Читайте также:
|
|
Атрибуты размеров операнда и адреса.
Процессоры семейства X86 могут работать как с 16-, так и с 32-битовыми адресами. При работе в реальном режиме, размер адресов и операндов, по умолчанию составляет 16 бит. Для программ, работающих в защищенном режиме, размер адреса и операнда определяется битом D из дескриптора кодового сегмента. При D=0, размер адреса и операнда составляет 16 бит, при D=1 – равен 32 битам. Однако, как размер операнда, так и размер адреса может быть изменен при помощи специального префикса команды. При этом, код префикса размера операнда равен 66H, а код префикса размера адреса – 67Н.
Результаты воздействия комбинации установки бита D в дескрипторе кодового сегмента и атрибутов размеров операнда и адреса, определенных в команде, иллюстрируется таблица III.1.
Таблица III.1
Установленный бит D дескриптора | ||||||||
Использование префикса размера операнда | - | - | + | + | - | - | + | + |
Использование префикса размера адреса | - | + | - | + | - | + | - | + |
Размер операнда, бит | ||||||||
Размер адреса, бит |
Заметим, что в R и V режиме дескрипторы не определены и, в этих случаях, процессор автоматически полагает, что бит D=0. Т.е. размеры операндов и адресов по умолчанию принимаются равным 16 битам. Однако и в R и в V-режиме разрешаются операции с 32 разрядными операндами, для чего необходимо использовать соответствующие префиксы. В R-режиме, с помощью префиксов переопределения адреса, можно также использовать, и 32 разрядные адреса, однако, при этом, следует помнить, об ограничении размера сегмента величиной 64 Кбайт.
Формат и кодирование команды.
На рис.III.1 приведен полный формат команды, используемый в процессорах семейства X86.
Поле префиксов команды Основное поле команды
Префикс повторе-ния или блокиро-вания | Префикс переопре-деления разрядно-сти адреса | Префикс переопре-деления разрядно- сти операндов | Префикс переопре-деления сегмента | Код опера- ции (COP) | 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 байта |
Рис.П.1. Формат команды процессоров i386+
Из всех полей команды обязательными являются только один или два байта кода операции.
Назначение и коды префиксов переопределения размеров адреса и данных, а также префиксов повторения, блокировки и переопределения сегментов, представлены в табл. III.2.
Таблица III.2
Кодирование префиксов команд в процессорах семейства iX86
№ п/п | Наименование и назначение префикса | Код префикса |
1. | Префикс повторения REP | F3h |
2. | Префикс повторения REPE/REPZ (синоним REP) | F3h |
3. | Префикс повторения REPNE/REPNZ | F2h |
4. | Префикс блокировки LOCK | F0h |
5. | Префикс переопределения сегмента на CS | 2Fh |
6. | Префикс переопределения сегмента на SS | 36h |
7. | Префикс переопределения сегмента на DS | 3Eh |
8. | Префикс переопределения сегмента на ES | 26h |
9. | Префикс переопределения сегмента на FS | 64h |
10. | Префикс переопределения сегмента на GS | 65h |
11. | Переопределение разрядности операнда (OS) | 66h |
12. | Переопределение разрядности адреса (AS) | 67h |
Таблица III.3
Кодирование сегментных регистров в процессорах семейства iX86
Тип сегментного регистра | Код сегментного регистра при R- и V-режимах работы процессора | Код сегментного регистра при Р-режиме работы процессора |
ES | ||
CS | ||
SS | ||
DS | ||
FS | - | |
GS | - |
При этом кодирование сегментных регистров приведено в табл. III.3.
Использование и возможности переопределения сегментных регистров сведены в табл.III.4. Отметим, при этом, что регистры FS и GS не принимаются по умолчанию ни в одной команде.
Таблица III.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) |
Заметим, что при программировании на языке Ассемблера, префиксы безусловного и условного повторения REP (REPZ, REPNZ и др.), используемые при обработке цепочечных команд, и префикс блокировки LOCK устанавливаются перед соответствующей командой. Префиксы же замены сегмента, отменяющие выбор сегмента по умолчанию, устанавливаются в команде перед эффективным адресом, разделяемые двоеточием (CS:EA). Префиксы переопределения разрядности адресов и операндов определяются директивами языка.
Формат байта COP в машинной команде с одним байтом COP может иметь шесть разновидностей, которые приведены на рис III.2. Двухбайтные поля, используемые под COP, рассматривать не будем. Они, как правило, применяются в командах, используемых в системном программном обеспечении, да в командах битовых операций.
Формат а) характерен для однобайтных команд сброса и установки битов регистра флагов и некоторых команд стековых операций (например, CLC; STI; PUSHF), а также команд программного прерывания INTO и INT3.
Форматы б), в) и г) характерны для большинства двухоперандных команд, причем формат б) используется для команд, где один операнд присутствует неявно (например, в командах умножения и деления MUL [DX+SI+disp]; DIV [DX+SI+disp], формат в) типичен для команд, в которых явно указываются месторасположение (адреса) обоих операндов (например, команды AND AX,DX; MOV AX,[BX+SI+disp]; ADD BX, [BP+SI+SI]), а формат г) используется для команд, в которых присутствует непосредственный операнд (например, ADD BX,3Ah; MOV [BX+disp],1234h).
Рис III.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 разрядный и указан полностью.
Форматы команд д) и е) используются для команд с одним операндом, когда операнд находится в регистре, и для описания команды достаточно одного байта (например, PUSH AX, INC BX).
Формат байта “mod R/M” в формате команды приведены на рис. III.3.
Основное назначение этого байта – определение месторасположения операндов, заданных в команде, а также способа вычисления эффективного адреса операнда, который располагается в памяти. Кодирование “mode” в байте “mod R/M” кода команды приведено в табл. III.5.
7 6 5 4 3 2 1 0
mod | reg/op | reg/mem |
|
|
|
Рис.III.3 Формат байта “mod R/M” кода команды.
Таким образом, код 11 означает, что оба операнда команды размещены в регистрах в соответствии с кодами указанными в остальных двух полях байта. Остальные три варианта определяют размещение одного операнда в регистре, а второго – в памяти. При этом операнд, расположенный в регистре определяется кодом в поле «reg/op» и именуется вторым операндом, а операнд, расположенный в памяти определяется кодом в поле «reg/mem» и именуется первым операндом. При этом, размерность смещения в команде (disp – displacement), при вычислении эффективного адреса операнда, размещенного в памяти, определяется кодом поля «mod». (Отметим, что поле «reg/op» обозначено так потому, что в некоторых командах с одним операндом, код самого операнда располагается в поле «reg/mem», а поле «reg/op» занимает некоторая константа, как бы расширение кода операции).
Таблица III.5
Кодирование поля mode
Код | Функциональное значение кода |
disp= 0 | |
disp = знак disp 8 | |
disp = disp 16 (32) | |
Признак регистровой адресации |
Здесь, disp 8, disp 16 (32) - восьмиразрядное и шестнадцатиразрядное (или 32 разрядное) смещение в команде.
Кодирование регистров в полях «reg/op», и «reg/mem» в байте “mod R/M” осуществляется в соответствии с табл.III.6.
Формирование эффективного адреса памяти второго операнда, находящегося в памяти, и осуществляемое при поле mode ¹11, вычисляется при 16 битовой адресации (при R-режиме процессоров i386+) в соответствии с табл.III.7. При 32 битовой адресации (в Р - режиме процессоров i386+) – в соответствии с табл. III.8 (при коде в поле «r/m» ¹100), и табл. III.10 (при поле «r/m» = 100).
Таблица III.6
Кодирование регистров в полях «reg/op» и «reg/mem»
Поле 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 |
Таблица III.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 |
Таблица III.8
Формирование эффективного адреса памяти при ЕА при 32 битовой
адресации и r/m ¹ 100.
Поле r/m | Адрес памяти первого операнда | ||
mode = 00 | mode = 01 | mode = 10 | |
EAX | EAX + d8 | EAX + d32 | |
ECX | ECX + 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”, а именно кодом поля «reg/mem» этого байта.
Отметим, что при 16 битовой адресации (R-режиме) используются только регистры BX, SI, DI и BP (в стековых ситуациях неявно привлекается регистр SP). При 32 битовой адресации (Р-режиме) для адресации можно использовать любой регистр общего назначения и, кроме того, может быть задействован байт SIB (Scale, Index, Base – масштаб, индекс, база), формат которого приведен на рис.III.4, а кодирование – в табл. III.9.
7 6 5 4 3 2 1 0
SS | Index | Base |
Рис.III.4. Формат байта SIB при 32 битовой адресации.
SS - масштабный множитель (коэффициент) для режима масштабирования индексной адресации. Он определяется разрядностью адресуемых данных (байт, слово, двойное слово, квадрослово).
Index - код регистра общего назначения, используемого как индексный регистр.
Base - код регистра общего назначения, используемого как базовый регистр.
Таблица III.9
Кодирование полей Index и SS в байте SIB
Код поля Index | Регистр, используемый как индексный | Код поля SS | Множитель для содержимого индексного регистра |
EAX | × 1 | ||
ECX | × 2 | ||
EDX | × 4 | ||
EBX | × 8 | ||
Отсутствует | |||
EBP | |||
ESI | |||
EDI |
Примечание: Когда поле Index содержит 100, показывая отсутствие индексного регистра, поле SS должно содержать 00; в противном случае эффективный адрес не определен.
Таблица III.10
Формирование эффективного адреса памяти ЕА при 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 |
Таким образом, возможные методы формирования смещения в сегменте могут быть представлены следующей схемой:
База Индекс Масштаб Константа
(Base) (Index) (Scale) (Displacement)
В заключение приведем в таблице III.11 сводные сведения об использовании регистров общего назначения в командах МП семейства Х86.
Таблица III.11
Использование РОН в командах МП семейства Х86
Применение | EAX | EBX | ECX | EDX | ESI | EDI | EBP | ESP |
Пересылки данных | + | + | + | + | + | + | + | * |
Базовый регистр | + | + | + | + | + | + | + | + |
Индексный регистр | + | + | + | + | + | + | + | |
Умножение | + | + | + | + | + | + | + | + |
Деление (делимое) | + | + | ||||||
Деление (остаток) | + | |||||||
Счетчик цикла | + | |||||||
Операции с цепочками | + | |||||||
Цепочка – источник | + | |||||||
Цепочка – получатель | + | |||||||
Адрес ввода/вывода | + | |||||||
Данные ввода/вывода | + | |||||||
Указатель таблицы | + |
Примечание:
* - не рекомендуется
Дата добавления: 2015-08-21; просмотров: 123 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
БЛАГОДАРНОСТИ | | | Ход работы |