Особенности структуры машинных команд

Объектные коды, приведенные в среднем столбце листинга — это, по существу, машинная исполняемая (.EXE или.COM) программа, записанная в шестнадцатеричных кодах.

Структура команды в исполняемой программе может существенно быть не похожа на породившую ее команду ассемблера. Например, стандартная двухадресная команда типа mov, add, sub, and и т. д. с адресацией типа m, r или r, m в исполняемой программе способна занимать 4 байта:

КОП d w mod reg r/m   dispL   dispH

Первый байт (байт кода операции) содержит код операции (КОП) и два однобитовых поля: d (направление) и w (слово). Поле d определяет направление передачи данных (записи результата) внутри команды. Если d = 1, то передача производится в reg, если d = 0, то происходит передача из reg. Поле w определяет формат данных: слово (w = 1) или байт (w = 0).

Второй байт команды (байт способа адресации) имеет три поля: reg (адрес регистра, где находится один из операндов), mod (режим адресации) и r/m (регистр/память). Если mod = 11, то второй из операндов тоже в регистре и поле r/m — адрес этого регистра. Если mod >< 11, то второй из операндов в памяти, причем при mod = 00: disp = 0 — смещение отсутствует (нет полей dispL и dispH), при mod = 01: disp = dispL — старший байт смещения отсутствует, при mod = 10: disp = dispH, dispL (есть оба байта смещения). Поля mod >< 11 и r/m (reg) определяют способ формирования исполнительного адреса (Аисп), как показано в табл. 9.1.

Таблица 9.1. Способы формирования исполнительного адреса

r/m или reg mod = 00 mod = 01 mod = 10 mod = 11
        w = 0 w = 1
  BX+SI BX+SI+disp BX+SI+disp AL AX
  BX+DI BX+DI+disp BX+DI+disp CL CX
  BP+SI BP+SI+disp BP+SI+disp DL DX
  BP+DI BP+DI+disp BP+DI+disp BL BX
  SI SI+disp SI+disp AH SP
  DI DI+disp DI+disp CH BP
  disp* BP+disp BP+disp DH SI
  BX BX+disp BX+disp BH DI

Если mod = 00 и r/m = 110, то Аисп = dispH, dispL — исполнительный адрес находится в команде (прямая адресация).

Третий и четвертый байты команды рассматриваемой структуры содержат 16-битовый код смещения поля памяти второго операнда (dispH — старший байт, dispL — младший байт).

Более подробно с объектными кодами команд ассемблера можно познакомиться в работах [10, 35].


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: