- •Введение
- •Сведения об архитектуре процессоров intel 80х86 и операционной системе windows, необходимые для программирования на ассемблере
- •1.1. Программно доступные регистры
- •1.2. Организация памяти [5]
- •1.2.1. Сегментация
- •1.2.2. Дескрипторы сегментов
- •1.2.3 Адресное пространство режима реального адреса
- •1.2.4. Адресное пространство защищенного режима [6]
- •1.2.5. Виртуальное адресное пространство
- •1.2.6. Способы адресации операндов
- •Регистровый операнд
- •Непосредственный операнд
- •1.3. Организация ввода – вывода
- •1.3.1. Консоль
- •1.3.2. Графический интерфейс пользователя
- •1.4. Система команд
- •Команды пересылки данных
- •Команды ввода/вывода
- •Команды целочисленной арифметики
- •Логические операции
- •Операции сдвигов
- •Команды передачи управления
- •Командные прерывания
- •Команды управления процессором
- •Команды обработки последовательности кодов
- •Команды для работы со стеком
- •2. Описание языка ассемблера
- •2.1. Алфавит языка ассемблера
- •2.2. Лексемы
- •2.3. Имена
- •2.3.1. Ключевые слова
- •2.3.2. Имена пользователя
- •2.4. Константы
- •2.4.1.Целые числа
- •2.4.2. Вещественные числа
- •2.4.3. Символьные и строковые константы
- •2.5. Структура строки языка ассемблера
- •2.5.1. Структура строки, содержащей машинную команду
- •2.6.3. Директивы упрощенного определения сегментов
- •2.6.4. Директивы определения сегментов и групп
- •2.6.5. Директивы описания процедуры
- •2.6.6. Директивы определения данных
- •2.6.7. Директивы определения имен
- •2.6.8. Директивы внешних ссылок
- •2.6.7. Директивы управления трансляцией
- •2.6.8. Макросредства
- •2.7. Операции в выражениях
- •2.7.1. Арифметические операции
- •2.7.2. Логические операции
- •2.7.3. Операции отношения
- •2.7.4. Операции, возвращающие значения
- •2.7.5. Операции присваивания атрибута
- •Трансляция программ
- •. Компиляция
- •3.2. Компоновка
- •Библиографический список
- •Функции api
- •1. Функция GetModuleHandleA
- •2. Функция LoadIcon
- •3. Функция LoadCursor
- •4. Функция Register Class
- •5. Функция CreateWindowExA
- •6. Функция ShowWindow
- •7. Функция UpdateWindow
- •8. Функция GetMessage
- •9. Функция DispatchMessage
- •10. Функция ExitProcess
- •11. Функция BeginPaint
- •12. Функция TextOutA
- •13. Функция EndPaint
- •Описание структур, определенных в фале win32.Inc
- •1. Структура wndclass
- •2. Структура сообщения
- •3. Структура paintstruct
- •Продолжение прил. 4
- •4. Структура rect
- •Формат командной строки и ключи транслятора tasm32
- •Формат командной строки и ключи компоновщика tlink32
- •Оглавление
1.2.6. Способы адресации операндов
Процессор поддерживает 11 способов адресации операндов. В языке ассемблера в командах или директивах в качестве операндов в общем случае используются выражения. В свою очередь выражения состоят из операндов и знаков операций. Операндами могут быть константы, имена программно доступных регистров, меток или переменных. Знаки операций связывают операнды и указывают на необходимость выполнения над ними арифметических, логических и других операций в процессе трансляции. Рассмотрим типы операндов с точки зрения способа адресации.
Регистровый операнд
Если в команде на месте операнда находится имя регистра, это означает, что команда выполняет соответствующее действие над содержимым регистра. Такой способ адресации операнда называется регистровым. Например:
MOV АХ,ВХ
Содержимое регистра ВХ передается в регистр АХ.
Непосредственный операнд
Операнд находится в команде в виде константы, либо транслятор преобразует выражение в фиксированное значение. Тип операнда и способ адресации в примерах рассматривается относительно второго операнда. Первый операнд - регистровый. Например:
М2 = 1024
MOV CX,7 ;пример 1
MOV SI,OFFSET M1 ;пример 2
MOV DX,M2 ;пример3
В примере 1 константа 7, определенная непосредственно в команде, заносится в регистр СХ. Во втором примере второй операнд является адресом (смещением), на который указывает имя Ml. Значение этого смещения вычислит ассемблер и поместит в качестве константы в код. В третьем случае необходимо, чтобы имени М2 директивами EQU или = было присвоено какое-нибудь значение.
Переменная
Переменная - имя, указывающее на ячейку памяти или на первую ячейку области памяти. Например:
MOV СХ,[ВОХ]
Содержимое ячейки памяти, помеченной в тексте программы именем BOX, передается в регистр CХ. Такой способ адресации называется прямым и все вышеперечисленные способы относятся к прямым способам адресации.
Косвенная адресация
Для обращения к переменной в памяти можно использовать в качестве указателя на адрес содержимое регистров ESI, SI, EDI, DI, EBX, BX, EBP, BP. Такая адресация в зависимости от используемых регистров именуется индексной, базовой, индексно-базовой и индексной, базовой, индексно-базовой со смещением.
Индексная или базовая адресация
В примерах с этими способами адресации используем тридцатидвухразрядные регистры. Содержимое базового или индексного регистра является адресом операнда.
MOV AL,[EBX]
MOV DL,[ESI]
Эта адресация может осуществляться с масштабированием, т.е. содержимое базового или индексного регистра умножается на масштабный коэффициент – 2,4 или 8.
MOV AX,[EBX*2]
Базово-индексная адресация
В этом случае содержимое базового регистра складывается с содержимым индексного. Например:
MOV EAX,[ESI+EBX]
Эта адресация может использоваться с масштабированием. Адресом операнда является сумма содержимого базового регистра и содержимого индексного регистра, умноженного на масштабный коэффициент. Например:
MOV ECX,[ESI*4+EB X]
Базовая или индексная адресация со смещением
Адрес операнда определяется суммой смещения и содержимого индексного регистра. Например:
MOV AX,BUF[ESI]
Содержимое индексного регистра может умножаться на масштабный коэффициент.
Базово-индексная адресация со смещением
Адресом операнда является сумма смещения, содержимого индексного и базового регистров. Например:
MOV AX,BUF[ESI+EBX]
Содержимое базового или индексного регистра может умножаться на масштабный коэффициент.
