Формат и кодирование команды.




Атрибуты размеров операнда и адреса.

Процессоры семейства 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.2.

Основное назначение этого байта – определение месторасположения операндов, заданных в команде, а также способа вычисления эффективного адреса операнда, который располагается в памяти. Кодирование “mode” в байте “mod R/M” кода команды приведено в табл. III.5.

 

7 6 5 4 3 2 1 0

mod reg/op reg/mem

Код регистра или способ вычисления эффективного адреса ЕА (при mode # 11). Определяет месторасполо- жение первого операнда совместно с байтом SIB (если он присутствует)
Код типа смещения DISP при вычислении эффективного адреса, или указание на регистровую адресацию
Код регистра, определяющего месторасположение второго операнда или расширение кода операции

 

Рис.III.2 Формат байта “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» этого байта. Использование же этого байта в командах дает возможность при косвенной адресации использовать в качестве базовых регистров не только регистры EBX и EBP, но и все остальные регистры общего назначения EAX, ECX, EDX, ESP, ESI, EDI. Кроме того, в этом случае, все эти регистры, кроме ESP, можно использовать и в качестве индексных регистров.

Формат байта 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 битовой адресации, и использовании байта SIB (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-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-04-03 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: