Объектные коды, приведенные в среднем столбце листинга — это, по существу, машинная исполняемая (.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].