Адресация данных.
Для четкого понимания того, как осуществляется адресация данных,
проанализируем способ образования адреса операнда. Адрес операнда
формируется по схеме сегмент:смещение
. Селектор сегмента
можно указать явным или неявным образом. Обычно селектор
сегмента загружается в сегментный регистр, а сам регистр выбирается в
зависимости от типа выполняемой операции.
Тип операции |
Регистр сегмента |
Сегмент |
Описание |
Команды процессора |
CS |
Програмный сегмент |
Используется при вызовах команд процессора. |
Обращение к стеку |
SS |
Сегмент стека |
Используется во всех операциях со стеком, а также в операциях с
памятью, в которых применяется стек или строка-приемник при выполнении
строковых операций. |
Локальные данные |
DS |
Сегмент данных |
Используется во всех операциях с данными, исключая те, в которых
применяется стек или строка-приемник при выполнении строковых операций. |
Строки-приемники |
ES |
Сегмент данных, адресуемый регистром ES |
Операнд-приемник в строковых операциях. |
Процессор автоматически выбирает сегмент в соответствии с условиями,
описанными в таблице. При сохранении операнда в памяти или загрузке из
памяти в качестве сегментного регистра по умолчанию используется DS,
но можно и явным образом указать сегментный регистр, применяемый в
операции.
Пусть, например, требуется сохранить содержимое регистра ЕАХ в
памяти, адресуемой сегментным регистром ES и смещением, находящимся
в регистре ЕВХ. В этом случае можно использовать команду
mov ES:[EBX],EAX
Обратите внимание на то, что после имени сегмента указывается символ двоеточия.
Режимы адресации.
В зависимости от местоположения источников образования полного (абсолютного)
адреса в языке ассемблера различают следующие способы адресации операндов:
- Регистровая адресация.
Подразумевает использование в качестве операнда регистра процессора, например:
PUSH DS
MOV BP,SP
- Прямая адресация.
При прямой адресации один операнд представляет собой адрес памяти,
второй – регистр:
MOV Data,AX
- Непосредственная адресация.
Применяется, когда операнд, длинной в байт или слово находится в
ассемблерной команде:
MOV AH,4CH
- Косвенная адресация.
При использовании косвенной адресации абсолютный адрес формируется исходя
из сегментного адреса в одном из сегментных регистров и смещения в регистрах
BX, BP, SI или DI:
MOV AL,[BX] |
; База – в DS, смещение – в BX |
MOV AX,[BP] |
; База – в SS, смещение – в BP |
MOV AX,ES:[SI]
|
; База – в ES, смещение – в SI |
- Базовая адресация.
В случае применения базовой адресации исполнительный адрес является суммой
значения смещения и содержимого регистра BP или BX, например:
MOV AX,[BP+6] |
; База – SS, смещение – BP+6 |
MOV DX,8[BX] |
; База – DS, смещение – BX+8 |
- Индексная адресация.
При индексной адресации исполнительный адрес определяется как сумма значения
указанного смещения и содержимого регистра SI или DI так же,
как и при базовой адресации, например:
MOV DX,[SI+5] |
; База – DS, смещение – SI+5 |
- Базово-индексная адресация.
Подразумевает использование для вычисления исполнительного адреса суммы содержимого
базового регистра и индексного регистра, а также смещения, находящегося в операторе,
например:
MOV BX,[BP][SI] |
; База – SS, смещение – BP+SI |
MOV ES:[BX+DI],AX |
; База – ES, смещение – BX+DI; |
MOV AX,[BP+6+DI] |
; База – SS, смещение - BP+6+DI |