- •Атрибуты размеров операнда и адреса, а также формат команды в процессорах семейства х86
- •1. Атрибуты размеров операнда и адреса.
- •2. Формат и кодирование команды.
- •Микропроцессоров семейства x86
- •I. Команды пересылок данных
- •II. Команды обработки данных
- •2. Команды логических операций
- •3. Команды сдвиговых операций
- •Команды битовых операций
- •IV. Команды операций со стеком
- •V. Команды управления программой
- •VI. Команды управления процессором
- •VII. Команды, используемые в системном программном обеспечении.
Приложение П.2
Атрибуты размеров операнда и адреса, а также формат команды в процессорах семейства х86
1. Атрибуты размеров операнда и адреса.
Процессоры семейства iX86 могут работать как с 16-, так и с 32-битовыми адресами. При работе в реальном режиме, размер адресов и операндов, по умолчанию составляет 16 бит. Для программ, работающих в защищенном режиме, размер адреса и операнда определяется битом D из дескриптора кодового сегмента. При D=0, размер адреса и операнда составляет 16 бит, при D=1 – равен 32 битам. Однако, как размер операнда, так и размер адреса может быть изменен при помощи специального префикса команды. При этом, код префикса размера операнда равен 66H, а код префикса размера адреса – 67Н.
Результаты воздействия комбинации установки бита D в дескрипторе кодового сегмента и атрибутов размеров операнда и адреса, определенных в команде, иллюстрируется таблица П.2.1.
Таблица П.2.1
Установленный бит D дескриптора |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
Использование префикса размера операнда |
- |
- |
+ |
+ |
- |
- |
+ |
+ |
Использование префикса размера адреса |
- |
+ |
- |
+ |
- |
+ |
- |
+ |
|
|
|
|
|
|
|
|
|
Размер операнда, бит |
16 |
16 |
32 |
32 |
32 |
32 |
16 |
16 |
Размер адреса, бит |
16 |
32 |
16 |
32 |
32 |
16 |
32 |
16 |
Заметим, что в R и V режиме дескрипторы не определены и, в этих случаях, процессор автоматически полагает, что бит D=0. Т.е. размеры операндов и адресов по умолчанию принимаются равным 16 битам. Однако, и в R и в V-режиме разрешаются операции с 32 разрядными операндами, для чего необходимо использовать соответствующие префиксы.
2. Формат и кодирование команды.
На рис. П.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 |
00 |
000 |
CS |
01 |
001 |
SS |
10 |
010 |
DS |
11 |
011 |
FS |
-- |
100 |
GS |
-- |
101 |
Таблица П.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 |
Указание
на регистровую адресацию, или код типа
смещения DISP
при вычислении эффективного адреса.
Код регистра, определяющего
месторасположение первого операнда
или расширение кода
операции
Код
регистра или способ вычисления
эффективного адреса ЕА (при mode
# 11). Определяет месторасполо- жение
второго операнда совместно с байтом
SIB
(если он присутствует)
Рис. П.2.2 Формат байта “mod R/M” кода команды.
Кодирование поля “mode” в байте “mod R/M” кода команды приведено в табл. П.2.5.
Таблица П.2.5
Кодирование поля mode
Код |
Функциональное значение кода |
00 |
DISP = 0 |
01 |
DISP = знак disp 8 |
10 |
DISP = disp 16 |
11 |
Признак регистровой адресации |
где 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 |
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 |
Признаком размерности операнда в коде команды служит состояние младшего (нулевого) бита 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 |
000 |
BX + SI |
BX + SI + d8 |
BX + SI + d16 |
001 |
BX + DI |
BX + DI + d8 |
BX + DI + d16 |
010 |
SS:[BP + SI] |
SS:[BP + SI + d8] |
SS:[BP + SI + d16] |
011 |
SS:[BP + DI] |
SS:[BP + DI + d8] |
SS:[BP + DI + d16] |
100 |
SI |
SI + d8 |
SI + d16 |
101 |
DI |
DI + d8 |
DI + d16 |
110 |
d16 |
SS:[BP + d8] |
SS:[BP + d16] |
111 |
BX |
BX + d8 |
BX + d16 |
Таблица П.2.8
Формирование эффективного адреса памяти при ЕА при 32 битовой адресации
(r/m 100)
Поле r/m |
Адрес памяти второго операнда |
||
|
mode = 00 |
mode = 01 |
mode = 10 |
000 |
EAX |
EAX + d8 |
EAX + d32 |
001 |
ECX |
EC + d8 |
ECX + d32 |
010 |
EDX |
EDX + d8 |
EDX + d32 |
011 |
EBX |
EBX + d8 |
EBX + d32 |
100 |
имеется SIB |
имеется SIB |
имеется SIB |
101 |
d32 |
SS:[EBP + d8] |
SS:[EBP + d32] |
110 |
ESI |
ESI + d8 |
ESI + d32 |
111 |
EDI |
EDI + d8 |
EDI + d32 |
Таким образом, присутствие в команде байта SIB обусловлено в самой кодировке байта “mod R/M”, а именно кодом поля r/m этого байта.
Таблица П.2.9
Формирование эффективного адреса памяти ЕА при 32 битовой адресации
(r/m = 100)
Поле base |
Адрес памяти второго операнда |
||
|
mode = 00 |
mode = 01 |
mode = 10 |
000 |
EAX + SS × ind |
EAX + SS × ind + d8 |
EAX + SS × ind + d32 |
001 |
ECX + SS × ind |
ECX + SS × ind + d8 |
ECX + SS × ind + d32 |
010 |
EDX + SS × ind |
EDX + SS × ind + d8 |
EDX + SS × ind + d32 |
011 |
EBX + SS × ind |
EBX + SS × ind + d8 |
EBX + SS × ind + d32 |
100 |
SS:[ESP+SS × ind] |
SS:[ESP + SS × ind + d8] |
SS:[ESP + SS × ind + d32] |
101 |
d32 + SS × ind |
SS:[EBP + SS × ind + d8] |
SS:[EBP + SS × ind + d32] |
110 |
ESI + SS × ind |
ESI + SS × ind + d8 |
ESI + SS × ind + d32 |
111 |
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 |
Множитель для содержимого индексного регистра
|
000 |
EAX |
00 |
× 1 |
001 |
ECX |
01 |
× 2 |
010 |
EDX |
10 |
× 4 |
011 |
EBX |
11 |
× 8 |
100 |
Отсутствует |
|
|
101 |
EBP |
|
|
110 |
ESI |
|
|
111 |
EDI |
|
|
Примечание: Когда поле Index содержит 100, показывая отсутствие индексного регистра, поле SS должно содержать 00; в противном случае эффективный адрес не определен.
Приложение П.3 |
СИСТЕМА КОМАНД |
