Формат байта COP в машинной команде с одним байтом COP может иметь шесть разновидностей, которые приведены на рис П.2. Двухбайтные поля, используемые под COP, рассматривать не будем. Они, как правило, применяются в командах, используемых в системном программном обеспечении, да в командах битовых операций.
Рис П.2 Форматы байта COP в машинной команде.
Формат а) характерен для команд сброса и установки бит регистра флагов и команд стековых операций.
Форматы б), в) и г) характерны для большинства двухоперандных команд, причем формат б) используется для команд, где один операнд присутствует неявно (например, в командах умножения и деления, а формат г) используется для команд, в которых присутствует непосредственный операнд.
Признаком размерности операнда в коде команды служит состояние младшего (нулевого) бита D0 (бита w) в поле байта кода операции (COP) команды. При w = 0 используются 8 разрядные операнды, а при w = 1, 16 или 32 разрядные.
То есть, если бит w = 0, то операндом является 8-ми битовый код, который берется из AL, BL и т.д. Если же бит w = 1, то операнд берется в зависимости от того, каким он установлен битом D дескриптора и префиксами переопределения размеров операндов, либо из AX, BX и т.д. (при 16 разрядных операндах) либо из EAX, EBX и т.д. (при установлении 32 разрядных операндов). Значение же самого бита w определяется при компиляции, исходя из описания вводимых данных, либо (при обращении к памяти) по указанию в команде (byte ptr, word ptr, и.т.д.).
Состояние второго справа бита, бита D1 (бит d) в поле байта кода операции (COP) команды, определяет направление передачи данных в двухоперандных командах. При d = 0 происходит передача данных из регистра (reg) в регистр/память (reg/mem), а при d = 1 происходит передача данных из регистра/памяти (reg/mem) в регистр (reg).
В командах сдвига и вращения, бит D1 COP (бит d) определяет сдвиг на 1 разряд (d = 0) или на число разрядов, указанных в CL (d= 1).
В командах формата г), когда используется непосредственный операнд, при w = 0, бит s не играет роли и процессором игнорируется. Однако когда бит w = 1, то есть, когда осуществляется операция с двухбайтными словами, то равенство бита s единице говорит, что непосредственный операнд является младшим байтом полного операнда, и должен рассматриваться как число со знаком (т.е. старший байт непосредственного операнда является знаковым расширением младшего байта). Если же бит s = 0, то это говорит о том, что непосредственный операнд 16 разрядный и указан полностью.
Форматы кода операции д) и е) используются в однооперандных командах, когда операнды находятся в регистрах. Это характерно, например, для однобайтных команд типа INC AX, или DEC EDX.
Формат байта “mod R/M” в формате команды приведены на рис. П.3.
Основное назначение этого байта – определение месторасположения операндов, заданных в команде. Кодирование “mode” в байте “mod R/M” кода команды приведено в табл. П.5.
7 6 5 4 3 2 1 0
mod |
reg/op |
reg/mem |
|
|
|
Рис. П.3 Формат байта “mod R/M” кода команды.
Таким образом, код 11 означает, что оба операнда команды размещены в регистрах в соответствии с кодами указанными в остальных двух полях байта. Остальные три варианта определяют размещение одного операнда в регистре, а второго – в памяти. При этом операнд, расположенный в регистре определяется кодом в поле «reg/op», а операнд, расположенный в памяти определяется кодом в поле «reg/mem», причем смещение в команде «disp» (disp – displacement), при вычислении эффективного адреса операнда, размещенного в памяти, определяется кодом поля «mod».
Таблица П.5
Кодирование поля mode
Код |
Функциональное значение кода |
00 |
disp= 0 |
01 |
disp = знак disp 8 |
10 |
disp = disp 16 (32) |
11 |
Признак регистровой адресации |
где disp 8, disp 16 (32) - восьмиразрядное и шестнадцатиразрядное (или 32 разрядное) смещение в команде Кодирование поля “reg” в байте “mod R/M” кода команды приведено в табл.П.6.
Формирование эффективного адреса памяти второго операнда, осуществляемое при поле mode ¹11, вычисляется при 16 битовой адресации (при R-режиме процессоров i386+) в соответствии с табл.П.7. При 32 битовой адресации (в Р - режиме процессоров i386+) – в соответствии с табл. П.8 (при поле r/m ¹100), и табл. П.11 (при поле r/m = 100).
Таблица П.6
Кодирование поля reg
Поле reg |
Поля w в команде нет |
Поле w в команде имеется |
||||
16-битовый операнд |
32-битовый операнд |
16-битовый операнд |
32-битовый операнд |
|||
w = 0 |
w = 1 |
w = 0 |
w = 1 |
|||
000 |
AX |
EAX |
AL |
AX |
AL |
EAX |
001 |
CX |
ECX |
CL |
CX |
CL |
ECX |
010 |
DX |
EDX |
DL |
DX |
DL |
EDX |
011 |
BX |
EBX |
BL |
BX |
BL |
EBX |
100 |
SP |
ESP |
AH |
SP |
AH |
ESP |
101 |
BP |
EBP |
CH |
BP |
CH |
EBP |
110 |
SI |
ESI |
DH |
SI |
DH |
ESI |
111 |
DI |
EDI |
BH |
DI |
BH |
EDI |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.