Часть 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 "Руководства пользователя по Турбо Ассемблеру".
                              Назад | Содержание | Вперед