Максимальная длина машинной команды – 15 байт. (Команда может состоять и из одного байта). Коду операции предшествуют однобайтные префиксы, модифицирующие операцию. После префиксов идёт код операции. Последующие поля машинной команды определяют местонахождение операндов. Операнды могут адресоваться следующими способами (если не считать того, что некоторые операнды могут задаваться неявно, как, например, регистры AX и DX в операциях умножения и деления, или CX в командах цикла):
1) Непосредственный метод адресации. Операнд находится в поле команды. Например, в командах
B8 0200 mov ax,512
BA 0000r mov dx,OFFSET mes
вторые операнды, 20 и OFFSET mes, задаются непосредственно. Здесь слева выписаны шестнадцатеричные коды.
2) Регистровый. Операнд находится в одном из регистров.
Например, оба операнда в команде
8E D8 mov ds,ax
задаются с помощью регистрового способа адресации.
3) Косвенно-регистровый. Адрес операнда находится в одном из регистров: si, di, bx.
Например, команда
8B 04 mov ax, [si]
переписывает содержимое слова, смещение которого находится в регистре si, в регистр ax. Второй операнд задан с помощью косвенно-регистрового метода адресации.
4) Прямая адресация. Относительный адрес операнда содержится в команде в виде смещения. В частности, команды пересылки в аккумулятор транслируются следующим образом:
A0 db mov al,db ; db – смещение байта
A1 dw mov ax,dw ; dw – смещение слова
A2 dd mov eax,dd ; dd – смещение двойного слова
Например:
A1 005C mov ax,ddd ; здесь относительный адрес слова равен 5С
5) Базовая адресация. Относительный адрес операнда равен сумме содержимого базового регистра (BP или BX) и смещения (состоящего из восьми или шестнадцати разрядов). Например:
8B 87 005C mov ax,ddd [bx]
8B 86 005C mov ax,ddd [bp]
6) Индексная адресация. Относительный адрес операнда формируется путем сложения содержимого индексного регистра, si или di, и смещения (состоящего из восьми или шестнадцати разрядов). В частности, если второй операнд команды mov является индексным, то команда, как и в случае базовой адресации, транслируется как
8B 8r XXXX mov ax,xxxx [r]
Например:
8B 84 005C mov ax,ddd [si]
8B 85 005C mov ax,ddd [si]
Базово-индексная адресация. Относительный адрес операнда равен сумме значений базового регистра (BX или BP) и индексного регистра (SI или DI). Этот способ адресации реализуется при значениях поля адреса 0,1,2 или 3.
1)
Например:
8B 00 mov ax,[bx+si]
8B 01 mov ax,[bx+di]
8B 02 mov ax,[bp+si]
8B 03 mov ax,[bp+di]
2) Базово-индексный относительный метод адресации. К сумме значений базового и индексного регистра прибавляется смещение, состоящее из восьми или шестнадцати разрядов.
Например:
8B 80 005C mov ax,add[bx+si]
8B 81 005C mov ax,ddd[bx+di]
8B 83 005C mov ax,ddd[bp+di]
Замечания.
1) Если x — смещение, то операнды [x] и x транслируются одинаково.
Например, команды
mov ax,[ddd]
mov ax,ddd
Имеют одинаковые коды, и, значит, действуют одинаково
2) Недопустимая команда
mov ax,[bx+x]
Вместо этой команды можно применить
mov ax,x[bx]
Или
mov ax,[bx+OFFSET x]
3) При непосредственном методе адресации не всегда ясно, сколько байт содержит операнд. В этом случае применяется модификатор ptr.
Например:
C6 06 0040r FF mov byte ptr x, 255
C6 85 0203 04 mov byte ptr [di+515],4
С7 85 0203 0004 mov word ptr [di+515],4
Пример. Рассмотрим применение базового-индексного метода адресации для команды JMP. Предположим, что в сегменте кодов находится область, содержащая некоторые данные. Если счетчик команд IP будет равен адресу байта, принадлежащего этой области, то следующая команда будет состоять из набора бит, прочитанных из этой области. Поэтому для корректного выполнения программы необходимо изменить счётчик команд с помощью команды JMP:
<1> code segment
<2> assume cs: code, ds: code
<3> start: mov ax,code ; инициализация
<4> mov ds,ax ; регистра ds
<5> mov ago,OFFSET ago+2 ; значение IP после JMP
<6> mov bx,OFFSET ddd ; OFFSET ddd+4
<7> mov si,4 ; будет адресом слова,
<8> jmp [bx+si] ; содержащего новое значение IP
<9> ddd db 1,2,3,4 ; данные
<10> ago dw 0 ; слово для адреса перехода
<11> mov ax,4C00h ; возврат в
<12> int 21h ; операционную систему
<13> code ends
<14> end start