1.1 Регистровый режим
Значение операнда-источника предварительно запоминается в одном из встроенных регистров микропроцессора.
Сам регистр становится эффективным адресом. Операнд (байт или слово) находится в регистре. Этот способ применим ко всем программно-адресуемым регистрам процессора:
inc CX | ; Увеличение на 1 содержимого CX |
push DS | ; Сегментный адрес сохраняется в стеке |
xchg BX,BP | ; Регистры BX и BP обмениваются содержимым |
mov ES,AX | ; Содержимое AX пересылается в ES |
1.2 Непосредственный режим
Непосредственная адресация. Операнд (байт или слово) указывается в команде и после трансляции поступает в код команды; он может иметь любой смысл (число, адрес, код ASCII), а также быть представлен в виде символического обозначения.
mov АН, 40h | ; Число 40h загружается в АН |
mov AL,'*' | ; Код ASCII символа "*' загружается в AL |
int 21h | ; Команда прерывания с аргументом 21h |
limit equ 528 | ; Число 528 получает обозначение limit |
mov CX,limit | ; Число, обозначенное limit, загружается в СХ |
Команда mov, использованная в последнем предложении, имеет два операнда; первый операнд определяется с помощью регистровой адресации, второй - с помощью непосредственной.
Важным применением непосредственной адресации является пересылка относительных адресов (смещений), для этого используется описатель offset (смещение):
; Сегмент данных
string db “Privet"; Строка символов
; Сегмент команд
mov DX,offset string; Адрес строки засылается в DX
1.3 Прямой режим.
Адресуется память; адрес ячейки памяти (слова или байта) указывается в команде (обычно в символической форме) и поступает в код команды:
; Сегмент данных
meml dw 0; Слово памяти содержит 0
mem2 db 230; Байт памяти содержит 230
; Сегмент команд
inc meml; Содержимое слова meml увеличивается на 1
mov DX, meml; Содержимое слова с именем menu загружается в DX
mov AL,mem2; Содержимое байта с именем mem2 загружается в АL
Сравнивая этот пример с предыдущим, мы видим, что указание в команде имени ячейки памяти обозначает, что операндом является содержимое этой ячейки; указание имени ячейки с описателем offset - что операндом является адрес ячейки.
Прямая адресация памяти на первой взгляд, кажется, простой и наглядной. Если мы хотим обратиться, например, к ячейке meml, мы просто указываем ее имя в программе. В действительности, однако, дело обстоит сложнее. Адрес любой ячейки состоит из двух компонентов: сегментного адреса и смещения. Обозначения meml и mem2 в предыдущем примере, являются смещениями. Сегментные же адреса хранятся в сегментных регистрах. Однако сегментных регистров четыре: DS, ES, CS и SS. Каким образом процессор узнает, из какого регистра взять сегментный адрес, и как сообщить ему об этом в программе?
Процессор различает группу кодов, носящих название префиксов. Имеется несколько групп префиксов: повторения, размера адреса, размера операнда, замены сегмента. Здесь нас будут интересовать префиксы замены сегмента.
Команды процессора, обращающиеся к памяти, могут в качестве первого байта своего кода содержать префикс замены сегмента, с помощью которого процессор определяет, из какого сегментного регистра взять сегментный адрес. Для сегментного регистра ES код префикса составляет 26h, для SS - 361i, для CS - 2Eh. Если префикс отсутствует, сегментный адрес берется из регистра DS (хотя для него тоже предусмотрен свой префикс).
В приведенном примере, по умолчанию, все данные адресуются через сегментный регистр DS, так что вместо inc meml можно было написать inc DS: mem. В случае замены сегментного регистра его обязательно нужно указывать явно:
inc ES: mem1
inc CS: mem2
Обращение к ячейке памяти по известному абсолютному адресу осуществляется следующим образом:
mov AL,DS: [17h] | Загрузка в AL содержимого ячейки со смещением 17h в сегменте, определяемом содержимым DS |
0 комментариев