Часть 4. Инструкции процессора
В этой части в алфавитном порядке описываются инструкции
процессоров 80х86. Для каждой инструкции представлены ее формы со
всеми комбинациями операндов, включая порождаемый объектный код,
требуемые операнды, время выполнения и описания. Приводится также
описание работы каждой инструкции и перечень генерируемый исклю-
чительных ситуаций.
Размер операнда и атрибуты размера адреса
-----------------------------------------------------------------
При выполнении инструкции для обращения к памяти процессора
80х86 используется 16 или 32-разрядная адресация. В итоге, каждая
инструкция, использующая адреса памяти, связывается с атрибутом
размера адреса (16 или 32 бита). В 16-битовых адресах предусмат-
ривается использование 16-разрядного смещения в инструкции и ге-
нерация в качестве результата вычисления действительного адреса
16-разрядного смещения адреса (адрес относительно сегмента). В 32
-битовой адресации подразумевается использование 32-разрядного
адреса и генерация 32-разрядного адресного смещения смещения ад-
реса. Аналогично, инструкция. в которой имеется доступ к словам
(или двойным словам), имеет атрибут размера операнда 16 или 32
бита.
Атрибуты определяются комбинацией значений по умолчанию,
префиксов инструкции и (для программ, выполняющихся в защищенном
режиме) бит спецификации размера в дескрипторах сегмента.
Атрибут сегмента, используемый по умолчанию
-----------------------------------------------------------------
Для программ, выполняемых в защищенном режиме, бит D в деск-
рипторах выполняемого сегмента определяет используемый по умолча-
нию атрибут и для размера адреса, и для размера операнда. Эти ис-
пользуемые по умолчанию атрибуты применяются при выполнении всех
инструкций в сегменте. Нулевое значение бита D подразумевает, что
размер адреса и размер операнда равен 16 битам, а значение, рав-
ное 1, - 32 битам.
Программы, которые выполняются в реальном режиме или вирту-
альном режиме процессора 8086, имеют по умолчанию 16-битовые ад-
реса и операнды.
Префиксы размера операнда и размера адреса
-----------------------------------------------------------------
Внутренняя кодировка инструкции может включать в себя двух-
байтовые префиксы: префикс размера адреса 67Н и префикс размера
операнда 66Н. (В следующем разделе, "Формат инструкций", показана
позиция префиксов в кодировке инструкций.) Эти префиксы переопре-
деляют используемые по умолчанию атрибуты сегмента для последую-
щей инструкции. В Таблице 4.1 показано действие каждой возможной
комбинации значений по умолчанию и переопределений.
Атрибуты действующего размера Таблица 4.1
----------------------------------------------------------------¬
¦Сегмент по умолчанию D= 0 0 0 0 1 1 1 1 ¦
¦Префикс размера операнда 66Н N N Y Y N N Y Y ¦
¦Префикс размера адреса 67Н N Y N Y N Y N Y ¦
¦Действующий размер операнда 16 16 32 32 32 32 16 16 ¦
¦Действующий размер адреса 16 32 16 32 32 16 32 16 ¦
¦ ¦
¦ Y - да, данный префикс инструкции присутствует. ¦
¦ N - нет, данного префикса инструкции нет. ¦
L----------------------------------------------------------------
Размер атрибута адреса для стека
-----------------------------------------------------------------
Инструкции, в которых стек используется неявно (например,
POP EAX), содержат также атрибут размера адреса стека (16 или 32
бита). В инструкциях с атрибутом размера адреса стека 16 исполь-
зуется 16-битовый указатель стека SP, а в инструкциях с атрибутом
размера адреса стека 32 для формирования адреса вершины стека ис-
пользуется 32-битовый регистр SP.
Атрибут размера адреса регистра стека управляется с помощью
бита B дескриптора сегмента данных в регистре SS. Нулевое значе-
ние бита B выбирает атрибут размера адреса стека 16, а значение,
равное 1, выбирает атрибут размера адреса стека 32.
Формат инструкций
-----------------------------------------------------------------
Вся кодировка инструкций является подмножеством общего фор-
мата инструкций, показанного на Рис. 4.1. Инструкции состоят из
необязательного префикса инструкции, одного или двух основных
байт кода операции, возможно спецификатора адреса, содержащего
байт ModR/M и байт SIB (основание адреса масштаба), смещения, ес-
ли оно необходимо, и поля непосредственных данных (если оно тре-
буется).
С помощью основного кода или кодов операции можно определить
меньшие кодируемые поля. Эти поля определяют направление опера-
ции, размеры смещений, кодировку регистров или расширение знака.
Кодируемые поля варьируются в зависимости от класса операции.
Большинство инструкций, которые могут ссылаться на операнд в
памяти, содержат после основного кода операции байт формы адреса-
ции. Этот байт, который называется байтом ModR/M, определяет фор-
му используемого адреса. Определенные кодировки байта ModR/V ука-
зывает второй байт адресации, байт SIB, который следует за байтом
ModR/M и требует полностью определять форму адресации.
-------------T--------------T---------------T-------------------¬
¦ Префикс ¦ Префикс раз- ¦ Префикс раз- ¦ Переопределение ¦
¦ инструкции ¦ мера адреса ¦ мера операнда ¦ сегмента ¦
+------------+--------------+---------------+-------------------+
¦ 0 или 1 0 или 1 0 или 1 0 или 1 ¦
+---------------------------------------------------------------+
¦ Число байт ¦
L----------------------------------------------------------------
--------------T--------T---------T-----------T------------------¬
¦ Код ¦ ModR/V ¦ SIB ¦ Смещение ¦ Непосредственное ¦
¦ операции ¦ ¦ ¦ ¦ значение ¦
+-------------+--------+---------+-----------+------------------+
¦ 1 или 2 0 или 1 0 или 1 0, 1, 2 0, 1, 2 или 4 ¦
¦ или 4 ¦
+---------------------------------------------------------------+
¦ Число байт ¦
L----------------------------------------------------------------
Рис. 4.1. Формат инструкций процессора 386
Виды адресации могут включать в себя непосредственно следую-
щее за байтом ModR/V или SIB смещение. Если смещение присутству-
ет, оно может быть 8, 16 или 32-битовым.
Если в инструкции задается непосредственный операнд, то этот
непосредственный операнд следует за байтами смещения. Непосредс-
твенный операнд, если он задан, всегда является последним полем
инструкции.
Допустимыми являются следующие коды префикса инструкции:
- F2h: префикс REP (используется только со строковыми инс-
трукциями);
- F3h: префикс REPE/REPZ (используется только со строковыми
инструкциями);
- F3h: префикс REPNE/REPNZ (используется только со строковы-
ми инструкциями);
- F0h: префикс LOCK.
Префиксами переопределения сегмента являются следующие пре-
фиксы:
- 2Eh: префикс переопределения сегмента CS;
- 36h: префикс переопределения сегмента SS;
- 3Eh: префикс переопределения сегмента DS;
- 26h: префикс переопределения сегмента ES;
- 64h: префикс переопределения сегмента FS (только для про-
цессора 80386);
- 65h: префикс переопределения сегмента GS (только для про-
цессора 80386);
- 66h: переопределение размера операнда;
- 67h: операнд размера адреса.
Байты ModR/M и SIB
-----------------------------------------------------------------
Во многих инструкциях процессора 80х86 за байтом (байтами)
кода операции следуют байты ModR/M и SIB. Они содержат следующую
информацию; тип индексации или номер регистра, который должен ис-
пользоваться в инструкции, используемый регистр или дальнейшая
информация для выборки инструкции, а также информацию о базе, ин-
дексе и масштабе.
Байт ModR/M содержит следующие поля информации:
- Поле mod, которое занимает два самых старших бита байта,
комбинируется с полем r/m для формирования 32 возможных
значений: 8 регистров и 24 режимов адресации.
- Поле reg, которое занимает следующие три поля за полем
mod, определяет номер регистра или другие три бита инфор-
мации о коде операции. Значение поля reg определяется пер-
выми байтом инструкции (кодом операции).
- Поле r/m, которое занимает три младших бита байта, может
задавать в качестве адреса операнда регистр или может фор-
мировать часть кодировки режима адресации в сочетании с
полем mod, как описано выше.
- Формы с базовой индексацией и масштабируемой 32-разрядной
адресацией требуют наличия байта SIB. Присутствие байта
SIB определяется специальной кодировкой байта ModR/M.
Байт SIB включает в себя следующие поля:
- Поле ss, которое занимает 2 старших бита байта, определяет
масштабный коэффициент.
- Поле index, которое занимает следующие 3 бита за полем ss,
задает для индексного регистра номер регистра.
- Поле base, которое занимает младшие три байта бита, задает
номер базового регистра.
На Рис. 4.2 показан формат байт ModR/M и SIB.
Байт ModR/M
7 6 5 4 3 2 1 0
----------------T--------------------------T--------------------¬
¦ Mod ¦ Регистр/Код операции ¦ R/M ¦
L---------------+--------------------------+---------------------
Байт SIB
7 6 5 4 3 2 1 0
----------------T--------------------------T--------------------¬
¦ SS ¦ Индекс ¦ База ¦
L---------------+--------------------------+---------------------
Рас. 4.2. Формат байт ModR/M и SIB
Значения и соответствующие виды адресации байт ModR/M и SIB
показаны в таблицах 4.2, 4.3 и 4.4
Виды 16-разрядной адресации с байтом ModR/M
Таблица 4.2
------------------T-----T-----T-----T-----T-----T-----T-----T---¬
¦r8(/r) ¦AL ¦CL ¦DL ¦BL ¦AH ¦CH ¦DH ¦BH ¦
¦r16(/r) ¦AX ¦CX ¦DX ¦BX ¦SP ¦BP ¦SI ¦DI ¦
¦r32(/r) ¦EAX ¦ECX ¦EDX ¦EBX ¦ESP ¦EBP ¦ESI ¦EDI¦
¦/цифра(код опера-¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ции) ¦0 ¦1 ¦2 ¦3 ¦4 ¦5 ¦6 ¦7 ¦
¦REG= ¦000 ¦001 ¦010 ¦011 ¦100 ¦101 ¦110 ¦111¦
+-----------------+-----+---T-+-----+-----+-----+-----+-----+---+
¦Действующий адрес¦ ModR/M ¦Значения ModR/M в шестнадцатиричном¦
¦ ¦ ¦виде ¦
+-----------------+----T----+------T---T---T---T---T---T---T----+
¦[BX + SI] ¦ ¦000 ¦ 00 ¦08 ¦10 ¦18 ¦20 ¦28 ¦30 ¦38 ¦
¦[BX + DI] ¦ ¦001 ¦ 01 ¦09 ¦11 ¦19 ¦21 ¦29 ¦31 ¦39 ¦
¦[BP + SI] ¦ ¦010 ¦ 02 ¦0A ¦12 ¦1A ¦22 ¦2A ¦32 ¦3A ¦
¦[BP + DI] ¦ 00 ¦011 ¦ 03 ¦0B ¦13 ¦1B ¦23 ¦2B ¦33 ¦3B ¦
¦[SI] ¦ ¦100 ¦ 04 ¦0C ¦14 ¦1C ¦24 ¦2C ¦34 ¦3C ¦
¦[DI] ¦ ¦101 ¦ 05 ¦0D ¦15 ¦1D ¦25 ¦2D ¦35 ¦3D ¦
¦dis16 ¦ ¦110 ¦ 06 ¦0E ¦16 ¦1E ¦26 ¦2E ¦36 ¦3E ¦
¦[BX] ¦ ¦111 ¦ 07 ¦0F ¦17 ¦1F ¦27 ¦2F ¦37 ¦3F ¦
¦[BX + SI] + dis8 ¦ ¦000 ¦ 40 ¦48 ¦50 ¦58 ¦60 ¦68 ¦70 ¦78 ¦
¦[BX + DI] + dis8 ¦ ¦001 ¦ 41 ¦49 ¦51 ¦59 ¦61 ¦69 ¦71 ¦79 ¦
¦[BP + SI] + dis8 ¦ ¦010 ¦ 42 ¦4A ¦52 ¦5A ¦62 ¦6A ¦72 ¦7A ¦
¦[BP + DI] + dis8 ¦01 ¦011 ¦ 43 ¦4B ¦53 ¦5B ¦63 ¦6B ¦73 ¦7B ¦
¦[SI] + dis8 ¦ ¦100 ¦ 44 ¦4C ¦54 ¦5C ¦64 ¦6C ¦74 ¦7C ¦
¦[DI] + dis8 ¦ ¦101 ¦ 45 ¦4D ¦55 ¦5D ¦65 ¦6D ¦75 ¦7D ¦
¦[BP] + dis8 ¦ ¦110 ¦ 46 ¦4E ¦56 ¦5E ¦66 ¦6E ¦76 ¦7E ¦
¦[BX] + dis8 ¦ ¦111 ¦ 47 ¦4F ¦57 ¦5F ¦67 ¦6F ¦77 ¦7F ¦
¦[BX + SI] + dis16¦ ¦000 ¦ 80 ¦88 ¦90 ¦98 ¦A0 ¦A8 ¦B0 ¦B8 ¦
¦[BX + DI] + dis16¦ ¦001 ¦ 81 ¦89 ¦91 ¦99 ¦A1 ¦A9 ¦B1 ¦B9 ¦
¦[BP + SI] + dis16¦ ¦010 ¦ 82 ¦8A ¦92 ¦9A ¦A2 ¦AA ¦B2 ¦BA ¦
¦[BP + DI] + dis16¦10 ¦011 ¦ 83 ¦8B ¦93 ¦9B ¦A3 ¦AB ¦B3 ¦BB ¦
¦[SI] + dis16 ¦ ¦100 ¦ 83 ¦8С ¦94 ¦9С ¦A4 ¦AC ¦B4 ¦BC ¦
¦[DI] + dis16 ¦ ¦101 ¦ 85 ¦8В ¦95 ¦9D ¦A5 ¦AD ¦B5 ¦BD ¦
¦[BP] + dis16 ¦ ¦110 ¦ 86 ¦8E ¦96 ¦9E ¦A6 ¦AE ¦B6 ¦DE ¦
¦[BX] + dis16 ¦ ¦111 ¦ 87 ¦8F ¦A7 ¦AF ¦A7 ¦AF ¦B7 ¦BF ¦
¦EAX/AX/AL (386) ¦ ¦000 ¦ C0 ¦C8 ¦D0 ¦D8 ¦T0 ¦T8 ¦F0 ¦F8 ¦
¦ECX/CX/CL (386) ¦ ¦001 ¦ C1 ¦C9 ¦D1 ¦D9 ¦E1 ¦E9 ¦F1 ¦F9 ¦
¦EDX/DX/DL (386) ¦ ¦010 ¦ C2 ¦CA ¦D2 ¦DA ¦E2 ¦EA ¦F2 ¦FA ¦
¦EBX/BX/BL (386) ¦ 11 ¦011 ¦ C3 ¦CB ¦D3 ¦DB ¦E3 ¦EB ¦F3 ¦FB ¦
¦ESP/SP/AH (386) ¦ ¦110 ¦ C4 ¦CC ¦D4 ¦DC ¦E4 ¦EC ¦F4 ¦FC ¦
¦EBP/BP/CH (386) ¦ ¦101 ¦ C5 ¦CD ¦D5 ¦DD ¦E5 ¦ED ¦F5 ¦FD ¦
¦ESI/SI/DH (386) ¦ ¦110 ¦ C6 ¦CE ¦D6 ¦DE ¦E6 ¦EE ¦F6 ¦FE ¦
¦EDI/DI/BH (386) ¦ ¦111 ¦ C7 ¦CF ¦D7 ¦DF ¦E7 ¦EF ¦F7 ¦FF ¦
L-----------------+----+----+------+---+---+---+---+---+---+-----
- "dis8" обозначает 8-битовое смещение, следующее за байтом
ModR/M, которое должно расширяться по знаку и добавляться
к индексу;
- "dis16" обозначает 16-итовое смещение, следующее за байтом
ModR/M, которое должно добавляться к индексу;
По умолчанию для действующего адреса, содержащего индексный
регистр BP, действующим адресом является регистр SS. Для других
действующих адресов сегментным регистром будет регистр DS.
Виды 32-разрядной адресации с байтом ModR/M
(только для процессора 80386) Таблица 4.3
------------------T-----T-----T-----T-----T-----T-----T-----T---¬
¦r8(/r) ¦AL ¦CL ¦DL ¦BL ¦AH ¦CH ¦DH ¦BH ¦
¦r16(/r) ¦AX ¦CX ¦DX ¦BX ¦SP ¦BP ¦SI ¦DI ¦
¦r32(/r) ¦EAX ¦ECX ¦EDX ¦EBX ¦ESP ¦EBP ¦ESI ¦EDI¦
¦/цифра(код опера-¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ции) ¦0 ¦1 ¦2 ¦3 ¦4 ¦5 ¦6 ¦7 ¦
¦REG= ¦000 ¦001 ¦010 ¦011 ¦100 ¦101 ¦110 ¦111¦
+-----------------+-----+--T--+-----+-----+-----+-----+-----+---+
¦Действующий адрес¦ModR/M ¦ Значения ModR/M в шестнадцатиричном¦
¦ ¦ ¦ виде ¦
+-----------------+---T----+-------T---T---T---T---T---T---T----+
¦[EAX] ¦ ¦ 000¦ 00 ¦08 ¦10 ¦18 ¦20 ¦28 ¦30 ¦38 ¦
¦[ECX] ¦ ¦ 001¦ 01 ¦09 ¦11 ¦19 ¦21 ¦29 ¦31 ¦39 ¦
¦[EDX] ¦ ¦ 010¦ 02 ¦0A ¦12 ¦1A ¦22 ¦2A ¦32 ¦3A ¦
¦[EBX] ¦ 00¦ 011¦ 03 ¦0B ¦13 ¦1B ¦23 ¦2B ¦33 ¦3B ¦
¦[][] ¦ ¦ 100¦ 04 ¦0C ¦14 ¦1C ¦24 ¦2C ¦34 ¦3C ¦
¦dis32 ¦ ¦ 101¦ 05 ¦0D ¦15 ¦1D ¦25 ¦2D ¦35 ¦3D ¦
¦[ESI] ¦ ¦ 110¦ 06 ¦0E ¦16 ¦1E ¦26 ¦2E ¦36 ¦3E ¦
¦[EDI] ¦ ¦ 111¦ 07 ¦0F ¦17 ¦1F ¦27 ¦2F ¦37 ¦3F ¦
¦dis8[EAX] ¦ ¦ 000¦ 40 ¦48 ¦50 ¦58 ¦60 ¦68 ¦70 ¦78 ¦
¦dis8[ECX] ¦ ¦ 001¦ 41 ¦49 ¦51 ¦59 ¦61 ¦69 ¦71 ¦79 ¦
¦dis8[EDX] ¦ ¦ 010¦ 42 ¦4A ¦52 ¦5A ¦62 ¦6A ¦72 ¦7A ¦
¦dis8[EPX] ¦ 01¦ 011¦ 43 ¦4B ¦53 ¦5B ¦63 ¦6B ¦73 ¦7B ¦
¦dis8[][] ¦ ¦ 100¦ 44 ¦4C ¦54 ¦5C ¦64 ¦6C ¦74 ¦7C ¦
¦dis8[EBP] ¦ ¦ 101¦ 45 ¦4D ¦55 ¦5D ¦65 ¦6D ¦75 ¦7D ¦
¦dis8[ESP] ¦ ¦ 110¦ 46 ¦4E ¦56 ¦5E ¦66 ¦6E ¦76 ¦7E ¦
¦dis8[EDI] ¦ ¦ 111¦ 47 ¦4F ¦57 ¦5F ¦67 ¦6F ¦77 ¦7F ¦
¦dis32[EAX] ¦ ¦ 000¦ 80 ¦88 ¦90 ¦98 ¦A0 ¦A8 ¦B0 ¦B8 ¦
¦dis32[ECX] ¦ ¦ 001¦ 81 ¦89 ¦91 ¦99 ¦A1 ¦A9 ¦B1 ¦B9 ¦
¦dis32[EDX] ¦ ¦ 010¦ 82 ¦8A ¦92 ¦9A ¦A2 ¦AA ¦B2 ¦BA ¦
¦dis32[EBX] ¦ 10¦ 011¦ 83 ¦8B ¦93 ¦9B ¦A3 ¦AB ¦B3 ¦BB ¦
¦dis32[][] ¦ ¦ 100¦ 83 ¦8С ¦94 ¦9С ¦A4 ¦AC ¦B4 ¦BC ¦
¦dis32[EBP] ¦ ¦ 101¦ 85 ¦8В ¦95 ¦9D ¦A5 ¦AD ¦B5 ¦BD ¦
¦dis32[ESI] ¦ ¦ 110¦ 86 ¦8E ¦96 ¦9E ¦A6 ¦AE ¦B6 ¦DE ¦
¦dis32[EDI] ¦ ¦ 111¦ 87 ¦8F ¦A7 ¦AF ¦A7 ¦AF ¦B7 ¦BF ¦
¦EAX/AX/AL ¦ ¦ 000¦ C0 ¦C8 ¦D0 ¦D8 ¦T0 ¦T8 ¦F0 ¦F8 ¦
¦ECX/CX/CL ¦ ¦ 001¦ C1 ¦C9 ¦D1 ¦D9 ¦E1 ¦E9 ¦F1 ¦F9 ¦
¦EDX/DX/DL ¦ ¦ 010¦ C2 ¦CA ¦D2 ¦DA ¦E2 ¦EA ¦F2 ¦FA ¦
¦EBX/BX/BL ¦ 11¦ 011¦ C3 ¦CB ¦D3 ¦DB ¦E3 ¦EB ¦F3 ¦FB ¦
¦ESP/SP/AH ¦ ¦ 110¦ C4 ¦CC ¦D4 ¦DC ¦E4 ¦EC ¦F4 ¦FC ¦
¦EBP/BP/CH ¦ ¦ 101¦ C5 ¦CD ¦D5 ¦DD ¦E5 ¦ED ¦F5 ¦FD ¦
¦ESI/SI/DH ¦ ¦ 110¦ C6 ¦CE ¦D6 ¦DE ¦E6 ¦EE ¦F6 ¦FE ¦
¦EDI/DI/BH ¦ ¦ 111¦ C7 ¦CF ¦D7 ¦DF ¦E7 ¦EF ¦F7 ¦FF ¦
L-----------------+---+----+-------+---+---+---+---+---+---+-----
- [][] обозначает байт SIB, следующий за байтом ModR/M;
- "dis8" обозначает 8-битовое смещение, следующее за байтом
SIB, которое должно расширяться по знаку и добавляться к
индексу;
- "dis32" обозначает 32-битовое смещение, следующее за бай-
том ModR/M, которое должно добавляться к индексу.
Виды 32-разрядной адресации с байтом SIB
(только для процессора 80386) Таблица 4.4
------------------T-----T-----T-----T-----T-----T-----T-----T---¬
¦r32(/r) ¦EAX ¦ECX ¦EDX ¦EBX ¦ESP ¦EBP ¦ESI ¦EDI¦
¦база= ¦0 ¦1 ¦2 ¦3 ¦4 ¦5 ¦6 ¦7 ¦
¦база= ¦000 ¦001 ¦010 ¦011 ¦100 ¦101 ¦110 ¦111¦
+-----------------+-----+-----+-----+-----+-----+-----+-----+---+
¦Масштабированный ¦Индекс Значения ModR/M в шестнадцатиричном¦
¦индекс ¦ SIB виде ¦
+-----------------+---T-------T---T---T---T---T---T---T---T-----+
¦[EAX] ¦ ¦000 ¦00 ¦01 ¦02 ¦03 ¦04 ¦05 ¦06 ¦07 ¦
¦[ECX] ¦ ¦001 ¦08 ¦09 ¦0A ¦0B ¦0C ¦0D ¦0E ¦0F ¦
¦[EDX] ¦ ¦010 ¦10 ¦11 ¦12 ¦13 ¦14 ¦15 ¦16 ¦17 ¦
¦[EBX] ¦00 ¦011 ¦18 ¦19 ¦1A ¦1B ¦1C ¦1D ¦1E ¦1F ¦
¦нет ¦ ¦100 ¦20 ¦21 ¦22 ¦23 ¦24 ¦25 ¦26 ¦27 ¦
¦[EBP] ¦ ¦101 ¦28 ¦29 ¦2A ¦2B ¦2C ¦2D ¦2E ¦2F ¦
¦[ESI] ¦ ¦110 ¦30 ¦31 ¦32 ¦33 ¦34 ¦35 ¦36 ¦37 ¦
¦[EDI] ¦ ¦111 ¦38 ¦39 ¦3A ¦3B ¦3C ¦3D ¦3E ¦3F ¦
¦[EAX*2] ¦ ¦000 ¦40 ¦41 ¦42 ¦43 ¦44 ¦45 ¦46 ¦47 ¦
¦[ECX*2] ¦ ¦001 ¦48 ¦49 ¦4A ¦4B ¦4C ¦4D ¦4E ¦4F ¦
¦[ECX*2] ¦ ¦010 ¦50 ¦51 ¦52 ¦53 ¦54 ¦55 ¦56 ¦57 ¦
¦[EBX*2] ¦01 ¦011 ¦58 ¦59 ¦5A ¦5B ¦5C ¦5D ¦5E ¦5F ¦
¦нет ¦ ¦100 ¦60 ¦61 ¦62 ¦63 ¦64 ¦65 ¦66 ¦67 ¦
¦[EBP*2] ¦ ¦101 ¦68 ¦69 ¦6A ¦6B ¦6C ¦6D ¦6E ¦6F ¦
¦[ESI*2] ¦ ¦110 ¦70 ¦71 ¦72 ¦73 ¦74 ¦75 ¦76 ¦77 ¦
¦[EDI*2] ¦ ¦111 ¦78 ¦79 ¦7A ¦7B ¦7C ¦7D ¦7E ¦7F ¦
¦[EAX*4] ¦ ¦000 ¦80 ¦81 ¦82 ¦83 ¦84 ¦85 ¦86 ¦87 ¦
¦[ECX*4] ¦ ¦001 ¦88 ¦89 ¦8A ¦8B ¦8C ¦8D ¦8E ¦8F ¦
¦[EDX*4] ¦ ¦010 ¦90 ¦91 ¦92 ¦93 ¦94 ¦95 ¦96 ¦97 ¦
¦[EBX*4] ¦10 ¦011 ¦98 ¦99 ¦9A ¦9B ¦9C ¦9D ¦9E ¦9F ¦
¦нет ¦ ¦100 ¦A0 ¦A1 ¦A2 ¦A3 ¦A4 ¦A5 ¦A6 ¦A7 ¦
¦[EBP*4] ¦ ¦101 ¦A8 ¦A9 ¦AA ¦AB ¦AC ¦AD ¦AE ¦AF ¦
¦[ESI*] ¦ ¦110 ¦B0 ¦B1 ¦B2 ¦B3 ¦B4 ¦B5 ¦B6 ¦B7 ¦
¦[EDI*4] ¦ ¦111 ¦B8 ¦B9 ¦BA ¦BB ¦BC ¦BD ¦BR ¦BF ¦
¦[EAX*8] ¦ ¦000 ¦C0 ¦C1 ¦C2 ¦C3 ¦C4 ¦C5 ¦C6 ¦C7 ¦
¦[ECX*8] ¦ ¦001 ¦C8 ¦C9 ¦CA ¦CB ¦CC ¦CD ¦CE ¦CF ¦
¦[EDX*8] ¦ ¦010 ¦D0 ¦D1 ¦D2 ¦D3 ¦D4 ¦D5 ¦D6 ¦D7 ¦
¦[EDX*8] ¦11 ¦011 ¦D8 ¦D9 ¦DA ¦DB ¦DC ¦DD ¦DE ¦DF ¦
¦нет ¦ ¦110 ¦E0 ¦E1 ¦E2 ¦E3 ¦E4 ¦E5 ¦E6 ¦E7 ¦
¦[EBP*8] ¦ ¦101 ¦E8 ¦E8 ¦EA ¦EB ¦EC ¦ED ¦EE ¦EF ¦
¦[ESI*8] ¦ ¦110 ¦F0 ¦F1 ¦F2 ¦F3 ¦F4 ¦F5 ¦F6 ¦F7 ¦
¦[EDI*8] ¦ ¦111 ¦F8 ¦F9 ¦FA ¦FB ¦FC ¦FD ¦FE ¦FF ¦
L-----------------+---+-------+---+---+---+---+---+---+---+------
- [*] и Mod = 00 означает "dis32" без базы, в противном слу-
чае [ESP]. Это обеспечивает следующие режимы адресации:
dis[индекс] (MOD = 00)
dis8[EBP][индекс] (MOD = 01)
dis32[EPB][индекс] (MOD = 10)
Как пользоваться описанием инструкций
-----------------------------------------------------------------
Приведем примерный формат описаний данной главы:
Название Что означает название инструкции
инструкции Какой процессор работает с инструкцией
--------------------------------------
O D I T S Z A P C
Информационные флаги
----------------------------------------------------------------¬
¦ Код операции Такты ¦
+--------------------T----------------T-------------T-----------+
¦ ¦ 386 ¦ 286 ¦ 86 ¦
+--------------------+----------------+-------------+-----------+
¦ ¦ Таблица, содержащая информацию о тактах ¦
L--------------------+-------------------------------------------
Флаги
-----------------------------------------------------------------
Каждая запись в этом разделе включает в себя информацию о
том, какие флаги регистра флагов процессора 80х86 изменяются и
почему. Каждый флаг имеет однобуквенное обозначение.
O = флаг переполнения
D = флаг направления
I = флаг прерывания
T = флаг ловушки
S = флаг знака
Z = флаг нуля
A = вспомогательный флаг
P = флаг четности
C = флаг переноса
О том, как изменяется регистр флагов, говорят следующие сим-
волы:
? = не определен после операции;
* = изменяется и отражает результаты операции;
0 = всегда означает очистку;
1 = всегда означает установку.
Код операции
-----------------------------------------------------------------
Столбец "код операции" показывает полный объектный код, по-
лученный в результате каждой формы инструкции. Когда это возмож-
но, коды показываются в виде шестнадцатиричных байт, в том
порядке, как они следуют в памяти. Записи, отличные от шестнадца-
тиричных байт, имеют следующие записи:
/цифры (Цифры от 0 до 7). Показывают, что байт ModR/
M использует только операнд r/m (регистр или
операнд в памяти). Поле reg содержит цифру,
которая обеспечивает расширение кода опера-
ции.
/r Показывает, что байт инструкции ModR/M со-
держит и регистровый операнд и операнд r/m.
cb, cw, cd, cp Значения первого байта (cb), второго байта
(cw), четвертого байта (cd) или шестого байта
(cp), которые следуют после кода операции,
используются для задания кода смещения и,
возможно, нового значения сегментного регист-
ра кода.
ib, iw, id Первый байт (ib), второй байт (iw), или чет-
вертый байт (id) - это непосредственный опе-
ранд инструкции, который следует за кодом
операции, байты ModR/M или байты масштабиро-
вания/индексирования. Код операции определя-
ет, является ли байт значением со знаком. Во
всех словах или двойных словах первым следует
младший байт.
+rb, +rw, +rd Код регистра от 0 до 7, добавляемый к шест-
надцатиричному байту, заданному слева, плюс
знак для формирования кода операции. Кодами
являются:
rb rw rd (386)
AL = 0 AX = 0 EAX = 0
CL = 1 CX = 1 ECX = 1
DL = 2 DX = 2 EDX = 2
BL = 3 BX = 3 EBX = 3
AH = 4 SP = 4 ESP = 4
CH = 5 BP = 5 EBP = 5
DH = 6 SI = 6 ESI = 6
BH = 7 DI = 7 EDI = 7
Инструкция
-----------------------------------------------------------------
В столбце "Инструкция" приводится синтаксис оператора инс-
трукции, как он должен указываться в программе TASM для процессо-
ра 386. Приведем перечень идентификаторов, использующихся для
представления операндов в операторах инструкций:
rel8
Относительный адрес в диапазоне от 128 байт до конца инс-
трукции до 127 байт после конца инструкции.
rel16, rel32
Относительный адрес в том же сегменте кода, что и ассембли-
руемая инструкция. "Rel16" применяется к инструкциям с атрибутом
размера операнда 16 бит, а "rel32" применяется к инструкциям с
атрибутом размера операнда 32 бита (только для процессора 386).
ptr16:16, ptr16:32
Дальний указатель, обычно в сегменте кода, отличном от того,
где находится инструкция. Обозначение "16:16" показывает, что
значение указателя состоит из двух частей. Значение справа от
двоеточия - это 16-битовый селектор или значение, предназначенное
для сегментного регистра кода. Значение слева от двоеточия соот-
ветствует смещению внутри целевого сегмента. "Ptr16:32" использу-
ется с атрибутом 32 бита (только для процессора 386).
r8
Один из регистров размером в байт (AL, CL, DL, BL, AH, CH,
DH или BH).
r16
Один из регистров размером в слово (AX, CX, DX, BX, SP, BP,
SI или DI).
r32 (386)
Один из регистров размером в двойное слово (EAX, ACX, ADX,
ABX, ASP, ABP, ASI или EDI).
imm8
Непосредственное байтовое значение. "Imm8" представляет со-
бой номер со знаком от -128 до +127 включительно. Для инструкций,
в которых "imm8" комбинируется с операндом размером в слово или
двойное слово, непосредственное значение расширяется по знаку до
слова или двойного слова. Старший байт слова заполняется старшим
битом непосредственного значения.
imm16
Непосредственное значение размером в слово. Используется в
инструкциях с атрибутом размера операнда 16. Это число в диапазо-
не от -32768 до +32767 включительно.
imm32 (386)
Непосредственное значение размером в двойное слово, которое
используется для инструкций с атрибутом размера операнда 32. Это
число в диапазоне от -2147483648 до +2147483647.
r/m8
Однобайтовый операнд, который представляет собой либо содер-
жимое байтового регистра (AL, BL, CL, DL, AH, CH, DH), либо байт
из памяти.
r/m16
Регистр размером в слово или операнд в памяти, используемый
для инструкций с атрибутом размера операнда 16. Это может быть
регистр AX, BX, CX, DX, SP, BP, SI или DI. Содержимое памяти
ищется по адресу, получаемому с помощью вычисления действующего
адреса.
r/m32
Регистр размером в двойное слово или операнд в памяти, ис-
пользуемый для инструкций c атрибутом размера операнда 32. Это
регистры EAX, ACX, ADX, ABX, ASP, ABP, ASI или EDI. Содержимое
памяти ищется по адресу, получаемому с помощью вычисления дейс-
твующего адреса.
m8
Байт в памяти, адресуемый с помощью DS:SI или ES:DI (исполь-
зуется только в строковых инструкциях процессора 386).
m16
Слово в памяти, адресуемое с помощью DS:SI или ES:DI (ис-
пользуется только в строковых инструкциях процессора 386).
m32
Двойное слово в памяти, адресуемое с помощью DS:SI или ES:DI
(используется только в строковых инструкциях процессора 386).
m16:16, m16:32 (386)
Указатель на память, содержащий дальний указатель, состоящий
из двух чисел. Число слева от двоеточия соответствует селектору
сегмента указателя. Число справа соответствует смещению.
m16 & 32, m16 & 16 (186/286/386), m32 & 32 (386)
Операнд в памяти, состоящий из пары элементов данных, разме-
ры которых указываются слева и справа от амперсанда (&). Допуска-
ются все режимы адресации к памяти. Операнды "m16 & 16" и "m32 &
32" используются в инструкции BOUND для представления операнда,
содержащего левую и правую границу индексов массива. "m16 & 32"
используется в инструкции LIDT и LGDT для представления слова, с
помощью которого загружается поле границы и двойного слова, с по-
мощью которого поле базы соответствующих регистров таблицы гло-
бальных дескрипторов и дескрипторов прерываний.
moffs8, moffs16, moffs32 (смещение в памяти, только для 386)
Простая переменная в памяти типа BYTE, WORD или DWORD (386),
используемая в некоторых вариантах инструкции MOV. Фактический
адрес задается простым смещением относительно базы сегмента. Байт
ModR/M в инструкции не используется. Число, указанное в "moffs",
показывает ее размер, определяемый атрибутом размера адреса инс-
трукции.
Sreg
Сегментный регистр. Битам сегментного регистра назначены
следующие значения: ES = 0, CS = 1, SS = 2, DS = 3, FS = 4 (386)
и GS = 5 (386).
Такты
-----------------------------------------------------------------
Столбец "Такты" показывает количество циклов таймера, кото-
рое инструкция требует для выполнения. Вычисление значений счет-
чика таймера делается в следующих предположениях:
- Была выполнена предварительная выборка и раскодировка инс-
трукции, и она готова для выполнения.
- Такты шины не требуют состояний ожидания.
- Отсутствуют локальные запросы HOLD, откладывающие доступ
процессора к шине.
- При выполнении инструкции не обнаруживается исключительных
ситуаций.
- Операнды в памяти выровнены.
Значения тактов таймера для инструкций, имеющих операнд r/m
(регистр или память), разделяются косой чертой. Значение слева
используется для регистрового операнда, а значение справа - для
операнда в памяти.
В спецификации значений таймера используются следующие иден-
тификаторы:
- n, который представляет собой число повторений.
- m, который представляет число компонентов в следующей вы-
полняемой инструкции, где все смещение (если оно имеется),
все непосредственные данные, все другие байты инструкции и
префиксы каждый рассматривается как один компонент.
- pm=, значение таймера, которое применяется при выполнении
инструкции в защищенном режиме. Когда значения таймера для
реального и защищенного режима одинаковы, pm= не указыва-
ется.
Когда при выполнении инструкции возникает исключительная си-
туация, а обработчик исключительной ситуации представляет собой
другую задачу, время исключительной ситуации инструкции увеличи-
вается на время переключения задач. Данный параметр зависит от
следующих факторов:
- Типа TSS, используемого для представления текущей задачи
(TSS 386 или TSS 286).
- Типа TSS, используемого для представления новой задачи.
- Находится ли текущая задача в режиме V86.
- Находится ли новая задача в режиме V86.
Примечание: Более подробно о защищенном режиме и перек-
лючении задач рассказывается в документации фирмы Intel.
AAA Выравнивание (ASCII) после сложения.
---------------------------------------------------------
O D I T S Z A P C
? ? ? * ? *
----------------------------------------------------------------¬
¦Код операции Инструкция Такты Описание ¦
+-----------T-----------T----T----T-----T--T--------------------+
¦ ¦ ¦486 ¦386 ¦286 ¦86¦ ¦
+-----------+-----------+----+----+-----+--+--------------------+
¦37 ¦ AAA ¦3 ¦4 ¦3 ¦8 ¦Выравнивание ASCII ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦после сложения. ¦
L-----------+-----------+----+----+-----+--+---------------------
Выполняйте инструкцию AAA только после инструкции ADD, кото-
рая оставляет байт результата в регистре AL. Младшие части опе-
рандов инструкции ADD должны быть в диапазоне от 0 до 9 (двоич-
но-десятичные числа). В этом случае инструкция AAA настраивает
регистр AL, чтобы он содержал правильную десятичную цифру резуль-
тата. Если сложение дает десятичный перенос, то регистр AH инкре-
ментируется, а флаг переноса и вспомогательный флаг переноса ус-
танавливаются в 1. Если десятичного переноса не было, то флаг
переноса и дополнительный флаг устанавливается в 0, а регистр AH
не изменяется. В любом случае верхняя часть регистра AL устанав-
ливается в 0. Чтобы преобразовать регистр AL к результату в коде
ASCII, укажите за инструкцией AAA OR AL, 30H.
AAD Выравнивание (ASCII) перед делением.
---------------------------------------------------------
O D I T S Z A P C
? * * ? * ?
----------------------------------------------------------------¬
¦Код операции Инструкция Такты Описание ¦
+-----------T------------T----T----T----T---T-------------------+
¦ ¦ ¦486 ¦386 ¦286 ¦ 86¦ ¦
+-----------+------------+----+----+----+---+-------------------+
¦D5 0A ¦ AAD ¦14 ¦19 ¦14 ¦ 60¦Выравнивание ASCII ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦перед делением. ¦
L-----------+------------+----+----+----+---+--------------------
Инструкция AAD используется для подготовки двух нераспако-
ванных двоично-десятичных чисел (младшие цифры в регистре AL,
старшие - в AH) для операции деления, которая дает распакованный
результат. Это выполняется путем установки регистра AL в AL + (10
* AH), а затем регистра AH в 0. После этого содержимое AX равно
двоичному эквиваленту исходного распакованного числа из двух
цифр.
AAM Выравнивание (ASCII) регистра AX после умножения.
---------------------------------------------------------
O D I T S Z A P C
? * * ? * ?
----------------------------------------------------------------¬
¦Код операции Инструкция Такты Описание ¦
+------------T----------T----T----T-----T--T--------------------+
¦ ¦ ¦486 ¦386 ¦286 ¦86¦ ¦
+------------+----------+----+----+-----+--+--------------------+
¦D4 0A ¦AAM ¦15 ¦17 ¦16 ¦83¦Выравнивание (ASCII)¦
¦ ¦ ¦ ¦ ¦ ¦ ¦AX после умножения. ¦
L------------+----------+----+----+-----+--+---------------------
Выполняйте инструкцию AAM только после выполнения инструкции
MUL над двумя распакованными двоично-десятичными цифрами, которая
дает результат в регистре AX. Поскольку результат меньше 100, он
целиком содержится в регистре AL. Инструкция AAM распаковывает
результат в регистре AL путем деления AL на 10. При этом частное
(более значащая цифра) остается в регистре AH, а остаток (менее
значащая цифра) - в AL.
AAS Выравнивание (ASCII) после вычитания.
---------------------------------------------------------
O D I T S Z A P C
? ? ? * ? *
----------------------------------------------------------------¬
¦Код операции Инструкция Такты Описание ¦
+------------T-----------T----T----T----T---T-------------------+
¦ ¦ ¦486 ¦386 ¦286 ¦ 86¦ ¦
+------------+-----------+----+----+----+---+-------------------+
¦3F ¦ AAS ¦3 ¦4 ¦3 ¦ 8 ¦Выравнивание ASCII ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦AL после вычитания.¦
L------------+-----------+----+----+----+---+--------------------
Выполняйте инструкцию AAS после инструкции SUB, которая ос-
тавляет байт результата в регистре AL. Младшие части операндов
инструкции SUB должны лежать в диапазоне от 0 до 9 (двоично-деся-
тичные цифры). В этом случае AAS настраивает регистр AL таким об-
разом, что он содержит корректный десятичный результат. Если при
вычитании получен десятичный перенос, то регистр AH декрементиру-
ется, а флаг переноса и дополнительного переноса устанавливаются
в 1. Если десятичного переноса нет, то флаг переноса и дополни-
тельного переноса устанавливаются в 0, а регистр AH не изменя-
ется. В любом случае старшая часть регистра AL устанавливается в
0. Чтобы преобразовать регистр AL к результату ASCII, используйте
после AAS OR AL,30H.
ADC Сложение с переносом.
---------------------------------------------------------
O D I T S Z A P C
* * * * * *
----------------------------------------------------------------¬
¦Код операции Инструкция Такты Описание ¦
+--------T----------------T----T----T----T-------T--------------+
¦ ¦ ¦486 ¦386 ¦286 ¦86 ¦ ¦
+--------+----------------+----+----+----+-------+--------------+
¦10 /r ¦ ADC r/m8,r8 ¦1/3 ¦2/7 ¦2/7 ¦3/16+EA¦Сложение с пе-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦реносом бай-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦та регистра с¦
¦ ¦ ¦ ¦ ¦ ¦ ¦байтом r/m. ¦
+--------+----------------+----+----+----+-------+--------------+
¦11 /r ¦ ADC r/m16,r16¦1/3 ¦2/7 ¦2/7 ¦3/16+EA¦Сложение с пе-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦реносом ре-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦гистра разме-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ром в слово со¦
¦ ¦ ¦ ¦ ¦ ¦ ¦словом r/m. ¦
+--------+----------------+----+----+----+-------+--------------+
¦11 /r ¦ ADC r/m32,r32¦1/3 ¦2/7 ¦ ¦ ¦Сложение двой-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ного слова в¦
¦ ¦ ¦ ¦ ¦ ¦ ¦регистре со¦
¦ ¦ ¦ ¦ ¦ ¦ ¦словом r/m c¦
¦ ¦ ¦ ¦ ¦ ¦ ¦переносом. ¦
+--------+----------------+----+----+----+-------+--------------+
¦12 /r ¦ ADC r8/m8,r8 ¦1/2 ¦2/6 ¦2/7 ¦3/9+EA ¦Сложение с пе-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦реносом бай-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦та r/m с бай-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦товым регист-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ром. ¦
+--------+----------------+----+----+----+-------+--------------+
¦13 /r ¦ ADC r16,r/m16¦1/2 ¦2/7 ¦2/7 ¦3/16+EA¦Сложение с пе-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦реносом сло-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ва r/m с реги-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦стром размером¦
¦ ¦ ¦ ¦ ¦ ¦ ¦в слово. ¦
+--------+----------------+----+----+----+-------+--------------+
¦13 /r ¦ ADC r32,r/m32¦1/2 ¦2/6 ¦ ¦ ¦Сложение с пе-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦реносом r/m¦
¦ ¦ ¦ ¦ ¦ ¦ ¦с регистром¦
¦ ¦ ¦ ¦ ¦ ¦ ¦размером в¦
¦ ¦ ¦ ¦ ¦ ¦ ¦двойное слово.¦
+--------+----------------+----+----+----+-------+--------------+
¦14 ib ¦ ADC .al,imm8 ¦1 ¦2 ¦3 ¦4 ¦Сложение с пе-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦реносом не-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦посредственно-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦го байта с AL.¦
+--------+----------------+----+----+----+-------+--------------+
¦15 iw ¦ ADC AX,imm16 ¦1 ¦2 ¦3 ¦4 ¦Сложение с пе-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦реносом непос-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦редственного ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦слова с AX. ¦
+--------+----------------+----+----+----+-------+--------------+
¦15 id ¦ADC EAX,imm8, ¦1/3 ¦2/7 ¦ 3/7¦4/7 ¦Сложение с пе-¦
¦ ¦ imm8 ¦ ¦ ¦ ¦ ¦реносом не-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦посредственно-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦го слова с¦
¦ ¦ ¦ ¦ ¦ ¦ ¦EAX. ¦
+--------+----------------+----+----+----+-------+--------------+
¦80 /2 ib¦ADC r/m8,imm16 ¦1/3 ¦2/7 ¦ 3/7¦4/17+EA¦Сложение с пе-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦реносом не-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦посредственно-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦го байта с¦
¦ ¦ ¦ ¦ ¦ ¦ ¦байтом r/m. ¦
+--------+----------------+----+----+----+-------+--------------+
¦81 /2 ib¦ADC r/m16,imm16 ¦1/3 ¦2/7 ¦ 3/7¦4/17+EA¦Сложение с пе-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦реносом не-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦посредственно-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦го байта со¦
¦ ¦ ¦ ¦ ¦ ¦ ¦словом r/m. ¦
+--------+----------------+----+----+----+-------+--------------+
¦81 /2 ib¦ADC r/m32,imm32 ¦1/3 ¦2/7 ¦ ¦ ¦Сложение с пе-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦реносом не-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦посредственно-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦го двойного¦
¦ ¦ ¦ ¦ ¦ ¦ ¦слова со сло-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦вом r/m. ¦
+--------+----------------+----+----+----+-------+--------------+
¦82 /2 ib¦ADC r/m16,imm8 ¦1/3 ¦2/7 ¦ 3/7¦4/7+EA ¦Сложение с пе-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦реносом не-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦посредственно-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦го слова, рас-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ширенного по¦
¦ ¦ ¦ ¦ ¦ ¦ ¦знаку, со сло-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦вом r/m. ¦
+--------+----------------+----+----+----+-------+--------------+
¦83 /2 ib¦ADC r/m32,imm8 ¦1/3 ¦2/7 ¦ ¦ ¦Сложение с пе-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦реносом не-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦посредственно-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦го слова, рас-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ширенного по¦
¦ ¦ ¦ ¦ ¦ ¦ ¦знаку, с двой-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ным словом¦
¦ ¦ ¦ ¦ ¦ ¦ ¦r/m. ¦
L--------+----------------+----+----+----+-------+---------------
Операция ADC выполняет целочисленное сложение двух операндов
(приемник и источник) с флагом переноса. Результат сложения прис-
ваивается первому операнду (приемнику), и соответствующим образом
устанавливаются флаги. Обычно операция ADC выполняется как часть
многобайтовой или многословной операции сложения. Когда к опе-
ранду размером в слово или двойное слово прибавляется непосредс-
твенное байтовое значение, то оно сначала расширяется по знаку до
размера слова или двойного слова.
ADD Сложение.
---------------------------------------------------------
O D I T S Z A P C
* * * * * *
----------------------------------------------------------------¬
¦Код операции Инструкция Такты Описание ¦
+---------T----------------T----T----T-----T-----T--------------+
¦ ¦ ¦486 ¦386 ¦286 ¦86 ¦ ¦
+---------+----------------+----+----+-----+-----+--------------+
¦04 ib ¦ ADD AL,imm8 ¦1 ¦2 ¦3 ¦4 ¦Сложение не-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦посредственно-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦го байта с AL.¦
+---------+----------------+----+----+-----+-----+--------------+
¦05 iw ¦ ADD EX,imm16 ¦1 ¦2 ¦3 ¦4 ¦Сложение не-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦посредственно-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦го слова с AL.¦
+---------+----------------+----+----+-----+-----+--------------+
¦05 id ¦ ADD EAX,imm32 ¦1 ¦2 ¦ ¦ ¦Сложение не-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦посредственно-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦го двойного¦
¦ ¦ ¦ ¦ ¦ ¦ ¦слова с EAX. ¦
+---------+----------------+----+----+-----+-----+--------------+
¦80 /0 ib ¦ ADD r/m8,imm2 ¦1/3 ¦2/7 ¦3/7 ¦/17 ¦Сложение не-¦
¦ ¦ ¦ ¦ ¦ ¦EA ¦посредственно-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦го байта с¦
¦ ¦ ¦ ¦ ¦ ¦ ¦байтом r/m. ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+---------+----------------+----+----+-----+-----+--------------+
¦81 /0 iw ¦ ADD r/m16,imm16¦1/3 ¦2/7 ¦3/7 ¦/7+EA¦Сложение не-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦посредственно-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦го слова со¦
¦ ¦ ¦ ¦ ¦ ¦ ¦словом r/m. ¦
+---------+----------------+----+----+-----+-----+--------------+
¦81 /0 id ¦ ADD r/m16,imm8 ¦1/3 ¦2/7 ¦3/7 ¦/7+EA¦Сложение не-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦посредственно-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦го байта с¦
¦ ¦ ¦ ¦ ¦ ¦ ¦расширением по¦
¦ ¦ ¦ ¦ ¦ ¦ ¦знаку со сло-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦вом r/m. ¦
+---------+----------------+----+----+-----+-----+--------------+
¦83 /0 ib ¦ ADD r/m32,imm8 ¦1/3 ¦2/7 ¦ ¦ ¦Сложение не-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦посредственно-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦го байта с¦
¦ ¦ ¦ ¦ ¦ ¦ ¦расширением по¦
¦ ¦ ¦ ¦ ¦ ¦ ¦знаку с двой-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ным словом¦
¦ ¦ ¦ ¦ ¦ ¦ ¦r/m. ¦
----------------------------------------------------------------¬
¦Код операции Инструкция Такты Описание ¦
+---------T----------------T----T----T-----T-----T--------------+
¦ ¦ ¦486 ¦386 ¦286 ¦86 ¦ ¦
+---------+----------------+----+----+-----+-----+--------------+
¦00 /r ¦ ADD r/m8,r8 ¦1/3 ¦2/7 ¦2/7 ¦/16 ¦Сложение бай-¦
¦ ¦ ¦ ¦ ¦ ¦EA ¦тового регист-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ра с байтом¦
¦ ¦ ¦ ¦ ¦ ¦ ¦r/m. ¦
+---------+----------------+----+----+-----+-----+--------------+
¦01 /r ¦ ADD r/m16,r16 ¦1/3 ¦2/7 ¦2/7 ¦/16 ¦Сложение ре-¦
¦ ¦ ¦ ¦ ¦ ¦EA ¦гистра разме-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ром в слово со¦
¦ ¦ ¦ ¦ ¦ ¦ ¦словом r/m. ¦
+---------+----------------+----+----+-----+-----+--------------+
¦01 /r ¦ ADD r/m32,r32 ¦1/3 ¦2/7 ¦ ¦ ¦Сложение ре-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦гистра разме-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ром в двойное¦
¦ ¦ ¦ ¦ ¦ ¦ ¦слово со сло-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦вом r/m. ¦
+---------+----------------+----+----+-----+-----+--------------+
¦02 /r ¦ ADD r8,r/m8 ¦1/2 ¦2/6 ¦2/7 ¦/9+EA¦Сложение бай-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦та r/m c реги-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦стром размером¦
¦ ¦ ¦ ¦ ¦ ¦ ¦в байт. ¦
+---------+----------------+----+----+-----+-----+--------------+
¦03 /r ¦ ADD r16,r/m16 ¦1/2 ¦2/6 ¦2/7 ¦/9+EA¦Сложение бай-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦та r/m c реги-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦стром размером¦
¦ ¦ ¦ ¦ ¦ ¦ ¦в слово. ¦
+---------+----------------+----+----+-----+-----+--------------+
¦03 /r ¦ ADD r32,r/m32 ¦1/2 ¦2/6 ¦ ¦ ¦Сложение бай-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦та r/m c реги-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦стром размером¦
¦ ¦ ¦ ¦ ¦ ¦ ¦в двойное сло-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦во. ¦
L---------+----------------+----+----+-----+-----+---------------
Операция ADD выполняет целочисленное сложение двух операндов
(приемника, и источника). Результат сложения присваивается перво-
му операнду (приемнику). Соответствующим образом устанавливаются
флаги.
Когда к операнду размером в слово или двойное слово добавля-
ется непосредственное байтовое значение, оно расширяется по
знаку размера слова или двойного слова.
AND Логическая операция И.
---------------------------------------------------------
O D I T S Z A P C
0 * * ? * 0
----------------------------------------------------------------¬
¦Код операции Инструкция Такты Описание ¦
+--------T---------------T----T----T-----T-------T--------------+
¦ ¦ ¦486 ¦386 ¦286 ¦86 ¦ ¦
+--------+---------------+----+----+-----+-------+--------------+
¦20 /r ¦AND r/m8,r8 ¦1/3 ¦2/7 ¦2/7 ¦3/16+EA¦Операция "И"¦
¦ ¦ ¦ ¦ ¦ ¦ ¦над регистром¦
¦ ¦ ¦ ¦ ¦ ¦ ¦размером в¦
¦ ¦ ¦ ¦ ¦ ¦ ¦байт и байтом¦
¦ ¦ ¦ ¦ ¦ ¦ ¦r/m. ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+--------+---------------+----+----+-----+-------+--------------+
¦21 /r ¦AND r/m16,r16 ¦1/3 ¦2/7 ¦2/7 ¦3/16+EA¦Операция "И"¦
¦ ¦ ¦ ¦ ¦ ¦ ¦над регистром¦
¦ ¦ ¦ ¦ ¦ ¦ ¦размером в¦
¦ ¦ ¦ ¦ ¦ ¦ ¦слово и словом¦
¦ ¦ ¦ ¦ ¦ ¦ ¦r/m. ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+--------+---------------+----+----+-----+-------+--------------+
¦21 /r ¦AND r/m32,r32 ¦1/3 ¦2/7 ¦ ¦ ¦Операция "И"¦
¦ ¦ ¦ ¦ ¦ ¦ ¦над регистром¦
¦ ¦ ¦ ¦ ¦ ¦ ¦размером в¦
¦ ¦ ¦ ¦ ¦ ¦ ¦двойное слово¦
¦ ¦ ¦ ¦ ¦ ¦ ¦и двойным сло-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦вом r/m. ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+--------+---------------+----+----+-----+-------+--------------+
¦22 /r ¦AND r8,r/m8 ¦1/2 ¦2/6 ¦2/7 ¦3/9+EA ¦Операция "И"¦
¦ ¦ ¦ ¦ ¦ ¦ ¦над байтом¦
¦ ¦ ¦ ¦ ¦ ¦ ¦r/m и байтовым¦
¦ ¦ ¦ ¦ ¦ ¦ ¦регистром. ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+--------+---------------+----+----+-----+-------+--------------+
¦23 /r ¦AND r16,r/m16 ¦1/2 ¦2/6 ¦2/7 ¦3/9+EA ¦Операция "И"¦
¦ ¦ ¦ ¦ ¦ ¦ ¦над словом¦
¦ ¦ ¦ ¦ ¦ ¦ ¦r/m и регист-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ром размером в¦
¦ ¦ ¦ ¦ ¦ ¦ ¦слово. ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+--------+---------------+----+----+-----+-------+--------------+
¦23 /r ¦AND r32,r/m32 ¦1/2 ¦2/6 ¦2/7 ¦3/16+EA¦Операция "И"¦
¦ ¦ ¦ ¦ ¦ ¦ ¦над двойным¦
¦ ¦ ¦ ¦ ¦ ¦ ¦словом r/m и¦
¦ ¦ ¦ ¦ ¦ ¦ ¦регистром раз-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦мером в двой-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ное слово. ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+--------+---------------+----+----+-----+-------+--------------+
¦24 ib ¦AND AL,imm8 ¦1 ¦2 ¦3 ¦4 ¦Операция "И"¦
¦ ¦ ¦ ¦ ¦ ¦ ¦над непосред-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ственным бай-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦том и регист-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ром AL. ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+--------+---------------+----+----+-----+-------+--------------+
¦25 iw ¦AND AX,imm16 ¦1 ¦2 ¦3 ¦4 ¦Операция "И"¦
¦ ¦ ¦ ¦ ¦ ¦ ¦над непосред-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ственным сло-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦вом и регист-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ром AX. ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+--------+---------------+----+----+-----+-------+--------------+
¦25 id ¦AND EAX,imm32 ¦1 ¦2 ¦3 ¦4 ¦Операция "И"¦
¦ ¦ ¦ ¦ ¦ ¦ ¦над непосред-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ственным двой-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ным словом и¦
¦ ¦ ¦ ¦ ¦ ¦ ¦регистром EAX.¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+--------+---------------+----+----+-----+-------+--------------+
¦80 /4 ib¦AND r/m8,imm8 ¦1/3 ¦2/7 ¦3/7 ¦4/17+EA¦Операция "И"¦
¦ ¦ ¦ ¦ ¦ ¦ ¦над непосред-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ственным бай-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦том и байтом¦
¦ ¦ ¦ ¦ ¦ ¦ ¦r/m. ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+--------+---------------+----+----+-----+-------+--------------+
¦81 /4 iw¦AND r/m16,imm16¦1/3 ¦2/7 ¦3/7 ¦4/17+EA¦Операция "И"¦
¦ ¦ ¦ ¦ ¦ ¦ ¦над непосред-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ственным сло-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦вом и словом¦
¦ ¦ ¦ ¦ ¦ ¦ ¦r/m. ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+--------+---------------+----+----+-----+-------+--------------+
¦81 /4 iв¦AND r/m32.imm32¦1/3 ¦2/7 ¦ ¦ ¦Операция "И"¦
¦ ¦ ¦ ¦ ¦ ¦ ¦над непосред-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ственным двой-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ным словом и¦
¦ ¦ ¦ ¦ ¦ ¦ ¦двойным словом¦
¦ ¦ ¦ ¦ ¦ ¦ ¦r/m. ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+--------+---------------+----+----+-----+-------+--------------+
¦83 /4 ib¦AND r/m16,imm8 ¦1/3 ¦2/7 ¦ ¦ ¦Операция "И"¦
¦ ¦ ¦ ¦ ¦ ¦ ¦над расширяе-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦мым по знаку¦
¦ ¦ ¦ ¦ ¦ ¦ ¦непосредствен-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ным байтом и¦
¦ ¦ ¦ ¦ ¦ ¦ ¦словом r/m. ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+--------+---------------+----+----+-----+-------+--------------+
¦83 /4 ib¦AND r/m32 imm8 ¦1/3 ¦2/7 ¦ ¦ ¦Операция "И"¦
¦ ¦ ¦ ¦ ¦ ¦ ¦над расширяе-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦мым по знаку¦
¦ ¦ ¦ ¦ ¦ ¦ ¦непосредствен-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ным байтом и¦
¦ ¦ ¦ ¦ ¦ ¦ ¦двойным словом¦
¦ ¦ ¦ ¦ ¦ ¦ ¦r/m. ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
L--------+---------------+----+----+-----+-------+---------------
Если соответствующие биты операндов равны 1, то каждый бит
результата после выполнения инструкции AND будет равен 1. В про-
тивном случае он принимает нулевое значение.
ARPL Выравнивает поле RPL селектора.
---------------------------------------------------------
O D I T S Z A P C
*
----------------------------------------------------------------¬
¦Код операции Инструкция Такты Описание ¦
+--------T---------------T----T--------T---------T--------------+
¦ ¦ ¦486 ¦386 ¦286 ¦ ¦
+--------+---------------+----+--------+---------+--------------+
¦63 /r ¦ APPL r/m16,r16¦9/9 ¦pm=20/21¦pm=10/11 ¦Делает так,¦
¦ ¦ ¦ ¦ ¦ ¦чтобы RPL¦
¦ ¦ ¦ ¦ ¦ ¦r/m16 было не¦
¦ ¦ ¦ ¦ ¦ ¦меньше, чем¦
¦ ¦ ¦ ¦ ¦ ¦RPL r16. ¦
L--------+---------------+----+--------+---------+---------------
Инструкция ARPL имеет два операнда. Первый операнд представ-
ляет собой 16-битовую переменную в памяти или регистр размером в
слово, который содержит значение селектора. Второй операнд - это
регистр размером в слово. Если поле RPL ("requested privilege
level" - запрос уровня привилегий, младшие два бита) меньше, чем
поле RPL второго операнда, то флаг нуля устанавливается в значе-
ние 1, а поле RPL первого операнда увеличивается таким образом,
чтобы совпадать со вторым операндом. В противном случае флаг нуля
устанавливается в значение 0, и первый операнд не изменяется.
Инструкция ARPL встречается не в прикладных программах, а в
системном программном обеспечении. Она используется для обеспече-
ния того, чтобы параметр селектора подпрограммы не запрашивал
больше привилегий, чем этого допускает вызывающая программа. Вто-
рой операнд инструкции ARPL обычно представляет собой регистр,
который содержит значение селектора CS вызывающей программы.
BOUND Проверка индекса массива и сравнение его с границами.
---------------------------------------------------------
O D I T S Z A P C
*
----------------------------------------------------------------¬
¦Код операции Инструкция Такты Описание ¦
+---------T----------------T----T-----T---T---------------------+
¦ ¦ ¦486 ¦386 ¦286¦ ¦
+---------+----------------+----+-----+---+---------------------+
¦62 /r ¦ BOUND r16,7 ¦7 ¦10 ¦13 ¦Проверяет, находится¦
¦ ¦ ¦ ¦ ¦ ¦ли r16 в границах¦
¦ ¦ ¦ ¦ ¦ ¦m16&16. ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦
+---------+----------------+----+-----+---+---------------------+
¦62 /r ¦ BOUND r32,7 ¦7 ¦10 ¦ ¦Проверяет, находится¦
¦ ¦ ¦ ¦ ¦ ¦ли r32 в границах¦
¦ ¦ ¦ ¦ ¦ ¦m32&32. ¦
¦ ¦ ¦ ¦ ¦ ¦ ¦
L---------+----------------+----+-----+---+----------------------
Инструкция BOUND обеспечивает, что индекс массива будет на-
ходится в границах, заданных блоком памяти, состоящем из верхней
и нижней границы. Каждая граница использует одно слово для атри-
бута размера операнда 16 бит и двойное слово для атрибута размера
операнда 32 бита. Первый операнд (регистр) должен быть больше или
равен первой границе в памяти (нижняя граница) или больше или ра-
вен второй (верхняя граница). Если регистр не находится в указан-
ных границах, то происходит прерывание 5. При возврате EIP указы-
вает на инструкцию BOUND.
Границы, описывающие структуру данных, помещают обычно перед
самим массивом, что позволяет адресоваться к границам через сме-
щение-константу относительно начала массива.
BSF Просмотр бит в прямом направлении.
---------------------------------------------------------
O D I T S Z A P C
*
----------------------------------------------------------------¬
¦Код операции Инструкция Такты Описание ¦
+----------T-------------T----------T-----T---------------------+
¦ ¦ ¦486 ¦386 ¦ ¦
+----------+-------------+----------+-----+---------------------+
¦0F BC ¦BSF r16,r/m16¦6-42/7-43 ¦10+3n¦Просмотр бит в прямом¦
¦ ¦ ¦ ¦ ¦направлении в слове¦
¦ ¦ ¦ ¦ ¦r/m. ¦
¦ ¦ ¦ ¦ ¦ ¦
+----------+-------------+----------+-----+---------------------+
¦0F BC ¦BSF r32,r/m32¦6-42/7-43 ¦10+3n¦Просмотр бит в прямом¦
¦ ¦ ¦ ¦ ¦направлении в двойном¦
¦ ¦ ¦ ¦ ¦слове r/m. ¦
¦ ¦ ¦ ¦ ¦ ¦
L----------+-------------+----------+-----+----------------------
Инструкция BSF просматривает биты во втором операнде разме-
ром в слово или двойное слово, начиная с бита 0. Если все биты
равны 0, то флаг ZF очищается, в противном случае флаг ZF уста-
навливается, и целевой регистр загружается индексом первого уста-
новленного бита.
BSR Просмотр бит в обратном направлении.
---------------------------------------------------------
O D I T S Z A P C
*
----------------------------------------------------------------¬
¦Код операции Инструкция Такты Описание ¦
+----------T-------------T----------T-----T---------------------+
¦ ¦ ¦486 ¦386 ¦ ¦
+----------+-------------+----------+-----+---------------------+
¦0F BD ¦BSR r16,r/m16¦6-42/7-43 ¦10+3n¦Просмотр бит в обрат-¦
¦ ¦ ¦ ¦ ¦ном направлении в¦
¦ ¦ ¦ ¦ ¦слове r/m. ¦
¦ ¦ ¦ ¦ ¦ ¦
+----------+-------------+----------+-----+---------------------+
¦0F BD ¦BSR r32,r/m32¦6-42/7-43 ¦10+3n¦Просмотр бит в обрат-¦
¦ ¦ ¦ ¦ ¦ном направлении в¦
¦ ¦ ¦ ¦ ¦двойном слове r/m. ¦
¦ ¦ ¦ ¦ ¦ ¦
L----------+-------------+----------+-----+----------------------
Инструкция BSR просматривает в обратном направлении (от
старшего к младшему биту) биты во втором операнде размером в сло-
во или двойное слово, начиная с бита 0. Если все биты равны 0, то
флаг ZF очищается, в противном случае флаг ZF устанавливается, и
целевой регистр загружается индексом первого установленного бита,
обнаруженного при просмотре в обратном направлении.
BSWAP Выполняет свопинг байт.
---------------------------------------------------------
O D I T S Z A P C
----------------------------------------------------------------¬
¦Код операции Инструкция Такты Описание ¦
+------------T-----------T------T-------------------------------+
¦ ¦ ¦486 ¦ ¦
+------------+-----------+------+-------------------------------+
¦0F C8/r ¦BSWAP r32 ¦1 ¦Выполняет свопинг (перестанов-¦
¦ ¦ ¦ ¦ку) байт в 32-разрядном регист-¦
¦ ¦ ¦ ¦ре для конвертирования формата¦
¦ ¦ ¦ ¦даты. ¦
L------------+-----------+------+--------------------------------
Инструкция BSWAP изменяет порядок байт в 32-разрядном ре-
гистре на обратный, преобразуя формат даты ("малый/большой" в
"большой/малый"). Когда инструкция BSWAP используется с операндом
размером 16 бит, то результат, остающийся в целевом регистре не
определен.
BT Проверка бита (только для процессоров 386 и i486).
---------------------------------------------------------
O D I T S Z A P C
*
----------------------------------------------------------------¬
¦Код операции Инструкция Такты Описание ¦
+----------T-------------T-----T-----T--------------------------+
¦ ¦ ¦486 ¦386 ¦ ¦
+----------+-------------+-----+-----+--------------------------+
¦0F A3 ¦BT r/m16,r16 ¦3/8 ¦3/12 ¦Сохраняет бит во флаге пе-¦
¦ ¦ ¦ ¦ ¦реноса. ¦
¦ ¦ ¦ ¦ ¦ ¦
+----------+-------------+-----+-----+--------------------------+
¦0F A3 ¦BT r/m32,r32 ¦3/8 ¦3/12 ¦Сохраняет бит во флаге пе-¦
¦ ¦ ¦ ¦ ¦реноса. ¦
¦ ¦ ¦ ¦ ¦ ¦
+----------+-------------+-----+-----+--------------------------+
¦0F BA/4 ib¦BT r/m16,imm8¦3/3 ¦3/6 ¦Сохраняет бит во флаге пе-¦
¦ ¦ ¦ ¦ ¦реноса. ¦
¦ ¦ ¦ ¦ ¦ ¦
+----------+-------------+-----+-----+--------------------------+
¦0F BA/4 ib¦BT r/m32,r16 ¦3/8 ¦3/12 ¦Сохраняет бит во флаге пе-¦
¦ ¦ ¦ ¦ ¦реноса. ¦
L----------+-------------+-----+-----+---------------------------
Инструкция BT сохраняет значение бита, указанного базой
(первый операнд) и смещения бита (второй операнд) во флаге пере-
носа.
BTC Проверка бита и дополнение (только для 386 и i486).
---------------------------------------------------------
O D I T S Z A P C
*
----------------------------------------------------------------¬
¦Код операции Инструкция Такты Описание ¦
+----------T--------------T-----T----T--------------------------+
¦ ¦ ¦486 ¦386 ¦ ¦
+----------+--------------+-----+----+--------------------------+
¦0F BB ¦BTC r/m16,r16 ¦6/13 ¦6/13¦Сохраняет бит во флаге пе-¦
¦ ¦ ¦ ¦ ¦реноса и дополняет его. ¦
¦ ¦ ¦ ¦ ¦ ¦
+----------+--------------+-----+----+--------------------------+
¦0F BB ¦BTC r/m32,r32 ¦6/13 ¦6/13¦Сохраняет бит во флаге пе-¦
¦ ¦ ¦ ¦ ¦реноса и дополняет его. ¦
¦ ¦ ¦ ¦ ¦ ¦
+----------+--------------+-----+----+--------------------------+
¦0F BA/7 ib¦BTC r/m16,imm8¦6/8 ¦6/8 ¦Сохраняет бит во флаге пе-¦
¦ ¦ ¦ ¦ ¦реноса и дополняет его. ¦
¦ ¦ ¦ ¦ ¦ ¦
+----------+--------------+-----+----+--------------------------+
¦0F BA/7 ib¦BTC r/m32,imm8¦6/13 ¦6/13¦Сохраняет бит во флаге пе-¦
¦ ¦ ¦ ¦ ¦реноса и дополняет его. ¦
¦ ¦ ¦ ¦ ¦ ¦
L----------+--------------+-----+----+---------------------------
Инструкция BTC сохраняет значение бита, указанного базой
(первый операнд) и смещения бита (второй операнд) во флаге пере-
носа, а затем дополняет бит.
BTR Проверка бита и сброс.
---------------------------------------------------------
O D I T S Z A P C
*
----------------------------------------------------------------¬
¦Код операции Инструкция Такты Описание ¦
+----------T--------------T-----T-----T-------------------------+
¦ ¦ ¦486 ¦386 ¦ ¦
+----------+--------------+-----+-----+-------------------------+
¦0F B3 ¦BTR r/m16,r16 ¦6/13 ¦6/13 ¦Сохраняет бит во флаге¦
¦ ¦ ¦ ¦ ¦переноса и сбрасывает¦
¦ ¦ ¦ ¦ ¦его. ¦
¦ ¦ ¦ ¦ ¦ ¦
+----------+--------------+-----+-----+-------------------------+
¦0F B3 ¦BTR r/m32,r32 ¦6/13 ¦6/13 ¦Сохраняет бит во флаге¦
¦ ¦ ¦ ¦ ¦переноса и сбрасывает¦
¦ ¦ ¦ ¦ ¦его. ¦
¦ ¦ ¦ ¦ ¦ ¦
+----------+--------------+-----+-----+-------------------------+
¦0F BA/6 ib¦BTR r/m16,imm8¦6/8 ¦6/8 ¦Сохраняет бит во флаге¦
¦ ¦ ¦ ¦ ¦переноса и сбрасывает¦
¦ ¦ ¦ ¦ ¦его. ¦
¦ ¦ ¦ ¦ ¦ ¦
+----------+--------------+-----+-----+-------------------------+
¦0F BA/6 ib¦BTR r/m32,imm8¦6/8 ¦6/8 ¦Сохраняет бит во флаге¦
¦ ¦ ¦ ¦ ¦переноса и сбрасывает¦
¦ ¦ ¦ ¦ ¦его. ¦
¦ ¦ ¦ ¦ ¦ ¦
L----------+--------------+-----+-----+--------------------------
Инструкция BTC сохраняет значение бита, указанного базой
(первый операнд) и смещения бита (второй операнд) во флаге пере-
носа, а затем сбрасывает бит, записывая в него 0.
BTS Проверка бита и установка.
---------------------------------------------------------
O D I T S Z A P C
*
----------------------------------------------------------------¬
¦Код операции Инструкция Такты Описание ¦
+----------T---------------T-----T----T-------------------------+
¦ ¦ ¦486 ¦386 ¦ ¦
+----------+---------------+-----+----+-------------------------+
¦0F B3 ¦ BTS r/m16,r16 ¦6/13 ¦6/13¦Сохраняет бит во флаге¦
¦ ¦ ¦ ¦ ¦переноса и устанавливает¦
¦ ¦ ¦ ¦ ¦его. ¦
¦ ¦ ¦ ¦ ¦ ¦
+----------+---------------+-----+----+-------------------------+
¦0F B3 ¦ BTS r/m32,r32 ¦6/13 ¦6/13¦Сохраняет бит во флаге¦
¦ ¦ ¦ ¦ ¦переноса и сбрасывает¦
¦ ¦ ¦ ¦ ¦его. ¦
¦ ¦ ¦ ¦ ¦ ¦
+----------+---------------+-----+----+-------------------------+
¦0F BA/5 ib¦ BTS r/m16,imm8¦6/8 ¦6/8 ¦Сохраняет бит во флаге¦
¦ ¦ ¦ ¦ ¦переноса и устанавливает¦
¦ ¦ ¦ ¦ ¦его. ¦
¦ ¦ ¦ ¦ ¦ ¦
+----------+---------------+-----+----+-------------------------+
¦0F BA/5 ib¦ BTS r/m32,imm8¦6/8 ¦6/8 ¦Сохраняет бит во флаге¦
¦ ¦ ¦ ¦ ¦переноса и устанавливает¦
¦ ¦ ¦ ¦ ¦его. ¦
¦ ¦ ¦ ¦ ¦ ¦
L----------+---------------+-----+----+--------------------------
Инструкция BTC сохраняет значение бита, указанного базой
(первый операнд) и смещения бита (второй операнд) во флаге пере-
носа, а затем устанавливает бит, записывая в него 1.
CALL Вызов процедуры.
---------------------------------------------------------
O D I T S Z A P C
----------------------------------------------------------------¬
¦Код операции Инструкция Такты Описание ¦
+-----T-------------T------T-----T-----T--------T---------------+
¦ ¦ ¦486 ¦386 ¦286* ¦86 ¦ ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦E8 cw¦CALL rel16 ¦3 ¦7+m ¦7 ¦19 ¦Выполняет ближ-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ний вызов отно-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦сительно смеще-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ния на следую-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦щую инструкцию.¦
+-----+-------------+------+-----+-----+--------+---------------+
¦FF /2¦CALL r/m16 ¦5/5 ¦7+m/ ¦7/11 ¦16/21+EA¦Выполняет ближ-¦
¦ ¦ ¦ ¦10+m ¦ ¦ ¦ний вызов (кос-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦венный через¦
¦ ¦ ¦ ¦ ¦ ¦ ¦регистр / кос-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦венный через¦
¦ ¦ ¦ ¦ ¦ ¦ ¦память) ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦9A cd¦CALL ptr16:16¦18, ¦ 7+m ¦ 13, ¦ 28 ¦Выполняет меж-¦
¦ ¦ ¦pm=20 ¦ pm= ¦ pm=2¦ ¦сегментный вы-¦
¦ ¦ ¦ ¦ 34+m¦ ¦ ¦зов в полностью¦
¦ ¦ ¦ ¦ ¦ ¦ ¦заданную точку.¦
+-----+-------------+------+-----+-----+--------+---------------+
¦9A cd¦CALL ptr16:16¦pm=35 ¦ pm= ¦ 41 ¦ ¦Выполняет вызов¦
¦ ¦ ¦ ¦ 52+m¦ pm=2¦ ¦с теми же при-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦вилегиями. ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦9A cd¦CALL ptr16:16¦pm=69 ¦ pm= ¦ 82 ¦ ¦Выполняет вызов¦
¦ ¦ ¦ ¦ 86+m¦ ¦ ¦через ворота¦
¦ ¦ ¦ ¦ ¦ ¦ ¦с большими при-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦вилегиями без¦
¦ ¦ ¦ ¦ ¦ ¦ ¦параметров. ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦9A cd¦CALL ptr16:16¦pm= ¦ pm= ¦ 86+4¦ ¦Выполняет вызов¦
¦ ¦ ¦77+4x ¦ 77+ ¦ ¦ ¦через ворота¦
¦ ¦ ¦ ¦ 4x+m¦ ¦ ¦с большими при-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦вилегиями с x¦
¦ ¦ ¦ ¦ ¦ ¦ ¦параметрами. ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦9A cd¦CALL ptr16:16¦pm= ¦ ts ¦ 177/¦ ¦Выполняет вызов¦
¦ ¦ ¦37+ts ¦ ¦ 82 ¦ ¦задачи (для 286¦
¦ ¦ ¦ ¦ ¦ ¦ ¦через сегмент¦
¦ ¦ ¦ ¦ ¦ ¦ ¦состояния / во-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦рота задачи). ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦FF /3¦CALL m16:16 ¦17, ¦ 22+m¦ 16/2¦ 37+EA¦Выполняет меж-¦
¦ ¦ ¦pm=20 ¦ pm38¦m ¦ ¦сегментный вы-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦зов (адрес в¦
¦ ¦ ¦ ¦ ¦ ¦ ¦двойном слове в¦
¦ ¦ ¦ ¦ ¦ ¦ ¦r/m). ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦FF /3¦CALL m16:16 ¦pm=35 ¦ pm= ¦ 44 ¦ ¦Выполняет вызов¦
¦ ¦ ¦ ¦ 56+m¦ ¦ ¦через ворота¦
¦ ¦ ¦ ¦ ¦ ¦ ¦с теми же при-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦вилегиями. ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦FF /3¦CALL m16:16 ¦pm=69 ¦ pm= ¦ 93 ¦ ¦Выполняет вызов¦
¦ ¦ ¦ ¦ 90+m¦ ¦ ¦через ворота¦
¦ ¦ ¦ ¦ ¦ ¦ ¦с большими при-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦вилегиями без¦
¦ ¦ ¦ ¦ ¦ ¦ ¦параметров. ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦FF /3¦CALL m16:16 ¦pm= ¦ pm= ¦ 90+4¦ ¦Выполняет вызов¦
¦ ¦ ¦77+x ¦ 90+4¦ +m ¦ ¦через ворота¦
¦ ¦ ¦ ¦ +m ¦ ¦ ¦с большими при-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦вилегиями с х¦
¦ ¦ ¦ ¦ ¦ ¦ ¦параметрами. ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦FF /3¦CALL m16:16 ¦pm= ¦ 5+ts¦ 180/¦ ¦Выполняет вызов¦
¦ ¦ ¦37+ts ¦ ¦ 85 ¦ ¦задачи (для 286¦
¦ ¦ ¦ ¦ ¦ ¦ ¦через сегмент¦
¦ ¦ ¦ ¦ ¦ ¦ ¦состояния / во-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦рота задачи). ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦E8 cd¦CALL rel32 ¦3 ¦ 7+m ¦ ¦ ¦Выполняет ближ-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ний вызов, сме-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦щение относи-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦тельно следую-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦щей инструкции.¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦FF /2¦CALL r/m32 ¦5/5 ¦ 7+m/¦ ¦ ¦Выполняет ближ-¦
¦ ¦ ¦37+ts ¦ 10+m¦ ¦ ¦ний вызов (кос-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦венный). ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦9A cp¦CALL ptr16:32¦pm=35 ¦ pm= ¦ ¦ ¦Выполняет вызов¦
¦ ¦ ¦ ¦ 55+m¦ ¦ ¦через ворота¦
¦ ¦ ¦ ¦ ¦ ¦ ¦с теми же при-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦вилегиями. ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦9A cp¦CALL ptr16:32¦pm=69 ¦ pm= ¦ ¦ ¦Выполняет вызов¦
¦ ¦ ¦ ¦ 82+m¦ ¦ ¦через ворота¦
¦ ¦ ¦ ¦ ¦ ¦ ¦с большими при-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦вилегиями. ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦9A cp¦CALL ptr32:32¦pm= ¦ pm= ¦ ¦ ¦Выполняет вызов¦
¦ ¦ ¦77+4x ¦90+4x¦ ¦ ¦через вентиль¦
¦ ¦ ¦ ¦+m ¦ ¦ ¦с большими при-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦вилегиями c x¦
¦ ¦ ¦ ¦ ¦ ¦ ¦параметрами. ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦9A cp¦CALL ptr16:32¦pm= ¦ ts ¦ ¦ ¦Выполняет вызов¦
¦ ¦ ¦37+ts ¦ ¦ ¦ ¦задачи. ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦FF /2¦CALL r/m32 ¦5/5 ¦ 7+m/¦ ¦ ¦Выполняет меж-¦
¦ ¦ ¦ ¦ 10+m¦ ¦ ¦сегментный вы-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦зов задачи (для¦
¦ ¦ ¦ ¦ ¦ ¦ ¦286 через сег-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦мент состояния/¦
¦ ¦ ¦ ¦ ¦ ¦ ¦вентиль зада-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦чи). ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦E8 cd¦CALL rel32 ¦3 ¦ 7+m ¦ ¦ ¦Выполняет ближ-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ний вызов, сме-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦щение относи-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦тельно следую-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦щей инструкции.¦
+-----+-------------+------+-----+-----+--------+---------------+
¦FF /2¦CALL r/m32 ¦5/5 ¦ 7+m/¦ ¦ ¦Выполняет ближ-¦
¦ ¦ ¦ ¦ 10+m¦ ¦ ¦ний косвенный¦
¦ ¦ ¦ ¦ ¦ ¦ ¦вызов. ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦9A cp¦CALL ptr16:32¦18, ¦ 17+m¦ ¦ ¦Выполняет меж-¦
¦ ¦ ¦pm=20 ¦/pm= ¦ ¦ ¦сегментный вы-¦
¦ ¦ ¦ ¦42+m ¦ ¦ ¦зов в соответ-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦ствии в полнос-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦тью заданным¦
¦ ¦ ¦ ¦ ¦ ¦ ¦указателем. ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦9A cp¦CALL ptr16:32¦pm=69 ¦ pm= ¦ ¦ ¦Выполняет вызов¦
¦ ¦ ¦ ¦82+m ¦ ¦ ¦через вентиль¦
¦ ¦ ¦ ¦ ¦ ¦ ¦с большими при-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦вилегиями без¦
¦ ¦ ¦ ¦ ¦ ¦ ¦параметров. ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦9A cp¦CALL ptr16:32¦pm=77+¦pm=90¦ ¦ ¦Выполняет вызов¦
¦ ¦ ¦4x ¦ 4x+m¦ ¦ ¦через вентиль¦
¦ ¦ ¦ ¦ ¦ ¦ ¦с большими при-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦вилегиями c x¦
¦ ¦ ¦ ¦ ¦ ¦ ¦параметрами. ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦9A cp¦CALL ptr16:32¦pm=37+¦ ts ¦ ¦ ¦Выполняет вызов¦
¦ ¦ ¦ts ¦ ¦ ¦ ¦задачи. ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦FF /3¦CALL m16:32 ¦17, ¦ 22+m¦ ¦ ¦Выполняет меж-¦
¦ ¦ ¦pm=20 ¦/pm= ¦ ¦ ¦сегментный вы-¦
¦ ¦ ¦ ¦32+m ¦ ¦ ¦зов по двойно-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦му слову r/m. ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦FF /3¦CALL m16:32 ¦pm=35 ¦ pm= ¦ ¦ ¦Выполняет вызов¦
¦ ¦ ¦ ¦54+m ¦ ¦ ¦через вентиль¦
¦ ¦ ¦ ¦ ¦ ¦ ¦с теми же при-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦вилегиями. ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦FF /3¦CALL m16:32 ¦pm=77+¦pm=90¦ ¦ ¦Выполняет вызов¦
¦ ¦ ¦4x ¦ 4x+m¦ ¦ ¦через вентиль¦
¦ ¦ ¦ ¦ ¦ ¦ ¦с большими при-¦
¦ ¦ ¦ ¦ ¦ ¦ ¦вилегиями c x¦
¦ ¦ ¦ ¦ ¦ ¦ ¦параметрами. ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦FF /3¦CALL m16:32 ¦pm=37+¦ 5+ts¦ ¦ ¦Выполняет вызов¦
¦ ¦ ¦ts ¦ ¦ ¦ ¦задачи. ¦
+-----+-------------+------+-----+-----+--------+---------------+
¦ * В следующей выполненной инструкции добавьте 1 цикл для¦
¦каждого байта. ¦
L----------------------------------------------------------------
Инструкция CALL приводит к выполнению процедуры, имя которой
указано в операнде. Когда процедура будет выполнена (выполнится
инструкция возврата управления процедуры), выполнение продолжает-
ся с инструкции, которая следует за инструкцией CALL.
Ниже описывается действие различных форм инструкций.
Ближними являются вызовы с целевыми метками типа r/m16,
r/m32, rel16, rel32. Изменение или сохранение значения сегментно-
го регистра при этом не обязательно. Инструкции CALL rel32 и
CALL rel16 добавляют для определения целевой метки к адресу сле-
дующей за CALL инструкцией смещение со знаком. Форма rel16 ис-
пользуется, когда атрибут размера операнда равен 16, а rel32 -
когда он равен 32. Результат записывается в 32-разрядный регистр
EIP. При rel16 старшие 16 бит EIP очищаются, что дает в результа-
те смещение, значение которого не превышает 16 бит. CALL r/m16 и
CALL r/m32 задают регистр или ячейку памяти, откуда выбирается
абсолютное сегментное смещение. При этом при атрибуте размера
операнда 32 из r/m выбирается 32-разрядное смещение (r/m32), а
при атрибуте размера операнда 16 - 16-разрядное (r/m16). Смещение
инструкции, следующей за инструкцией CALL, заносится в стек. Она
будет извлекаться ближней инструкцией RET процедуры. Этой формой
инструкцией CALL регистр CS не изменяется.
Дальние вызовы CALL ptr16:16 и CALL ptr16:32 используют
4-байтовый и 6 байтовый операнд как длинный указатель на вызывае-
мую процедуру. Формы CALL m16:16 и m16:32 выбирают длинный указа-
тель из заданной ячейки памяти (косвенно). В реальном режиме ад-
ресации или виртуальном режиме процессора 8086 длинный указатель
для регистра CS и 16 или 32 бита для регистра EIP (в зависимости
от атрибута размера операнда). Эти формы инструкции заносят в ка-
честве адреса возврата и CS, и IP (или EIP).
В защищенном режиме обе формы с длинным указателем анализи-
руют байт AR, индекс которого задается селекторной частью указа-
теля длинного типа. В зависимости от значения байта AR вызов бу-
дет выполнять один из следующих типов передачи управления:
- дальний вызов с тем же уровнем защиты;
- дальний вызов с изменением защиты;
- переключение задачи.
Примечание: Турбо Ассемблер расширяет синтаксис инструкции
CALL таким образом, чтобы способствовать передаче параметров
подпрограммам на языке высокого уровня. Более подробно это описы-
вается в Главе 7 "Руководства пользователя по Турбо Ассемблеру".
Назад | Содержание | Вперед