Форматы команд: Базовый формат команд

Печать
Программирование - Архитектура и система команд микропроцессоров x86

 

Кодировки всех команд являются подмножеством базового формата команды, показанного на рис. 5.1.

 

Базовый формат команды

Рис. 5.1. Базовый формат команды

 

Команда содержит следующие поля:

  • префиксы команды (необязательно присутствуют и могут следовать в произвольном порядке);
  • одно или двухбайтный код операции;
  • спецификатор адреса, состоящий из байта режима адресации ModR/M и байта масштабируемого индекса SIB (Scale Index Base) (необязательно присутствуют);
  • смещение, если оно необходимо;
  • поля непосредственного значения, если такое значение присутствует.

В коде операции могут быть определены более мелкие поля:

  • направление операции;
  • размер смещения;
  • коды регистров;
  • знак расширения.

Эти поля варьируются в зависимости от класса операции.

Большинство команд, которые могут ссылаться на операнд в памяти, содержат байт режима адресации, следующий за байтом (байтами) кода операции. Этот байт, называемый ModR/M байтом, определяет используемую форму (режим) адресации. Кодирование определенным образом байта ModR/M указывает на наличие второго байта спецификатора адреса — SIB байта, который следует сразу же за байтом ModR/M и необходим для полного описания формы адресации.

Формы адресации могут включать в себя смещение, следующее непосредственно за ModR/M байтом или SIB байтом. Присутствующее смещение может быть 8, 16 или 32-битным.

Если в команде присутствует непосредственный операнд, то он всегда следует за байтами смещения и является последним полем в команде.

Для каждой группы префиксов зарезервировано не более одного байта, т.е. префикс данной группы может присутствовать или нет. Префиксы сгруппированы следующим образом:

  • префиксы команды REP, REPE/REPZ, REPNE/REPNZ, LOCK;
  • префиксы замещения сегмента CS, SS, DS, ES, FS, GS;
  • префиксы замещения размера операнда;
  • префиксы замещения размера адреса.

В команде может присутствовать только по одному префиксу из каждой группы. Результат использования избыточного количества префиксов (более одного префикса из группы) неопределен и варьируется от процессора к процессору. Префиксы могут следовать в любом порядке.

Префиксы команды:

  • F3h — REP (используется только со строковыми командами).
  • F3h — REPE/REPZ (используется только со строковыми командами).
  • F2h — REPNE/REPNZ (используется только со строковыми командами).
  • F0h — LOCK.

Префиксы замещения сегмента:

  • 2Eh — префикс замещения сегмента по умолчанию сегментом CS.
  • 36h — префикс замещения сегмента по умолчанию сегментом SS.
  • 3Eh — префикс замещения сегмента по умолчанию сегментом DS.
  • 26h — префикс замещения сегмента по умолчанию сегментом ES.
  • 64h — префикс замещения сегмента по умолчанию сегментом FS.
  • 65h — префикс замещения сегмента по умолчанию сегментом GS.
  • 66h — префикс замещения размера операнда.
  • 67h — префикс замещения размера адреса.