Формат команды микропроцессора IA-32
Инструкция микропроцессора может содержать следующие поля:
префикс | КОП | Mod R/M | SIB | смещение | непосредственный операнд |
0/1 байт | 1/2 байта | 0/1 байт | 0/1 байт | 0/1/2/4 байта | 0/1/2/4 байта |
Префикс - необязательная часть инструкции, которая позволяет изменить некоторые особенности ее выполнения. В команде может быть использовано сразу несколько префиксов разного типа.
Типы префиксов:
- командные префиксы (префиксы повторения) REP, REPE/REPZ, REPNE/REPNZ;
- префикс блокировки шины LOCK;
- префиксы размера;
- префиксы замены сегмента.
КОП - код операции.
Байт "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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!