Структура команды
Структура команды определяется составом, назначением и расположением полей в коде команды.
Форматом командыназывается заранее оговоренная структура полей ее кода сразметкой номеров разрядов (бит), определяющих границы отдельных полей команды, или с указанием числа разрядов (бит) в определенных полях, позволяющая ЭВМ распознавать составные части кода.
Рассмотрим пример формата скалярной команды обработки данных для процессора Intel-32 (рис.10).
Единственным обязательным полем является поле кода операции (код команды), все остальные поля необязательны и могут отсутствовать.

Рис. 10. Структура команды
Код операции (КОП)определяет тип выполняемой операции, а также в некоторых командах в первом байте может содержаться бит W, задающий разрядность операндов (пример –ADC– 0001001w):
W = 0 — операция с байтами,
W = 1 — операция со словами (16 или 32 разряда); для 32-разрядных процессоров по умолчанию разрядность слова обычно принята 32, что определяет содержимое дескриптора сегмента кода (CS), для изменения используются префиксы.
В ряде команд (DEC) первый байт КОП содержит поля reg или sreg, определяющие адрес используемых регистров. Трёхбитовое поле reg задает выбираемый регистр в соответствии с разрядностью обрабатываемых операндов. Поле sreg (двух или трехбитовое) определяет адрес сегментного регистра.
Префиксы инструкций делятся на 4 группы:
префиксы повторения;
префикс блокировки;
префиксы выбора сегментного регистра;
префиксы переключения разрядности адреса или слова.
Префиксы повторенияREP,REPE,REPZ,REPNE,REPNZиспользуются для работы со строковыми командами. Они организуют цикл повторения строковой команды до окончания просмотра строки-источника или до выполнения какого-либо условия.
Префиксы блокировкиLOCKинициирует выдачу сигнала блокировки системной шины во время выполнения текущей команды.
Префиксы выбора сегментного регистра.При обращениях к памяти использование сегментных регистров по умолчанию определяется типом обращения (выборка кода команды – регистр сегмента кодаCS, чтение/запись данных – регистр сегмента данных). Для большинства типов обращения на время текущей инструкции возможно указание альтернативного сегментного регистра, что обеспечивает префикс замены сегмента (CS:,ES:,DS:,SS:,FS: илиGS:) перед кодом инструкции (табл. 1).
ES: ADD EAX,[EBX+ESI]
Таблица 1. Использование сегментных регистров при обращении к памяти
|
Тип обращения к памяти |
Сегментный регистр | |
|
по умолчанию |
альтернативный | |
|
Выборка команд |
CS |
Нет |
|
Стековые операции |
SS |
Нет |
|
Строка-приемник |
ES |
Нет |
|
Любые другие ссылки на память, кроме тех, которые используют в качестве базового регистр EBP[0÷31] или ESP[0÷31] |
DS
|
CS, ES, SS, FS, GS
|
|
Ссылки на память, использующие в качестве базового регистр EBP[0÷31] или ESP[0÷31] |
SS |
CS, DS, ES, FS, GS |
Префиксы переключения разрядности адреса или слова(SIZ,ADDRSIZ) позволяют на время выполнения команды изменить разрядность машинного слова или адреса памяти (1632).
В команде может присутствовать до четырёх префиксов (по одному из разных групп) или вообще не присутствовать.
Большинство команд, которые обращаются за операндом в оперативную память, имеют адресующий байт спецификатора (названный ModR/Mбайтом).
Поле MODуказывает, какой разрядности смещение используется для формирования адреса. Если оно имеет значение 00 (при некоторых значениях R/M) или 01, 10, то используется 8-, 16- или 32-разрядное смещение. Это смещение задается соответствующими байтами в коде команды, которые располагаются после байтов адресации. ПолеModможет объединяться с полемR/M. Может формировать 32 значения: 8 регистров и 24 способа адресации.
поле Reg/Opcode задает номер регистра или служит для продолжения кода команды (3 бита).В одноадресных командах поле Reg/Opcode содержит дополнительные биты кода операции. В двухадресных командах поле REG содержит адрес регистра, в котором хранится второй из операндов. Тип команды (одно- или двухадресная) определяется первым битом КОП.
поле R/M может определять регистр как операнд или может быть объединено с полем Mod для формирования способа адресации.
Некоторые ModR/M байты требуют второй адресный байт, SIBбайт для того, что бы полностью определить форму адресации. SIB байт включает следующие области (поля):
масштаб (scale);
база (base);
индекс (index).
3-битовые поля INDEX и BASE, определяют выбор регистров, используемых в качестве индексного и базового регистров, и 2-битовое поле scale, задающее масштабный коэффициент для модификации значения индекса. Допускаются только 4 значения масштабного коэффициента:
1–код 00, 2–код 01, 4–код 10, 8–код 11.
Некоторые формы адресации включают смещениев формат команды сразу после ModR/M или SIB байтов. Если смещение требуется, это может быть 1, 2, или 4 байта в зависимости от величины самого смещения.
При выполнении операций с непосредственной адресацией (константой) она задается в последних байтах команды (рис. 10). В этом случае КОП ряда команд содержит бит S, определяющий способ использования непосредственно задаваемых данных. Константа может занимать 1байт (S=0), 2 или 4 байта (S=1) по аналогии с битомWв поле КОП.
Команды содержат от 1 до 11 байт. Проведенные оценки показывают, что в среднем длина команды составляет 4 — 5 байт.
Для команд передачи управления вместо адресов операндов (результата), в адресной части команды может храниться адрес следующей команды. Такие адреса могут бытьотносительнымии показывать смещение внутри текущего кодового сегмента относительно адреса текущей команды (EIP– указателя команд). Это смещение может быть положительным (в сторону старших адресов) и отрицательным (к началу программы). Адрес может бытьабсолютным, т.е. показывать смещение внутри текущего кодового сегмента относительно его начала. Существуют и так называемые межсегментные вызовы, тогда адрес следующей команды складывается из адреса вызываемого сегмента и смещения внутри этого сегмента относительно его начала (только положительное).
Режимы адресации процессоров INTEL
Интеловский 32-разрядный процессор реализует сегментную организацию оперативной памяти, при которой физический адрес ячейки памяти формируется путем сложения начального базового адреса сегмента и исполнительного адреса (ячейки внутри сегмента).
Базовый адрес сегмента определяется содержимым 16-разрядного сегментного регистра и зависит от режима работы процессора. Если он работает в режиме обработки 16-разрядных данных (RealMode- режим реальных адресов), то 20-разрядный базовый адрес формируется путем сдвига содержимого сегментного регистра на 4 разряда влево. Если процессор работает в режиме обработки 32-разрядных данных (ProtectedMode- защищенный режим), то 32-разрядный базовый адрес содержится в дескрипторе, выбор которого из таблицы дескрипторов осуществляется с помощью селектора — содержимого соответствующего сегментного регистра.
Исполнительный адрес Аиявляется 16- или 32-разрядным в зависимости от атрибутов дескриптора кодового сегмента. Разрядность адреса может быть изменена на время выполнения текущей команды префиксомADDRSIZ. Аиформируется в соответствии с заданным способом адресации в зависимости от значения полей MOD и R/M и содержимого байта SIB (для 32-разрядных адресов). В общем случае Аиобразуется путем арифметического сложения трех компонентов:
- содержимого базового регистра;
- содержимого индексного регистра, умноженного на масштабный множитель;
- 8, 16, 32-разрядного смещения, заданного в одном, двух или четырех байтах команды.
Исполнительный адрес: Аи =Base+IndexScale+Disp

Рис. 11. Возможные способы адресации операндов
В зависимости от значений полей MOD и R/M для формирования ЕА используются все или часть этих слагаемых.
В процессоре Intelсуществуют способы адресации, показанные в табл.2.
Отдельно следует рассмотреть форматы команд сопроцессора (FPU–FloatPointUnit) для обработки чисел с плавающей запятой. Эти команды появились позднее вместе с самим блокомFPU. Однобайтовые коды были почти все уже использованы для целочисленных операций и, как правило, все коды команд обработки чисел с плавающей точкой занимают два байта. Такие команды оперируют действительными данными из набора регистров, входящих в блок FPU, изображен на рис. 12 и целочисленными данными из ОП.
Для целочисленных данных из ОП используются те же режимы адресации, что были описаны выше. Для действительных операндов и результатов в формате команды указывается номер соответствующего регистра данных блока FPU, например:
FMULST(0),ST(i).
Для таких команд адрес операнда ST(0) всегда задается неявно, а адрес операндаST(i) – номер регистраi, задаётся в последних бита кода операции:
-
КОП
D8C8+i
Длина команды 2 байта
Регистры данных FPU – 80-разрядные и хранят действительные данные в экспоненциальной форме (±мантисса2×2±порядок).

Рис. 12. Регистры данных блока FPU.
Таблица 2. Режимы адресации операндов
|
Режим |
Формула вычисления исп. адреса |
Пример записи на ассемблере |
Формат команды в кодах | ||||
|
непосредственная адресация (Immediate mode) |
вместо адреса присутствует сам операнд |
ROL var,6 |
| ||||
|
регистровая адресация (Register Mode) |
Аи=код регистра |
DIV EDI |
| ||||
|
Прямая адресация (Direct Mode) |
Аи=Disp |
DIV VAR1 |
| ||||
|
Косвенная регистровая адре-сация (Register Indirect Mode) |
Аи=Base |
DIV [EBX] |
| ||||
|
Базовая адресация (Based Mode) |
Аи=Base+Disp |
DIV MAS1[EBX] |
| ||||
|
Индексная адресация (Index Mode) |
Аи=Index+Disp |
DIV MAS1[ESI] |
| ||||
|
Масштабированная индексная адресация (Scaled Index Mode) |
Аи=ScaleIndex+Disp |
DIV MAS1[ESI*4] |
| ||||
|
Базово-индекс. Адресация (Based Index Mode) |
Аи=Base+Index |
DIV [EBX+EDI] |
| ||||
|
Масштабированная базово-индексная адресация (Based Scaled Index Mode) |
Аи=Base+ScaleIndex |
DIV [EBX+EDI*8] |
| ||||
|
Базово-индексная адресация со смещением (Based Index Mode with Displacement) |
Аи=Base+Index+Disp |
DIV А[EBX+EDI] |
| ||||
|
Масшт. базово-индексная адресация со смещением (Based Scaled Index Mode with Displ.) |
Аи=Base+ScaleIndex+Disp |
DIV В[EBX+EDI*8] |
| ||||
|
Относительная (Relative mode) |
Адрес след. команды= EIP+код адреса |
JMP met1 |
|
