ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.


http://instrumtur.ru/ Стеллажи металлические 023 для колес.

 

Часть 27

Часть 5   Набор команд
-----------------------------------------------------------------
Глава 26  Набор команд
-----------------------------------------------------------------
В данной главе представлены команды процессора i486 в алфавитном
порядке. Для каждой команды приводятся ее формы при различных
комбинациях операндов, включая создаваемый объектный код,
требуемые операнды, время выполнения и описание. Каждой команде
соответствует описание ее работы и краткий обзор генерируемых ею
исключений.
26.1  Атрибуты размера операнда и размера адреса
-----------------------------------------------------------------
При выполнении команды процессор i486 может адресовать память,
используя для этого либо 16-разрядные, либо 32-разрядные адреса.
Следовательно, каждая команда, адресующая память, имеет
соответственно атрибут размера адреса, равный 16 или 32 битам.
Использование 16-разрядных адресов подразумевает использование
16-разрядных смещений в командах и генерацию 16-разрядных
адресных смещений (адресов относительно начала сегмента) в
результате вычисления исполнительного адреса. 32-разрядные адреса
подразумевают использование 32-разрядных смещений в командах и
генерацию 32-разрядных адресных смещений. Аналогичным образом,
команда, выполняющая доступ к слову (16 битов) или к двойному
слову (32 бита) имеет атрибут размера операнда, равный 16 или 32
битам, соответственно.
26.1.1  Атрибут для сегмента по умолчанию
-----------------------------------------------------------------
Для программ, работающих в защищенном режиме, бит D в
дескрипторах выполняемых сегментов задает атрибут по умолчанию
как для размера адреса, так и для размера операнда. Эти атрибуты
по умолчанию применяются при выполнении всех команд данного
сегмента. Очищенный бит D задает размер адреса и размер операнда
по умолчанию, равный 16 битам, а установленный бит D - равный 32
битам.
Программы, работающие в реальном режиме или в виртуальном режиме
8086, имеют 16-разрядные адреса и операнды по умолчанию.
26.1.2  Префиксы размера операнда и размера адреса команд
-----------------------------------------------------------------
Внутреннее кодирование команды может включать в себя два
префикса длиной по одному байту: префикс размера адреса, 67H, и
префикс размера операнда, 66H. (В последующем разделе, "Формат
команды", показано положение этих префиксов в кодировке
команды). Эти префиксы переопределяют атрибуты сегмента по
умолчанию для непосредственно следующей за ними команды. В
Таблице 26-1 показано воздействие каждой возможной комбинации
умолчаний и переопределений.
           Таблица 26-1. Действующие атрибуты размера
-----------------------------------------------------------------
Умолчание для сегмента D = ...  | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
-----------------------------------------------------------------
Префикс размера операнда 66H    | N | N | Y | Y | N | N | Y | Y |
-----------------------------------------------------------------
Префикс размера адреса   67H    | 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    Нет, этот префикс команды не задан
26.1.3  Атрибут размера адреса для стека
-----------------------------------------------------------------
Команды, неявно использующие стек (например, POP EAX) также
имеют атрибут размера адреса стека, равный 16 или 32 битам.
Команды с атрибутом размера адреса стека, равным 16 битам,
используют 16-разрядный регистр указателя стека SP, а команды с
атрибутом размера адреса стека, равным 32 битам, используют
32-разрядный регистр ESP, позволяющий сформировать адрес вершины
стека.
Атрибут размера адреса стека управляется битом B дескриптора
сегмента данных в регистре SS. Нулевое значение бита B выбирает
атрибут размера адреса стека, равный 16 битам; значение единицы
выбирает атрибут размера адреса стека, равный 32.
26.2  Формат команды
-----------------------------------------------------------------
Любые варианты кодирования команд представляют собой
подмножества общего формата команды, показанного на Рисунке
26-1. Команда состоит из опциональных префиксов команды, одного
или двух байтов основного кода операции, возможно описателя
адреса, состоящего из байта ModR/M и байта SIB (Scale Index
Base, или Масштабный коэффициент Индекс База), смещения, если
оно необходимо, и непосредственного поля данных, если оно
необходимо.
-----------------------------------------------------------------
    Префикс     |    Префикс     |     Префикс    |Переопределени
    команды     | размера адреса |размера операнда|    сегмента
-----------------------------------------------------------------
    0 или 1     |   0 или 1      |     0 или 1    |   0 или 1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                   Число байтов
-----------------------------------------------------------------
-----------------------------------------------------------------
   Код     |  MODR/M  |   SIB    |  Смещение   | Непосредственный
 операции  |          |          |             |    операнд
-----------------------------------------------------------------
  1 или 2  |  0 или 1 |  0 или 1 | 0,1,2 или 4     0,1,2 или 4
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                   Число байтов
-----------------------------------------------------------------
          Рисунок 26-1. Формат команды процессора i486
Меньшие поля кодировки могут быть определены внутри основного
кода операции или кодов операции. Эти поля определяют
направление работы команды, размер смещений, кодировку регистров
или расширение знаком; эти поля кодировки изменяются в
зависимости от класса операции.
Большинство команд, которые могут обращаться к операнду в
памяти, имеют байт формы адресации, следующий после байта
(байтов) основного кода операции. Этот байт, называемый ModR/M ,
задает используемую форму адреса. Некоторые кодировки байта ModR
/M указывают на второй байт адресации, SIB (Масштабный
коэффициент Индекс База), который следует за байтом ModR/M и
необходим для полного определения формы адресации.
Некоторые формы адресации могут включать величину смещения,
непосредственно следующую за байтами ModR/M или SIB. При наличии
смещения оно может занимать 8, 16 или 32 бита.
Если в  команде  задан  непосредственный операнд,  то он всегда
следует за  байтами  смещения.  Непосредственный  операнд,  если 
 он
задан, всегда является последним полем команды.
Ниже приводятся допустимые коды префиксов команд:
     F3H   префикс REP (используется только со строковыми команда
ми)
     F3H   префикс  REPE/REPZ  (используется  только  со  строков
ыми
     командами).
     F2H   префикс REPNE/REPNZ (используется  только  со  строков
ыми
     командами).
     F0H префикс LOCK
Ниже приволятся префиксы переопределения сегментов:
     2EH   префикс переопределения сегмента CS
     36H   префикс переопределения сегмента SS
     3EH   префикс переопределения сегмента DS
     26H   префикс переопределения сегмента ES
     64H   префикс переопределения сегмента FS
     65H   префикс переопределения сегмента GS
     66H   переопределение размера операнда
     67H   переопределение размера адреса
26.2.1  Байты ModR/M и SIB
-----------------------------------------------------------------
Байты ModR/M и SIB следуют за байтом (байтами) кода операции во
многих командах процессора i486. Они несут следующую информацию:
- Тип индексации или номер регистра, используемого в команде.
- Используемый регистр или дополнительная информация для выбора
  команды.
- Информация о базе, индексе и масштабном коэффициенте.
Байт ModR/M содержит три информационных поля:
- Поле mod,  которое занимает два старших бита  в  байте,  и  в
  комбинации с полем r/m образует 32 возможных значения: восемь
  регистров и 24 режима индексации.
- Поле reg, занимающее следующие три бита после поля mod, задает
  либо номер регистра, либо следующие три бита информации о коде
  операции. Смысл поля reg определяется первым байтом (кодом
  операции) команды.
- Поле r/m, занимающее три младшие бита в байте, может либо
  задавать регистр в качестве местоположения операнда, либо
  может в комбинации с полем mod формировать часть кодировки
  режима адресации, как было описано выше.
Формы 32-разрядной адресации типа база-индекс или масштаб-индекс
требуют наличия байта SIB. Наличие байта SIB определяется
определенной кодировкой байта ModR/M. Байт SIB в этом случае
содержит следующие поля:
- Поле ss, занимающее два старших бита в байте, задает
  масштабный коэффициент.
- Поле индекса (index), занимающее следующие три бита после поля
  ss, задает номер индексного регистра.
- Поле базы (base), занимающее три младших бита в байте, задает
  номер базового регистра.
Форматы байтов ModR/M и SIB показпны на Рисунке 26-2.
Значения и соответствующие формы адресации для байтов ModR/M и
SIB показаны в таблицах 26-2, 26-3 и 26-4. 16-разрядные формы
адресации, задаваемые байтом ModR/M, показаны в Таблице 26-2. 32
-разрядные формы адресации, задаваемые байтом ModR/M, показаны в
Таблице 26-3. В Таблице 26-4 показаны 32-разрядные формы
адресации, задаваемые байтом SIB.
             Байт MODR/M
      7   6   5       4      3  2    1   0
     --------------------------------------
     | MOD  | REG/Код операции|   R/M     |
     --------------------------------------
         Байт SIB (Масштабный коэффициент,
                   Индекс, База)
      7    6    5    4    3    2    1    0
     --------------------------------------
     |  SS   |    Индекс    |     База    |
     --------------------------------------
            Рисунок 26-2. Формат байтов ModR/M и SIB
  Таблица 26-2. Формы 16-разрядной адресации для байта ModR/M
-----------------------------------------------------------------
--
|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
 |
|----------------------------------------------------------------
-|
| Исполнительный | ModR/M |     Шестнадцатиричные значения       
 |
|    адрес       |        |             ModR/M                   
 |
|----------------------------------------------------------------
-|
| [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]        |    011 | 03 | 0B | 13 | 1B | 23 | 2B | 33 | 3B
 |
| [SI]           | 00 100 | 04 | 0C | 14 | 1C | 24 | 2C | 34 | 3C
 |
| [DI]           |    101 | 05 | 0D | 15 | 1D | 25 | 2D | 35 | 3D
 |
| смещ16         |    110 | 06 | 0E | 16 | 1E | 26 | 2E | 36 | 3E
 |
| [BX]           |    111 | 07 | 0F | 17 | 1F | 27 | 2F | 37 | 3F
 |
|----------------------------------------------------------------
-|
| [BX+SI]+смещ8  |    000 | 40 | 48 | 50 | 58 | 60 | 68 | 70 | 78
 |
| [BX+DI]+смещ8  |    001 | 41 | 49 | 51 | 59 | 61 | 69 | 71 | 79
 |
| [BP+SI]+смещ8  |    010 | 42 | 4A | 52 | 5A | 62 | 6A | 72 | 7A
 |
| [BP+DI]+смещ8  |    011 | 43 | 4B | 53 | 5B | 63 | 6B | 73 | 7B
 |
| [SI]+смещ8     | 01 100 | 44 | 4C | 54 | 5C | 64 | 6C | 74 | 7C
 |
| [DI]+смещ8     |    101 | 45 | 4D | 55 | 5D | 65 | 6D | 75 | 7D
 |
| [BP]+смещ8     |    110 | 46 | 4E | 56 | 5E | 66 | 6E | 76 | 7E
 |
| [BX]+смещ8     |    111 | 47 | 4F | 57 | 5F | 67 | 6F | 77 | 7F
 |
|----------------------------------------------------------------
-|
| [BX+SI]+смещ16 |    000 | 80 | 88 | 90 | 98 | A0 | A8 | B0 | B8
 |
| [BX+DI]+смещ16 |    001 | 81 | 89 | 91 | 99 | A1 | A9 | B1 | B9
 |
| [BP+SI]+смещ16 |    010 | 82 | 8A | 92 | 9A | A2 | AA | B2 | BA
 |
| [BP+DI]+смещ16 |    011 | 83 | 8B | 93 | 9B | A3 | AB | B3 | BB
 |
| [SI]+смещ16    | 10 100 | 84 | 8C | 94 | 9C | A4 | AC | B4 | BC
 |
| [DI]+смещ16    |    101 | 85 | 8D | 95 | 9D | A5 | AD | B5 | BD
 |
| [BP]+смещ16    |    110 | 86 | 8E | 96 | 9E | A6 | AE | B6 | BE
 |
| [BX]+смещ16    |    111 | 87 | 8F | 97 | 9F | A7 | AF | 77 | BF
 |
|----------------------------------------------------------------
-|
| EAX/AX/AL      |    000 | C0 | C8 | D0 | D8 | E0 | E8 | 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      |    011 | C3 | CB | D3 | DB | E3 | EB | F3 | FB
 |
| ESP/SP/AH      | 11 100 | 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
 |
-----------------------------------------------------------------
--
ПРИМЕЧАНИЯ: смещ8 означает, что 8-разрядное смещение, следующее
за байтом ModR/M, должно быть расширено по знаку и прибавлено к
индексу. смещ16 означает, что 16-разрядное смещение, следующее
за байтом ModR/M, должно быть прибавлено к индексу. Сегментным
регистром по умолчанию для исполнительного адреса, содержащего
индекс BP, является SS, а для прочих исполнительных адресов -
DS.
   Таблица 26-3. Формы 32-битовой адресации для байта ModR/M
-----------------------------------------------------------------
--
|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
 |
|----------------------------------------------------------------
-|
| Исполнительный | ModR/M |     Шестнадцатиричные значения       
 |
|    адрес       |        |             ModR/M                   
 |
|----------------------------------------------------------------
-|
| [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]          |    011 | 03 | 0B | 13 | 1B | 23 | 2B | 33 | 3B
 |
| [--][--]       | 00 100 | 04 | 0C | 14 | 1C | 24 | 2C | 34 | 3C
 |
| смещ32         |    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
 |
|----------------------------------------------------------------
-|
| смещ8[EAX]     |    000 | 40 | 48 | 50 | 58 | 60 | 68 | 70 | 78
 |
| смещ8[ECX]     |    001 | 41 | 49 | 51 | 59 | 61 | 69 | 71 | 79
 |
| смещ8[EDX]     |    010 | 42 | 4A | 52 | 5A | 62 | 6A | 72 | 7A
 |
| смещ8[EBX]     |    011 | 43 | 4B | 53 | 5B | 63 | 6B | 73 | 7B
 |
| смещ8[--][--]  | 01 100 | 44 | 4C | 54 | 5C | 64 | 6C | 74 | 7C
 |
| смещ8[ebp]     |    101 | 45 | 4D | 55 | 5D | 65 | 6D | 75 | 7D
 |
| смещ8[ESI]     |    110 | 46 | 4E | 56 | 5E | 66 | 6E | 76 | 7E
 |
| смещ8[EDI]     |    111 | 47 | 4F | 57 | 5F | 67 | 6F | 77 | 7F
 |
|----------------------------------------------------------------
-|
| смещ32[EAX]    |    000 | 80 | 88 | 90 | 98 | A0 | A8 | B0 | B8
 |
| смещ32[ECX]    |    001 | 81 | 89 | 91 | 99 | A1 | A9 | B1 | B9
 |
| смещ32[EDX]    |    010 | 82 | 8A | 92 | 9A | A2 | AA | B2 | BA
 |
| смещ32[EBX]    |    011 | 83 | 8B | 93 | 9B | A3 | AB | B3 | BB
 |
| смещ32[--][--] | 10 100 | 84 | 8C | 94 | 9C | A4 | AC | B4 | BC
 |
| смещ32[EBP]    |    101 | 85 | 8D | 95 | 9D | A5 | AD | B5 | BD
 |
| смещ32[ESI]    |    110 | 86 | 8E | 96 | 9E | A6 | AE | B6 | BE
 |
| смещ32[EDI]    |    111 | 87 | 8F | 97 | 9F | A7 | AF | 77 | BF
 |
|----------------------------------------------------------------
-|
| EAX/AX/AL      |    000 | C0 | C8 | D0 | D8 | E0 | E8 | 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      |    011 | C3 | CB | D3 | DB | E3 | EB | F3 | FB
 |
| ESP/SP/AH      | 11 100 | 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
 |
-----------------------------------------------------------------
--
ПРИМЕЧАНИЯ: [--][--] означает, что за байтом ModR/M следует байт
SIB. смещ8 означает, что 8-разрядное смещение, следующее за
байтом ModR/M, должно быть расширено по знаку и прибавлено к
индексу. смещ32 означает, что 32-разрядное смещение, следующее
за байтом ModR/M, должно быть прибавлено к индексу.
     Таблица 26-4. Формы 32-битовой адресации для байта SIB
-----------------------------------------------------------------
--
|r32                      |EAX |ECX |EDX |EBX |ESP |EBP |ESI |EDI
 |
|База                     | 0  | 1  | 2  | 3  | 4  | 5  | 6  | 7 
 |
|База                     |000 |001 |010 |011 |100 |101 |110 |111
 |
|----------------------------------------------------------------
-|
|Масштабированный| Индекс |     Шестнадцатиричные значения       
 |
|    индекс      |   SS   |             ModR/M                   
 |
|----------------------------------------------------------------
-|
| [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]          |    011 | 03 | 0B | 13 | 1B | 23 | 2B | 33 | 3B
 |
| отсутствует    | 00 100 | 04 | 0C | 14 | 1C | 24 | 2C | 34 | 3C
 |
| [EBP]          |    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
 |
|----------------------------------------------------------------
-|
| [EAX*2]        |    000 | 40 | 48 | 50 | 58 | 60 | 68 | 70 | 78
 |
| [ECX*2]        |    001 | 41 | 49 | 51 | 59 | 61 | 69 | 71 | 79
 |
| [EDX*2]        |    010 | 42 | 4A | 52 | 5A | 62 | 6A | 72 | 7A
 |
| [EBX*2]        |    011 | 43 | 4B | 53 | 5B | 63 | 6B | 73 | 7B
 |
| отсутствует    | 01 100 | 44 | 4C | 54 | 5C | 64 | 6C | 74 | 7C
 |
| [EBP*2]        |    101 | 45 | 4D | 55 | 5D | 65 | 6D | 75 | 7D
 |
| [ESI*2]        |    110 | 46 | 4E | 56 | 5E | 66 | 6E | 76 | 7E
 |
| [EDI*2]        |    111 | 47 | 4F | 57 | 5F | 67 | 6F | 77 | 7F
 |
|----------------------------------------------------------------
-|
| [EAX*4]        |    000 | 80 | 88 | 90 | 98 | A0 | A8 | B0 | B8
 |
| [ECX*4]        |    001 | 81 | 89 | 91 | 99 | A1 | A9 | B1 | B9
 |
| [EDX*4]        |    010 | 82 | 8A | 92 | 9A | A2 | AA | B2 | BA
 |
| [EBX*4]        |    011 | 83 | 8B | 93 | 9B | A3 | AB | B3 | BB
 |
| отсутствует    | 10 100 | 84 | 8C | 94 | 9C | A4 | AC | B4 | BC
 |
| [EBP*4]        |    101 | 85 | 8D | 95 | 9D | A5 | AD | B5 | BD
 |
| [ESI*4]        |    110 | 86 | 8E | 96 | 9E | A6 | AE | B6 | BE
 |
| [EDI*4]        |    111 | 87 | 8F | 97 | 9F | A7 | AF | 77 | BF
 |
|----------------------------------------------------------------
-|
| [EAX*8]        |    000 | C0 | C8 | D0 | D8 | E0 | E8 | F0 | F8
 |
| [ECX*8]        |    001 | C1 | C9 | D1 | D9 | E1 | E9 | F1 | F9
 |
| [EDX*8]        |    010 | C2 | CA | D2 | DA | E2 | EA | F2 | FA
 |
| [EBX*8]        |    011 | C3 | CB | D3 | DB | E3 | EB | F3 | FB
 |
| отсутствует    | 11 100 | C4 | CC | D4 | DC | E4 | EC | F4 | FC
 |
| [EBP*8]        |    101 | C5 | CD | D5 | DD | E5 | ED | F5 | FD
 |
| [ESI*8]        |    110 | C6 | CE | D6 | DE | E6 | EE | F6 | FE
 |
| [EDI*8]        |    111 | C7 | CF | D7 | DF | E7 | EF | F7 | FF
 |
-----------------------------------------------------------------
--
ПРИМЕЧАНИЯ: [*] означает смещ32 без базы, если MOD равно 00, и
[ESP] в противном случае. Это обеспечивает следующие режимы
адресации:
          смещ32[индекс]       (MOD = 00)
          смещ8[EBP][индекс]   (MOD = 01)
          смещ32[EBP][индекс]  (MOD = 10)
26.2.2  Как читать описание набора команд
-----------------------------------------------------------------
Ниже приводится пример формата, используемого в описании каждой
команды процессора i486 в данной главе:
CMC - Дополнение флага переноса
-----------------------------------------------------------------
|Код       Команда  Число      Описание                         |
|операции           тактовых                                    |
|                   циклов                                      |
| F5       CMC         2       Дополнение флага переноса        |
-----------------------------------------------------------------
За приведенной таблицей следуют параграфы "Операция",
"Описание", "Изменяемые флаги", "Исключения защищенного режима",
"Исключения режима реальных адресов" и иногда "Примечания". В
следующих разделах описаны условные обозначения и аббревиатуры,
используемые в этих параграфах описания команд.
26.2.2.1  Колонка кода операции
-----------------------------------------------------------------
Колонка "Код операции" приводит полный объектный код,
генерируемый кля каждой формы команды. Где это возможно, коды
приводятся в шестнадцатиричной байтовой записи, в
последовательности их расположения в памяти. Определения
элементов, помимо шестнадцатиричных байтов, следующие:
/цифра (цифра от 0 до 7) указывает на то, что байт ModR/M
команды использует только операнд r/m (регистр или память). Поле
reg содержит цифру, представляющую собой расширение кода
операции команды.
/r: указывает на то, что байт ModR/M команды содержит и операнд
    регистра, и операнд r/m.
cb, cw, cd, cp: 1-байтовое (cb), 2-байтовое (cw), 4-байтовое
(cd) или 6-байтовое (cp) значение, следующее за кодом операции,
используемое для задания смещения кода и возможно, нового
значения регистра кодового сегмента.
ib, iw, id: 1-байтовый (ib), 2-байтовый (iw) или 4-байтовый (id)
непосредственный операнд команды, следующий за кодом операции,
байтами ModR/M или SIB. Код операции определяет, является ли
данный операнд значением со знаком. Все слова и двойные слова
представлены таким образом, что первым следует младший байт.
+rb, +rw, +rd: Код регистра, от 0 до 7, складываемый с
шестнадцатиричным байтом, находящимся слева от знака плюс,
образуя единый байт кода операции. Коды:
     rb              rw               rd
  AL  =  0        AX  =  0        EAX  =  0
  CL  =  1        CX  =  1        ECX  =  1
  DL  =  2        DX  =  2        EDX  =  2
  BL  =  3        BX  =  3        EBX  =  3
     rb              rw               rd
  AH  =  4        SP  =  4        ESP  =  4
  CH  =  5        BP  =  5        EBP  =  5
  DH  =  6        SI  =  6        ESI  =  6
  BH  =  7        DI  =  7        EDI  =  7
+i: Используется в командах с плавающей точкой, когда один из
операндов - это ST(i) из стека регистров модуля операций с
плавающей точкой процессора (FPU). Число i (которое может быть в
диапазоне от 0 до 7) складывается с шестнадцатиричным байтом,
находящимся слева от знака плюс, образуя единый байт кода
операции:
26.2.2.2  Колонка "Команда"
-----------------------------------------------------------------
Колонка "Команда" дает синтаксис оператора команды в том виде, в
котором этот оператор записывается в программе на ASM386. Ниже
приводится список символических имен, используемых для
представления операндов в операторах команды:
rel8: относительный адрес в диапазоне 128 байтов от 128 байтов
до конца команды до 127 байтов после конца команды.
rel16, rel32: относительный адрес в пределах того же кодового
сегмента, что и ассемблируемая команда. rel16 применяется с
командами с атрибутом размера операнда, равным 16 битам; rel32
применяется с командами с атрибутом размера операнда, равным 32
битам.
ptr16:16,ptr16:32: дальний указатель, обычно установленный на
кодовый сегмент, отличный от сегмент текущей команды. Запись 16:
16 указывает на то, что значение указателя состоит из двух
частей. Значение слева от двоеточия это 16-битовый селектор или
значение, предназначенное для регистра кодового сегмента.
Значение справа от двоеточия соответствует смещению в пределах
сегмента назначения. ptr16:16 используется, когда атрибут
размера операнда команды равен 16 битам; ptr16:32 используется в
случае 32-битового атрибута.
r8: один из байтовых регистров: AL,CL,DL,BL,AH,CH,DH или BH.
r16: один из регистров размером в слово: AX,CX,DX,BX,SP,BP,SI
или DI.
r32: один из регистров размером в двойное слово: EAX,ECX,EDX,
EBX,ESP,EBP,ESI или EDI.
imm8: непосредственное значение байта. imm8 это число со знаком
в диапазоне от -127 до +127, включительно. Для команд, в которых
imm8 комбинируется с операндом размером в слово или двойное
слово, непосредственное значение расширяется по знаку, образуя
слово или двойное слово. Старший байт слова заполняется самым
старшим битом непосредственного значения.
imm16: непосредственное значение размером в слово, используемое
для команд, атрибут размера операнда которых равен 16 битам. Это
число в диапазоне от -32768 до +32767, включительно.
imm32: непосредственное значение размером в двойное слово,
используемое для команд, атрибут размера операнда которых равен
32 битам. Это число в диапазоне от +2147483647 до -2147483648,
включительно.
r/m8: однобайтовый операнд, представляющий собой либо содержимое
байтового регистра (AL, BL, CL, DL, AH, BH, CH, DH), либо
содержимое байта в памяти.
r/m16: операнд регистра-слова или операнд памяти, используемый в
командах, атрибут размера операнда которых равен 16 битам.
Регистры-слова это AX, BX, CX, DX, SP, BP, SI, DI. Содержимое
памяти находится по адресу, получаемому при вычислении
исполнительного адреса.
r/m32: операнд регистра-двойного слова или операнд памяти,
используемый в командах, атрибут размера операнда которых равен
32 битам. Регистры-слова это EAX, EBX, ECX, EDX, ESP, EBP, ESI,
EDI. Содержимое памяти находится по адресу, получаемому при
вычислении исполнительного адреса.
m8: байт памяти, адресуемый DS:SI или ES:DI (используется только
строковыми командами).
m16: слово памяти, адресуемое DS:SI или ES:DI (используется
только строковыми командами).
m32: двойное слово памяти, адресуемое DS:SI или ES:DI
(используется только строковыми командами).
m16:16, m16:32: операнд памяти, содержащий дальний указатель,
составленный из двух чисел. Число слева от двоеточия соответствуе
селектору сегмента    указателя.   Число   справа   от   двоеточи
соответствует его смещению.
m16&32, m16&16, m32&32: операнд памяти, состоящий из пар
элементов данных, размеры которых обозначены слева и справа от
символа амперсанда (&). Все режимы адресации памяти разрешены,
операнды m16&16 и m32&32 используются командой BOUND для
получения операнда, содержащего верхнюю и нижнюю границы для
индексов массивов. m16&32 используется командами LIDT и LGDT для
получения слова, которым загружается поле границы, и двойного
слова, которым загружается поле базы соответствующих регистров
таблиц дескрипторов - глобальной и прерываний.
moffs8, moffs16, moffs32: (смещение в памяти) - простая
переменная памяти типа BYTE, WORD или DWORD, используемая
некоторыми вариантами команды MOV. Фактический адрес задается
простым смещением относительно базы сегмента. В команде байт
ModR/ M не используется. Число, указанное в moffs, обозначает
размер, определяемый атрибут размера адреса команды.
Sreg: сегментный регистр. Назначения битов сегментных регистров:
ES=0, CS=1, SS=2, DS=3, FS=4 и GS=5.
m32real, m64real, m80real: (соответственно) - операнды памяти -
действительные числа с плавающей точкой одинарной, двойной и
расширенной точности.
m16int, m32int, m64int: (соответственно) - операнды памяти -
целочисленного типа word, short и long с плавающей точкой.
mNbyte: N-байтовый операнд памяти с плавающей точкой.
ST или ST(0): старший элемент стека регистров FPU.
ST(i): i-й элемент от вершины стека регистров FPU (i =0...7).
26.2.2.3  Колонка "Число тактовых циклов"
-----------------------------------------------------------------
Колонка "Число тактовых циклов" задает примерное число тактовых
циклов, за которое выполняется команда. Вычисления тактовых
циклов производятся исходя из следующих предположений:
- При доступе к данным или командам происходит кэш-пападание
  (нахождение искомого в кеше).
- Цель команды перехода находится в кеше.
- Никакие циклы аннулирования не конкурируют с командой за
  использование кеша.
- Трансляция адреса страницы находит совпадение в TLB.
- Операнды памяти выравнены.
- Вычисления исполнительного адреса используют один базовый
  регистр и ни одного индексного регистра, а базовый регистр не
  является регистром назначения предыдущей команды.
- Смещение и непосредственное значение не используются
  одновременно.
- Во время выполнения не происходит исключений.
- Задержки при записи в буфер отсутствуют.
Обсуждение потерь быстродействия в случаях, когда эти условия не
выполняются, находится в Приложении E.
В спецификациях подсчета тактовых циклов используются следующие
символические имена:
- n представляет число повторений.
- m представляет число компонентов следующей выполняемой
команды, где все смещение целиком (если оно имеется) считается
за один компонент, все непосредственные данные в команде (если
они имеются) считаются за один компонент, и каждый другой байт
команды и префикс(ы) также считаются за один компонент.
- pm= представляет собой счетчик тактовых циклов, работающий,
когда команда выполняется в защищенном режиме. pm= не задается,
когда число циклов одинаково для защищенного режима и режима
реальных адресов.
Когда во время выполнения команды генерируется исключение, а
обработчик этого исключения находится в другой задаче, время
выполнения команды увеличивается на число тактовых циклов,
требуемых для переключения задачи. Этот параметр зависит от
нескольких факторов:
- Типа TSS, используемого для представления новой задачи (TSS
  центрального процессора i486 или TSS 80286.)
- От того, находится ли текущая задача в режиме V86.
- От того, находится ли новая задача в режиме V86.
- От того, произошло ли кеша-попадание при попытке доступа.
- От того, используется ли шлюз задачи, или же шлюз
  прерывания/ловушки.
В Таблице  26-5  приводятся  значения времени на переключение
задачи для исключений, предполагая попадание в кеш и
использование шлюзов задачи. Полное описание см. в Приложении Е.
26.2.2.4  Колонка "Описание"
-----------------------------------------------------------------
Колонка "Описание", расположенная после колонки "Число тактовых
циклов" содержит краткое описание разных форм команды. В
разделах "Работа команды" и "Описание" содержится более
подробная информация о работе команды.
26.2.2.5  Работа команды
-----------------------------------------------------------------
В разделе "Работа команды" находится алгоритмическое описание
команды, использующее запись, аналогичную языкам Алгол и
Паскаль. Алгоритмы составлены из следующих элементов:
Комментарии заключаются в пары символов "(*" и "*)".
Составные операторы заключаются между ключевыми словами
оператора "if" (IF, THEN, ELSE, FI) или оператора "do" (DO, OD),
либо оператора "case" (CASE...OF,ESAC).
Имя регистра подразумевает содержимое регистра. Имя регистра в
квадратных скобках подразумевает содержимое позиции памяти,
адрес которой содержится в регистре. Например, ES:[DI] означает
содержимое адреса памяти, задаваемого относительно регистра ES
содержимым регистра DI. [SI] указывает на содержимое адреса,
содержащегося в регистре SI относительно сегмента для SI по
умолчанию (DS) или относительно переопределенного сегмента.
       Таблица 26-5. Время выполнения переключения задачи
-----------------------------------------------------------------
                    |          Новая задача
 Старая задача      |--------------------------------------------
                    |На TSS i486 | на TSS 80286 | на TSS VM
-----------------------------------------------------------------
VM/i486/80286 TSS   |    199     |     180      |    177
-----------------------------------------------------------------
VM = виртуальный режим
Квадратные скобки используются также для операндов памяти, где
они означают, что содержимое адреса памяти задается смещением
относительно сегмента. Например, [SRC] указывает, что содержимое
исходного операнда является смещением относительно сегмента.
A <- B  означает, что значение B присваивается А.
Символы =, <>, >= и <= это операции отношения, используемые при
сравнении двух величин, означающие равенство, неравенство,
больше или равно или меньше или равно, соответственно. Выражение
отношения, например, A = B, имеет результат TRUE (истина), если
значение А равно значению В; в противном случае оно равно FALSE
(ложь).
В алгоритмических описаниях используются следующие
идентификаторы:
- OperandSize представляет собой атрибут размера операнд
команды, равный либо 16, либо 32 битам. AddressSize представляет
собой атрибут размера адреса, также равный 16 или 32 битам.
Например,
     IF instruction = CMPSW
     THEN OperandSize <- 16;
     ELSE
        IF instruction = CMPSD
        THEN OperandSize <- 32;
        FI;
     FI;
означает, что атрибут размера операнда зависит от формы
используемой команды CMPS. См. описание атрибутов размера адреса
и размера операнда в начале данной главы, где приводятся общие
указания относительно определения данных атрибутов.
- StackAddrSize представляет собой атрибут размера адреса для
  стека, связанный с данной командой, и имеет значение 16 или 32
  бита, как объяснялось выше в данной главе.
- SRC представляет собой исходный операнд. При наличии двух
  операндов SRC это операнд справа.
- DEST представляет собой операнд назначения. При наличии двух
  операндов DEST это операнд слева.
- LeftSRC, RightSRC позволяют различить два операнда, оба из
  которых являются исходными операндами.
- eSP представляет собой либо регистр SP, либо регистром ESP, в
  зависимости от установки бита B для текущего сегмента стека.
Следующие функции используются в алгоритмических описаниях:
- Truncate to 16 bits (значение) уменьшает размер значения таким
  образом, чтобы оно помещалось в 16 битах, при необходимости
  отбрасывая старший байт.
- Addr(операнд) возвращает исполнительный адрес операнда
  (результат вычисления исполнительного адреса перед сложением с
  базой сегмента).
- ZeroExtend(значение) возвращает значение, расширенное нулем в
  соответствии с атрибутом размера операнда команды. Например,
  если OperandSize = 32, ZeroExtend для байтового значения,
  равного -10, преобразует байт из значения F6H в двойное слово
  с шестнадцатиричным значением 000000F6H. Если значение,
  переданное ZeroExtend, и атрибут размера операнда имеют
  одинаковое значение, то ZeroExtend возвращает это значение
  неизмененным.
- SignExtend(значение) возвращает значение, расширенное знаком в
  соответствии с атрибутом размера операнда команды. Например,
  если OperandSize = 32, SignExtend для байтового значения,
  равного -10, преобразует байт из значения F6H в двойное слово
  с шестнадцатиричным значением FFFFFFF6H. Если значение,
  переданное SignExtend, и атрибут размера операнда имеют
  одинаковое значение, то SignExtend возвращает это значение
  неизмененным.
- Push(значение) помещает значение в стек. Число байтов,
  помещенных в стек, определяется атрибутом размера операнда
  команды. Действие Push следующее:
     IF StackAddrSize = 16
     THEN
         IF OperandSize = 16
         THEN
             SP <- SP - 2;
             SS:[SP] <- значение (* присвоение 2 байтов, начиная
                                    с байта, адресуемого в SP *)
         ELSE (* OperandSize = 32 *)
             SP <- SP - 4;
             SS:[SP] <- значение (* присвоение 4 байтов, начиная
                                    с байта, адресуемого в SP *)
         FI;
     ELSE (* StackAddrSize = 32 *)
         IF OperandSize = 16
         THEN
             ESP <- ESP - 2;
             SS:[ESP] <- значение (* присвоение 2 байтов, начиная
                                    с байта, адресуемого в ESP *)
         ELSE (* OperandSize = 32 *)
             ESP <- ESP - 4;
             SS:[ESP] <- значение (* присвоение 4 байтов, начиная
                                    с байта, адресуемого в ESP *)
         FI;
     FI;
- Pop(значение) удаляет значение из вершины стека и возвращает
  его. Оператор EAX <- Pop(); присваивает EAX 32-битовое
  значение, которое Pop снимает с вершины стека. Pop возвращает
  либо слово, либо двойное слово, в зависимости от атрибута
  размера операнда. Действие Pop следующее:
     IF StackAddrSize = 16
     THEN
         IF OperandSize = 16
         THEN
             значение возврата <- SS:[SP]; (* 2-байтовое знач *)
             SP <- SP + 2;
         ELSE (* OperandSize = 32 *)
             значение возврата <- SS:[SP]; (* 4-байтовое знач *)
             SP <- SP + 4;
         FI;
     ELSE (* StackAddrSize = 32 *)
         IF OperandSize = 16
         THEN
             значение возврата <- SS:[ESP]; (* 2-байтовое знач *)
             ESP <- ESP + 2;
         ELSE (* OperandSize = 32 *)
             значение возврата <- SS:[ESP]; (* 4-байтовое знач *)
             ESP <- ESP + 4;
         FI;
     FI;
     RETURN(значение возврата); (* возврат слова или двойного
                                   слова *)
Pop ST используется для страниц с командами операций с плавающей
точкой и означает извлечение из стека регистров FPU.
Bit[BitBase, BitOffset] (Бит [БазаБита, СмещениеБита])
возвращает адрес бита в строке битов, представляющей собой
битовую последовательность в памяти или регистре. Биты
нумеруются в регистре или памяти от младшего к старшему. В
памяти два байта слова располагаются таким образом, что младший
байт содержит младшие адреса битов.
Если базовым операндом является регистр, то смещение может
находиться в диапазоне 0...31. Это смещение адресует бит в
указанном регистре. Например, 'BIT[EAX, 21]' показана на Рисунке
26-4.
- I-O-Permission(I-O-Address, width) (Разрешение ввода-вывода
(адрес-ввода-вывода,ширина)) возвращает значения TRUE или FALSE
в зависимости от битового массива разрешения ввода/вывода и
прочих факторов. Эта функция определяется следующим образом:
     IF тип TSS равен 80286 THEN RETURN FALSE; FI;
     Ptr <- [TSS +66]; (* выборка указателя битового массива *)
     BitStringAddr <- SHR(I-O-Address, 3) + Ptr;
     MaskShift <- I-O-Address AND 7;
     CASE width OF:
            BYTE:nBitMask <- 1;
            WORD:nBitMask <- 3;
            DWORD:nBitMask <- 15;
     31            21                               0
     -------------------------------------------------
     |             | |                               |
     -------------------------------------------------
                    ^                                ^
                    |_________BITOFFSET=21___________|
     Рисунок 26-3. BitOffset (СмещениеБита) для BIT[EAX,21]
        Индексация бита (положительное смещение)
     7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
    -------------------------------------------------
    |   | |         |               |               |
    -------------------------------------------------
    | BITBASE + 1   |   BITBASE     |  BITBASE - 1  |
       ^                            |
       |_____OFFSET = -13___________|
        Индексация бита (отрицательное смещение)
     7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
    -------------------------------------------------
    |               |               |   | |         |
    -------------------------------------------------
    | BITBASE       |   BITBASE-1   |  BITBASE - 2  |
                    |               |     ^
                    |_____OFFSET = -11____|
           Рисунок 26-4. Индексация битового массива
     ESAC;
     mask <- SHL (nBitMask, MaskShift);
     CheckString <- [BitStringAddr] AND mask;
     IF CheckString = 0
     THEN RETURN(TRUE);
     ELSE RETURN(FALSE);
     FI;
- Switch-Tasks - это функция переключения задачи, описанная в
  Главе 7.
26.2.2.6  Описание
Раздел "Описание" содержит дальнейшие пояснения к работе
команды.
26.2.2.7  Изменяемые флаги
-----------------------------------------------------------------
В разделе "изменяемые флаги" перечисляются флаги, изменяемые
командой, как описано ниже:
- Если флаг всегда очищается или всегда устанавливаются
  командой, то после имени флага приводится это значение (0 или
  1). Арифметические и логические команды обычно присваивают
  значения флагам состояния стандартным образом, описанным в
  Приложении С. Отличные от этих соглашений присвоения флагам
  описываются в разделе "Работа команды".
- Значения флагов, описанные как "неопределенные", могут быть
  изменены командой неопределенным образом.
Не описанные в этом разделе флаги командой не изменяются.
В описаниях команд имеется раздел "Изменяемые флаги FPU", в
котором сказано, каким образом каждая команда может повлиять на
четыре бита условного кода слова состояния FPU. В этих описаниях
имеются также разделы "Числовые исключения", в которых
перечислены флаги исключений слова состояния FPU,
устанавливаемые командой.
26.2.2.8  Исключения защищенного режима
-----------------------------------------------------------------
В данном разделе описаны исключения, которые генерируются при
выполнении команды в защищенном режиме. Имена этих исключений
образуются из знака фунта (#), за которым следуют две буквы и
опциональный код ошибки в круглых скобках. Например, #GP (0)
обозначает исключение общей защиты с кодом ошибки 0. В Таблице
26-6 приводятся соответствия каждого двухбуквенного имени номеру
прерывания.
В Главе 9 описаны исключения и состояние процессора i486 после
входа в то или иное исключение.
Прикладные программисты должны обращаться к документации по
операционной системе для определения действий, предпринимаемых,
когда генерируется то или иное исключение.
26.2.2.9  Исключения режима реальных адресов
-----------------------------------------------------------------
Поскольку в режиме реальных адресов процессор i486 выполняет
меньшее количество проверок на ошибку, данный режим имеет меньше
условий исключений. Более подробную информацию о таких
исключениях см. в Главе 22.
26.2.2.10 Исключения виртуального режима 8086
-----------------------------------------------------------------
Задачи виртуального режима 8086 обеспечивают возможность
моделирования виртуальных машин 8086. Исключения виртуального
режима 8086 аналогичны исключениям процессора 8086, однако с
некоторыми отличиями. Подробности см. в Главе 23.
                    Таблица 26-6. Исключения
-----------------------------------------------------------------
Мнемоника   Прерывание     Описание
-----------------------------------------------------------------
   #UD          6          Неверный код операции
   #NM          7          Устройство недоступно
   #DF          8          Двойной сбой
   #TS         10          Неверный TSS
   #NP         11          Сегмент или шлюз не присутствуют
   #SS         12          Сбой в стеке
   #GP         13          Сбой общей защиты
   #PF         14          Страничный сбой
   #MF         16          Ошибка операции с плавающей точкой
   #AC         17          Проверка выравнивания
-----------------------------------------------------------------
AAA - Преобразование к ASCII после сложения
-----------------------------------------------------------------
|Код       Команда  Число      Описание                         |
|операции           тактовых                                    |
|                   циклов                                      |
| 37       AAA         3       Преобразование к ASCII после     |
|                              сложения                         |
-----------------------------------------------------------------
Работа команды
--------------
IF ((AL AND 0FH) > 9) OR (AF = 1)
THEN
 AL <- (AL + 6) AND 0FH;
 AH <- AH + 1;
 AF <- 1;
 CF <- 1;
ELSE
 CF <- 0;
 AF <- 0;
FI;
Описание
--------
Команда AAA должна выполняться только после команды ADD,
помещающей байт результата в регистр AL. Младшие полубайты
операндов команды ADD должны быть в диапазоне от 0 до 9 (двоично
-десятичные цифры). В данном случае команда AAA преобразует
регистр AL таким образом, чтобы он содержал правильный результат
десятичной цифры. Если при сложении был выполнен десятичный
перенос, то регистр AH инкрементируется, а флаги CF и AF
устанавливаются. Если десятичного переноса не было, то флаги CF
и AF очищаются, а регистр AH остается без изменений. В любом
случае, регистр AL остается со старшим полубайтом, установленным
равным 0. Для преобразования регистра AL в результат ASCII
поместите после команды AAA команду OR AL,30H.
Изменяемые флаги
----------------
В случае десятичного переноса устанавливаются флаги AF  и CF,
а при  отсутствии десятичного переноса эти флаги очищаются;  флаг
OF, SF, ZF и PF неопределены.
Исключения защищенного режима
----------------------------------
     Отсутствуют
Исключения режима реальных адресов
---------------------------------------
     Отсутствуют
Исключения виртуального режима 8086
----------------------------------------
     Отсутствуют
-----------------------------------------------------------------
AAD - Преобразование AX к ASCII перед делением
-----------------------------------------------------------------
|Код       Команда  Число      Описание                         |
|операции           тактовых                                    |
|                   циклов                                      |
|D5 0A     AAD         14      Преобразование AX к ASCII перед  |
|                              делением                         |
-----------------------------------------------------------------
Работа команды
--------------
 AL <- AH * 10 + AL;
 AH <- 0;
Описание
--------
Команда AAD используется для подготовки двух двоично-десятичных
цифр (младшая цифра в регистре, старшая цифра в регистре AH) к
операции деления, которая даст неупакованный результат. Это
выполняется установкой регистра AL в AL + (10 * AH), с
последующей очисткой регистра AH. После этого регистр AX равен
двоичному эквиваленту исходного неупакованному двухзначному
числу.
Изменяемые флаги
----------------
Флаги SF, ZF и PF устанавливаются в соответствии с результатом;
флаги OF, AF и CF неопределены.
Исключения защищенного режима
----------------------------------
     Отсутствуют
Исключения режима реальных адресов
---------------------------------------
     Отсутствуют
Исключения виртуального режима 8086
----------------------------------------
     Отсутствуют
-----------------------------------------------------------------
AAM - Преобразование AX к ASCII после умножения
-----------------------------------------------------------------
|Код       Команда  Число      Описание                         |
|операции           тактовых                                    |
|                   циклов                                      |
|D4 0A     AAM        15       Преобразование AX к ASCII после  |
|                              умножения                        |
-----------------------------------------------------------------
Работа команды
--------------
 AH <- AL / 10;
 AL <- AL MOD 10;
Описание
--------
Команда AAM должна выполняться только после команды MUL,
выполняемой для двух неупакованных двоично-десятичных цифр и
помещающей результат в регистр AX. Поскольку результат меньше
100, он полностью помещается в регистре AL. Команда AAM
распаковывает результат в AL, деля AL на 10 и помещая частное
(старшая цифра) в регистр AH, а остаток (младшая цифра) в
регистр AL.
Изменяемые флаги
----------------
Флаги SF, ZF и PF устанавливаются в соответствии с результатом;
флаги OF, AF и CF неопределены.
Исключения защищенного режима
----------------------------------
     Отсутствуют
Исключения режима реальных адресов
---------------------------------------
     Отсутствуют
Исключения виртуального режима 8086
----------------------------------------
     Отсутствуют
-----------------------------------------------------------------
AAS - Преобразование AL к ASCII после вычитания
-----------------------------------------------------------------
|Код       Команда  Число      Описание                         |
|операции           тактовых                                    |
|                   циклов                                      |
| 3F       AAS         3       Преобразование AL к ASCII после  |
|                              вычитания                        |
-----------------------------------------------------------------
Работа команды
--------------
IF (AL AND 0FH) > 9 OR AF = 1
THEN
 AL <- AL - 6;
 AL <- AL AND 0FH;
 AH <- AH - 1;
 AF <- 1;
 CF <- 1;
ELSE
 CF <- 0;
 AF <- 0;
FI;
Описание
--------
Команда AAS должна выполняться только после команды SUB,
помещающей байт результата в регистр AL. Младшие полубайты
операндов команды SUB должны быть в диапазоне от 0 до 9 (двоично
-десятичные цифры). В данном случае команда AAS преобразует
регистр AL таким образом, чтобы он содержал правильный результат
десятичной цифры. Если при вычитании был выполнен десятичный
перенос, то регистр AH декрементируется, а флаги CF и AF
устанавливаются. Если десятичного переноса не было, то флаги CF
и AF очищаются, а регистр AH остается без изменений. В любом
случае, регистр AL остается со старшим полубайтом, установленным
равным 0. Для преобразования регистра AL в результат ASCII
поместите после команды AAS команду OR AL,30H.
Изменяемые флаги
----------------
В случае десятичного переноса устанавливаются флаги AF и CF, а
при отсутствии десятичного переноса эти флаги очищаются; флаги
OF, SF, ZF и PF неопределены.
Исключения защищенного режима
----------------------------------
     Отсутствуют
Исключения режима реальных адресов
---------------------------------------
     Отсутствуют
Исключения виртуального режима 8086
----------------------------------------
     Отсутствуют
-----------------------------------------------------------------


Яндекс цитирования