Формат машинных команд IA-32

Машинная команда представляет собой закодированное по определенным правилам указание процессору на выполнение некоторой операции. Правила кодирования команд называются форматом команд. Команды процессоров архитектуры IA-32 считаются сложными. Максимальная длина машинной команды IA-32 превышает 10 байт. Реальная команда может содержать гораздо меньшее количество полей, вплоть до одного - только код операции.

Как на уровне формата машинной команды соответствуют между собой машинные команды и команды ассемблера? Для примера рассмотрим типичную команду языка ассемблера: mov ebx, eax

Команда mov производит копирование содержимого регистра ЕАХ в регистр ЕВХ. Соответствующая машинная команда будет выглядеть так:

8B D8

Значение 8В - код операции. Еще один пример команды mov: mov ecx, 128

Данная команда инициализирует содержимое регистра ЕСХ десятичным значением 128. Соответствующая машинная команда выглядит так:

B9 00000080

Значение поля с кодом операции - В9. Из примеров видно, что прямого соответствия между структурой команды ассемблера и соответствующей машинной командой нет. Несмотря на то, что команда ассемблера одна и та же (mov), коды машинных команд - разные (8В и В9). Большинство команд ассемблера имеют несколько возможных вариантов сочетания операндов. Как показано в приведенных примерах, несмотря на одинаковые названия команд ассемблера, для каждого возможного сочетания операндов имеется своя машинная команда, со своим значением поля кода операции. Это говорит о том, что машинная команда всегда однозначна по отношению к производимым ею действиям на уровне аппаратуры. Несколько упрощая реальность, можно утверждать, что значение в поле кода операции является номером микропрограммы в блоке микропрограммного управления для каждой конкретной команды ассемблера с каждым конкретным вариантом сочетания операндов.

Логически любая команда языка ассемблера содержит несколько элементов.

Элемент, описывающий, что делать, называется кодом операции (КОП). Значение в поле кода операции некоторым образом определяет в блоке микропрограммного управления подпрограмму, реализующую действия для данной команды.

Элементы, описывающие объекты, с которыми нужно что-то делать, являются операндами. Операнды в команде могут и не задаваться, а подразумеваться по умолчанию.

Элементы, описывающие, как делать, являются типами операндов и обычно задаются неявно. Они используются транслятором ассемблера при формировании машинной команды для определения значения поля кода операции.

Эти же элементы имеет и машинная команда, но в закодированном виде. Перевод команд ассемблера в соответствующие машинные команды осуществляет специальная программа - ассемблер, которую можно также назвать транслятором (компилятором) ассемблера.

Рассмотрим поля машинной команды.

Префиксы - необязательные однобайтные элементы машинной команды. Назначение префиксов - изменить действия, выполняемые командой. Префиксы могут указываться программистом явно при написании исходного текста программы, либо их, по определенным соображениям, может вставить ассемблер. Процессор распознает префиксы по их значениям. Машинная команда может иметь до четырех префиксов одновременно. В памяти префиксы предшествуют команде. Порядок их следования при этом может быть любым.

Код операции - обязательный элемент, описывающий операцию, выполняемую командой. Код операции может занимать от одного до трех байт. Для некоторых машинных команд часть битов кода операции может находиться в байте mod r/m.

Многим командам соответствует несколько кодов операций, каждый из которых определяет нюансы выполнения операции. Отметим, что поле кода операции не имеет однозначной структуры. В зависимости от конкретных команд, не обязательно разных с точки зрения языка ассемблера, оно может иметь в своем составе от одного до трех элементов. Один из этих трех элементов является непосредственно кодом операции или ее частью, остальные уточняют детали операции. Такое строение поля кода операции усложняет, в частности, процесс дизассемблирования. Для определения размера и границ очередной команды необходимо полностью проанализировать ее поле кода операции.

Рассмотрим назначение дополнительных битов поля кода операции:

Поле Кол-во битов Назначение
     
d   Определяет направление передачи данных: 0 - передача данных из регистра reg в память (или регистр), адресуемую полем r/m;1 - передача данных из памяти (или регистра), адресуемой полем r/m, в регистр reg. При наличии байта sib адрес операнда в памяти формируется с учетом содержимого этого байта
     
s   Задает необходимость расширения 8-разрядного непосредственного операнда до 16 или 32 бита. Старшие биты при этом заполняются значением старшего (знакового) бита исходного 8-разрядного операнда
w   Определяет размер данных, которыми оперирует команда: байт, слово, двойное слово: 0 - 8 битов; 1 - 16 битов для 16-разрядного размера операндов или 32 бита для 32-разрядного размера операндов
reg   Определяет регистр, используемый в команде. Значение поля зависит от поля w, в том числе если поле w отсутствует

Последующие поля машинной команды определяют характеристики и местоположение операндов, участвующих в операции, и особенности их использования.

Байт режима адресации mod r/m – иногда называемый постбайтом, несет информацию об операндах и режиме адресации. Большинство команд процессора Intel -двухоперандные. Операнды могут находиться в памяти, а также в одном или двух регистрах. Архитектура IA-32 не допускает, чтобы оба операнда команды находились в памяти. Если операнд находится в памяти, то байт mod r/m определяет компоненты (смещение, базовый и индексный регистры), используемые для вычисления его эффективного адреса. Байт mod r/m состоит из трех полей.

─ Поле mod (два бита) определяет способ адресации и количество байтов, занимаемых в команде адресом операнда (поле смещения в команде). Поле mod используется совместно с полем r/m, которое определяет способ модификации адреса операнда полем смещения в команде. Поле mod в комбинации с полем r/m образует 32 возможных значения, обозначающих один из восьми регистров и 24 режима адресации.

mod Способ адресации
  Поле смещения в команде отсутствует и адрес операнда определяется содержимым базового и/или индексного регистра. Какие именно регистры потребуются для вычисления эффективного адреса, определяется значением этого байта.
  Поле смещения в команде присутствует, занимает один байт и модифицируется содержимым базового и/или индексного регистра.
  Поле смещения в команде присутствует, занимает два или четыре байта (в зависимости от значения, действующего по умолчанию или определяемого префиксом размера адреса) и модифицируется содержимым базового и/или индексного регистра.
  Операндов в памяти нет - они находятся в регистрах. Это же значение байта mod используется в случае, когда команда работает с непосредствен­ным операндом

─ Поле reg (3 бита) определяет либо регистр, находящийся в команде на месте второго операнда, либо возможное расширение кода операции.

Поле reg w=0 w=1
16-раз. опер. 32-раз. опер.
  AL AX EAX
  CL CX ECX
  DL DX EDX
  BL BX EBX
  AH SP ESP
  CH BP EBP
  DH SI ESI
  BH DI EDI

─ Поле r/m используется совместно с полем mod и определяет либо регистр, находящийся в команде на месте первого операнда (если mod = 11), либо базовые и индексные регистры, применяемые для вычисления эффективного адреса (совместно с полем смещения в команде).

В архитектуре Intel один из операндов обязательно находится в регистре, и он может быть первым или вторым. Расположение первого и второго операндов в формате команды фиксировано. Но, например, команда mov может выполнять пересылку как из регистра в память, так и из памяти в регистр. В машинном представлении это одна и та же команда. В ее поле reg будет содержаться код регистра, а в поле r/m - код режима адресации. Эти две команды будут различаться только одним битом d, который определяет направление передачи. Если в команде участвуют два регистра, то в этом случае вступает в силу правило: поле reg определяет второй операнд, а поле r/m - первый.

Байт масштаба, индекса и базы (Scale-Index-Base - sib) используется для расширения возможностей адресации операндов. На наличие байта sib в машинной команде указывает сочетание одного из значений 01 или 10 поля mod и значения поля r/m= 100. Байт sib состоит из трех элементов.

─ В поле масштаба (ss) размещается масштабный множитель для индексного компонента index, занимающего следующие три бита байта sib. В поле ss может содержаться значение 1, 2, 4 или 8. При вычислении эффективного адреса на это значение будет умножаться содержимое индексного регистра.

─ Поле index позволяет хранить номер индексного регистра, содержимое которого применяется для вычисления эффективного адреса операнда.

─ Поле base требуется для хранения номера базового регистра, содержимое которого также применяется для вычисления эффективного адреса операнда. В качестве базового и индексного регистров могут использоваться большинство регистров общего назначения.

Поле смещения в команде - это 8-, 16- или 32-разрядное целое число со знаком, представляющее собой полностью или частично значение эффективного адреса операнда.

Поле непосредственного операнда - необязательное поле, представляющее собой
8-, 16- или 32-разрядный непосредственный операнд.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: