Приложение №1.

Обзор системы команд процессоров “x86”.

Система команд 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 приняты следующие обозначения:

·         reg16/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.4. Инструкции логических операций

 


Таблица 2.5. Инструкции сдвигов

 



Таблица 2.6. Инструкции обработки бит и байт

 



Таблица 2.7. Инструкции передачи управления

 




Таблица 2.8. Инструкции строковых операций

 




Таблица 2.9. Инструкции работы с флагами

 


Таблица 2.10. Инструкции загрузки указателей

 


Таблица 2.11. Разные инструкции

 



Таблица 2.12. Инструкции ММХ

 




Таблица 2.13. Инструкции 3DNow!

 



Таблица 2.14. Инструкции FPU

 









Таблица 2.15. Системные инструкции