Приложение П.2
АТРИБУТЫРАЗМЕРОВ ОПЕРАНДА И АДРЕСА, А ТАКЖЕ ФОРМАТ КОМАНДЫВ ПРОЦЕССОРАХ СЕМЕЙСТВА Х86
Атрибуты размеров операнда и адреса.
Процессоры семейства iX86 могут работать как с 16-, так и с 32-битовыми адресами. При работе в реальном режиме, размер адресов и операндов, по умолчанию составляет 16 бит. Для программ, работающих в защищенном режиме, размер адреса и операнда определяется битом D из дескриптора кодового сегмента. При D=0, размер адреса и операнда составляет 16 бит, при D=1 – равен 32 битам. Однако, как размер операнда, так и размер адреса может быть изменен при помощи специального префикса команды. При этом, код префикса размера операнда равен 66H, а код префикса размера адреса – 67Н.
Результаты воздействия комбинации установки бита D в дескрипторе кодового сегмента и атрибутов размеров операнда и адреса, определенных в команде, иллюстрируется таблица П.2.1.
Таблица П.2.1
Установленный бит D дескриптора | ||||||||
Использование префикса размера операнда | - | - | + | + | - | - | + | + |
Использование префикса размера адреса | - | + | - | + | - | + | - | + |
Размер операнда, бит | ||||||||
Размер адреса, бит |
Заметим, что в R и V режиме дескрипторы не определены и, в этих случаях, процессор автоматически полагает, что бит D=0. Т.е. размеры операндов и адресов по умолчанию принимаются равным 16 битам. Однако, и в R и в V-режиме разрешаются операции с 32 разрядными операндами, для чего необходимо использовать соответствующие префиксы.
Формат и кодирование команды.
На рис. П.2.1 приведен полный формат команды, используемый в процессорах семейства iAPX86.
Поле префиксов команды Основное поле команды
Префикс повторе-ния или блокиро-вания | Префикс переопре-деления разрядно-сти адреса | Префикс переопре-деления разрядно- сти операндов | Префикс переопре-деления сегмента | Код опера- ции (КОП) | Mod R/M | SIB | Относитель-ный адрес (смещение в команде) | Непосред-ственные данные (операнд) | |
0 или 1 байт | 0 или 1 байт | 0 или 1 байт | 0 или 1 байт | 1 или 2 байта | 0 или 1 байт | 0 или 1 байт | 0,1,2 или 4 байта | 0,1,2 или 4 байта |
Рис. П.2.1. Формат команды процессоров i386+
Из всех полей команды обязательными являются только один или два байта кода операции.
Назначение и коды префиксов переопределения размеров адреса и данных, а также префиксов повторения, блокировки и перекрытия сегментов, представлены в табл. П.2.1.
Таблица П.2.2
Кодирование префиксов команд в процессорах семейства iAPX86
№ п/п | Наименование и назначение префикса | Код префикса |
1. | Префикс повторения REP | F3h |
2. | Префикс повторения REPE/REPZ (синоним REP) | F3h |
3. | Префикс повторения REPNE/REPNZ | F2E |
4. | Префикс блокировки LOCK | F0h |
5. | Префикс переопределения сегмента на CS | 2Fh |
6. | Префикс переопределения сегмента на SS | 36h |
7. | Префикс переопределения сегмента на DS | 3Eh |
8. | Префикс переопределения сегмента на ES | 26h |
9. | Префикс переопределения сегмента на FS | 64h |
10. | Префикс переопределения сегмента на GS | 65h |
11. | Переопределение разрядности операнда | 66h |
12. | Переопределение разрядности адреса | 67h |
Заметим, что в R- и V-режимах процессоров i386+, как и в базовом процессоре i8086 не используются префиксы переопределения разрядности операндов, а также префиксы переопределения сегмента на FS и GS из-за отсутствия таковых.
При этом кодирование сегментных регистров приведено в табл. П.2.3.
Использование и возможности переопределения сегментных регистров сведены в табл. П.2.4.
Таблица П.2.3
Кодирование сегментных регистров в процессорах семейства iAPX
Тип сегментного регистра | Код сегментного регистра при R- и V-режимах работы процессора | Код сегментного регистра при Р-режиме работы процессора |
ES | ||
CS | ||
SS | ||
DS | ||
FS | -- | |
GS | -- |
Таблица П.2.4
Возможности переопределения сегментных регистров
Тип обращения к памяти | Базовый адрес сегмента | Сегментное смещение | |
По умолчанию | Возможность переопределения | ||
Выборка команды | CS | Нет | IP(EIP) |
Обращение к стеку | SS | Нет | SP(ESP) |
Адресация операнда | DS | CS, SS, ES, FS, GS | EA |
Адресация операнда с использованием BP(EBP) или SP(ESP) как базового регистра | SS | CS, DS, ES, FS, GS | EA |
Адресация элемента цепочки-источника | DS | CS, SS, ES, FS, GS | SI(ESI) |
Адресация элемента цепочки-получателя (приемника) | ES | Нет | DI(EDI) |
Формат байта “mod R/M” в формате команды приведены на рис. П.2.2
7 6 5 4 3 2 1 0
mod | reg/op | reg/mem |
|
|
|
Рис. П.2.2 Формат байта “mod R/M” кода команды.
Кодирование поля “mode” в байте “mod R/M” кода команды приведено в табл. П.2.5.
Таблица П.2.5
Кодирование поля mode
Код | Функциональное значение кода |
DISP = 0 | |
DISP = знак disp 8 | |
DISP = disp 16 | |
Признак регистровой адресации |
где disp 8, disp 16 – восьмиразрядное и шестнадцатиразрядное смещение в команде. Кодирование поля “reg” в байте “mod R/M” кода команды приведено в табл. П.2.6.
Таблица П.2.6
Кодирование поля reg
Поле reg | Поля W в команде нет | Поле W в команде имеется | ||||
16-битовый операнд | 32-битовый операнд | 16-битовый операнд | 32-битовый операнд | |||
W = 0 | W = 1 | W = 0 | W = 1 | |||
AX | EAX | AL | AX | AL | EAX | |
CX | ECX | CL | CX | CL | ECX | |
DX | EDX | DL | DX | DL | EDX | |
BX | EBX | BL | BX | BL | EBX | |
SP | ESP | AH | SP | AH | ESP | |
BP | EBP | CH | BP | CH | EBP | |
SI | ESI | DH | SI | DH | ESI | |
DI | EDI | BH | DI | BH | EDI |
Признаком размерности операнда в коде команды служит состояние младшего (нулевого) бита D0 (бита W) в поле байта кода операции (КОП) команды. При W = 0 используются 8 разрядные операнды, а при W = 1 – 32 разрядные.
То есть, если бит W = 0, то операндом является 8-ми битовый код, который берется из AL, BL и т.д. Если же бит W = 1, то операнд берется в зависимости от того, каким он установлен битом D дескриптора и префиксами переопределения размеров операндов, либо из AX, BX и т.д. (при 16 разрядных операндах) либо из EAX, EBX и т.д. (при установлении 32 разрядных операндов).
Состояние второго справа бита (d) в поле байта кода операции (КОП) команды, определяет направление передачи данных в двухоперандных командах. При d = 0 происходит передача данных из регистра (reg) в регистр/память (reg/mem), а при d = 1 происходит передача данных из регистра/памяти (reg/mem) в регистр (reg). В командах сдвига и вращения, бит D1 КОП (бит d) определяет сдвиг на 1 разряд (V = 0) или на число разрядов, указанных в CL.
Формирование эффективного адреса памяти второго операнда, осуществляемое при поле mode ¹11, вычисляется при 16 битовой адресации (при R-режиме процессоров i386+) в соответствии с табл. П.2.7. При 32 битовой адресации (в Р-режиме процессоров i386+) – в соответствии с табл. П.2.7 (при поле r/m ¹100), и табл. П.2.8 (при поле r/m = 100).
Таблица П.2.7
Формирование эффективного адреса памяти при 16 битовой адресации
Поле r/m | Адрес памяти второго операнда | ||
mode = 00 | mode = 01 | mode = 10 | |
BX + SI | BX + SI + d8 | BX + SI + d16 | |
BX + DI | BX + DI + d8 | BX + DI + d16 | |
SS:[BP + SI] | SS:[BP + SI + d8] | SS:[BP + SI + d16] | |
SS:[BP + DI] | SS:[BP + DI + d8] | SS:[BP + DI + d16] | |
SI | SI + d8 | SI + d16 | |
DI | DI + d8 | DI + d16 | |
d16 | SS:[BP + d8] | SS:[BP + d16] | |
BX | BX + d8 | BX + d16 |
Таблица П.2.8
Формирование эффективного адреса памяти при ЕА при 32 битовой адресации
(r/m ¹ 100)
Поле r/m | Адрес памяти второго операнда | ||
mode = 00 | mode = 01 | mode = 10 | |
EAX | EAX + d8 | EAX + d32 | |
ECX | EC + d8 | ECX + d32 | |
EDX | EDX + d8 | EDX + d32 | |
EBX | EBX + d8 | EBX + d32 | |
имеется SIB | имеется SIB | имеется SIB | |
d32 | SS:[EBP + d8] | SS:[EBP + d32] | |
ESI | ESI + d8 | ESI + d32 | |
EDI | EDI + d8 | EDI + d32 |
Таким образом, присутствие в команде байта SIB обусловлено в самой кодировке байта “mod R/M”, а именно кодом поля r/m этого байта.
Таблица П.2.9
Формирование эффективного адреса памяти ЕА при 32 битовой адресации
(r/m = 100)
Поле base | Адрес памяти второго операнда | ||
mode = 00 | mode = 01 | mode = 10 | |
EAX + SS × ind | EAX + SS × ind + d8 | EAX + SS × ind + d32 | |
ECX + SS × ind | ECX + SS × ind + d8 | ECX + SS × ind + d32 | |
EDX + SS × ind | EDX + SS × ind + d8 | EDX + SS × ind + d32 | |
EBX + SS × ind | EBX + SS × ind + d8 | EBX + SS × ind + d32 | |
SS:[ESP+SS × ind] | SS:[ESP + SS × ind + d8] | SS:[ESP + SS × ind + d32] | |
d32 + SS × ind | SS:[EBP + SS × ind + d8] | SS:[EBP + SS × ind + d32] | |
ESI + SS × ind | ESI + SS × ind + d8 | ESI + SS × ind + d32 | |
EDI + SS × ind | EDI + SS × ind + d8 | EDI + SS × ind + d32 |
Отметим также, что при 16 битовой адресации (R-режима) используются только регистры BX, SI, DI и BP (в стековых ситуациях неявно привлекается регистр SP). При 32 битовой адресации (Р-режиме) для адресации можно использовать любой регистр общего назначения и, кроме того, может быть задействован байт SIB (Scale, Index, Base – масштаб, индекс, база), формат которого приведен на рис. П.2.3, а кодирование – в табл. П.2.10.
7 6 5 4 3 2 1 0
SS | Index | Base |
Рис.П.2.3. Формат байта SIB при 32 битовой адресации.
SS - масштабный множитель (коэффициент) для режима масштабирования индексной адресации.
Index - код регистра общего назначения, используемый как индексный регистр.
Base - код регистра общего назначения, используемого как базовый регистр.
Таблица П.2.10
Кодирование полей Index и SS в байте SIB
Код поля Index | Регистр, используемый как индексный | Код поля SS | Множитель для содержимого индексного регистра |
EAX | × 1 | ||
ECX | × 2 | ||
EDX | × 4 | ||
EBX | × 8 | ||
Отсутствует | |||
EBP | |||
ESI | |||
EDI |
Примечание: Когда поле Index содержит 100, показывая отсутствие индексного регистра, поле SS должно содержать 00; в противном случае эффективный адрес не определен.
Приложение П.3 |
СИСТЕМА КОМАНД |