3.5. Способы адресации

Максимальная длина машинной команды – 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