Система команд
32-разрядных процессоров является существенно расширенной системой команд
8086/80286. Расширения касаются увеличения разрядности адресов и операндов,
более гибкой системы адресации, появления принципиально новых типов данных (битовые строки и поля) и команд.
Команды
(инструкции) содержат одно- или двухбайтный код инструкции, за которым могут
следовать несколько байт, определяющих режим исполнения команды и операнды.
Команды могут использовать до трех операндов (или ни одного).
Результат выполнения записывается в место, предопределенное инструкцией, или (и)
в место, заданное операндом назначения. Операнды могут находиться в
памяти, регистрах процессора или непосредственно в команде. Для 32-разрядных процессоров
разрядность «слова» (word) по умолчанию может
составлять 32 бит, а не 16. Это распространяется на многие инструкции, включая
и строковые. В реальном режиме и режиме виртуального
8086 по умолчанию используется 16-битная
адресация и 16-битные операнды-слова. В защищенном режиме, режим адресации и разрядность слова по умолчанию
определяются дескриптором кодового
сегмента. Перед любой инструкцией может быть использован префикс переключения разрядности адреса или
слова. При адресации памяти использование
сегментного регистра, предусмотренного командой, в ряде инструкций
может подавляться префиксом изменения сегмента (Segment
Override). Назначение префиксов раскрыто в табл. 1. Префиксы могут использоваться в любом сочетании (не более одного из каждой группы),
их действие распространяется только
на одну инструкцию.
Таблица 1. Назначение
префиксов инструкций
Инструкции пересылки данных (табл. 2.1) позволяют передавать константы или переменные между регистрами и памятью, а также
портами ввода/вывода в различных
комбинациях, но в памяти может находиться не более одного операнда. В
эту группу отнесены и инструкции преобразования форматов — расширений
и перестановки байт. Операции со стеком выполняются словами с разрядностью, определяемой текущим режимом. При
помещении в стек слова указатель стека SP уменьшается на число
байт слова (2 или 4), при извлечении — увеличивается. «Классические» (8086)
инструкции пересылки не влияют на содержимое
регистра флагов. Инструкции пересылки по результатам сравнения (CMPXCHG)
модифицируют флаг ZF. Новые инструкции условной пересылки (CMOVxx) позволяют сократить число ветвлений в
программе.
Инструкции двоичной
арифметики (табл. 2.2) выполняют все арифметические действия с байтами, словами и двойными
словами, кодирующими знаковые или беззнаковые
целые числа. Умножение и деление для 8086 возможны
только с аккумулятором, результат для 16-битных операндов расширяется в DX. Для
286+ возможно двух и трехадресное умножение с расширением только в старший байт
(два байта для 386+).
Инструкции десятичной
арифметики являются
дополнением к предыдущим. Они позволяют оперировать с
неупакованными (биты [7:4]=0, биты [3:0] содержат десятичную цифру 0-9) или
упакованными (биты [7:4] содержат старшую, биты [3:0] — младшую десятичную
цифру 09) двоично-десятичными числами.
Арифметические операции над этими числами требуют применения инструкций
коррекции форматов (табл. 2.3).
Инструкции логических
операций (табл. 2.4) выполняют все функции булевой алгебры над байтами, словами или двойными
словами.
Сдвиги и вращения
(циклические сдвиги) (табл. 2.5) выполняются над регистром или операндом в памяти. Число позиций, на
которое производится сдвиг, берется из непосредственного операнда или
регистра CL по модулю 8 для однобайтного операнда и по модулю 16 или 32
для операнда-слова, в зависимости от разрядности данных (32 только для 386+).
Биты, выталкиваемые при сдвигах, попадают во флаг CF. При сдвигах влево и
простом сдвиге вправо освобождающиеся биты заполняются нулями (инструкции SAL
и SHL — синонимы). При
арифметическом сдвиге вправо старший бит (знак) сохраняет свое значение.
При циклических сдвигах выталкиваемые биты попадают и во флаг CF, и в освобождающиеся позиции. В сдвигах могут
участвовать и два операнда (инструкции SHLD и SHRD).
Инструкции обработки
бит и байт (табл. 2.6) позволяют проверять (копировать
в CF) и устанавливать значение указанного операнда, а также искать
установленный бит. Битовые операции выполняются над 16- или 32-битным словом
памяти или регистром. Инструкции BSF, BSR и ВТ
не изменяют значения слова; ВТС, BTR и BTS воздействуют на
указанный бит слова r/m.
Номер интересующего бита берется из операнда по модулю 16 или 32, в
зависимости от разрядности.
Операции с байтами
обеспечивают условную установку значений 00h или 0lh. Инструкция тестирования
может выполняться над байтом, словом или двойным
словом.
Передача управления (табл.
2.7) осуществляется с помощью инструкций безусловных
и условных переходов, вызовов процедур и прерываний (исключений). Безусловный
переход (JMP) может быть как внутрисегментным (ближним или коротким), так и межсегментным (дальним). Адрес перехода может
непосредственно указываться в команде, или при косвенной адресации находится в
регистре или памяти и может иметь дополнительные слагаемые. Короткий
переход (short) может передавать управление
только на адрес назначения, удаленный от текущего в пределах -128...+127 байт, ближний
(near) — в пределах сегмента. При дальнем (far) переходе адрес назначения (непосредственный или косвенный) включает новое значение указателя инструкций
и значение (или селектор) сегмента кода, обеспечивая доступ к любой точке памяти (в пределах, разрешенных защитой).
Условные переходы в 8086 и 80286 возможны только
короткие (8-байтное смещение), процессоры 386+ допускают переход в пределах 16-
или 32-байтного смещения, в зависимости от
режима адресации. Условные переходы выполняются по состоянию флагов и/или содержимому регистра СХ (ЕСХ).
Инструкции циклов комбинируют условный
переход с декрементом регистра СX(ЕСХ).
Инструкция вызова
процедуры (CALL) передает управление в точку перехода, сохраняя адрес следующей за ней инструкции в стеке. По инструкции возврата
(RЕT) этот адрес восстановится в указатель инструкций IP(EIP) и в CS при дальнем
вызове. Как и безусловный переход, вызов и возврат могут быть
как внутрисегментными (ближним), так и межсегментными, допуская те же режимы адресации. Межсегментные вызовы и возвраты в защищенном
режиме осуществляются через шлюзы
вызовов.
Строковые операции (табл.
2.8) выполняются с операндами в памяти, адресуемыми регистрами DS:SI
(DS;ESI) для источника и ES:DI (ES:EDI) для приемника. Операции могут использоваться с префиксами условного или
безусловного повтора. После каждой пересылки или сравнения индексные
регистры (SI, DI или оба) участвующих операндов
автоматически инкрементируются или декрементируются на количество байт,
участвующих в операции (1,2 или 4). Направление модификации определяется флагом
DP. DF=0 — инкремент, DF=1 — декремент.
Строковые инструкции ввода/вывода с префиксами повтора позволяют достигать высоких скоростей обмена с портами,
ценой полной загрузки процессора.
Операции с флагами (табл.
2.9) позволяют изменять значения отдельных флагов, а также сохранять их значение в стеке (или регистре АН) и
восстанавливать сохраненные значения.
Инструкции загрузки
указателей (табл. 2.10) позволяют загружать дальние указатели из памяти в регистр общего назначения
и соответствующий сегментный регистр.
Кроме того, с сегментными регистрами возможны стековые операции PUSH и
POP, а также обмен через регистры общего назначения (MOV).
В табл. 2.11 приведены разные инструкции, не
входящие в вышеперечисленные классы.
Инструкция ENTER служит
для подготовки вызовов процедур (с поддержкой
вложенности) в языках высокого уровня. Она выделяет область переменных
в стеке. Обратная инструкция LEAVE восстанавливает исходное значение указателя стека.
Инструкции ММХ (табл.
2.12) имеют сложную мнемонику, которая включает следующие элементы:
· префикс Р (Packed), указывающий на обработку упакованных форматов;
· мнемонику операции (например, ADD, CMP или XOR);
· суффикс, указывающий тип насыщения: US (Unsigned Saturation) — насыщение
беззнаковое, S (Signed
saturation) -насыщение знаковое;
· суффикс, указывающий тип данных: B — упакованные байты, W — упакованные слова, D
— упакованные двойные слова, О — учетверенное слово.
Инструкции,
у которых типы входных и выходных данных различаются (например,
преобразования), имеют два суффикса.
Для
инструкций пересылки данных операнды источника и назначения могут находиться в памяти (т32 или т64),
целочисленных регистрах (ir32) или регистрах ММХ (mm). Для остальных инструкций, кроме
вышеперечисленных, операндисточник может быть и непосредственным, а операнд
назначения всегда является регистром
ММХ. Для операндов,
находящихся в памяти, применимы все
существующие режимы адресации.
Инструкции расширения
3DNow! (табл. 2.13) появились с процессорами AMD
K6-2. Эти инструкции становятся весьма популярными, хотя процессоры Intel, их не поддерживают.
Инструкции
математического сопроцессора (FPU) (табл. 2.14),
имеют свою специфику задания операндов. Переменная st(0)
находится на вершине стека сопроцессора, st(i) смещена от вершины на i.
Загрузка данных начинается с декремента указателя стека сопроцессора (поле TОР)
— перемещения вершины. Если новая вершина не пустая (по полю TAG) или
стек исчерпан, вызывается исключение с указанием причины. После загрузки поле TAG
устанавливается в соответствии с
загруженным числом. При извлечении из стека производится инкремент ТОР,
а в поле TAG старой вершины устанавливается признак пустой ячейки. Попытка использования пустого регистра в операциях
или для сохранении
результатов в памяти вызывает исключение. Инструкции с префиксом «F»
предварительно проверяют флаг исключения ES (они называются ожидающими
инструкциями), инструкции с префиксом «FN» флаг исключения не проверяют (не ожидающие инструкции). Ряд инструкций не вызывает
исключения в случае, если обнаруживаются операнды не-числа
(NaN).
К системным инструкциям (табл. 2.15) относятся инструкции
управления защитой — загрузки и сохранения регистров дескрипторов и регистра
задачи; проверки и выравнивания привилегий;
обмена с управляющими, отладочными и
модельно-специфическими (включая тестовые) регистрами; управления кэшированием, захвата шины и остановки процессора.
В табл. 2.1-2.15 приняты
следующие обозначения:
·
reg — 16/32-битный
регистр;
·
тет — 16/32-битная
ячейка памяти, адресуемая регистрами процессора;
·
r8,
r16, r32 — только 8-, 16- или 32-битный регистр;
·
т8, т16, т32, т64 — только 8-, 16-, 32- или 64-битная ячейка памяти, адресуемая регистрами;
·
r/m — 8/16/32-битный регистр или ячейка
памяти, адресуемая регистрами процессора;
·
r/m/i — 8/16/32-битный регистр, ячейка
памяти, адресуемая регистрами процессора,
или непосредственный операнд;
·
i — непосредственный
операнд 8, 16, 32 или 64 бит;
·
i8, i16 — непосредственный операнд 8,
16 бит;
·
moffsS, moffs16, moffs32 — 8-, 16- или 32-битная ячейка, адресуемая
в команде
(не через регистры процессора);
·
ptr16:16, ptr16:32 -- операнд-указатель: 16-битный селектор и 16/32-битное смещение;
·
т16:16, т16:32 — ячейка памяти, содержащая указатель;
·
rel8, rel16, rel32 — смещение короткое (127 байт) или ближнее внутри сегмента кода относительно адреса следующей инструкции;
·
st(0) — верхушка стека FPU;
·
st(i) — регистр стека FPU, смещенный от
верхушки на i;
·
m80bcd
-- упакованное 10-байтное двоично-десятичное число в памяти, используемое FPU;
·
m16int, m32int, m64int — целочисленные значения в памяти, используемые FPU;
·
m32real, m64real, m80real — вещественные числа в памяти, используемые FPU;
·
m94/108byte — образ
регистров (контекста) FPU в памяти, включая стек;
·
m14/28byte — образ
состояния FPU в памяти;
·
т16&32 — 6-байтная
структура в памяти (база и лимит GDT и IDТ).
·
Красным цветом
помечены инструкции, имеющие отношение только к защищенному режиму.
Для
некоторых инструкций в таблицах через косую черту указаны мнемоники-синонимы,
расшифровка дается применительно к первой из них или наиболее лаконичной.
Операнд назначения в списке всегда стоит первым, во многих случаях он может
одновременно являться и одним из операндов источников.
Таблица 2.1. Инструкции пересылки данных
Таблица 2.2. Инструкции двоичной арифметики
Таблица 2.3.
Инструкции десятичной арифметики
1 Инструкции AAD и ААМ
допускают обобщенный формат вызова, при котором коррекция выполняется по любому
модулю (а не только по модулю 10).
Таблица 2.6. Инструкции обработки бит и байт
Таблица 2.7. Инструкции передачи управления
Таблица 2.8. Инструкции строковых операций
Таблица 2.9. Инструкции
работы с флагами
Таблица 2.10. Инструкции загрузки указателей
Таблица 2.11. Разные
инструкции
Таблица 2.13. Инструкции 3DNow!
Таблица 2.14. Инструкции FPU