Формат команды микропроцессора IA-32



Инструкция микропроцессора может содержать следующие поля:

 

префикс КОП Mod R/M SIB смещение непосредственный операнд
0/1 байт 1/2 байта 0/1 байт 0/1 байт 0/1/2/4 байта 0/1/2/4 байта

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

Типы префиксов:

  1. командные префиксы (префиксы повторения) REP, REPE/REPZ, REPNE/REPNZ;
  2. префикс блокировки шины LOCK;
  3. префиксы размера;
  4. префиксы замены сегмента.

 

КОП - код операции.

Байт "Mod R/M" определяет режим адресации, а также иногда дополнительный кодоперации. Необходимость байта "Mod R/M" зависит от типа инструкции.

БайтSIB (Scale-Index-Base) определяет способ адресации при обращении к памяти в 32-битном режиме. Необходимость байта SIBзависит от режима адресации, задаваемого полем "Mod R/M".

 

Кроме того, инструкция может содержать непосредственный операнд и/или смещение операнда в сегменте данных.

 

На размер инструкции накладывается ограничение в 15 байт. Инструкция большего размера может получиться при некорректном использовании большого количества префиксов. В IA-32 в таком случае генерируют исключение #13.

 

Если инструкция микропроцессора требует операнды, то они могут задаваться следующими способами:

1. непосредственно в коде инструкции (только операнд-источник);

2. в одном из регистров;

3. через порт ввода-вывода;

4. в памяти.

 

Для совместимости с 16-битными процессорами архитектура IA-32 использует одинаковые коды для инструкций, оперирующих как с 16-битными, так и 32-битными операндами.

 

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

1. режима работы,

2. бита D дескриптора используемого сегмента,

3. наличия в инструкции определенных префиксов.

 

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

 

Регистровый режим адресации определят операнд-источник или операнд-приемник в одном из регистров процессора или сопроцессора.

 

В некоторых случаях, (например, в инструкциях DIV и MUL) могут использоваться пары 32-битных регистров (например, EDX:EAX), образуя 64-битный операнд.

Адресация через порт ввода-вывода подразумевает получение операнда или сохранение операнда через пространство портов ввода-вывода. Адрес порта ввода-вывода либо непосредственно включается в код инструкции, либо берется из регистра DX.

 

Очень распространенный способ адресации операнда - адресация через память. Таким образом, может быть указан операнд-источник или операнд-приемник. Следует отметить, что процессор не позволяет одновременно задавать оба операнда через память (за исключением некоторых цепочечных команд).

 

Для получения операнда из памяти процессору необходимо знать:

1. селектор сегмента,

2. смещение в сегменте.

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

1. CS -для выборки инструкций;

2. SS - для работы со стеком или обращения к памяти через регистры ESP или EBP;

3. ES - для получения адреса операнда-приемника в цепочечных командах;

4. DS - при всех остальных обращениях к памяти.

Явное использование сегментных регистров возможно, если в код инструкции включается префикс смены сегмента.

Указание префикса смены сегмента допустимо не для всех команд:

1. нельзя менять сегмент для команд работы со стеком (всегда используется SS);

2. для цепочечных команд можно менять сегмент только операнда-источника (операнд-приемник всегда адресуется через ES).

 

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

 

EA = BASE + (INDEX*SCALE) + DISPLACEMENT

 

Такая схема позволяет в языках высокого уровня и на языке Ассемблера легко реализовать работу с массивами.

 


Дата добавления: 2021-11-30; просмотров: 25; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!