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


Симптоматическое питание, а еще посмотрим на проблему с смотрите на http://www.manada.ru.

 

Часть 13

               Глава 13. Расширенные инструкции
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Турбо Ассемблер распознает все  стандартные  мнемоники  инс-
трукций Intel,  применимые к текущему выбранному процессору. Дан-
ная глава представляет собой  обзор  этих  инструкций.  Подробный
перечень данных  инструкций  вы можете найти в кратком справочном
руководстве.

     Эффективная генерация кода: директивы SMART и NOSMART
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Эффективная генерация кода означает, что Турбо Ассемблер мо-
жет определить, что можно использовать различные инструкции более
эффективно, чем  вы  это делаете.  Например,  в некоторых случаях
можно заменить инструкцию LEA более короткой и быстрой инструкци-
ей MOV:

     LEA AX,lval

можно заменить на:

     MOV AX,OFFSET lval

     Турбо Ассемблер предусматривает директивы, которые позволяют
вам использовать эффективную генерацию кода. Эти директивы описа-
ны в следующей таблице:

              Директивы эффективной генерации кода   Таблица 13.1
ЪДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і    Директива    і    Значение                                  і
ГДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і    SMART        і    Разрешает генерацию эффективного кода.    і
і                 і                                              і
і    NOSMART      і    Запрещает генерацию эффективного кода.    і
АДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     По умолчанию  генерация эффективного кода разрешена.  Однако
на генерацию эффективного кода влияют не только директивы SMART и
NOSMART, но и директива VERSION.

            Примечание: О директиве VERSION подробнее рассказыва-
       ется в Главе 3.

     Генерация эффективного кода влияет на следующие ситуации ге-
нерации кода:

     - Замена инструкции LEA инструкцией MOV, если операндом инс-
       трукции LEA является простой адрес.

     - Где это возможно, выполняется генерация булевских инструк-
       ций со знаком,. Например, AND AX,+02 вместо AND AX,0002.

     - Замена  инструкции  CALL  FAR  xxxx комбинацией инструкций
       PUSH CS, CALL NEAR xxxx, где целевой адрес xxxx использует
       тот же регистр CS.

     Использование эффективных инструкций облегчает написание эф-
фективного кода.  Некоторые стандартные  инструкции  Intel  также
расширены таким образом,  чтобы расширить их возможности и облег-
чить использование. Они обсуждаются в следующих разделах.

               Расширенные инструкции перехода
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Условные переходы,  такие  как JC или JE в процессорах 8086,
80186 и 80286 могут быть только ближними (NAER),  то есть переход
выполняется в  границах  сегмента  и на расстояние -128 байт +127
байт относительно текущего адреса.  Это ограничение  действует  и
для условных  инструкций цикла,  таких как JCXZ или LOOP (на всех
процессорах фирмы Intel).

     Там, где это необходимо,  Турбо Ассемблер может генерировать
дополнительные последовательности  переходов и обходить это огра-
ничение. Например,  Турбо  Ассемблер может преобразовать инструк-
цию:

     JC xxx

в инструкции:

     JNC temptag
     JMP xxx

     Вы можете разрешить данную дополнительную последовательность
переходов в  помощью  директивы JUMPS,  и запретить ее директивой
NOJUMPS. По умолчанию Турбо Ассемблер не генерирует это средство.

     Когда вы указывает директиву JUMPS, Турбо Ассемблер резерви-
рует достаточно  места для дополнительных последовательностей пе-
рехода во всех условных переходах вперед. Когда определяется фак-
тическое расстояние  перехода  вперед,  дополнительная последова-
тельность может не понадобиться.  Когда это происходит, Турбо Ас-
семблер для заполнения лишнего пространства генерирует инструкции
NOP.

     Чтобы избежать дополнительных инструкций NOP, вы можете:

     - использовать переопределение условных  переходов, диапазон
       которых вам известен, например:

               JC SHORT abc
               ADD ax,ax
     abc:

     - задать параметр командной строки /m (подробнее о нем расс-
       казывается в Главе 2).

       Дополнительные инструкции цикла процессора 80386
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В инструкциях  цикла  процессора  80386  в  качестве регист-
ра-счетчика может использоваться регистр CX или  ECX. Стандартные
мнемоники инструкций LOOP,  LOOPE,  LOOPZ,  LOOPNE и LOOPNZ фирмы
Intel выбирают регистр-счетчик на основе того,  является ли теку-
щий сегмент  кода  32-битовым  сегментом (тогда используется ECX)
или 16-битовым (используется регистр CX).

     Турбо Ассемблер имеет специальные инструкции, которые увели-
чивают гибкость средства LOOP.  Инструкции LOOP,  LOOPE,  LOOPWZ,
LOOPWNE и LOOPWNZ используют в качестве счетчика регистр CX,  не-
зависимо  от  текущего  сегмента.  Аналогично,  инструкции LOOPD,
LOOPDE,  LOOPDZ, LOOPDNE и LOOPDNZ используют в качестве счетчика
регистр ECX.

            Дополнительные инструкции ENTER и LEAVE
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Инструкции ENTER и LEAVE используются для удаления  из стека
кадра процедуры.  В зависимости от того, является текущий сегмент
кода 16-битовым или 32-битовым,  стандартные инструкции  ENTER  и
LEAVE будут модифицировать либо регистры BP и SP, либо EBP и ESP.
Если сегмент кода - это 32-битовый сегмент, а сегмент стека - 16-
битовый, то данные инструкции могут оказаться неподходящими.

     В Турбо  Ассемблере  предусмотрены 4 дополнительные инструк-
ции, которые всегда выбирают конкретный размер  стека, независимо
от размера сегмента кода. Инструкции ENTERW и LEAVEW всегда выби-
рают в качестве регистров кадра стека BP и SP,  a ENTERD и LEAVED
- регистры EBP и ESP.

            Дополнительные инструкции возврата
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Стандартная инструкция RET генерирует код, который соответс-
твующим образом завершает текущую процедуру.  Это включает в себя
генерацию кода завершения процедуры,  которая  использует  интер-
фейсные соглашения языка высокого уровня. Даже если для процедуры
используются соглашения NOLANGUAGE,  инструкция RET в зависимости
от описания  процедуры (описана она как NEAR или FAR) будет гене-
рировать различный код.  Для процедуры NEAR Турбо Ассемблер гене-
рирует дальнюю  инструкцию возврата.  Для процедуры FAR Турбо Ас-
семблер генерирует ближнюю инструкцию  возврата.  (Вне  процедуры
всегда генерируется ближний возврат.)

     Турбо Ассемблер  включает  в себя дополнительные инструкции,
которые позволяют задавать генерацию  нужных инструкций  возврата
(без кода завершения). Они перечислены в следующей таблице:

                       Инструкции возврата           Таблица 13.2
ЪДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і   Инструкция    і Функция                                     і
ГДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і   RETN          і Всегда генерирует ближний возврат.          і
і                 і                                             і
і   RETNF         і Всегда генерирует дальний возврат.          і
і                 і                                             і
і   RETCODE       і Генерирует возврат, тип  которого  соответ- і
і                 і ствует текущей выбранной модели. Для модели і
і                 і TINY, SMALL, COMPACT и TPASCAL генерируется і
і                 і ближний возврат. Для модели MEDIUM,  LARGE, і
і                 і HUGE и TCHUGE - дальний возврат.            і
АДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

              Расширенные инструкции PUSH и POP
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Турбо Ассемблер поддерживает несколько расширений инструкций
PUSH и POP. Эти расширения существенно уменьшают объем ввода, не-
обходимого для  задания расширенной последовательности инструкций
PUSH  и POP.

       Инструкции PUSH и POP с несколькими операндами
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     На одной строке вы можете задать несколько инструкций PUSH и
POP. Например:

     PUSH ax
     PUSH bx
     PUSH cx
     POP cx
     POP bx
     POP ax

можно записать как:

     PUSH ax bx cx
     POP cx bx ax

     Чтобы Турбо Ассемблер распознавал наличие нескольких операн-
дов в этих инструкциях, нужно чтобы любой операнд не мог рассмат-
риваться как часть соседнего операнда, например инструкция:

     PUSH foo [bx]

может привести к непредвиденному результату, поскольку foo,[bx] и
foo[bx] являются  допустимыми  выражениями.  Чтобы эта инструкция
стала определенней, можно  использовать  круглые  или  квадратные
скобки, например:

     PUSH [foo] [bx]

      Использование в инструкциях PUSH и POP указателей
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Стандартные инструкции PUSH и POP не могут сохранять в стеке
дальние указатели,  которые  требуют  4  байт в процессорах 8086,
80186 и 80286 и 6 байт в процессоре 80386.

     Турбо Ассемблер допускает указание в инструкциях PUSH  и POP
операнда-указателя  размером  DWORD для процессора 8086,  80186 и
80286 и QWORD для процессора 80386.  Когда  обнаруживаются  такие
инструкции, Турбо  Ассемблер генерирует инструкции PUSH и POP для
двух частей операнда.

        Занесение в стек константа (процессор 8086)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Хотя процессоры  80186б 80286 и 80386 среди основного набора
инструкций  содержат инструкцию PUSH,  которая заносит в стек не-
посредственное значение, в процессоре 8086 такой инструкции нет.

     Однако Турбо  Ассемблер  позволяет использовать в инструкции
PUSH константы и в процессоре 8086.  При этом генерируется после-
довательность инструкций,  имеющая  тот же результат,  что и инс-
трукция PUSH c операндом-константой для процессора 80186 и выше.

            Примечание: Это средство вы можете использовать толь-
       ко при разрешении генерации эффективного кода.

     Последовательность инструкций,  которую  Турбо Ассемблер ис-
пользуется для выполнения операции PUSH с константой, имеет длину
около 10 байт.  Они короче и выполняются быстрее,  чем выполнение
той же функции,  но их выполнение связано с  потерей  содержимого
регистра, например:

     MOV ax, constant
     PUSH ax

     Данная последовательность имеет длину только 6  байт,  но  в
процессе этого теряется содержимое регистра AX.

                Расширенные инструкции сдвига
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     При использовании процессор 8086 инструкции сдвига RCL, RCR,
ROL, ROR,  SHL,  SHR,  SAL и SAR не могут воспринимать  константу
циклического  сдвига,  отличную  от 1.  При работе на процессорах
80186,  80286 и 80386 можно использовать  константу  циклического
сдвига со значением до 255.

     Когда Турбо Ассемблер обнаруживает инструкцию сдвига со зна-
чением константы, большим 1 (при выборе процессора 8086),он гене-
рирует соответствующее число инструкций сдвига со значением конс-
танты циклического сдвига 1. Например, инструкции:

     .8086
     SHL ax,4

генерируют последовательность:

     SHL   ax,1
     SHL   ax,1
     SHL   ax,1
     SHL   ax,1

 Принудительное переопределение сегментов: инструкции SEGxx
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В Турбо  Ассемблере  предусмотрены  6  инструкций,   которые
приводят к генерации переопределений сегмента. Эти инструкции пе-
речислены в следующей таблице:

               Инструкции переопределения сегмента   Таблица 13.3
ЪДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і    Инструкция і Значение                                      і
ГДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і    SEGCS      і Генерирует префиксный байт переопределения CS.і
і               і                                               і
і    SEGSS      і Генерирует префиксный байт переопределения SS.і
і               і                                               і
і    SEGDS      і Генерирует префиксный байт переопределения DS.і
і               і                                               і
і    SEGES      і Генерирует префиксный байт переопределения ES.і
і               і                                               і
і    SEGFS      і Генерирует префиксный байт переопределения FS.і
і               і                                               і
і    SEGGS      і Генерирует префиксный байт переопределения GS.і
АДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Вы можете  использовать  эти инструкции в сочетании с такими
инструкциями, как XLATB,  которые не требуют аргументов, но могут
использовать переопределение сегментов, например:

     SEGCS XLATB

     Заметим, что в большинстве инструкций имеется альтернативная
форма, при которой,  чтобы указать на необходимость переопределе-
ния, вы можете задать пустой аргумент:

     XLAT BYTE cs:[bx]

     Приведенные два примера генерируют один и тот же код.

        Дополнительные инструкции работы с флагами
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Часто, чтобы улучшить эффективность и уменьшить размер кода,
можно упростить  инструкции  работы  с  флагами.  Например,  если
единственным желаемым результатом является  установка конкретного
бита в AX,  а флаги процессора, на которые влияет данная инструк-
ция, значение не имеют, инструкцию:

     OR ax,1000h

можно упростить до инструкции:

     OR, ah,10h

     Турбо Ассемблер обеспечивает  4  дополнительных  инструкции,
которые обеспечивают эти функциональные возможности. Они показаны
в следующей таблице:

          Эффективные инструкции работы с флагами    Таблица 13.4
ЪДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і    Инструкция   і Функция        іСоответствует инструкции     і
ГДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і    SETFLAG      і Установка бит  і          OR                 і
і                 і (бита) флага.  і                             і
і                 і                і                             і
і    MASKFLAG     і Размаскированиеі          AND                і
і                 і бит (бита)     і                             і
і                 і флага.         і                             і
і                 і                і                             і
і    TESTFLAG     і Проверка бит   і          TEST               і
і                 і (бита) флага.  і                             і
і                 і                і                             і
і    FLIPFLAG     і Дополнение бит і          XOR                і
і                 і (бита) флага.  і                             і
АДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Эти инструкции можно использовать для  улучшения модульности
записей, например:

     FOO        RECORD R0:1,R1:4,R2:3,R3:1
        .
        .
        .
        TESTFLAG AX,R0

     В данном примере TESTFLAG будет генерировать наиболее эффек-
тивные инструкции, независимо от того, где в записи находится R0.

      Дополнительные инструкции работы с битами полей
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Турбо Ассемблер  может  генерировать  специальные последова-
тельности инструкций для задания значений и  извлечения  значений
из битовых полей, заданных с помощью оператора RECORD. Это позво-
ляет вам писать код, независимый от фактического расположения по-
ля в записи.  При использовании их в сочетании с оператором ENUM,
записи на языке ассемблера могут получить очень  высокий  уровень
модульности. Список  данных инструкций приведен в следующей табли-
це:

    Инструкции для установки и извлечения значения   Таблица 13.5
ЪДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і   Инструкция  і  Функция                                      і
ГДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і   SETFIELD    і  Устанавливает значение поля записи.          і
і               і                                               і
і   GETFIELD    і  Извлекает значение из поля записи.           і
АДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

                       Инструкция SETFIELD
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Инструкция SETFIELD генерирует код, устанавливающий значение
поля записи. Она имеет синтаксис:

     SETFIELD имя_поля регистр/память_приемник, регистр_источник

где "имя_поля"  - имя поля записи,  "регистр/память_приемник" для
SETFIELD представляет собой регистр или адрес в памяти  типа BYTE
или WORD (DWORD для процессора 80386).  "Регистр_источник" должен
быть регистром того же или меньшего размера.  Если источник мень-
ше, чем приемник,  то регистр-источник должен быть младшей частью
другого регистра,  имеющего тот же размер,  что и приемник.  Этот
полный регистр  называется рабочим регистром.  Используйте данный
регистр для сдвига значения в регистре-источнике,  благодаря чему
оно выравнивается по приемнику. Например:

     FOO        RECORD R0:1,R1:4,R2:3,R3:1
        .
        .
        .
        SETFIELD  F1  AX,BL     ; рабочим регистром является BX
        SETFIELD  F1  AX,BH     ; недопустимо!

     SETFIELD сдвигает регистр-источник,  чтобы эффективно выров-
нять его на поле приемника,  выполняет операцию OR и помещает ре-
зультат в регистр-приемник.

           Примечание: Операция SETFIELD уничтожает все  содержи-
      мое рабочего регистра.

     Чтобы выполнить свою функцию, инструкция SETFIELD генерирует
эффективную и  расширенную  последовательность  инструкций   XOR,
XCHG, ROL, ROR, OR и MOVZX.

     Операция SETFIELD  не  пытается  очистить целевое поле перед
выполнением над его значением операции OR.  Если это  необходимо,
вы можете   очистить  поле  явным  образом, используя  инструкцию
MASKFLAG.

                     Инструкция GETFIELD
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Инструкция GETFIELD извлекает данные из поля  записи. Логика
ее работы противоположна инструкции SETFIELD. Она имеет следующий
синтаксис:

     GETFIELD имя_поля регистр_приемник, регистр/память_источник

где "имя_поля" и "регистр_приемник" работают так же, как в опера-
ции SETFIELD. "Регистр/память_источник" можно использовать также,
как "регистр_источник" в операции SETFIELD, например:

     FOO        RECORD R0:1,R1:4,R2:3,R3:1
        .
        .
        .
        GETFIELD  F1  AX,BL     ; рабочим регистром является BX
        GETFIELD  F1  AX,BH     ; недопустимо!

           Примечание: Операция GETFIELD уничтожает все  содержи-
      мое рабочего регистра.

     Операция GETFIELD извлекает значение  поля,  обнаруженное  в
регистре-источнике или  по  адресу памяти,  и устанавливает в это
значение соответствующую часть регистра-приемника.  На другие ре-
гистры (кроме рабочего) и флаги процессора эта инструкция не вли-
яет.

     Чтобы выполнить свою функцию, инструкция GETFIELD генерирует
эффективную и  расширенную  последовательность  инструкций   MOV,
XCHG, ROL и ROR.

Дополнительная быстрая инструкции непосредственного умножения
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Для эффективной индексации массивов Турбо Ассемблер  обеспе-
чивает специальную операцию непосредственного умножения. Инструк-
ция FASTIMUL решает типичную проблему,  возникающую при  создании
массива структур. Для процессора 8086 инструкция непосредственно-
го умножения недоступна. Даже на более развитых процессорах умно-
жение с использованием сдвигов и сложений выполняется в некоторых
обстоятельствах существенно быстрее,  чем стандартная  непосредс-
твенная инструкция IMUL. На основе текущего назначения процессора
инструкция Турбо Ассемблера FASTIMUL выбирает между наиболее  эф-
фективной доступной  последовательностью сдвигов и сложений и не-
посредственной операцией IMUL текущего процессора (если она  име-
ется). Инструкция FASTIMUL имеет следующий синтаксис::

     FASTIMUL регистр_приемник, регистр/память_источник, значение

     Данная инструкция  очень напоминает тернарную операцию IMUL,
доступную на процессорах 80186, 80286 и 80386. Регистр-приемник -
это  регистр  размером  в  слово (или двойное слово при работе на
процессора 80386).  "Регистр/память_источник" - это  регистр  или
адрес в памяти, который должен соответствовать размеру приемника.
"Значение" - это фиксированная константа со знаком (множитель).

     Инструкция FASTIMUL использует для выполнения  своей функции
комбинацию инструкций IMUL,  MOV,  NEG,  SHL, ADD и SUB. При этом
содержимое регистра-источника (или адреса памяти) теряется. Флаги
процессора не изменяются.

   Расширение необходимых инструкций для процессора 80386
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Процессор 80386 имеет возможность работы в 16-  или  32-раз-
рядном режиме.  Многие стандартные инструкции в этих разных режи-
мах имеют разный смысл.  В Турбо Ассемблере  размером  инструкции
можно управлять с помощью используемых в выражениях переопределе-
ний SMALL и LARGE.

     В общем случае,  если вы в  адресном  выражении  используете
SMALL и LARGE,  операция управляет генерацией адресной части инс-
трукции в зависимости от того, должна она быть 16- или 32-разряд-
ной.

          Примечание: Более  подробно о переопределении размера с
     помощью операций SMALL и LARGE рассказывается в Главе 5.

     Когда SMALL или LARGE указывается вне адресной части выраже-
ния, то  можно управлять тем,  какая инструкция выполняется - 16-
или 32-битовая.  В тех случаях, когда размер инструкции определя-
ется по  типу операнда,  Турбо Ассемблер сам выбирает размер инс-
трукции. Действие SMALL и LARGE показано в следующей таблице.

           Примечание: Турбо Ассемблер выбирает  размер  инструк-
      ции,  используя SMALL и LARGE,  только когда нет другой ин-
      формации.

               Действие инструкций SMALL и LARGE     Таблица 13.6
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і Инструкция                  і Действие                        і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і PUSH[SMALL/LARGE] сегм_рег  і Выбирает, какая форма сегментно-і
і                             і го регистра  (16- или 32-разряд-і
і                             і ная) используется  в  инструкцииі
і                             і PUSH.                           і
і                             і                                 і
і POP[SMALL/LARGE] сегм_рег   і Выбирает, какая форма сегментно-і
і                             і го регистра  (16- или 32-разряд-і
і                             і ная) используется  в  инструкцииі
і                             і POP.                            і
і                             і                                 і
і FSAVE[SMALL/LARGE] указ_пам і Выбирает, какая форма  состоянияі
і                             і с плавающей   точкой   (16-  илиі
і                             і 32-разрядная) сохраняется.      і
і                             і                                 і
і FRSTOR[SMALL/LARGE] указ_памі Выбирает, какая форма  состоянияі
і                             і с плавающей   точкой   (16-  илиі
і                             і 32-разрядная) восстанавливается.і
і                             і                                 і
і FSTENV[SMALL/LARGE] указ_памі Выбирает, какая форма  состоянияі
і                             і с плавающей   точкой   (16-  илиі
і                             і 32-разрядная) записывается.     і
і                             і                                 і
і FLDENV[SMALL/LARGE] указ_памі Выбирает, какая форма  состоянияі
і                             і с плавающей   точкой   (16-  илиі
і                             і 32-разрядная) загружается.      і
і                             і                                 і
і LGDT[SMALL/LARGE] указ_пам  і Выбирает, какая форма глобальнойі
і                             і таблицы дескрипторов (16- или 32і
і                             і -разрядная) загружается.        і
і                             і                                 і
і SGDT[SMALL/LARGE] указ_пам  і Выбирает, какая форма глобальнойі
і                             і таблицы дескрипторов (16- или 32і
і                             і -разрядная) сохраняется.        і
і                             і                                 і
і LIDT[SMALL/LARGE] указ_пам  і Выбирает,  какая  форма  таблицыі
і                             і дескрипторов прерываний (16- илиі
і                             і 32-разрядная) загружается.      і
і                             і                                 і
і SIDT[SMALL/LARGE] указ_пам  і Выбирает,  какая  форма  таблицыі
і                             і дескрипторов прерываний (16- илиі
і                             і 32-разрядная) сохраняется.      і
і                             і                                 і
і JMP[SMALL/LARGE] указ_пам   і Для адресов  памяти  размером  ві
і                             і двойное слово  (DWORD)  выбираеті
і                             і между 16-битовым  переходом  JMPі
і                             і типа  FAR и 32-битовым переходомі
і                             і JMP типа NEAR.                  і
і                             і                                 і
і  CALL[SMALL/LARGE] указ_пам і Для адресов  памяти  размером  ві
і                             і двойное слово  (DWORD)  выбираеті
і                             і между 16-битовой     инструкциейі
і                             і CALL  типа FAR и 32-битовой инс-і
і                             і трукцией CALL типа NEAR.        і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

              Вызов процедур с кадрами стека
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Турбо Ассемблер поддерживает  расширенную  форму  инструкции
CALL, которая  позволяет  вам непосредственно вызывать процедуры,
использующие интерфейсные соглашения языков высокого уровня.

     Аргументы процедурам,  использующим интерфейсные  соглашения
языков высокого уровня,  передаются через стек в кадре стека. Пе-
ред вызовом процедуры вызывающая программа должна занести эти ар-
гументы в стек.

     Используемые процедурой  интерфейсные  соглашения определяют
порядок, в котором аргументы должны заноситься в стек. Для проце-
дур Бейсика,  Фортрана и Паскаля аргументы заносятся в стек в том
порядке, в котором они указываются. Для языков Си и С++ аргументы
заносятся в стек в обратном порядке.

     Используемые процедурой  интерфейсные  соглашения определяют
также, должна удалять аргументы из стека после  вызова  процедуры
сама процедура или вызывающая программа.  Языка Си и С++ требуют,
чтобы стек очищала вызывающая программа.  Во всех  других  языках
процедура должна  сама удалить аргументы из стека перед возвратом
управления.

     Турбо Ассемблер с помощью расширенной  инструкции  CALL  сам
выполняет за  вас функции по занесению аргументов в стек в нужном
порядке и очисткой стека.  Вызов процедуры  с  параметрами  имеет
следующий синтаксис:

     CALL выражение [язык] [,список_аргументов]

где "выражение" является целью инструкции CALL, "язык" задает ис-
пользуемые при вызове языковые соглашения.  Если  вы  не  задаете
язык, Турбо  Ассемблер  использует по умолчанию язык,  заданный в
директиве MODEL.

           Примечание: О директиве MODEL более подробнее  расска-
      зывается в Главе 7.

     Аргументы, если они имеются, указываются после идентификато-
ра языка.  Синтаксис каждого аргумента в списке совпадает с  син-
таксисом, который  используется  в расширенных инструкциях PUSH и
POP. Вы можете разделить эти аргументы запятыми, например:

     CALL test PASCAL,ax,es OFFSET buffer,blen
     Поскольку в данном примере указан Паскаль,  Турбо  Ассемблер
будет заносить аргументы в стек в том порядке, в котором они ука-
заны.  Этот пример эквивалентен следующим инструкциям:

     PUSH ax
     PUSH es OFFSET buffer
     PUSH word PTR blen
     CALL test

     Вызов процедуры  Си  требует,  чтобы  аргументы заносились в
стек в обратном порядке.  Турбо Ассемблер делает это автоматичес-
ки, поэтому вызов вида:

     CALL test C,ax,es OFFSET buffer, word PTR blen

даст в результате следующий код:

     PUSH word PTR blen
     PUSH es OFFSET buffer
     PUSH ax
     CALL test
     SUB sp,8

     При вызове процедуры с аргументами аргументы в списке следу-
ет всегда указывать  в том порядке, в котором они следуют в заго-
ловке процедуры.  При  необходимости  Турбо Ассемблер изменяет их
порядок на обратный.

     Нужно не забывать разделять аргументы запятыми, а компоненты
аргументов -  пробелами.  В  зависимости от соглашений указанного
языка Турбо Ассемблер может заносить аргументы в стек  в обратном
порядке, но порядок компонентов аргумента он не изменяет.

     Если при   вызове   используются   интерфейсные   соглашения
NOLANGUAGE, Турбо Ассемблер при наличии любого аргумента сообщает
об ошибке. Хотя аргументы для процедуры NOLANGUAGE можно задать с
помощью директивы ARG, при вызове такой процедуры требуется явное
занесение аргументов в стек.

           Вызываемые процедуры, содержащие RETURNS
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Процедуры, определяющие  некоторые из своих аргументов с по-
мощью ключевого слова RETURNS  требуют  отдельного  рассмотрения.
Эти  аргументы  используются  для  возврата значений в вызывающую
программу.  Таким образом,  вызывающая программа всегда извлекает
их из стека.  Чтобы способствовать передаче этих аргументов, зад-
анных  в описании процедуры после директивы RETURNS,  в Турбо Ас-
семблере  нет специальных расширений инструкции CALL.  Перед инс-
трукцией CALL вы должны явным образом занести  аргументы  в  стек
(PUSH), а потом извлечь их их стека (POP).

     Вызов процедур методов для объектов: CALL...METHOD
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     Инструкция CALL расширена таким образом,  чтобы поддерживать
методы объектов. Вызов метода объекта может генерировать либо не-
посредственный вызов  (для  статических методов),  либо косвенный
вызов (для виртуальных методов).

     Поскольку вы можете использовать косвенный вызов,  выполняю-
щие вызов инструкции  могут нарушить содержимое некоторых регист-
ров. В этом случае,  если вы используете вызов виртуального мето-
да, Турбо Ассемблер позволяет вам выбрать соответствующие регист-
ры.
     Приведем синтаксис расширения CALL...METHOD:
     CALL указатель_экземпляра METHOD [имя_объекта:]имя_метода
        [USES [сегм_регистр:]регистр_смещения] [язык_и_аргументы]

где "указатель_экземпляра"  должен описывать экземпляр объекта. В
режиме MASM часто невозможно определить имя объекта, связанного с
экземпляром. В этом случае Турбо Ассемблер позволяет использовать
поле "имя_объекта", благодаря чему вы можете задать имя экземпля-
ра объекта.

     Поле "имя_метода" содержит имя метода,  который должен вызы-
ваться для конкретного экземпляра объекта.

           Примечание: О том, как задавать виртуальных или стати-
      ческий метод, подробнее рассказывается в Главе 8.

     Если метод является виртуальным,и требуется косвенный вызов,
инструкция CALL...METHOD выполняет косвенный вызов через регистры
ES:BX (ES:EBX для модели USE32 процессора 80386).  Если вы хотите
использовать другие регистры,  можно переопределить их с  помощью
оператора USES. Поле "сегм_регистр" это необязательный используе-
мый сегментный регистр, а "регистр_смещения" - это регистр смеще-
ния, используемый для вызова.

     Для объектов, описанных с помощью таблиц NEAR, CALL...METHOD
загружает только регистр смещения.  Турбо Ассемблер предполагает,
что сегментный регистр всегда установлен в корректное значение.

            Примечание: Хорошей  практикой программирования явля-
       ется соответствующий  вызов  методов  с помощью косвенного
       вызова, даже когда вы знаете, что вызываемый метод являет-
       ся статическим.  При модификации объектов методы могут из-
       мениться со статических на виртуальные.

     Поле "язык_и_аргументы"  инструкции  CALL...METHOD  содержит
необязательные спецификации языка и аргументов, которые идентичны
по форме описанным в предыдущем разделе.

     Вызов процедур  методов  для  С++  и Паскаля требует обычно,
чтобы экземпляр объекта передавался в качестве аргумента в стеке.
Подробнее об этом рассказывается в Главе 18 и Главе 19.

таточная рекурсия для методов объектов: инструкция JMP...METHOD
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Турбо Ассемблер обеспечивает инструкцию JMP...METHOD,  соот-
ветствующую инструкции  CALL...METHOD.  Она  имеет следующий син-
таксис:

     JMP указатель_экземпляра METHOD [имя_объекта:]имя_метода
        [USES [сегм_регистр:]регистр_смещения]

     Инструкция JMP...METHOD   полностью   аналогична  инструкции
CALL...METHOD, за исключением того, что она:

     - генерирует вместо инструкции CALL инструкцию JMP;

     - генерирует код завершения процедуры для очистки стека  пе-
       ред генерацией инструкции JMP.

     Инструкция JMP...METHOD  позволяет  писать  эффективный  код
остаточной рекурсии (tail recursion). Она предназначена для заме-
ны общей  ситуации,  когда инструкция  CALL...METHOD  дается  для
конкретного метода с последующей инструкцией RET.

 Дополнительные инструкции для объектного программирования
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     При создании  экземпляра  объекта требуется инициализировать
указатель таблицы  виртуальных методом объекта (если он имеется),
чтобы он указывал на корректную таблицу виртуальных методов.  Ин-
струкция TBLINIT позволяет вам сделать это автоматически. Эта ин-
струкция имеет следующий синтаксис:

     TBLINIT указатель_экземпляра_объекта

     Поле "указатель_экземпляра__объекта"  представляет собой ад-
рес объекта, указатель таблицы виртуальных методов которого нужно
инициализировать. Инструкция TBLINIT предполагает,  что экземпляр
объекта должен иметь тип текущего объекта (другими  словами,  не-
посредственно предшествующее  определение объекта определяет объ-
ектный тип, который инициализирует TBLINIT). Например:

     TBLINIT DS:ST

 инициализирует указатель таблицы виртуальных методов объекта DS:
SI (если она имеется).

               Глава 14. Использование макрокоманд
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Макрокоманды позволяют вам задавать имя  идентификатора  для
текстовой  строки  или блока кода,  которые будут часто использо-
ваться в программе.  Однако макрокоманды выходят за рамки простой
подстановки.  В Турбо Ассемблере имеются макрооперации, обеспечи-
вающие большую гибкость в определении макрокоманд.  В сочетании с
возможностью использования  макрокоманд из нескольких строк с ар-
гументами это превращает макросредства Турбо Ассемблера  в  очень
мощный инструмент.  В данной главе описывается, как можно исполь-
зовать в программах текстовые макрокоманды и макрокоманды, состо-
ящие из нескольких строк.

                 Текстовые макрокоманды
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Текстовая макрокоманда - это  идентификатор,  представляющий
строку текстовых  символов.  Когда  Турбо  Ассемблер обнаруживает
идентификатор в выражениях (и в других ситуациях), он подставляет
вместо него текстовые символы. Например, если DoneMsg - это текс-
товая макрокоманда,  имеющая значение "Returning to DOS", то сле-
дующий оператор:

     GoodBy    DB DoneMsg

дает в результате:

     GoodBy    DB 'Returning to DOS'

  Определение текстовых макрокоманд с помощью директивы EQU
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Для определения простых текстовых макрокоманд можно  исполь-
зовать директиву EQU.Приведем синтаксис определения текстовой ма-
крокоманды:

     имя   EQU  текстовая_строка

где "текстовая_строка" связывается с  текстовой  макрокомандой  с
именем "имя".  Для выделения текста вы можете заключить текстовую
строку в угловые скобки (<>), например:

     DoneMsg    DB <'Returning to DOS'>

     Если в режиме MASM вы опустите скобки,  то  Турбо  Ассемблер
будет определять,  можно  ли свести текстовую строку к выражению.
Если ее вычислить нельзя,  Турбо Ассемблер будет интерпретировать
текстовую  строку  как  текстовую  макрокоманду  (чтобы сохранить
совместимость c MASM).  Чтобы обеспечить  правильное  определение
текстовой строки,  нужно  всегда  заключать  ее в угловые скобки.
Рассмотрим следующие ошибки,  которые могут  возникать,  если  вы
этого не делаете:

     Earth   EQU dirt        ; Earth = "dirt"
     Planet  EQU Earth       ; Planet = "dirt" (неверно!)
     Planet  EQU      ; Planet = "Earth" (верно!)

     В режиме Ideal оператор EQU всегда определяет текстовую мак-
рокоманду.

     Текстовые макрокоманды  являются переопределяемыми. Вы може-
те переопределить  текстовую  макрокоманду в том же модуле другой
текстовой строкой.

     Директивы макрокоманд работы с текстовыми строками
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Турбо Ассемблер обеспечивает директивы,  которые могут рабо-
тать с текстовыми макрокоманд.  Эти директивы доступны  в  режиме
Ideal и  для  версий  M510,  M520 и T300 (как задается директивой
VERSION).

     Строковые аргументы для любой из этих  директив  могут  быть
следующими:

     - текстовой строкой, заключенной в скобки, например, ;

     - именем ранее определенной текстовой макрокоманды;

     - выражением с предшествующим символом %,  значение которого
       эквивалентно числовому представлению  строки  для текущего
       основания.

                      Директива CATSTR
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Директива CATSTR определяет новую текстовую макрокоманду пу-
тем конкатенации строк. Она имеет следующий синтаксис:

     имя CATSTR строка[,строка]...

     Директива CATSTR выполняет конкатенацию слева-направо. Турбо
Ассемблер создает новую текстовую макрокоманду с именем "имя".

                      Директива SUBSTR
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Директива SUBSTR  определяет  новую  текстовую макрокоманду,
которая является подстрокой строки.  Она имеет следующий  синтак-
сис:

     имя SUBSTR строка,выражение_позиции[,выражение_размера]

     Новая текстовая макрокоманда с именем "имя" состоит из части
строки ,  начинающейся с символа в позиции "выражение_позиции"  и
длины "выражение_длины".  Если вы не указываете "выражение_разме-
ра", новая текстовая макрокоманда содержит остаток строки,  начи-
ная с символа в "выражении_позиции". Турбо Ассемблер рассматрива-
ет первый символ строки как позицию 1.

                       Директива INSTR
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Директива INSTR  возвращает позицию одной строки внутри дру-
гой. Она имеет следующий синтаксис:

     имя INSTR [выражение_начала,]строка_1,строка_2

     Турбо Ассемблер присваивает "имя" числовому значению,  кото-
рое соответствует  первой  позиции первого вхождения "строки_2" в
"строку_1". Первый символ "строки_1" имеет позицию 1. Если "стро-
ка_2" в  "строке_1" не содержится,  то Турбо Ассемблер возвращает
значение 0.  Если вы укажете "выражение_начала", то поиск начина-
ется с символа, задаваемого этим выражением. Первый символ строки
находится в позиции 1.

                      Директива SIZESTR
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Директива SIZESTR  возвращает  длину  текстовой макрокоманды
(число символов в строке). Она имеет синтаксис:

     имя SIZESTR строка

где "имя" устанавливается в числовое значение,  равное длине ука-
занной строки. Нулевая строка <> имеет длину 0.

            Примеры макрокоманд работы с текстом
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Следующие примеры показывают, как работают эти операции:

     VERSION T300
     ABC     EQU                        ; ABC = "abc"
     ABC2    EQU       ABC                   ; ABC2 = "ABC"
     ABC     EQU                        ; ABC = "det"
                                             ; (переопределяется)
     ABC3    CATSTR    ABC2,<,>,ABC,<,>,ABC2 ;ABC3 = "ABC,DEF,
                                             ; ABC"
     ABCLEN  SIZESTR   ABC                   ; ABCLEN = 3
     ABC3LEN SIZESTR   ABC3                  ; ABC3LEN = 11
     COMMA1  INSTR     ABC3,<,>              ; COMMA1 = 4
     COMMA2  INSTR     COMMA1+1,ABC3,<,>     ; COMMA2 = 8
     ABC4    SUBSTR    ABC3,5                ; ABC4 = "def,ABC"
     ABC5    SUBSTR    ABC3,5,3              ; ABC5 = "def"
     ABC6    EQU       3+2+1                 ; ABC6 = 6
                                             ; (числовое
                                             ; присваивание)
     ABC7    EQU       %3+2+1                ; ABC7 = "6"
                                             ; (текстовая
                                             ; макрокоманда)
     ABC8    EQU       %COMMA1               ; ABC8 = "4"

         Макрокоманды, состоящие из нескольких строк
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Макрокоманды, состояние из нескольких строк,  позволяют  вам
определить в их теле инструкции, директивы или другие макрокоман-
ды, которые будут включаться в исходный код при  вызове  макроко-
манды. Вы  можете  указать аргументы макрокоманды,  которые Турбо
Ассемблер будет подставлять в тело макрокоманды при  ее включении
в модуле.

     Существует насколько  типов  макрокоманд,  состоящих из нес-
кольких строк.  Одна версия  подставляет  каждый  элемент  строки
(один за другим),  который является аргументом макрокоманды. Дру-
гая версия повторяет определенное число  раз  тело  макрокоманды.
Наконец, в одном месте вы можете определить еще одну версию,  ко-
торая будет много раз вызываться.  Все эти версии имеют общее оп-
ределение тела макрокоманды.

      Тело макрокоманды, состоящей из нескольких строк
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Независимо от содержимого тела макрокоманды,  средство обра-
ботки макрокоманд  Турбо  Ассемблера интерпретирует макрокоманду,
состоящую из нескольких строк, как просто несколько строк текста.
Турбо Ассемблер позволяет вам заменить идентификаторы в теле мак-
рокоманды текстом, заданным при вызове макрокоманды. Это средство
называется подстановкой аргументов.  Идентификаторы в теле макро-
команды, которые должны  быть  заменены,  называются  формальными
(фиктивными) аргументами.  Предположим, например, что идентифика-
тор foo - это формальный аргумент в следующем теле макрокоманды:

     PUSH foo
     MOV foo,1

     Если при  вызове  данной  макрокоманды  вы  присваиваете foo
текстовую строку AX, то фактическим включаемым в модуль текст бу-
дет:

     PUSH foo
     MOV AX,1

     Правила, которые Турбо Ассемблер использует для  распознава-
ния формальных аргументов,  достаточно сложны. Рассмотрим, напри-
мер, следующие строки тела макрокоманды,  где формальный аргумент
foo не распознается:

     symfoo:
          DB 'It is foo time'

     В общем случае Турбо Ассемблер не  будет  распознавать  фор-
мальный аргумент (без специального указания) в следующих ситуаци-
ях:

     - когда он является частью другого идентификатора;

     - когда он находится внутри кавычек (' или ");

     - в  режиме  Ideal,  когда он указывается после двоеточия не
       внутри кавычек.

           Использование в макрокомандах символа &
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Символ &  в теле макрокоманды имеет специальное значение.  В
общем случае  & отделяет имя формального аргумента от окружающего
текста, благодаря чему Турбо Ассемблер может распознавать его при
подстановке. Если, например, имеется следующее тело макрокоманды:

     sym&foo:
          DB 'It is &foo time'

и если  вы при вызове данной макрокоманды присвоите foo текстовую
строку party, то фактическим включаемым в модуль текст будет сле-
дующее:

     symparty:
          DB 'It is party time'

     В качестве другого примера можно привести следующий:

     foo&sym:
          DB 'We are in O&foo&o'

     Если вы при вызове данной макрокоманды присвоите foo тексто-
вую строку  hi,  то  фактическим  включаемым в модуль текст будет
следующее:

     hisym:
          DB 'We are in Ohio'

     Приведем правила для символа &:

     - вне заключенных в кавычки строк символ &  используется как
       разделитель;

     - внутри заключенной в кавычки строки и после двоеточия, ко-
       торое не находится в заключенной в кавычки строке в режиме
       Ideal, символ & должен предшествовать формальному аргумен-
       ту (чтобы этот аргумент мог распознаваться);

     - при расширении макрокоманды Турбо Ассемблер  удаляет  один
       символ & из группы таких символов.

     Последний пункт дает возможность помещать внутри макрокоманд
макроопределения, требующие символа &. Турбо Ассемблер будет уда-
лять только один символ & из группы.

         Включение комментариев в тело макрокоманды
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В особенно сложных макрокомандах иногда желательно поместить
в теле макрокоманды комментарии, которые не должны включаться при
ее расширении.  Это также уменьшает объем необходимой  Турбо  Ас-
семблеру для обработки макрокоманд памяти.  Для этого используйте
комментарий с предшествующей двойной  точкой  запятой  (в  начале
строки). Например, следующее тело макрокоманды:

     ;; Это макрокоманда с комментарием
     DB 'макрокоманда с комментарием'

приведет к включению при ее вызове только следующего текста:

     DB 'макрокоманда с комментарием'

           Примечание: Комментарии с одиночной точкой  с  запятой
      при вызове  макрокоманды  всегда включаются в макрорасшире-
      ние.

               Локальные формальные аргументы
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В начале  тела  макрокоманды  вы всегда можете включить одну
или более директив LOCAL.  Директива LOCAL описывает  специальные
формальные аргументы,  которым при каждом расширении макрокоманды
будет присваиваться уникальное символьное имя.

     Синтаксис директивы LOCAL в теле макрокоманды выглядит  сле-
дующим образом:

     LOCAL формальный_аргумент_1 [,формальный_аргумент_2]...

     Если имя "формальный_аргумент", указанное в директиве LOCAL,
не  содержит префикс локального идентификатора,  то присваиваемое
ему уникальное имя идентификатора будет  иметь  вид  ??xxxx,  где
xxxx  представляет  шестнадцатиричное  число.  В противном случае
уникальное  символьное  имя  будет  иметь   вид   <локальный_пре-
фикс>xxxx.

           Примечание: Подробности о разрешении локальных иденти-
      фикаторов и задании локального префикса можно узнать в Гла-
      ве 11.

     Вы можете  использовать формальные аргументы LOCAL для зада-
ния в теле макрокоманды меток, например:

     LOCAL @agn, @zero
        XOR dx,dx
        MOV cx,exp
        MOV ax,1
        JCXZ @zero
        MOV bx,factor
     @agn: MUL bx
        LOOP @agn
     @zero:

                       Директива EXITM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Директиву EXITM  можно  использовать в теле макрокоманды для
принудительного завершения ассемблирования включаемого тела  мак-
рокоманды. Она имеет следующий синтаксис:

     EXITM

     Когда Турбо  Ассемблер  обнаруживает  директиву EXITM в теле
макрокоманды, которая включена в исходный код модуля, ассемблиро-
вание расширенного  тела  макрокоманды  немедленно  прекращается.
Вместо этого Турбо Ассемблер будет продолжать ассемблирование мо-
дуля после конца макрокоманды.

     Для завершения макрокоманды при определенных условиях вы мо-
жете использовать оператор EXITM с директивой условного ассембли-
рования.

           Примечание: Директивы  условного  ассемблирования под-
      робнее рассматриваются в Главе 15.

        Директива GOTO и макроидентификаторы перехода
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Использование директивы GOTO и макроидентификаторов перехода
позволяют вам управлять последовательностью расширения строк мак-
рокоманды.  Вы можете поместить цель перехода в любом месте  тела
макрокоманды. Она занимает всю строку макрокоманды и имеет следу-
ющий синтаксис:

     :идентификатор_перехода

     При расширении макрокоманды все макроидентификаторы перехода
отбрасываются.

     Директива GOTO сообщает Турбо Ассемблеру,  что нужно перейти
на заданную  точку  исходного  кода,  а  именно - на "идентифика-
тор_перехода". Это позволяет вам поместить GOTO в блоке условного
ассемблирования. Например:

     IF foo
        GOTO tag1
     ENDIF
        DISPLAY "foo имеет значение false!"
     :tag
              ; возобновление макрокоманды...
              ; работает одинаково, независимо от того,
              ; равно foo false или true

           Примечание: Будьте аккуратны и не создавайте  при  ис-
      пользовании  директивы GOTO бесконечных циклов. Бесконечные
      циклы могут привести к тому,  что Турбо Ассемблер исчерпает
      доступную память или даже прекратит работу.

     Подробнее о директивах условного ассемблирования рассказыва-
ется в Главе 15.

      Общие макрокоманды, состоящие из нескольких строк
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Турбо Ассемблер  связывает  тело макрокоманды,  состоящей из
нескольких строк (включая директивы, инструкции и другие макроко-
манды) с символьным именем макрокоманды.  При использовании имени
макрокоманды в качестве  директивы  Турбо  Ассемблер  включает  в
программу тело макрокоманды (операторы).  Таким образом вы можете
использовать макрокоманду,  состоящую из нескольких  строк,  нес-
колько раз.

     Приведем синтаксис  общей  макрокоманды  из нескольких строк
режима Ideal:

     MACRO имя список_параметров
      тело_макрокоманды
     ENDM

     В режиме MASM общее определение макрокоманды  из  нескольких
строк имеет следующий синтаксис:

     имя MACRO список_параметров
      тело_макрокоманды
     ENDM

где "имя"  - это имя определяемой вами макрокоманды из нескольких
строк. "Тело_макрокоманды" содержит операторы, которые составляет
тело макрорасширения. В макрокоманду вы можете помещать любые до-
пустимые операторы Турбо Ассемблера (и любое их число).  Макроко-
манду завершает ключевое слово ENDM.

     В следующем   примере  определяется  макрокоманда  с  именем
PUSHALL, которая при вызове включает в вашу программу тело макро-
команды, состоящее из трех инструкций PUSH:

     PUSHALL MACRO
        PUSH AX BX CX DX
        PUSH DS SI
        PUSH ES DI
     ENDM

     "Список_параметров" -  это  список формальных аргументов (их
идентификаторов) макрокоманды. Он имеет следующий синтаксис:

     [формальный_аргумент  [,формальный_аргумент]...]

     В макрокоманде вы можете использовать любое число формальных
аргументов (если они не умещаются на одной строке,  для продолже-
ния на другой строке можно использовать символ /). Например:

     ADDUP MACRO dest,\       ; dest - это первый формальный
                              ; аргумент, а s1,s2 -
                              ; это второй и третий
                              ; аргумент макрокоманды
        MOV dest,s1
        ADD dest,s2
     ENDM

     Каждый формальный аргумент имеет следующий синтаксис:

     имя_формального_аргумента[:тип_аргумента]

где "имя_аргумента" - это символьное имя,  используемое для подс-
тановки (вместо него) фактического параметра,  передаваемого мак-
рокоманд при ее вызове. Необязательный "тип_аргумента" задает ка-
кую-то информацию о виде фактического  параметра, воспринимаемого
при вызове макрокоманды. Поддерживаются следующие типы:

                 Типы формальных аргументов          Таблица 14.1
ЪДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і  Тип                 і Значение                               і
ГДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і  REQ                 і Аргументы не  могут быть  нулевыми или і
і                      і состоять из пробелов.                  і
і                      і                                        і
і  =<текстовая_строка> і Заключенная в кавычки текстовая строка і
і                      і задает используемое по умолчанию  зна- і
і                      і чение аргумента (когда фактический ар- і
і                      і гумент является нулевым или состоит из і
і                      і пробелов).                             і
і                      і                                        і
і  VARARG              і Фактический аргумент  состоит  из  ос- і
і                      і тальной части макровызова, интерпрети- і
і                      і руемого  как  список  аргументов.  Для і
і                      і обеспечения этой интерпретации исполь- і
і                      і зуются угловые скобки, запятые.        і
і                      і                                        і
і  REST                і Фактический аргумент  состоит  из  ос- і
і                      і тальной части макровызова, интерпрети- і
і                      і руемого  как непосредственный текст.   і
АДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

   Вызов общей макрокоманды, состоящей из нескольких строк
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Чтобы вызвать общую макрокоманду,  используйте в вашей прог-
раммы в  качестве  директивы  имя  макрокоманды.  Турбо Ассемблер
вставляет в  этой  точке модуля (поле подстановок всех формальных
аргументов) тело макрокоманды.  При  вызове  общей  макрокоманды,
состоящей из нескольких строк, используется следующий синтаксис:

     имя_макрокоманды [аргумент [[,]аргументе]...]

где "имя_макрокоманды" - это идентификатор макрокоманды.  Если вы
вызываете макрокоманду с аргументами, то список аргументов указы-
вается  после  имени  макрокоманды.  Вы можете задать любое число
аргументов, но все они должны умещаться на одной строке. Аргумен-
ты нужно отделять друг от друга запятыми или пробелами.  При рас-
ширении макрокоманды Турбо Ассемблер заменяет  первый  формальный
аргумент  макроопределения первым передаваемым аргументом, второй
аргумент - вторым аргументом и т.д.

     Каждый "аргумент"  представляет текстовую строку.  Вы можете
задать эту текстовую строку следующими способами:

     - как непрерывную группу символов,  не содержащую  пробелов,
       запятых или двоеточий;

     - как  группу  символов,  выделенную угловыми скобками (<>),
       которая может содержать пробелы, запятые и двоеточия;

     - как одиночный символ с предшествующим знаком !,  что экви-
       валентно заключению символа в угловые скобки;

     - как выражение с предшествующим символом %,  которое предс-
       тавляет текстовое значение выражения,  соответствующее те-
       кущему выбранному основанию.

            Литеральные строки в угловых скобках
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Используйте угловые скобки для выделения литеральной строки,
содержащей символы-разделители.  Следует  использовать  следующий
синтаксис:

     <текст>

где "текст"  интерпретируется  как  одиночный строковый параметр,
даже если он содержит запятые, пробелы или символы табуляции, ко-
торые обычно  разделяют  параметры.  Используйте данную операцию,
когда вы хотите передать аргумент,  содержащий один из таких сим-
волов.

     Вы можете также использовать эту операцию,  чтобы Турбо  Ас-
семблер интерпретировал символ литерально, не придавая ему специ-
альное значение. Например, если вы хотите передать в качестве па-
раметра макровызова  точку с запятой (;),  то чтобы предотвратить
ее интерпретацию как комментария,  вы можете заключить ее в угло-
вые скобки (<;>).  При преобразовании заключенной в скобки строки
в текстовый аргумент Турбо Ассемблер убирает только  один уровень
угловых скобок.  Это  позволяет вызывать макрокоманду,  требующую
наличия угловых скобок, из другой макрокоманды.

                          Символ !
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Символ !  позволяет вам вызывать макрокоманду с аргументами,
которые содержат специальные символы.  Указание этого символа пе-
ред другим символом эквивалентно заключению этого второго символа
в угловые скобки.  Например, !; действует также, как <;>. Некото-
рые общие случаи использования данного символа показаны в следую-
щей таблице:

              Использование специального символа !   Таблица 14.2
ЪДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і    Строка       і    Полученные в результате символ           і
ГДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і    !>           і            >                                і
і                 і                                             і
і    !<           і            <                                і
і                 і                                             і
і    !!           і            !                                і
АДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

                Символ вычисления выражения %
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Символ % указывает Турбо Ассемблеру, что выражение нужно вы-
числить. Ассемблер преобразует результат выражения к виду ASCII с
текущим основанием.  Используйте данный символ,  когда в качестве
макроаргумента вы хотите передать строку,представляющую вычислен-
ный результат, а не само выражение. При этом используется следую-
щий синтаксис:

     %выражение

где "выражение"  может  быть  либо выражением (использующим любые
допустимые операнды и операции), или именем текстовой макрокоман-
ды. Если  это  выражение,  то создаваемым текстом будет результат
выражения с текущим основанием.  Если "выражение" - это текстовая
макрокоманда, то  создаваемым тестом будет текст,  который предс-
тавляет  текстовая   макрокоманда.  Например,  следующий  фрагмент
программы:

     DEFSYM               MACRO     NUM
     TMP_&NUM:
     ENDNUM

     TNAME            EQU        ; определение
                                       ; текстовой макрокоманды
     DEFSYM  %5+4
     DEFSYM  %TNAME

приведет с следующему макрорасширению:

     TMP_9:
     TMP_JUNK:

реопределение общей макрокоманды, состоящей из нескольких строк
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Общие макрокоманды, состоящие из нескольких строк, вы можете
переопределять. Новое  определение  автоматически заменяет старое
определение. Все предшествующие места,  где макрокоманда уже была
вызвана, не изменяются.  Во всех вызовах макрокоманды,  следующих
за переопределением, используется новое определение.

        Удаление общей макрокоманды: директива PURGE
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Для удаления  макрокоманд  вы  можете использовать директиву
PURGE. Директива PURGE имеет следующий синтаксис:

     PURGE имя_макрокоманды, [имя_макрокоманды]...

     Директива PURGE удаляет определение  макрокоманды, состоящей
из нескольких строк,  с именем "имя_макрокоманды" После использо-
вания директивы PURGE Турбо Ассемблер  больше  не  интерпретирует
идентификатор PURGE как макрокоманду, например:

     ADD MACRO a1,a2
        SUB a1,a2
     ENDM
        ADD ax,bx     ; этот вызов даст SUB ax,bx
     PURGE ADD
        ADD ax,bx     ; теперь это не макрокоманда, поэтому
                      ; вы получите ADD ax,bx

     Вы можете  сразу  удалить этой директивой несколько макроко-
манд, разделив их имена запятыми. Отметим однако, что идентифика-
тор  удаленной  макрокоманды  можно  переопределить только другой
макрокомандой.

       Определение вложенных и рекурсивных макрокоманд
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Операторы в теле макрокоманды могут включать в себя операто-
ры, вызывающие или определяющие другие макрокоманды. Возьмем сле-
дующий пример:

     MCREATE         MACRO  opname, op1,op2,op3,op4,op5,op6,op7
        IFNB opname
           DO & opname MACRO op,count
              IF count LE 4
                REPT count
                  opname op,1
                ENDM
              ELSE
                MOVE CL,count
                opname op,CL
             ENDIF
          EMDM                               ; конец DOopname
        MCREATE op1,op2,op3,op4,op5,op6,op7  ; рекурсия!
      ENDIF                      ; конец if
     ENDM                        ; конец макрокоманды MCREATE

     После вызова:

     MCREATE ror,rol,rcl,rcr,shl,sal,sar

будут созданы  дополнительные  макрокоманды DOror,  DOrol и т.д.,
которые можно использовать следующим образом:

     DOshr         ax,5
     DOrcr         bx,3

     Рекурсивные макрокоманды  можно вызывать со списком парамет-
ров и задавать их таким образом,  что они будут работать с  пере-
менным числом  параметров  (от  0 до максимального числа парамет-
ров). Для этого макрокоманда должна использовать  первый параметр
для выполнения  ее макрорасширения,  а затем вызывать сама себя с
оставшимися параметрами.  При каждой рекурсии  остается  на  один
параметр меньше. В конце концов, будет последняя рекурсия без па-
раметров.

     Когда вы вызываете макрокоманду рекурсивно, всегда требуется
как-то проверить конец рекурсии. Обычно при наличии передаваемого
параметра это делается в теле макрокоманды  с  помощью  условного
оператора IFNB. Приведем простой пример рекурсивной макрокоманды:

     PUSH MACRO r1,r2,r3,r4,r5,r6,r7,r8
     IFNB r1
         PUSH r1
         PUSH r2,r3,r4,r5,r6,r7,r8
     ENDIF
     ENDM

               Счетчик повторения макрокоманды
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

    Для повторения тела макрокоманды  заданное число раз вы може-
те использовать директиву повторения REPT. Для этого используется
следующий синтаксис:

     REPT выражение
        тело_макрокоманды
     ENDM

где "выражение"  указывает  Турбо  Ассемблеру,  сколько раз нужно
повторить тело макрокоманды,  заданное между директивами  REPT  и
ENDM. При вычислении "выражения" должна получаться константа. Оно
не должно содержать имен идентификаторов с опережающими ссылками.
Чтобы отметить  конец  блока  повторения,  используйте  директиву
ENDM. Например, следующий код:

     REPT 4
         SHL ax,1
     ENDM

даст в результате следующее:

     SHL  ax,1
     SHL  ax,1
     SHL  ax,1
     SHL  ax,1

                       Директива WHILE
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Для повторения тела макрокоманды до того момента, пока опре-
деленное  выражение  не примет значения 0 (false),  вы можете ис-
пользовать макродирективу WHILE. Она имеет следующий синтаксис:

     WHILE выражение
        тело_макрокоманды
     ENDM

     Перед каждой итерацией тела макрокоманды Турбо Ассемблер вы-
числяет "выражение".  Будьте  аккуратны  и  избегайте бесконечных
циклов, которые привести к тому,  что Турбо  Ассемблер  исчерпает
доступную память или прекратит работу.  Приведем пример использо-
вания директивы WHILE:

     WHILE  1
                    ;; ничего не делает
     ENDM

                Макрокоманды повторения строк
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Для повторения  тела  макрокоманды  для  каждого  элемента в
списке или каждого символа в строке вы можете использовать макро-
директивы повторения IRP и IRPC.  Каждая из этих директив требует
от вас  задания одного формального аргумента.  Приведем синтаксис
директивы IRP:

     IRP формальный_аргумент, список_аргументов
        тело_макрокоманды
     ENDM

     Директива IRPC имеет следующий синтаксис:

     IRP формальный_аргумент, строка
        тело_макрокоманды
     ENDM

в обоих случаях "формальный_аргумент" - это аргумент,  используе-
мый в теле макрокоманды. Конец тела макрокоманды отмечает ENDM.

     В синтаксисе директивы IRP  "список_аргументов"  состоит  из
спискам аргументов,  разделенных запятыми. Аргументами может быть
любой текст (идентификаторы, строки, числа и т.д.). Форма каждого
аргумента в списке аналогична той, которая описана выше для вызо-
ва общей макрокоманды,  состоящей из нескольких строк. Список ар-
гументов всегда нужно заключать в угловые скобки (<>).

     В синтаксисе  директива IRPC аргумент состоит из одной стро-
ки. Строка может содержать столько символов, сколько вы хотите.

     Для каждого аргумента или символа в строке  Турбо  Ассемблер
будет включать в модуль тело макрокоманды, подставляя вместо фор-
мального аргумента  аргумент  или  символ (когда он его находит).
Например:

     IRP reg 
        PUSH reg
     ENDM

дает следующее:

     PUSH  ax
     PUSH  bx
     PUSH  cx
     PUSH  dx

а директива IRPC:

     IRPC LUCKY,1379
        DB LUCKY
     ENDM

дает следующее:

     DB   1
     DB   2
     DB   3
     DB   4

     Используйте директива  IRPC  аккуратно,  поскольку Турбо Ас-
семблер помещает каждый символ в строке  в  макрорасширение  "как
есть", поэтому макрокоманда строкового повторения:

     IRPC CHAR,HELLO
          DB CHAR
     ENDM

может дать не DB 'H','E'','L','L','O', а DB H,E,L,L,O (где каждая
буква интерпретируется как имя идентификатора.

              Непосредственная макродиректива %
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Непосредственная макродиректива  %   интерпретирует   строку
текста так,  как если бы это было тело макрокоманды.  Приведем ее
синтаксис:

     # строка_тела_макрокоманды

где "строка_тела_макрокоманды"  представляет  тело  макрокоманды,
используемое для непосредственного макрорасширения, например:

     SEGSIZE EQU 
     LANGUAGE EQU 

     % MODEL SEGSIZE,LANGUAGE   ; дает MODEL TINY,WINDOWS PASCAL

      Включение расширения макрокоманды в файл листинга
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Расширения макрокоманд, состоящих из нескольких строк, обыч-
но включаются в файл листинга.  Однако в Турбо Ассемблере предус-
мотрены следующей директивы:

     - .LALL

     - .SALL

     - .XALL

     - %MACS

     - %NOMACS

которые позволяют управлять листингом макрорасширений.

           Примечание: Подробнее об этих директивах рассказывает-
      ся в Главе 17.

          Глава 15. Использование условных директив
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Существует два класса условных директив: директивы условного
ассемблирования и условные директивы генерации сообщений об ошиб-
ке. С помощью директив условного ассемблирования вы можете управ-
лять тем,  какой код будет ассемблироваться в программе при опре-
деленных условиях.

     Директивы условного ассемблирования позволяют вам  генериро-
вать во  время ассемблирования сообщения об ошибках при наступле-
нии определенных событий.  Турбо Ассемблер выводит  сообщение  об
ошибке на экран и в файл листинга и предотвращает создание объек-
тного файла.  В данной главе описывается,  как можно использовать
имеющиеся условные директивы.

              Синтаксис условных директив
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Тремя директивами условного ассемблирования являются  дирек-
тивы IFxxx, ELSEIFxxx и ERRxxx. Эти директивы используются также,
как операторы условия в языках высокого уровня.

          Директива условного ассемблирования IFxxx
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Вы можете  использовать  директиву условного ассемблирования
IFxxx для определения блока кода,  который включается в объектный
файл при удовлетворении определенных условий (таких как определе-
ние идентификатора или установка  какого-то  значения).  Приведем
синтаксис оператора условного ассемблирования:

     IFxxx
       тело_условия_true
     EMDIF

или
     IFxxx
       тело_условия_true
     ELSE
       тело_условия_false
     ENDIF

где IFxxx представляет следующие директивы:

     IF
     IF1
     IF2
     IFDEF
     IFNDEF
     IFB
     IFNB
     IFIDN
     IFIDNI
     IFDIF
     IFDIFI

     Каждая директива  условного  ассемблирования  IFxxx   задает
конкретное условие,  при  вычислении которого получается истинное
(true) или ложное (false) значение.  Если условие имеет  значение
true, то выполняется ассемблирование и помещение в объектный файл
блока ассемблируемого кода "тело_условия_true". Если при вычисле-
нии условия получается значение false, то Турбо Ассемблер пропус-
кает "тело_условия_true" и не включает его в объектный  файл. При
наличие директивы ELSE, если условие имеет значение false, то ас-
семблируется и  выводится  в  объектный  файл  блок   "тело_усло-
вия_false".  Если условие имеет значение true, то этот блок игно-
рируется. Условный блок завершается директивой ENDIF.

     Кроме особых случаев директив IF1 и IF2 (которые  мы обсудим
позднее) два  описанных блока кода являются  взаимноисключающими:
в объектный файл включается либо "тело_условия_true", либо "тело_
условия_false", но не оба блока одновременно. Кроме того, если вы
используете форму IFxxx...ELSE...ENDIF, один из блоков будет обя-
зательно включаться  в  объектный  файл.  Если используется форма
IFxxx...ENDIF, то "тело_условия_true"  может  включаться  или  не
включаться в объектный файл, в зависимости от условия.

     При использовании  вложенных  директив  IF  и ELSE директива
ELSE всегда соответствует ближайшей директиве IF.

     В следующем примере test является  идентификатором,  который
управляет включением  кода  (если идентификатор не определен,  то
генерируется соответствующий блок кода) Идентификатор color уста-
навливается в ненулевое значение,  если дисплей цветной,  и равен
0, если дисплей монохромный.

     От этих значений зависит фактическая генерация кода:

     .
     .
     .
     IFDEF test                     ; true, если test определен
        ; первая часть блока кода   ; если test определен
     IF color                       ; true, если color <> 0
        ; блок кода color           ; если color <> 0
     ELSE                           ;
                                    ; код для монохромного
                                    ; дисплея если color = 0
     ENDIF                          ;
       ; вторая часть блока кода    ; если test определен
     ELSE                           ;
      ; другой код                  ; если test не определен
     ENDIF
     .
     .
     .

ЪДДДДДДДДДДДДВДДДДДДДДДДВДДДДДДДДДДДВДДДДДДДДДДДДДДВДДДДДДДДДДДДї
і   test     іопределен і определен і не определен іне определені
і   color    і   0      і   не 0    і       0      і    не 0    і
ГДДДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДДДДДДЕДДДДДДДДДДДДґ
і    код     і блок кодаі блок кода і  другой код  ідругой код  і
і            і    1     і    1      і              і            і
і            і          і           і              і            і
іцветной/моноі блок кодаі блок кода і  блок кода   і            і
і            і   color  і     2     і      2       і            і
АДДДДДДДДДДДДБДДДДДДДДДДБДДДДДДДДДДДБДДДДДДДДДДДДДДБДДДДДДДДДДДДЩ

     Если идентификатор test не определен,то не ассемблируется ни
код для цветного дисплея (color),  ни для монохромного, поскольку
все это включено в блок условного  ассемблирования,  который  ас-
семблируется только при определенном идентификаторе test.

        Директивы условного ассемблирования ELSEIFxxx
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Вы можете использовать директивы  условного  ассемблирования
ELSEIFxxx как  сокращенную  форму,  когда  требуется использовать
несколько директив IF. Директива ELSEIFxxx представляет собой эк-
вивалент директивы  ELSE,  за которой следует вложенная директива
IFxxx, но дает более компактный код. Например:

     .
     .
     .
     IF mode EQ 0
        ; кода для mode = 0
     ELSEIF mode LT 5
        ; код для coe = 1..4
     ELSE
        ; код для mode = 5...
     ENDIF
     .
     .
     .

сравните его со следующим:

     .
     .
     .
     IF mode EQ 0
        ; кода для mode = 0
     ELSE
      IF mode LT 5
        ; код для coe = 1..4
     ELSE
        ; код для mode = 5...
      ENDIF
     ENDIF
     .
     .
     .

     Вне оператора IFxxx директиву ELSEIFxxx использовать нельзя.

        Директивы генерации сообщений об ошибке ERRxx
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Директива ERRxxx  генерирует при удовлетворении определенных
условий сообщения пользователя об ошибке. Она имеет следующий об-
щий синтаксис:

     ERRxxx [аргументы] [сообщение]

     В этом  случае  директива  ERRxxx представляет какую-либо из
директив условной  генерации  сообщения  об  ошибке  (такие   как
ERRIFB, .ERRB и т.д.).

     "Аргументы" представляют  аргументы,  которые могут потребо-
ваться в директиве для вычисления  условия.  Некоторые  директивы
требуют выражения,  другие требуют символьного выражения, а неко-
торые - одно или два текстовых выражений.  Некоторые из  директив
вовсе не требуют аргументов.

     Если указано "сообщение", то оно задает необязательное сооб-
щение, которое выводится с ошибкой.  Сообщение должно быть заклю-
чено в кавычки (' или ").

     Директивы генерации сообщений об ошибке генерируют пользова-
тельское сообщение  об  ошибке,  которое  выводится  на  экран  и
включается в файл листинга (если он имеется) в месте расположения
директивы в исходном коде.  Если директива задает сообщение,  оно
выводится на  той же строке непосредственно за ошибкой. Например,
директива:

     ERRIFNDEF foo "foo не определено!"

если идентификатор foo не определен при обнаружении ошибки,  при-
ведет к генерации ошибки:

     User error: "foo не определено!"

               Описания конкретных директив
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

       Далее следует описание директив.

     Безусловные директивы генерации сообщений об ошибке
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Безусловными директивами генерации сообщений об ошибке явля-
ются директивы ERR и .ERR. Эти директивы всегда генерируют ошибку
и не требуют аргументов,  хотя могут содержать необязательное со-
общение. Директиву .ERR можно использовать только в режиме MASM.

              Условные директивы с выражениями
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Эти директивы  обеспечивают условное ассемблирование или ге-
нерацию сообщений об ошибке на основе  результатов  вычисления  в
Турбо Ассемблере выражения.  Во всех этих директивах при вычисле-
нии выражения должна получаться константа,  и оно не может содер-
жать опережающих ссылок. Если при вычислении выражения получается
0, Турбо Ассемблер рассматривает выражение, как ложное (false). в
противном случае оно рассматривается как истинное (true).

     В следующей таблице показаны директивы условного ассемблиро-
вания, использующие выражения.

   Директивы условного ассемблирования, использующие сообщения
                                                     Таблица 15.1
ЪДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і  Директива IFxxx    і Ассемблирует "тело_условия_true" если:  і
ГДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і  IF выражение       і при  вычислении   выражения  получается і
і                     і значение true.                          і
і                     і                                         і
і  IFE выражение      і при  вычислении   выражения  получается і
і                     і значение false.                         і
і                     і                                         і
і  ELSEIF выражение   і при  вычислении   выражения  получается і
і                     і значение true.                          і
і                     і                                         і
і  ELSEIFE выражение  і при  вычислении   выражения  получается і
і                     і значение false.                         і
АДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     В следующей таблице показаны  директивы  генерации сообщений
об ошибке, в которых используются выражения:

 Директивы генерации сообщений об ошибке, использующие выражения

                                                    Таблица. 15.2
ЪДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і  Директива ERRxxx  і Генерируется сообщение user error, если: і
ГДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і  ERRIF выражение   і при вычислении выражения получается зна- і
і                    і чение true.                              і
і                    і                                          і
і  .ERRNZ выражение  і при вычислении выражения получается зна- і
і                    і чение true (только в режиме MASM).       і
і                    і                                          і
і  ERRIFE выражение  і при вычислении выражения получается зна- і
і                    і чение false.                             і
і                    і                                          і
і  .ERRE выражение   і при вычислении выражения получается зна- і
і                    і чение false (только в режиме MASM).      і
АДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

            Условные директивы с идентификатором
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Эти директивы обеспечивают условное ассемблирование или  ге-
нерацию сообщения  об ошибке на основе того,  является ли опреде-
ленным один или более идентификаторов. Данные идентификаторы объ-
единены в выражение с идентификаторами.

     Выражение с  идентификаторами - это выражение,  состоящее из
имен идентификаторов,  булевских операций AND,  OR, NOT и круглых
скобок. В  выражении с идентификаторами каждое имя идентификатора
интерпретируется как булевское значение,  при вычислении которого
получается значение true,  если идентификатор существует (опреде-
лен), или false,  если идентификатор не существует (даже если  он
определяется в  модуле позднее).  Турбо Ассемблер комбинирует эти
значения, используя булевские операции,  для получения  конечного
значения true  или  false.  В  своей простейшей форме выражение с
идентификаторами содержит имя единственного идентификатора и дает
при вычислении значение true,  если этот идентификатор определен.
Синтаксические правила в выражении с  идентификаторами аналогичны
тем, которые  используются в выражениях Турбо Ассемблера.  Напри-
мер, если идентификатор foo определен, а идентификатор bar - нет,
то при вычислении выражения с идентификаторами получаются следую-
щие результаты:

    Вычисление определенных и неопределенных идентификаторов

                                                     Таблица 15.3
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і    Выражение с идентификаторами   і         Результат         і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і    foo                            і    True                   і
і                                   і                           і
і    bar                            і    False                  і
і                                   і                           і
і    not foo                        і    False                  і
і                                   і                           і
і    not bar                        і    True                   і
і                                   і                           і
і    foo OR bar                     і    True                   і
і                                   і                           і
і    foo AND bar                    і    False                  і
і                                   і                           і
і    NOT (foo AND bar)              і    True                   і
і                                   і                           і
і    NOT foo OR NOT bar             і    True (то же, что       і
і                                   і  (NOT foo) OR (NOT bar)   і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     В следующей  таблице  показаны директивы,  которые управляют
ассемблированием и используют выражение с идентификаторами:

Директивы, использующие выражение с идентификаторами Таблица 15.4
ЪДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іДиректива IFxxx         і Ассемблирует "тело_условия_true" еслиі
ГДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іIFDEF выражение_ид      і при вычислении  выражения  получаетсяі
і                        і значение true.                       і
і                        і                                      і
іIFNDEF выражение_ид     і при вычислении  выражения  получаетсяі
і                        і значение false.                      і
і                        і                                      і
іELSEIFDEF выражение_ид  і при вычислении  выражения  получаетсяі
і                        і значение true.                       і
і                        і                                      і
іELSEIFNDEF выражение_ид і при вычислении  выражения  получаетсяі
і                        і значение false.                      і
АДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     В следующей  таблице  показаны директивы выводы сообщения об
ошибке, которые используют выражение с идентификаторами:

        Директивы генерации сообщения об ошибке      Таблица 15.5
ЪДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іДиректива IFxxx         і Ассемблирует "тело_условия_true" еслиі
ГДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іERRIFDEF выражение_ид   і при вычислении  выражения  получаетсяі
і                        і значение true.                       і
і                        і                                      і
і.ERRDEF выражение_ид    і при вычислении  выражения  получаетсяі
і                        і значение  true  (только  для   режимаі
і                        і MASM).                               і
і                        і                                      і
іERRIFNDEF выражение_ид  і при вычислении  выражения  получаетсяі
і                        і значение false.                      і
і                        і                                      і
і.ERRNDEF выражение_ид   і при вычислении  выражения  получаетсяі
і                        і значение  false  (только   в   режимеі
і                        і MASM).                               і
АДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Например, следующие  условия  генерации  сообщения об ошибке
эквивалентны и приводят к генерации ошибки в  случае  определения
foo и bar:

     ERRIFDEF foo AND bar
            Условные директивы с идентификатором
Директивы, использующие выражение с идентификаторами Таблица 15.4
ЪДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іДиректива IFxxx         і Ассемблирует "тело_условия_true" еслиі
ГДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іIFDEF выражение_ид      і при вычислении  выражения  получаетсяі
і                        і значение true.                       і
і                        і                                      і
іIFNDEF выражение_ид     і при вычислении  выражения  получаетсяі
і                        і значение false.                      і
і                        і                                      і
іELSEIFDEF выражение_ид  і при вычислении  выражения  получаетсяі
і                        і значение true.                       і
і                        і                                      і
іELSEIFNDEF выражение_ид і при вычислении  выражения  получаетсяі
і                        і значение false.                      і
АДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     В следующей  таблице  показаны директивы выводы сообщения об
ошибке, которые используют выражение с идентификаторами:

        Директивы генерации сообщения об ошибке      Таблица 15.5
ЪДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іДиректива IFxxx         і Ассемблирует "тело_условия_true" еслиі
ГДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іERRIFDEF выражение_ид   і при вычислении  выражения  получаетсяі
і                        і значение true.                       і
і                        і                                      і
і.ERRDEF выражение_ид    і при вычислении  выражения  получаетсяі
і                        і значение  true  (только  для   режимаі
і                        і MASM).                               і
і                        і                                      і
іERRIFNDEF выражение_ид  і при вычислении  выражения  получаетсяі
і                        і значение false.                      і
і                        і                                      і
і.ERRNDEF выражение_ид   і при вычислении  выражения  получаетсяі
і                        і значение  false  (только   в   режимеі
і                        і MASM).                               і
АДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Например, следующие  условия  генерации  сообщения об ошибке
эквивалентны и приводят к генерации ошибки в  случае  определения
foo и bar:

     ERRIFDEF foo AND bar
     ERRIFNDEF NOT ( foo AND bar )
     ERRIFBDEF NOT foo OR NOT bar

          Условные директивы с текстовыми строками
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Эти директивы условное ассемблирование или генерацию сообще-
ний об  ошибке на основе содержимого текстовой строки.  Текстовой
строкой может быть либо  строка,  заключенная  в  угловые  скобки
(<>), либо  имя  текстовой макрокоманды с предшествующим символом
%. Например:

                     ; текстовая строка ABC
     %foo                 ; содержимое текстовой макрокоманды foo

           Примечание: Об определении текстовых макрокоманд и ра-
      боте с ними рассказывается в Главе 14.

     Директивы условного ассемблирования,  использующие текстовую
строку, показаны в следующей таблице:

                       Директивы условного

     ассемблирования, использующие текстовую строку  Таблица 15.6
ЪДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і Директива IFxxx      і ассемблирует "тело_условия_true", если:і
ГДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і IFNB текст_строка    і "текст_строка" не состоит из одних про-і
і                      і белов.                                 і
і                      і                                        і
і IFB текст_строка     і "текст_строка" не пуста.               і
і                      і                                        і
і IFIDN текст_строка_1,і "текст_строка_1" и  "текст_строка_2"   і
і     текст_строка_2   і идентичны.                             і
і                      і                                        і
і IFINDI текст_строка_1і "текст_строка_1" и  "текст_строка_2"   і
і     ,текст_строка_2  і идентичны (регистр символов не учиты-  і
і                      і вается.                                і
і                      і                                        і
і IFDIF текст_строка_1,і "текст_строка_1" и  "текст_строка_2"   і
і     текст_строка_2   і различны.                              і
і                      і                                        і
і IFDEFI текст_строка_1і "текст_строка_1" и  "текст_строка_2"   і
і     ,текст_строка_2  і различны (регистр символов игнорирует- і
і                      і ся.                                    і
і                      і                                        і
і ELSEIFNB текст_строкаі "текст_строка" не состоит из пробелов. і
і                      і                                        і
і ELSEIFB текст_строка і "текст_строка" не пуста.               і
і                      і                                        і
і ELSEIFIDN текст_стро-і "текст_строка_1" и  "текст_строка_2"   і
і  ка_1, текст_строка_2і идентичны.                             і
і                      і                                        і
і                      і                                        і
і ELSEIDNI текст_стро- і "текст_строка_1" и  "текст_строка_2"   і
і  ка_1,текст_строка_2 і идентичны (регистр символов игнориру-  і
і                      і ется).                                 і
і                      і                                        і
і ELSEIFDIF текст_стро-і "текст_строка_1" и  "текст_строка_2"   і
і  ка_1,текст_строка_2 і различны.                              і
і                      і                                        і
і ELSEIFDIFI текст_строі "текст_строка_1" и  "текст_строка_2"   і
і  -ка_1,текст_строка_2і различны (регистр символов игнориру-   і
і                      і ется).                                 і
АДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Использующие текстовую  строку директивы генерации сообщения
об ошибке показаны в следующей таблице:

                   Директивы вывода сообщений

      об ошибке использующие текстовую строку        Таблица 15.6
ЪДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іДиректива ERRxxx        і Генерирует сообщение об ошибке, если:і
ГДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іERRIFNB текст_строка    і "текст_строка"  не  состоит  из однихі
і                        і пробелов.                            і
і                        і                                      і
і.ERRIFNB текст_строка   і "текст_строка"  не  состоит  из однихі
і                        і пробелов (только для режима MASM).   і
і                        і                                      і
іERRIFB текст_строка     і "текст_строка" состоит из пробелов.  і
і                        і                                      і
і.ERRB текст_строка      і "текст_строка" состоит из одних  про-і
і                        і белов.                               і
і                        і                                      і
іERRIFIDN текст_строка_1,і "текст_строка_1" и  "текст_строка_2" і
і текст_строка_2         і идентичны.                           і
і                        і                                      і
і.ERRIDN текст_строка_1, і "текст_строка_1" и  "текст_строка_2" і
і текст_строка_2         і идентичны (только для режима MASM).  і
і                        і                                      і
іERRIFIDNI текст_строка_1і "текст_строка_1" и  "текст_строка_2" і
і ,текст_строка_2        і идентичны (регистр символов игнориру-і
і                        і ется).                               і
і                        і                                      і
і.ERRIDNI текст_строка_1,і "текст_строка_1" и  "текст_строка_2" і
і текст_строка_2         і идентичны (регистр символов игнориру-і
і                        і ется) - только для режима MASM.      і
і                        і                                      і
іERRIFDIF текст_строка_1,і "текст_строка_1" и  "текст_строка_2" і
і текст_строка_2         і различны.                            і
і                        і                                      і
і.ERRDIF текст_строка_1, і "текст_строка_1" и  "текст_строка_2" і
і текст_строка_2         і различны (только для режима MASM).   і
і                        і                                      і
іERIFDIFI текст_строка_1,і "текст_строка_1" и  "текст_строка_2" і
і текст_строка_2         і различны (регистр символов игнориру- і
і                        і ется).                               і
і                        і                                      і
і.ERRFIFI текст_строка_1,і "текст_строка_1" и  "текст_строка_2" і
і текст_строка_2         і различны (регистр символов игнориру- і
і                        і ется) - только для режима MASM.      і
АДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Используйте эти директивы для проверки передаваемых макроко-
мандам аргументов (однако их можно использовать не только в  мак-
рокомандах).

     При использовании  их  в  макроопределениях  директивы IFB и
IFNB позволяют определить,  передали ли вы в макрокоманду  нужное
число аргументов.  Если при вызове макрокоманды вы передали слиш-
ком мало аргументов,  Турбо Ассемблер не генерирует сообщение  об
ошибке. Незаданные аргументы просто остаются пустыми. Таким обра-
зом, вы можете определить макрокоманду, воспринимающую переменное
число аргументов. Например:

     .
     .
     .
     load MACRO addr, reg
        IFNB 
           MOV reg,addr
        ELSE
           MOV ax,addr
        ENDIF
     ENDM
     .
     .
     .

     Вы можете  вызывать  макрокоманду данного примера,  как load
test,cx, что даст генерацию инструкции mov cx,test,  или  вызвать
ее как load test, то приведет к генерации инструкции mov ax,test,
поскольку второй параметр пуст. Можно также использовать директи-
ву ERRIFB для генерации сообщения об ошибке, если в вызове макро-
команды пропущен аргумент:

     .
     .
     .
     load MACRO addr
        ERRIFNB 
           MOV reg,addr
     ENDM
     .
     .
     .

     Если эту макрокоманду вызвать с помощью load, а не с помощью
load test, то будет генерироваться ошибка.

           Условия выполнения прохода Ассемблером
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Следующие директивы  обеспечивают  выполнение  условного ас-
семблирования или генерацию ошибки на основе текущего прохода Ас-
семблера:

ЪДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і    Директива IFxxx  і  ассемблирует "тело_условия_true", если:і
ГДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і    IF1              і Турбо Ассемблер выполняет первый проход.і
і    IF2              і Турбо Ассемблер выполняет второй проход.і
АДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

ЪДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і    Директива ERRxxx і генерирует ошибку user error, если:     і
ГДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і    ERRIF1           і Турбо Ассемблер выполняет первый проход.і
і                     і                                         і
і    .ERR1            і Турбо  Ассемблер выполняет первый проході
і                     і (только для режима MASM).               і
і                     і                                         і
і    ERRIF2           і Турбо Ассемблер выполняет второй проход.і
і                     і                                         і
і    .ERR2            і Турбо Ассемблер выполняет второй  проході
і                     і (только для режима MASM).               і
АДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Обычно Турбо Ассемблер работает как однопроходный ассемблер.
Если  вы используете средство многопроходной работы Турбо Ассемб-
лера (вызывая его с параметром командной строки /m),  то  при не-
обходимости используется несколько проходов.

     Поскольку Турбо  Ассемблер  всегда выполняет по крайней мере
один проход, директива условного ассемблирования IF1 всегда будет
ассемблировать код  своего  условного блока,  а директивы .ERR1 и
ERRIF1 всегда будут генерировать сообщение об ошибке  (но  только
на первом проходе).

     Если вы  используете  любую из этих директив и не разрешаете
многопроходную работу, то Турбо Ассемблер будет генерировать  для
всех  таких директив предупреждение "Pass dependent construction"
("Конструкция,  зависящая от прохода"),  чтобы предупредить вас о
возможно опасном пропуске кода.  Если вы разрешите многопроходную
работу, Турбо Ассемблер будет выполнять точно два прохода и гене-
рировать  предупреждение Vaximum compatibility pass was done (Вы-
полнен проход с целью обеспечения максимальной совместимости).

         Включение условных директив в файл листинга
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Обычно код  условного  ассемблирования  с  ложным   условием
(false) в  листинг  не включается.  Используя директивы Турбо Ас-
семблера и параметры командной строки,  вы можете это переопреде-
лить.

           Примечание: Более  подробная  информация  содержится в
      Главе 2 и Главе 17.

             Глава 16. Интерфейс с компоновщиком
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Модульные программы обычно состоят из нескольких независимых
частей кода,  называемых модулями. Компилятор обрабатывает каждый
из этих модулей независимо,  а компоновщик (TLINK) объединяет по-
лученные части вместе для создания выполняемого файла. О том, как
использовать TLINK, рассказывается в документации по компилятору,
но важно также знать,  как определить и включить все файлы и биб-
лиотеки, которые могут понадобиться при компоновке. В данной Гла-
ве рассказывается о том, как это сделать.

              Описание внешних идентификаторов
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Может оказаться так,  что вам потребуется использовать неко-
торые переменные  или  процедуры во всех модулях вашей программы.
Турбо Ассемблер обеспечивает несколько директив, которые позволя-
ют вам  определить идентификаторы и библиотеки таким образом, что
вы сможете использовать их глобально,  а также использовать общие
переменные (для которых выделяет память компоновщик).  Вам потре-
буется также соблюдать аккуратность при назначении имен идентифи-
каторов, поскольку  различные языки имеют здесь конкретные требо-
вания. В следующий нескольких разделах мы обсудим эти директивы и
соглашения по наименованию.

              Соглашения для конкретного языка
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Когда вы назначаете имена идентификаторам,  которые планиру-
ется использовать глобально,  нужно помнить об использовании спе-
цификатора языка.  К именам  переменных  предъявляются  следующие
требования:

     - в Паскале имена указываются символами в верхнем регистре;

     - в  Си/С++  имен  должны начинаться с символа подчеркивания
       (_). Остальная часть имени записывается символами в нижнем
       регистре.

     Параметр /m (описанный в Главе 2) сообщает Турбо Ассемблеру,
что во всех именах идентификаторов нужно различать регистр. Пара-
метр /mx (также описанный в Главе 2) указывает, что различать ре-
гистр символов нужно только во внешних и общедоступных  идентифи-
каторах, и что все другие идентификаторы в исходном файле записа-
ны в верхнем регистре.  Когда вы используете  эти  два  параметра
вместе,  для идентификаторов, описанных в Паскале, они имеют спе-
циальное значение: они приводят к тому, что рассматриваемые иден-
тификаторы  будут  доступны  компоновщику,  как  идентификаторы в
верхнем регистре.

           Описание общедоступных идентификаторов
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     При описании общедоступного идентификатора вы предполагаете,
что он должен быть доступен из других модулей. Общедоступными мо-
гут быть следующие типы идентификаторов:

     - имена переменных;
     - метки программы;
     - числовые константы, определенные с помощь EQU.

     Для определения  общедоступных идентификаторов можно исполь-
зовать директиву PUBLIC, которая имеет следующий синтаксис:

     PUBLIC [язык] идентификатор [,[язык] идентификатор] ...

где "язык" представляет собой C,  CPP,  PASCAL,  BASIC,  FORTRAN,
PROLOG или  NOLANGUAGE и определяет соглашения конкретного языка,
применяемые к имени переменной. Использование спецификатора языка
в директиве PUBLIC временно переопределяет временно переопределя-
ет текущую установку языка (по умолчанию NOLANGUAGE,  если другой
язык не задан в директиве .MODEL).

     Турбо Ассемблер  описывает  идентификатор в объектном модуле
таким образом, что он будет доступен всем другим модулям. Если вы
не сделаете идентификатор общедоступным,  то сможете обращаться к
нему только из текущего модуля, например:

     PUBLIC XYPROC          ; процедура общедоступна
     XYPROC PROC NEAR

             Описание идентификаторов библиотеки
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Вы можете использовать идентификаторы, как динамические точ-
ки входа для динамически компонуемых библиотек (DLL).  Для описа-
ния идентификаторов,  которые будут доступны таким  образом,  ис-
пользуйте директиву PUBLICDDL. Она имеет следующий синтаксис:

     PUBLICDLL [язык] идентификатор [,[язык] идентификатор] ...

     Турбо Ассемблер  описывает  идентификатор в объектном файле,
как динамически компонуемую точку входа, благодаря чему они могут
быть доступны в других программах. Спецификатор "язык" приводит к
применению специфических для языка соглашений к конкретному имени
идентификатора. Допустимыми спецификаторами языка являются специ-
фикаторы C, CPP, PASCAL, BASIC, FORTRAN, PROLOG и NOLANGUAGE.

Приведем пример кода с использованием PUBLICDLL:

     PUBLICDLL XYPROC          ; процедура XYPROC доступна как
     XYPOROXC PROC NEAR        ; динамически компонуемая точка
                               ; входа

             Определение внешних идентификаторов
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Внешние идентификаторы - это идентификаторы, которые опреде-
лены вне модуля и которые вы можете использовать  внутри  модуля.
Эти идентификаторы   должны  быть  описаны  с  помощью  директивы
PUBLIC. Директива EXTRN имеет следующий синтаксис:

     EXTRN определение [,определение] ...

где "определение" описывает идентификатор и имеет следующий  фор-
мат:

     [язык] имя [[счетчик_1]] :сложный_тип [:счетчик_2]

             Описание глобальных идентификаторов
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Глобальные идентификаторы действуют также,  как  общедоступ-
ные, при этом вам не нужно определять PUBLIC или EXTRN.  Если пе-
ременная определена в модуле,  она действует  как  общедоступная.
Если нет,  она действует как внешняя.  Для определения глобальных
идентификаторов вы можете использовать директиву GLOBAL. Директи-
ва GLOBAL  имеет  тот же синтаксис,  что директивы PUBLIC и EXTRN
(их синтаксис описан в предыдущих разделах).

     Директива GLOBAL позволяет вам иметь включаемый файл,  кото-
рый будет включаться во все исходные модули.  Включаемый файл со-
держит все совместно используемые данные,  определенные как  гло-
бальные идентификаторы.  Когда  вы  в каждом модуле ссылаетесь на
эти элементы данных,  директива GLOBAL  действует  как  директива
EXTRN, описывая для другого модуля, как определены данные.

     Перед тем, как использовать его где-либо в исходном коде, вы
должны описать идентификатор как GLOBAL.  Кроме того заметим, что
при задании  аргументов директивы GLOBAL используется тот же син-
таксис, что и в директиве EXTRN.

     Приведем пример:

     GLOBAL X:WORD, Y:BYTE
     X  DW 0                 ; идентификатор стал доступен в
                             ; других модулях
     mov  al, Y              ; описан как внешний

                Определение общих переменных
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Общие переменные действуют как внешние переменные,  но здесь
есть одно существенное различие:  общие переменные распределяются
компоновщиком. Общие переменные переменные на самом деле аналоги-
чны глобальным переменным, но вы не можете присвоить им начальные
значения. На эти неинициализированные переменные  можно ссылаться
из нескольких модулей.

     Для определения  общей переменной вы можете использовать ди-
рективу COMM. Она имеет следующий синтаксис:

     COMM определение [,определение]...

     Каждое "определение" описывает идентификатор и имеет следую-
щий формат:

     [расстояние] [язык] имя_идентификатора[[счетчик_1]]:
                             сложный_тип [счетчик_2]

где поле "расстояние" не является обязательным и может  быть  FAR
или NEAR.  Если вы не зададите "расстояние", по умолчанию оно бу-
дет соответствовать используемой модели памяти.  Если вы  не  ис-
пользуете  упрощенные директивы сегментации,  то по умолчанию ис-
пользуется  NEAR.  В  крошечной,  малой  и  средней  моделях   по
умолчанию также используется NEAR, а во всех других - FAR.

     Поле "язык" задает язык:  C,  PASCAL, BASIC, FORTRAN, PROLOG
или NOLANGUAGE. Использование в директиве COMM спецификатора язы-
ка временно  переопределяет текущую установку языка (по умолчанию
или заданную с помощью директивы .MODEL).  Заметим, что для того,
чтобы действовало  данное средство,  вам не обязательно использо-
вать директиву .MODEL.

     Поле "имя_идентификатора" задает имя идентификатора, который
должен быть  общим,  и  память  для которого должна выделяться на
этапе компоновки.  В этом поле можно также  задавать  коэффициент
размера элемента массива "счетчик_1",  который должен учитываться
в вычисляемом объеме общей памяти. Если в качестве расстояния за-
дано FAR, то компоновщик, использует значение "счетчика_2", чтобы
указать,  сколько имеется элементов с размером, равным произведе-
нию  основного  размера элемента (который определяется его типом)
на "счетчик_1". По умолчанию значение поля "счетчик_1" равно 1.

     "Сложный_тип" - это тип данных аргумента. Он может быть либо
простым типом,  либо сложным выражением с указателем.  Более под-
робно о синтаксисе сложного типа рассказывается в Главе 5.

     Необязательное значение "счетчик_2" определяет, сколько эле-
ментов определяет  эта  общая переменная.  Если вы не задаете это
поле, то подразумевается значение 1. Полный объем памяти, выделя-
емой для  общей  переменной,  равен  произведению значения "счет-
чик_2" на длину, заданную полем "тип", и на значение "счетчик_1".

     В режиме MASM,  предполагается,  что  общие  идентификаторы,
описанные вне любого сегмента, должны быть доступны с помощью ре-
гистра DS,  что не всегда может допустимым предположением. Убеди-
тесь, что  вы  либо  поместили в DS корректное значение сегмента,
либо при ссылке на  эти  переменные  используете  переопределение
сегмента. В режиме Ideal Турбо Ассемблер корректно проверяет, яв-
ляются ли общие переменные адресуемыми,  используя любой из теку-
щих сегментных регистров, описанный в директиве ASSUME.

     Приведем пример использования директивы COMM:

     COMM buffer:BYTE:512        ; во время компоновки выделяет-
                                 ; ся 512 байт
     COMM abc[41]:WORD:10        ; на этапе компоновки выделяет-
                                 ; ся память  820  байт (10 эле-
                                 ; ментов из 41 слова каждый)

     COMM FAR abc[41]:WORD:10    ; на этапе компоновки выделяет-
                                 ; ся  10 элементов из  82  байт
                                 ; (2 байта * 41 элемент)

                    Включение библиотеки
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В том случае,  когда вы знаете,  что ваш исходный файл будет
всегда использовать  подпрограммы заданной библиотеки,  можно ис-
пользовать директиву INCLUDELIB.  Директива  INCLUDELIB  сообщает
компоновщику, что  нужно включить указанную библиотеку.  В режиме
Ideal эта директива имеет следующий синтаксис:

     INCLUDELIB "имя_файла"     ; обратите внимание на кавычки!

а в режиме MASM:

     INCLUDELIB имя_файла

где "имя_файла" - это имя библиотеки,  которую вы хотите включать
с помощью компоновщика на этапе компоновки.  Если вы не укажете в
заданном имени файла  расширение,  то  компоновщик  подразумевает
расширение .LIB.

     Приведем пример:

     INCLUDELIB "diskio"      ; включает DISKIO.LIB

               Глава 17. Генерация листинга
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Файл листинга полезно использовать,  когда вы  хотите  точно
видеть, что генерирует Турбо Ассемблер при ассемблировании каждой
инструкции или директивы. Основу этого файла составляет  исходный
файл, в который включен большой объем сопровождающей информации о
результатах ассемблирования.  Турбо Ассемблер выводит для  каждой
инструкции полученный  машинный  код,  а также смещение в текущем
сегменте (на каждой строке с машинным кодом).  Кроме того,  Турбо
Ассемблер выводит в таблицах информацию о метках и сегментах, ис-
пользуемых в программе, включая значение и тип каждой метки и ат-
рибуты каждого сегмента.

           Примечание: См.  в Главе 2 описание параметров команд-
      ной строки /l и /la.

     Турбо Ассемблер  может также по запросу генерировать таблицу
перекрестных ссылок для всех меток,  используемых в исходном фай-
ле, в которой показано,  где определяется каждая метка,  и где на
нее имеется ссылка.

           Примечание: См. в Главе 2 описание параметра командной
      строки /c.

                     Формат листинга
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В верхней  части  каждой страницы листинга выводится заголо-
вок, содержащий версию Турбо Ассемблера, с помощью которой выпол-
нено ассемблирование файла,  дату и время ассемблирования и номер
страницы в листинге.

     Файл листинга содержит две части: аннотированный листинг ис-
ходного кода и таблицу идентификаторов.  Сначала выводится исход-
ный ассемблируемый код с заголовком,  содержащим имя файла, в ко-
тором находится  исходный  код.  Вывод  исходного кода Ассемблера
сопровождается информацией о машинном коде,  который ассемблирует
Турбо Ассемблер.  Все  ошибки или предупреждения,  обнаруженные в
процессе ассемблирования, включаются в листинг непосредственно за
содержащей ошибку строкой.

     Строки кода в файле листинга имеет следующий формат:

<глубина> <номер_строки> <смещение> <машинный_код> <исходный_код>

где <глубина>  показывает  уровень  вложенности включаемых файлов
или макрокоманд в файле листинга.

     Поле <номер_строки> содержит номер строки в  файле  листинга
(не включая заголовки). Номера строк особенно полезны при исполь-
зовании перекрестных ссылок Турбо Ассемблера,  в которых указыва-
ются номер строк. Учтите, что поле <номер_строки> не соответству-
ет номерам  строк  исходного  модуля.  Например,  если   в   файл
включается другой файл или выполняется макрорасширение, то значе-
ние поля <номер_строки> продолжает  увеличиваться,  хотя  текущая
строка в исходном файле остается той же.  Чтобы преобразовать но-
мер строки обратно в строку исходного кода, вы должны найти стро-
ку в файле листинга,  и найти такую же строку в исходном коде (по
ее внешнему виду, а не по номеру).

     Поле <смещение> представляет смещение в текущем сегменте на-
чала машинного кода, сгенерированного из соответствующей исходной
строки Турбо Ассемблером.

     Поле <машинный_код>  показывает  фактическую  последователь-
ность шестнадцатиричных значений размером в байт или слово, кото-
рые  ассемблированы из соответствующей исходной строки на Ассемб-
лере.

     Поле <исходный_код> - это просто исходная строка Ассемблера,
с комментариями и всем,  что в ней содержится. Некоторые исходные
строки (например те, которые содержат только комментарии) не  ге-
нерируют никакого машинного кода.  Эти строки не  содержат  полей
<смещение> и <машинный_код>, но имеют номер строки.

            Общие директивы управления листингом
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Имеется ряд директив,  которые позволяют вам управлять видом
файла листинга.  Общие  директивы управления листингом включают в
себя следующие директивы:

     - .LIST             ; только режим MASM

     - .XLEST            ; только режим MASM

     - %LIST

     - %NOLIST

     - %CTLS

     - %NOCTLS

     - %SYMS

     - %NOSYMS

     Директива %LIST выводит в файл листинга все строки исходного
кода. Эта  директива  назначается по умолчанию при создании файла
листинга. Чтобы запретить вывод в листинг  всех  строк  исходного
кода, используйте директиву %NOLIST. Приведем пример:

     %NOLIST            ; запретить листинг
     INCLUDE MORE .INC
     %LIST              ; разрешить листинг

     Директивы .LIST и .XLIST работают также, как директивы %LIST
и %NOLIST. Приведем пример:

     .LIST
     jmp xyz           ; эта строка всегда выводится
     .XLIST
     add dx,ByteVar    ; не содержится в листинге

     Для управления включением в листинг директив управления лис-
тингом вы можете использовать директивы %CTL и  %NOCTL. Директива
%CTLS  приводит к включению в листинг директив управления листин-
гом (таких как %LIST,  %INCL и т.д.). Обычно они в листинг не вы-
водятся. Эта директива действует для всех последующих строк, поэ-
тому сама директива  %CTLS  в  листинг  не  выводится.  Директива
%NOCTLS изменяет действие директивы %CTLS на обратное.  После за-
дания директивы %NOCTLS все последующие директивы управления лис-
тингом  в  листинг  включаться  не будут (этот режим используется
Турбо Ассемблером по умолчанию,  когда начинается ассемблирование
исходного файла). Например:

     %CTLS
     %NOLIST           ; эта директива не будет включена в
                       ; исходный файл
     %NOCTLS
     %LIST             ; это не будет включаться в листинг

     Для задания  включения или не включения в файл листинга таб-
лицы идентификаторов вы  можете  использовать  директивы  %SYMS и
%NOSYMS (по умолчанию таблица идентификаторов выводится). Таблица
будет выводиться в конце файла листинга.

     Приведем синтаксис директивы %SYMS:

     %SYMS

     Директива %NOSYMS имеет следующий синтаксис:

     %NOSYMS

            Директивы листинга включаемых файлов
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В том случае,  когда вы хотите вывести в файл листинга вклю-
чаемые файлы, вы можете разрешить или запретить эту возможность с
помощью директив  %INCL и %NOINCL.  По умолчанию включаемые файлы
обычно включаются в файл листинга.  Директива %NOINCL приостанав-
ливает вывод  в файл листинга всех последующих включаемых файлов,
пока он снова не будет разрешен директивой %INCL. Это полезно ис-
пользовать при наличии больших включаемых файлов,  которые содер-
жат,  например, много определений EQU, которые никогда не изменя-
ются.

     Приведем пример:

     %INCL
     INCLUSE DEFS.INC        ; содержимое выводится в листинг
     %NOINCL
     INCLUSE DEF1.INC        ; содержимое не выводится в листинг

       Директивы вывода блоков условного ассемблирования
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Когда в  исходном  коде  у  вас  содержатся  блоки условного
ассемблирования, может оказаться желательным включение  в листинг
всей информации. Вывод блоков условного ассемблирования может по-
мочь в тех случаях, когда вы хотите точно видеть поведение исход-
ного кода.  В  Турбо Ассемблере предусмотрены следующие директивы
вывода блоков условного ассемблирования:

     - .LFCOND            ; только для режима MASM

     - .SFCOND            ; только для режима MASM

     - ,TFCOND            ; только для режима MASM

     - %CONDS

     - %NOCONDS

     Обычно Турбо Ассемблер не включает в листинг блоки условного
ассемблирования.

     Директива %CONDS  выводит  в файл листинга все операторы ус-
ловного блока. При этом в файл листинга выводятся также все блоки
с условием false. Директива .LFCOND работает аналогично директиве
.LFCOND. Директива %NOCONDS предотвращает вывода в  файл листинга
блоков условного  ассемблирования  с  условием  false.  Директива
.SFCONDS работает аналогично директиве %NOCOND.  Если  вы  хотите
переключить режим  вывода  блоков условного ассемблирования,  ис-
пользуйте директиву .TFCOND.

     Первая директива .TFCOND, которую обнаруживает Турбо Ассемб-
лер, разрешает  вывод в листинг всех блоков условного ассемблиро-
вания. Если вы используете параметр командной  строки  /X,  блоки
условного ассемблирования  будут сначала выводиться в листинг,  а
первая директива .TFCOND запретит их вывод.  При каждом обнаруже-
нии в  исходном  файле  директивы .TFCOND состояние вывода блоков
условного ассемблирования изменяется на обратное.

     Для указания любой из этих директив поместите  директиву  на
отдельной строке  исходного кода.  Она будут влиять на непосредс-
твенно следующие за данной директивой блоки условного ассемблиро-
вания.

       Директивы вывода в файл листинга макрокоманд
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Обычно макрорасширения включаются в файлы  листинга. Наличие
такой информации в файле листинга может оказаться очень полезной,
когда вы хотите видеть, что делается в исходном коде. В Турбо Ас-
семблере предусмотрено   несколько  директив,  которые  позволяют
включать и выключать данное средство. Это следующие директивы:

     - .LALL              ; только для режима MASM
     - .SALL              ; только для режима MASM
     - .XALL              ; только для режима MASM
     - %MACS
     - %NOMACS

     Директива %MACS разрешает листинг всех макрорасширений. Тоже
самое делает  директива  .LALL,  но  она работает только в режиме
MASM. Вы можете использовать эти директивы для  включения  макро-
расширений в файл листинга.

     Директива %MACS имеет следующий синтаксис:

     %MACS

     Директиву .LALL вы можете задать следующим образом:

     .LALL

     Если вы  хотите подавить вывод всех операторов макрорасшире-
ния, используйте директивы %NOMACS или .SALL.  Заметим,  что  эти
директивы можно  использовать для выключения вывода макрорасшире-
ния в файл листинга.

     Директива %NOMACS имеет следующий синтаксис:

     %NOMACS

     Директива .SALL задается следующим образом:

     .SALL

     Доступная в режиме MASM директива .XALL позволяет вам  выво-
дить в листинг только те макрорасширения,  которые генерируют код
или данные. Она имеет следующий синтаксис:

     .XALL

       Директивы вывода листинга перекрестных ссылок
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     В таблице  идентификаторов  листинга ссылок обычно выводится
большой объем информации о метках, группах и сегментах, но там не
сообщается, где определены сегменты, группы и метки и где они ис-
пользуются. Информация,  выводимая в таблице перекрестных ссылок,
позволяет вам  легко находить метки и следить за ходом выполнения
программы при ее отладке.

     Существует несколько способов разрешения включения  информа-
ции о перекрестных ссылках в файл листинга.  Для получения инфор-
мации о перекрестных ссылках для всего файла вы можете  использо-
вать параметр  командной  строки  /c  (подробности  можно найти в
Главе 2), либо включить в исходный код директивы, позволяющие вам
разрешать и  запрещать  вывод  перекрестных  ссылок для отдельных
частей исходного кода. Это следующие директивы:

     - %CREF
     - %NOCREF
     - %CREFALL
     - %CREFREF
     - %CREFUREF

     Директивы %CREF и .CREF позволяют вам собрать  информацию  о
перекрестных ссылках  для  всех идентификаторах в исходном файле,
начиная с данной точки. Директивы %CREF и .CREF отменяют действие
директив %NOCREF или .XCREF,  которые запрещают сбор информации о
перекрестных ссылках.

     Директивы %CREF и .CREF имеют следующий синтаксис:

     %CREF
или
     .CREF

     Директивы %NOCREF и .XCREF имеют синтаксис:

     %NOCREF [идентификатор, ...]
или
     .XCREF [идентификатор, ...]

     Если вы  используете директивы %NOCREF и .XCREF без указания
идентификатора, то вывод  перекрестных  ссылок  запрещается  пол-
ностью. Если  вы  указываете одно или более имен идентификаторов,
то вывод перекрестных ссылок запрещается только для данных  иден-
тификаторов.

     Директива %CREFALL выводит в листинг перекрестные ссылки для
всех идентификаторов. Директива %CREFALL изменяет действие преды-
дущей директивы  %CREFREF (запрещающей вывод в таблицу перекрест-
ных ссылок тех идентификаторов, на которые ссылки отсутствуют) на
обратное. После указания директивы %CREFALL все встречающиеся да-
лее в исходном файле идентификаторы будут  включаться  в  листинг
перекрестных ссылок.  Турбо  Ассемблер  использует  это  режим по
умолчанию а начале ассемблирования исходного файла.

     Директивы %CREFALL,  %CREFREF и  %CREFUREF  имеют  следующий
синтаксис:

     %CREFALL

     %CREFREF

     %CREFUREF

            Параметры изменения формата листинга
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Директивы управления форматом листинга изменяют формат файла
листинга. Вы  можете использовать эти директивы,  чтобы приспосо-
бить вид листинга под свой вкус и потребности.

     Директива PAGE задает высоту и ширину страницы файла листин-
га и  начинает  новую страницу.  Директива PAGE работает только в
режиме MASM. Она имеет следующий синтаксис:

     PAGE [число_строк] [,число_столбцов]
     PAGE +

где "число_строк" задает число строк,  выводимых на странице лис-
тинга. Поле "число_столбцов" может принимать значения  от  59  до
255 и задает число столбцов на странице. Если вы опустите один из
этих параметров,  то текущая установка данного параметра остается
без изменений.  Чтобы изменить только число столбцов, укажите пе-
ред этим параметром запятую, в противном случае вы измените число
строк.

     Если вы  укажете  после директивы PAGE символ плюса (+),  то
начинается новая страница,  номер раздела увеличивается,  а номер
страницы снова начинается с 1. Если вы используете директиву PAGE
без аргументов,  то листинг возобновляется с новой  страницы  без
изменения номера раздела.

     Директива %PAGESIZE работает также,  как директива PAGE,  но
она не начинает новую страницу и работает как в режиме Ideal, так
и в режиме MASM. Директива %PAGESIZE имеет следующий синтаксис:

     %PAGESIZE [число_строк] [,число_столбцов]

     Директива %NEWPAGE  работает как директива PAGE без аргумен-
тов. Строки исходного текста после директивы %NEWPAGE будут начи-
наться в  файле  листинга  с новой страницы.  Директива %PAGESIZE
имеет следующий синтаксис:

     %NEWPAGE

     Директива %BIN устанавливает длину поля  объектного  кода  в
файле листинга. Директива %BIN имеет синтаксис:

     %BIN размер

где "размер" является константой.  Если вы не используете эту ди-
рективу, то поле кода операции занимает в файле  листинга  до  20
позиций, например:

     %BIN 12        ; устанавливает 12 позиций в листинге

     Директива %DEPTH  устанавливает  размер поля глубины в файле
листинга. Эта директива имеет следующий синтаксис:

     %DEPTH размер

где "размер" задает, скольку столбцов нужно зарезервировать в по-
ле глубины файла листинга. Это поле указывает уровень вложенности
включаемых файлов (INCLUDE) и макрорасширений.  Если  в  качестве
размера вы укажете 0,  то это поле в файле листинга не выводится.
Обычно не требуется задавать "размер" > 2, поскольку при этом без
усечения будет  выводиться  глубина до 99.  По умолчанию это поле
имеет значение 1.

     Директива %LINENUM задает размер поля номеров строк  в файле
листинга. Данная директива имеет следующий синтаксис:

     %LINENUM размер

     Директива %LINENUM  позволяет  вам  задать,  сколько позиций
должны занимать номера строк в файле листинга.  В  поле  "размер"
должна указываться константа. Если вы хотите минимизировать шири-
ну листинга, то можете уменьшить размер поля номеров строк. Кроме
того, если  ваш  файл содержит более 9999 строк,  то размер этого
поля может потребоваться увеличить, чтобы номера не усекались. По
умолчанию номер строки занимает 4 столбца.

     Директива %TRUNC  усекает слишком длинные поля листинга. Она
имеет следующий синтаксис:

     %TRUNC

     Поле объектного кода в файле листинга имеет достаточно  мес-
та для вывода кода, генерируемого большинством инструкций или ди-
рективами выделения данных.  Размер этого поля можно настроить  с
помощью директивы %BIN.  Если отдельная строка исходного кода ге-
нерирует больше кода, чем можно вывести на одной строке, то оста-
ток автоматически усекается и таким образом будет невидимым. Если
вы хотите видеть весь генерируемый код,  то используйте директиву
%NOTRUNC (слишком  длинная  строка при этом будет переноситься на
следующую). В противном случае используйте директиву  %TRUNC.  Вы
можете использовать эти инструкции для переключения режима усече-
ния.

     Директива %NOTRUNC имеет следующий синтаксис:

     %NOTRUNC

     Директива %PCNT задает размер поля "сегмент:смещение" в фай-
ле листинга. Она имеет следующий синтаксис:

     %PCNT размер

где "размер" - это число столбцов, которые вы хотите зарезервиро-
вать для смещения в текущем ассемблируемом  сегменте.  Турбо  Ас-
семблер устанавливает  размер,  равный 4,  для обычных 16-битовых
сегментов и 8 для 32-битовых сегментов процессора 80386. Директи-
ва %PCNT  позволяет  переопределить эти используемые по умолчанию
значения.

     Директива TITLE, которую вы можете использовать только в ре-
жиме MASM,  задает заголовок файла листинга.  Эта директива имеет
следующий синтаксис:

     TITLE текст

     Заголовок "текст" будет выводиться в  верхней  части  каждой
страницы после имени исходного файла и перед заголовком, заданным
по директиве SUBTTL.  Директиву TITLE можно использовать в  прог-
рамме только один раз.

     Директива %TITLE работает также,  как директива TITLE, но вы
можете использовать ее как в режиме MASM,  так и в режиме  Ideal.
Эта директива имеет следующий синтаксис:

     %TITLE "текст"

     Директива SUBTTL работает только в режиме MASM и задает под-
заголовок файла листинга. Она имеет следующий синтаксис:

     SUBTTL текст

     Подзаголовок выводится в верхней части каждой страницы после
имени исходного  файла  и  после заголовка,  заданного директивой
TITLE.

     Директиву SUBTTL можно указывать в  программе  столько  раз,
сколько требуется.  Каждая директива изменяет подзаголовок, кото-
рый будет выводиться на следующей странице листинга.

     Директива %SUBTTL работает аналогично директиве  SUBTTL,  но
ее можно указывать как в режиме Ideal,  так и в режиме MASM.  Эта
директива имеет синтаксис:

     %SUBTTL "текст"

     Директива %TABSIZE задает позицию табуляции в файле  листин-
га. Данная директива имеет следующий синтаксис:

     %TABSIZE размер

где "размер" - это число столбцов между двумя позициями табуляции
в файле листинга. По умолчанию это 8 столбцов.

     Для задания длины поля исходного  текста  в  файле  листинга
можно использовать директиву %TEXT, которая имеет синтаксис:

     %TEXT размер

где "размер" - это число столбцов, используемых для вывода в фай-
ле листинга исходных строк. Если размер исходной строки превышает
длину этого поля,  то оно будет либо усекаться, либо переноситься
на следующую строку,  в зависимости  от  использования  директивы
%TRUNC или %NOTRUNC.

     Чтобы сохранить   все   параметры   управления  листингом  в
16-уровневом стеке,  можно использовать директиву  %PUSHCTL.  Она
сохраняет только те параметры управления листингом, которые можно
разрешить или запретить (%INCL,  %NOINCL и т.д.).  Размеры  полей
листинга не сохраняются. Данная директива особенно полезна в мак-
рокомандах, когда вы можете вызывать специальные режимы листинга,
которые отменяются при завершении макрорасширения.

     Директива %PUSHCTL имеет синтаксис:

     %PUSHCTL

     Директива %POPCTL  восстанавливает из стека параметры управ-
ления листингом и имеет следующий синтаксис:

     %POPCTL

     Эта директива восстанавливает параметры управления листингом
в те  значения,  которые  они  имели  перед  последней директивой
%PUSHCTL. Значения размеров полей листинга (%DEPTH, %PCNT и т.д.)
не восстанавливаются.

      Глава 18. Интерфейс Турбо Ассемблера и Borland C++
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Хотя некоторые программисты  могут  разрабатывать  программы
целиком  на языке Ассемблера (и делают это),  другие предпочитают
писать основную часть программы на языке высокого уровня, обраща-
ясь к языку Ассемблера только для осуществления управления нижне-
го уровня,  или когда требуется высокая производительность. Неко-
торые  предпочитают писать преимущественно на Ассемблере,  только
иногда используя конструкции и библиотечные средства языков высо-
кого уровня.

     Данная глава объясняет использование Турбо Ассемблера с ком-
пиляторами С++. В этой главе они называются компиляторами семейс-
тва Borland С++.  Однако Турбо Ассемблер можно использовать также
с Турбо C++ и Турбо Си. Приводимая ниже таблица содержит перечень
компиляторов этого семейства.

                 Компиляторы Borland С++ и Си        Таблица 18.1
ЪДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і Название продукта  і Имя файла компилятора                    і
ГДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і Borland С++        і bcc.exe, bccx.exe, bc.exe или bcx.exe    і
і Турбо C++          і tcc.exe или tc.exe                       і
і Турбо Cи           і tcc.exe                                  і
АДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Например, если мы говорим,  чтобы  вы  выполнили  компиляцию
строкой:

     bcc -S plusone.cpp

а вы работаете с Турбо С++, то вместо нее вы можете ввести следу-
ющую командную строку:

     tcc -S plusone.cpp

     Если при интерфейсе с Турбо Ассемблером вы используете Турбо
Си,  то вы ограничены использованием только компилятора командной
строки.  В случае же Borland С++ и Турбо С++ вы  можете  работать
как с компиляторами командной строки, так и с компилятором интег-
рированной среды.

     Borland C++ дает хорошие  возможности  поддержки  смешанного
программирования на С++ и на языке Ассемблера на произвольной ос-
нове и предоставляет не один,  а целых три механизма  объединения
модулей на Ассемблере и на С++. Имеющееся в С++ средство встроен-
ного ассемблирования позволяет быстро и просто вставить  текст на
языке Ассемблера прямо в функцию С++. Вы можете выполнить ассемб-
лирование встроенного кода при помощи Турбо Ассемблера или встро-
енного Ассемблера Borland С++.  Те,  кто предпочитает держать ас-
семблерные части программы в отдельных модулях,  написанных цели-
ком на языке Ассемблера, может ассемблировать их при помощи Турбо
Ассемблера и затем скомпоновать с модулями Borland С++.

     Сначала  мы  рассмотрим  использование встроенного в Borland
C++ Ассемблера. Далее мы подробно обсудим компоновку отдельно ас-
семблированных в Турбо Ассемблере модулей с Borland C++ и  иссле-
дуем процесс вызова функций, написанных с помощью Турбо Ассембле-
ра, из программы, созданной в Borland C++. И наконец, мы рассмот-
рим вызов функций Borland C++ из программы на Турбо Ассемблере.

        Вызов из Borland C++ функций Турбо Ассемблера
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Обычно C++  и Ассемблер совместно используют путем написания
отдельных модулей целиком на C++ или Ассемблере, компиляции моду-
лей С++ и ассемблирования модулей Ассемблера с  последующей  сов-
местно компоновкой  этих раздельно написанных модулей.  Это пока-
зано на Рис. 1.18.

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і   Исходный файл на языке С++ і і Исходный файл на Ассемблере  і
і          имя_файла.СPP       і і        имя_файла.ASM         і
АДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДЩ АДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДЩ
               і                              і
                 Компиляция                     Ассемблирование
        ХНННННННННННННё              ХННННННННННННННННННё
        і Borland C++ і              і  Турбо Ассемблер і
        ФНННННННННННННѕ              ФННННННННННННННННННѕ
               і                              і
                                             
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і     Объектный файл языка С++ і і   Объектный файл языка С++   і
і          имя_файла.OBJ       і і        имя_файла.OBJ         і
АДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДЩ АДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДЩ
               і                               і
               і                               і
               АДДДДДДДДДДДДДї   ЪДДДДДДДДДДДДДЩ
                             і   і
                                
                        ХНННННННННННННё
                        і   TLINK     і Компоновка
                        ФНННННННННННННѕ
                               і
                               
                ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
                і         Выполняемый файл       і
                і          имя_файла.EXE         і
                АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Рис. 1.18  Цикл  компиляции,  ассемблирования  и  компоновки
Borland C++, Турбо Ассемблера и компоновщика TLINK

     Выполняемый файл получается из "смеси" модулей С++ и Ассемб-
лера. Этот цикл можно запустить командой:

        bcc имя_файла_1.cpp имя_файла_2.asm

которая указывает Borland C++,  что нужно  сначала  компилировать
файл имя_файла_1.СPP в файл имя_файла_1.OBJ, а затем вызвать Тур-
бо Ассемблер для ассемблирования файла имя_файла_2.asm в имя_фай-
ла_2.obj, и,  наконец,  вызвать  компоновщик TLINK для компоновки
файла имя_файл_1.OBJ и имя_файл_2.OBJ в файл имя_файла.EXE.

     Раздельную компиляцию полезно использовать  для  программ  с
большим объемом кода на Ассемблере, так как это позволяет исполь-
зовать все возможности Турбо Ассемблера и программировать на язы-
ке Ассемблера  в  чисто ассемблерном окружении  без ключевых слов
asm, дополнительного времени на компиляцию  и  связанными  с  С++
непроизводительными затратами  при работе со встроенным Ассембле-
ром.

     За раздельную компиляцию приходится платить  следующую цену:
программист, работающий с Ассемблером,  должен вникать во все де-
тали организации интерфейса между С++ и кодом  Ассемблера.  В  то
время как  при  использовании  встроенного Ассемблера Borland C++
сам выполняет спецификацию сегментов, передачу параметров, ссылку
на переменные С++ и т.д.,  отдельно компилируемые функции Ассемб-
лера должны все это (и даже более) делать самостоятельно.

     В интерфейсе Турбо Ассемблера и Borland C++ есть два  основ-
ных  аспекта.  Во-первых,  различные  части кода С++ и Ассемблера
должны правильно компоноваться,  а функции и переменные в  каждой
части кода должны быть доступны (если это необходимо) в остальной
части кода. Во-вторых, код Ассемблера должен правильно работать с
вызовами  функций,  соответствующих  соглашениям  языка С++,  что
включает в себя доступ к передаваемым параметрам,  возврат значе-
ний  и соблюдение правил сохранения регистров,  которых требуется
придерживаться в функциях С++.

     Давайте теперь приступим к изучению правил компоновки  прог-
рамм Турбо Ассемблера и Borland C++.

 Основные моменты в интерфейсе Турбо Ассемблера и Borland C++
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Чтобы скомпоновать вместе модули Borland C++ и Турбо Ассемб-
лера, должны быть соблюдены следующие три пункта:

     1. В модулях Турбо Ассемблера должны использоваться соглаше-
        ния об именах, принятые в Borland C++.

     2. Borland  C++ и Турбо Ассемблер должны совместно использо-
        вать соответствующие функции и имена переменных  в форме,
        приемлемой для Borland C++.

     3. Для  комбинирования модулей в выполняемую программу нужно
        использовать утилиту-компоновщик TLINK.

     Здесь ничего не говориться о том, что в действительности де-
лают  модули  Турбо Ассемблера.  Пока мы коснемся только основных
моментов,  обеспечивающих разработку  функций  Турбо  Ассемблера,
совместимых с С++.

            Компоновка ассемблерных модулей с С++
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Важной концепцией С++ является  безопасная  с  точки  зрения
стыковки типов компоновка.  Компилятор и компоновщик должны рабо-
тать согласованно, чтобы гарантировать правильность типов переда-
ваемых между функциями аргументов. Процесс, называемый "корректи-
ровкой имен" (name-mangling), обеспечивает необходимую информацию
о типах аргументов.  "Корректировка имени" модифицирует имя функ-
ции таким образом, чтобы оно несло информацию о принимаемых функ-
цией аргументах.

     Когда программа  пишется целиком на С++,  корректировка имен
происходит автоматически и прозрачно для программы. Однако, когда
вы пишете  ассемблерный  модуль  для последующей его компоновки с
программой на С++,  вы сами обязаны обеспечить корректировку имен
в модуле. Это легко сделать, написав пустую функцию на С+ и ском-
пилировав  ее  с  ассемблерным  модулем.  Генерируемый  при  этом
Borland С++  файл .ASM будет содержать исправленные имена.  Затем
вы можете их использовать при написании  реального  ассемблерного
модуля.

     Например, следующий  фрагмент кода определяет четыре различ-
ные версии функции с именем test:

     void test()
     {
     }

     void test( int )
     {
     }

     void test( int, int )
     {
     }

     void test( float, double )
     {
     }

     Если этот код компилируется с параметром -S,  то  компилятор
создает  на  выходе  файл на языке Ассемблера (.ASM).  Вот как он
выглядит (несущественные детали убраны):

     ;       void test()
     @testSqv       proc    near
            push    bp
            mov     bp,sp
            popo    bp
            ret
     @testSqv       endp

     ;       void test( int )
     @testSqi       proc    near
            push    bp
            mov     bp,sp
            popo    bp
            ret
     @testSqi       endp

     ;       void test( int, int )
     @testSqii      proc    near
            push    bp
            mov     bp,sp
            popo    bp
            ret
     @testSqii      endp

     ;       void test( float, double )
     @testSqfd      proc    near
            push    bp
            mov     bp,sp
            popo    bp
            ret
     @testSqfd      endp

      Использование Extern "C" для упрощения компоновки
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

      При желании  вы можете использовать в ассемблерных функциях
неисправленные имена,  не пытаясь выяснить,  как должны выглядеть
правленные. Использование нескорректированных  имен  защитит ваши
ассемблерные функции  от возможных изменений алгоритма в будущем.
Borland С++ позволяет определять  в  программах  С++  стандартные
имена функций С++, как в следующем примере:

     extern "C" {
          int add(int *a, int b);
     }

     Любые функции,  объявленные внутри фигурных скобок,  получат
имена в стиле языка Си. Ниже показаны соответствующие определения
в ассемблерном модуле:

           public _add
      _add proc

     Объявление ассемблерной функции в блоке extern "C"  позволит
вам избежать  проблем  со "откорректированными именами". При этом
улучшится и читаемость кода.

                  Модели памяти и сегменты
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Чтобы  данная  функция  Ассемблера могла могла вызываться из
С++, она должна использовать ту же модель памяти, что и программа
на языке С++, а также совместимый с С++ сегмент кода. Аналогично,
чтобы данные,  определенные в модуле Ассемблера,  были доступны в
программе  на языке С++ (или данные С++ были доступны в программе
Ассемблера),  в программе на Ассемблере должны соблюдаться согла-
шения языка С++ по наименованию сегмента данных.

     Модели памяти и обработку сегментов на Ассемблере может ока-
заться реализовать  довольно сложно.  К счастью,  Турбо Ассемблер
сам выполняет почти всю работу по  реализации  моделей  памяти  и
сегментов,  совместимых с Borland C++, при использовании упрощен-
ных директив определения сегментов.

  Упрощенные директивы определения сегментов и Borland C++
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Директива .MODEL  указывает Турбо Ассемблеру,  что сегменты,
создаваемые с помощью упрощенных директив  определения сегментов,
должны быть совместимы с выбранной моделью памяти (TINY - крохот-
ной,  SMALL - малой,  COMPACT -  компактной,  MEDIUM  -  средней,
LARGEбольшой  или  HUGE  -  громадной) и управляет назначаемым по
умолчанию типом (FAR или NEAR) процедур, создаваемых по директиве
PROC.  Модели  памяти,  определенные  с помощью директивы .MODEL,
совместимы с моделями Borland C++ с соответствующими именами.

     Наконец, упрощенные директивы определения  сегментов  .DATA,
.CODE,  .DATA?, .FARDATA, .FARDATA? и .CONST генерируют сегменты,
совместимые с Borland C++.

     Например, рассмотрим  следующий  модуль  Турбо  Ассемблера с
именем DOTOTAL.ASM:

        .MODEL   SMALL       ; выбрать малую модель памяти
                             ; (ближний код и данные)
        .DATA                ; инициализация сегмента данных,
                             ; совместимого с Borland C++
        EXTRN   _Repetitions:WORD ; внешний идентификатор
        PUBLIC  _StartingValue ; доступен для других модулей
_StartValue     DW   0
        .DATA?               ; инициализированный сегмент
                             ; данных, совместимый с Borland C++
RunningTotal    DW   ?
        .CODE                ; сегмент кода, совместимый с
                             ; Borland C++
        PUBLIC  _DoTotal
_DoTotal        PROC         ; функция (в малой модели памяти
                             ; вызывается с помощью вызова
                             ; ближнего типа)
        mov     cx,[_Repetitions] ; счетчик выполнения
        mov     ax,[_StartValue]
        mov     [RunningTotal],ax ; задать начальное
                             ; значение
TotalLoop:
        inc     [RunningTotal] ; RunningTotal++
        loop    TotalLoop
        mov     ax,[RunningTotal] ; возвратить конечное
                             ; значение (результат)
        ret
_DoTotal        ENDP
        END

     Написанная на  Ассемблере процедура _DoTotal при использова-
нии малой модели памяти может вызываться из Borland C++ с помощью
оператора:

        DoTotal();

     Заметим, что в процедуре DoTotal предполагается,  что где-то
в  другой   части   программы   определена   внешняя   переменная
Repetitions.  Аналогично, переменная StartingValue объявлена, как
общедоступная,  поэтому она доступна в других  частях  программы.
Следующий модуль Borland C++ (который называется SHOWTOT.CPP) об-
ращается  к  данным  в  DOTOTAL.ASM  и  обеспечивает  для  модуля
DOTOTAL.ASM внешние данные:

     extern  int StartingValue;
     extern  int DoTotal(word);
     int  Repetitions;
     main()
     {
        int i;
        Repetitions = 10;
        StartingValue = 2;
        print("%d\n", DoTotal());
     }

     Чтобы создать из модулей DOTOTAL.ASM и SHOWTOT.CPP выполняе-
мую программу SHOWTOT.EXE, введите команду:

     bcc showtot.cpp dototal.asm

     Если бы вы захотели скомпоновать процедуру _DoTotal с  прог-
раммой на языке C++,  использующей компактную модель  памяти,  то
пришлось бы просто заменить директиву .MODEL на .MODEL COMPACT, а
если бы вам  потребовалось  использовать  в  DOTATOL.ASM  сегмент
дальнего типа,  то можно было бы использовать директиву .FARDATA.

     Короче говоря, при использовании упрощенных директив опреде-
ления  сегментов генерация корректного  упорядочивания сегментов,
моделей памяти и имен сегментов труда не составляет.

    Старые директивы определения сегментов и Borland C++
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     Коснемся теперь проблемы организации интерфейса Турбо Ассем-
блера с  кодом языка С++,  где используются директивы определения
сегментов старого типа (стандартные директивы определения сегмен-
тов).  Например, если вы замените в модуле DOTOTAL.ASM упрощенные
директивы определения сегментов директивами старого типа,  то по-
лучите следующее:

    DGROUP  group    _DATA,_BSS
    _DATA   segment  word public 'DATA'
            EXTRN   _Repetitions:WORD ; внешний идентификатор
            PUBLIC  _StartingValue ; доступен для других модулей
    _StartValue     DW   0
    _DATA   ends
    _BSS    segment word public 'BSS'
    RunningTotal    DW   ?
    _BSS    ends
    _TEXT   segment byte public 'CODE'
            assume  cs:_TEXT.ds:DGROUP,ss:DGROUP
            PUBLIC  _DoTotal
    _DoTotal        PROC         ; функция (в малой модели памяти
                                 ; вызывается с помощью вызова
                                 ; ближнего типа)
            mov     cx,[_Repetitions] ; счетчик выполнения
            mov     ax,[_StartValue]
            mov     [RunningTotal],ax ; задать начальное
                                 ; значение
    TotalLoop:
            inc     [RunningTotal] ; RunningTotal++
            loop    TotalLoop
            mov     ax,[RunningTotal] ; возвратить конечное
                                 ; значение (результат)
            ret
    _DoTotal        ENDP
    _TEXT   ENDS
            END

     Данная версия директив определения сегментов не только длин-
нее,  то также и хуже читается.  К тому же  при  использовании  в
программе  на языке С++ различных моделей памяти ее труднее изме-
нять.  При организации интерфейса с Borland C++ в общем случае  в
использовании  старых  директив определения сегментов нет никаких
преимуществ.  Если же вы тем не менее захотите  использовать  при
организации интерфейса с Borland C++ старые директивы определения
сегментов, вам придется идентифицировать корректные сегменты, со-
ответствующие используемым в коде на языке С++ моделям памяти.

     Простейший способ  определения,  какие  сегментные директивы
старых версий должны выбираться для компоновки  с  той  или  иной
программой Borland С++,  заключается в компиляции главного модуля
программы на Borland С++ для желаемой модели памяти  с параметром
-S, что тем самым заставит Borland С++ сгенерировать ассемблерную
версию соответствующей программы на Borland С++.  В  этой  версии
кодов Си  вы  сможете найти все старые сегментные директивы,  ис-
пользуемые Турбо Cи;  просто скопируйте их  в  вашу  ассемблерную
часть программы.

     Вы также можете посмотреть, как будут выглядеть соответству-
ющие старые директивы,  скомпилировав их обычным образом (без па-
раметра -S) и использовав TDUMP - утилиту, поставляемую Турбо Ас-
семблером,  чтобы получить все записи определения  сегмента.  Ис-
пользуйте следующую командную строку:

    tdump -OI segdef module.obj

 Значения по умолчанию: когда необходимо загружать сегменты?
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В некоторых  случаях вызываемые из языка С++ функции Ассемб-
лера могут использовать (загружать) для обращения  к  данным  ре-
гистры  DS  и/или ES.  Полезно знать соотношение между значениями
сегментных регистров при вызове из Borland C++,  так  как  иногда
Ассемблер использует преимущества эквивалентности двух сегментных
регистров. Давайте рассмотрим значения сегментных регистров в тот
момент,  когда  функция  Ассемблера вызывается из Borland C++,  а
также соотношения между сегментными регистрами, и случаи, когда в
функции  Ассемблера требуется загружать один или более сегментных
регистров.

     При входе  в функцию Ассемблера из Borland C++ регистры CS и
DS имеют следующие значения,  которые зависят от используемой мо-
дели памяти (регистр SS всегда используется для сегмента стека, а
ES всегда используется, как начальный сегментный регистр):

      Значения регистров при входе в Ассемблер из Borland C++
                                                     Таблица 18.2
    ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
    і  Модель           CS                          DS          і
    ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
    і Крохотная         _TEXT                    DGROUP         і
    і Малая             _TEXT                    DGROUP         і
    і Компактная        _TEXT                    DGROUP         і
    і Средняя        имя_файла_TEXT              DGROUP         і
    і Большая        имя_файла_TEXT              DGROUP         і
    і Громадная      имя_файла_TEXT   имя_вызывающего_файла_DATAі
    АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Здесь "имя_файла" - это имя модуля на Ассемблере, а "имя_вы-
зывающего_файла" - это имя модуля Borland C++, вызывающего модуль
на Ассемблере.

     В крохотной модели памяти _TEXT и DGROUP совпадают,  поэтому
при входе в функцию содержимое регистра CS равно  содержимому DS.
При  использовании  крохотной,  малой  и компактной модели памяти
при входе в функцию содержимое SS равно содержимому  регистра DS.

     Когда же в функции на Ассемблере, вызываемой из программы на
языке С++,  необходимо загружать сегментный регистр?  Отметим для
начала, что вам никогда не придется (более того, этого не следует
делать) загружать регистры SS или CS:  при дальних вызовах, пере-
ходах или возвратах регистр CS  автоматически  устанавливается  в
нужное значение, а регистр SS всегда указывает на сегмент стека и
в ходе выполнения программы изменять его не следует  (если только
вы не пишете программу,  которая "переключает" стеки. В этом слу-
чае вам нужно четко понимать, что вы делаете).

     Регистр ES вы можете всегда использовать так, как это требу-
ется.  Вы  можете установить его таким образом, чтобы он указывал
на данные с дальним типом обращения,  или  загрузить  в  ES  сег-
мент-приемник для строковой функции.

     С регистром  DS  дело обстоит иначе.  Во всех моделях памяти
Borland C++,  кроме сверхбольшой,  регистр DS при входе в функцию
указывает на статический сегмент данных (DGROUP),  и изменять его
не следует. Для доступа к данным с дальним типом обращения всегда
можно использовать регистр ES,  хотя вы можете посчитать, что для
этого временно нужно использовать регистр DS (если вы собираетесь
осуществлять интенсивный доступ к данным), что исключит необходи-
мость использования в вашей программе множества инструкций с пре-
фиксом переопределения сегмента. Например, вы можете обратиться к
дальнему сегменту одним из следующих способов:

                  .
                  .
                  .
                  .FARDATA
Counter           DW    0
                  .
                  .
                  .
                  .CODE
                  PUBLIC  _AsmFunction
_AsmFunction      PROC
                  .
                  .
                  .
                  mov   ax,@FarData
                  mov   es,ax         ; ES указывает на
                                      ; сегмент данных с
                                      ; дальним типом
                                      ; обращения
                  inc   es:[Counter]  ; увеличить значение
                                      ; счетчика
                  .
                  .
                  .
_AsmFunction      ENDP
                  .
                  .
                  .

или иначе:

                  .
                  .
                  .
                  .FARDATA
Counter           DW     0
                  .
                  .
                  .
                  .CODE
                  PUBLIC  _AsmFunction
_AsmFunction      PROC
                  .
                  .
                  .
                  assume  ds:@FarData
                  mov   ax,@FarDAta
                  mov   ds,ax          ; DS указывает на
                                       ; сегмент данных с
                                       ; дальним типом
                                       ; обращения
                  inc   [Counter]      ; увеличить значение
                                       ; счетчика
                  assume ds:@Data
                  mov   ax,@Data
                  mov   dx,ax          ; DS снова указывает
                                       ; на DGROUP
                  .
                  .
                  .
_AsmFunction      ENDP
                  .
                  .
                  .

     Второй вариант имеет то преимущество, что при каждом обраще-
нии к дальнему сегменту данных в нем не требуется переопределение
ES:. Если для обращения к дальнему сегменту вы загружаете регистр
DS,  убедитесь в том,  что перед обращением к  другим  переменным
DGROUP  вы  его  восстанавливаете (как это делается в приведенном
примере). Даже если в данной функции на Ассемблере вы не обращае-
тесь  к DGROUP,  перед выходом из нее все равно обязательно нужно
восстановить содержимое DS,  так как в Borland C++ подразумевает-
ся, что регистр DS не изменялся.

     При использовании в функциях,  вызываемых из С++, сверхболь-
шой модели памяти работать с регистром DS нужно несколько по-дру-
гому.  В сверхбольшой модели памяти Borland C++ совсем не исполь-
зует DGROUP.  Вместо этого каждый модуль имеет  свой  собственный
сегмент  данных,  который является дальним сегментом относительно
всех других модулей  в  программе  (нет  совместно  используемого
ближнего сегмента данных).  При использовании сверхбольшой модели
памяти на входе в функцию регистр DS должен быть установлен таким
образом,  чтобы он указывал на этот дальний сегмент данных модуля
и не изменялся до конца функции, например:

                  .
                  .
                  .
                  .FARDATA
                  .
                  .
                  .
                  .CODE
                  PUBLIC  _AsmFunction
_AsmFunction      PROC
                  push    ds
                  mov     ax,@FarData
                  mov     ds,ax
                  .
                  .
                  .
                  pop     ds
                  ret
_AsmFunction      ENDP
                  .
                  .
                  .

     Заметим, что  исходное состояние регистра DS сохраняется при
входе в функцию _AsmFunction с помощью инструкции  PUSH  и  перед
выходом восстанавливается с помощью инструкции POP. Даже в сверх-
большой модели памяти Borland C++ требует, чтобы все функции сох-
раняли регистр DS.

           Общедоступные и внешние идентификаторы
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Программы Турбо Ассемблера могут вызывать функции С++ и ссы-
латься на внешние переменные Си.  Программы Borland C++ аналогич-
ным образом могут вызывать общедоступные (PUBLIC)  функции  Турбо
Ассемблера и обращаться к переменным Турбо Ассемблера.  После то-
го,  как в Турбо Ассемблере устанавливаются совместимые с Borland
C++ сегменты (как описано в предыдущих разделах), чтобы совместно
использовать функции и переменные Borland C++ и Турбо Ассемблера,
нужно соблюдать несколько простых правил.

                   Подчеркивания и язык Си
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Если вы пишете на языке Си или С++,  то  все  внешние  метки
должны  начинаться  с символа  подчеркивания (_). Компилятор Си и
С++ вставляет символы подчеркивания перед всеми  именами  внешних
функций и  переменных  при их использовании в программе на Си/С++
автоматически,  поэтому вам требуется вставить их самим только  в
ассемблерных кодах. Вы должны убедиться, что все ассемблерные об-
ращения к функциям и переменным Си начинаются с символа подчерки-
вания,  и  кроме того,  вы должны вставить его перед именами всех
ассемблерных функций и переменных,  которые делаются общими и вы-
зываются из программы на языке Си/С++.

     Например, следующая программа на языке Си (link2asm.cpp):

      extrn int ToggleFlag();
      int Flag;
      main()
      {
          ToggleFlag();
      }

правильно компонуется  со  следующей  программой  на   Ассемблере
(CASMLINK.ASM):

            .MODEL  SMALL
            .DATA
            EXTRN   _Flag:word
            .CODE
            PUBLIC  _ToggleFlag
_ToggleFlag PROC
            cmp     [_Flag],0      ; флаг сброшен?
            jz      SetFlag        ; да, установить его
            mov     [_Flag],0      ; нет, сбросить его
            jmp     short EndToggleFlag ; выполнено
SetFlag:
            mov     [_Flag],1      ; установить флаг
EndToggleFlag:
            ret
_ToggleFlag ENDP
            END

     При использовании в директивах EXTERN и PUBLIC спецификатора
языка Си правильно компонуется со следующей программой на Ассемб-
лере (CSPEC.ASM):

            .MODEL  SMALL
            .DATA
            EXTRN   C Flag:word
            .CODE
            PUBLIC  C ToggleFlag
ToggleFlag  PROC
            cmp     [Flag],0       ; флаг сброшен?
            jz      SetFlag        ; да, установить его
            mov     [Flag],0       ; нет, сбросить его
            jmp     short EndToggleFlag ; выполнено
SetFlag:
            mov     [Flag],1       ; установить флаг
EndToggleFlag:
            ret
ToggleFlag  ENDP
            END

           Примечание: Метки,  на  которые  отсутствуют  ссылки в
      программе не Си (такие, как SetFlag) не требуют предшеству-
      ющих символов подчеркивания.

     Турбо Ассемблер  автоматически  при  записи  имен   Flag   и
ToggleFlag  в объектный файл поместит перед ними символ подчерки-
вания.

Различимость  строчных и прописные символов в идентификаторах
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В именах идентификаторов Турбо Ассемблер обычно не различает
строчные и прописные буквы (верхний и нижний регистр).  Поскольку
в С++ они различаются, желательно задать такое различие и в Турбо
Ассемблере (по крайней мере для тех идентификаторов, которые сов-
местно  используются Ассемблером и С++).  Это можно сделать с по-
мощью параметров /ML и /MX.

     Переключатель (параметр) командной  строки  /ML  приводит  к
тому,  что  в Турбо Ассемблере во всех идентификаторах строчные и
прописные символы будут различаться (считаться различными). Пара-
метр  командной строки /MX указывает Турбо Ассемблеру, что строч-
ные и  прописные  символы  (символы  верхнего и нижнего регистра)
нужно различать в общедоступных (PUBLIC) идентификаторах, внешних
(EXTRN) идентификаторах глобальных (GLOBAL) идентификаторах и об-
щих (COMM) идентификаторах.  В большинстве случаев следует  также
использовать параметр /ML.

                         Типы меток
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Хотя в программах Турбо Ассемблера можно свободно обращаться
к любой переменной или данным любого размера (8, 16, 32 бита и т.
д.), в общем случае хорошо обращаться к переменным в соответствии
с их размером. Например, если вы записываете слово в байтовую пе-
ременную, то обычно это приводит к проблемам:

            .
            .
            .
SmallCount  DB   0
            .
            .
            .
            mov   WORD PTR [SmallCount],0ffffh
            .
            .
            .

     Поэтому важно, чтобы в операторе Ассемблера EXTRN, в котором
описываются переменные С++,  задавался правильный размер этих пе-
ременных,  так как при генерации размера доступа к переменной С++
Турбо Ассемблер основывается именно на этих описаниях.

     Если в программе на языке С++ содержится оператор:

        char c

то код Ассемблера:

                 .
                 .
                 .
EXTRN            c:WORD
                 .
                 .
                 .
                 inc  [c]
                 .
                 .
                 .

может привести к весьма неприятным ошибкам, поскольку после того,
как в  коде  на  языке  С++ переменная c увеличится очередные 256
раз, ее значение будет сброшено, а так как она описана, как пере-
менная  размером  в  слово,  то байт по адресу OFFSET c + 1 будет
увеличиваться некорректно, что приведет к непредсказуемым резуль-
татам.

     Между типами  данных  С++  а Ассемблера существует следующее
соотношение:

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і    Тип данных С++             і          Тип данных Ассемблераі
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і    unsigned char              і                     byte      і
і    char                       і                     byte      і
і    enum                       і                     word      і
і    unsigned short             і                     word      і
і    short                      і                     word      і
і    unsigned int               і                     word      і
і    int                        і                     word      і
і    unsigned long              і                     dword     і
і    long                       і                     dword     і
і    float                      і                     dword     і
і    double                     і                     qword     і
і    long double                і                     tbyte     і
і    near*                      і                     word      і
і    far*                       і                     dword     і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

               Внешние дальние идентификаторы
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Если вы используете упрощенные директивы определения сегмен-
тов,  то описания идентификаторов EXTRN в сегментах дальнего типа
не должны размещаться ни в каком сегменте, так как  Турбо  Ассем-
блер  рассматривает  идентификаторы, описанные в данном сегменте,
как связанные с данным сегментом. Это имеет свои недостатки: Тур-
бо Ассемблер не может проверить возможность адресации к идентифи-
катору, описанному, как внешний (EXTRN), вне  любого  сегмента  и
поэтому  не может в случае необходимости  сгенерировать определе-
ние сегмента или сообщить вам, что была попытка обратиться к дан-
ной переменной, когда сегмент не был загружен корректным значени-
ем. Тем  не  менее Турбо Ассемблер генерирует для ссылок на такие
внешние идентификаторы правильный код,  но  не  может  обеспечить
обычную степень проверки возможности адресации к сегменту.

     Если вы все-таки захотите, то можно использовать для  явного
описания каждого внешнего идентификатора сегмента старые директи-
вы определения сегментов, а затем поместить директиву  EXTRN  для
этого  идентификатора внутрь описания сегмента. Это довольно уто-
мительно, поэтому если вы не хотите обеспечивать загрузку коррек-
тного  значения  сегмента  при обращении к данным, то проще всего
просто разместить описания  EXTRN  для  идентификаторов  дальнего
типа   вне   всех  сегментов.  Предположим,  например,  что  файл
FILE1.ASM содержит следующее:

                     .
                     .
                     .
                     .FARDATA
FileVariable         DB   0
                     .
                     .
                     .

и он компонуется с файлом FILE2.ASM, который содержит:

                     .
                     .
                     .
                     .DATA
                     EXTRN  FileVariable:BYTE
                     .CODE
Start                PROC
                     mov   ax,SEG FileVariable
                     mov   ds,ax
                     .
                     .
                     .

     SEG FileVariable  не  будет  возвращать корректного значения
сегмента.  Директива EXTRN размещена в области действия директивы
файла FILE2.ASM DATA,  поэтому Турбо Ассемблер считает, что пере-
менная FileVariable должна находиться  в  ближнем  сегменте  DATA
файла FILE2.ASM, а не в дальнем сегмента DATA.

     В следующем коде FILE2.ASM SEG FileVariable будет возвращать
корректное значение сегмента:

                     .
                     .
                     .
                     .DATA
@CurSeg              ENDS
                     EXTRN   FileVariable:BYTE
                     .CODE
Start                PROC
                     mov   ax,SEG FileVariable
                     mov   ds,ax
                     .
                     .
                     .

     "Фокус" здесь состоит в том,  что директива @CurSeg ENDS за-
вершает  сегмент  .DATA,  поэтому,  когда переменная FileVariable
описывается,  как внешняя,  никакая сегментная директива не дейс-
твует.

               Командная строка компоновщика
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Простейший способ скомпоновать модули Borland C++ с модулями
Турбо Ассемблера состоит в том, чтобы ввести одну командную стро-
ку Borland C++,  после чего он выполнит всю остальную работу. При
задании нужной командной строки Borland C++  выполнит  компиляцию
исходного кода Си, вызовет Турбо Ассемблер для ассемблирования, а
затем вызовет утилиту TLINK для компоновки объектных файлов в вы-
полняемый файл.  Предположим, например, что у вас есть программа,
состоящая из файлов на языке Си MAIN.CPP и STAT.CPP и файлов  Ас-
семблера SUMM.ASM и DISPLAY.ASM. Командная строка:

        bcc main.cpp stat.cpp summ.asm display.asm

выполняет компиляцию  файлов MAIN.CPP и STAT.CPP, ассемблирование
файлов SUMM.ASM и DISPLAY.ASM и компоновку всех четырех объектных
файлов, а также кода инициализации С++ и необходимых библиотечных
функций в выполняемый файл MAIN.EXE.  При вводе имен  файлов  Ас-
семблера нужно только помнить о расширениях .ASM.

     Если вы используете утилиту TLINK в  автономном  режиме,  то
генерируемые Турбо Ассемблером объектные файлы представляют собой
стандартные объектные модули и обрабатываются также,  как  объек-
тные модули С++.  Описание TLINK в автономном режиме см. в Прило-
жении С.

    Взаимодействие между Турбо Ассемблером и Borland C++
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Теперь, когда вы понимаете,  как нужно строить и компоновать
совместимые с С++ модули Ассемблера, нужно знать, какой код можно
помещать в функции Ассемблера,  вызываемые из  С++.  Здесь  нужно
проанализировать три момента:  получение передаваемых параметров,
использование регистров и возврат значений в вызывающую  програм-
му.

                     Передача параметров
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Borland C++ передает функциям параметры  через  стек.  Перед
вызовом функции С++ сначала заносит передаваемые этой функции па-
раметры,  начиная с самого правого параметра и  кончая  левым,  в
стек. В С++ вызов функции:

     .
     .
     .
     Test(i, j, 1);
     .
     .
     .

компилируется в инструкции:

     mov   ax,1
     push  ax
     push  word ptr DGROUP:_j
     push  word ptr DGROUP:_i
     call  near ptr _Test
     add   sp,6

где видно, что правый параметр (значение  1),  заносится  в  стек
первым, затем туда заносится параметр j и, наконец, i.

     При возврате  из функции занесенные в стек параметры все еще
находятся там,  но они больше не используются. Поэтому непосредс-
твенно  после каждого вызова функции Borland C++ настраивает ука-
затель стека обратно в соответствии со значением, которое он имел
перед занесением в стек параметров (параметры, таким образом, от-
брасываются).  В предыдущем примере три параметра (по  два  байта
каждый)  занимают в стеке вместе 6 байт,  поэтому Borland C++ до-
бавляет значение 6 к указателю стека,  чтобы отбросить  параметры
после обращения к функции Test. Важный момент здесь заключается в
том, что в соответствии с используемыми по умолчанию соглашениями
Си/C++ за удаление параметров из стека отвечает вызывающая  прог-
рамма.

     Функции Ассемблера могут обращаться к параметрам, передавае-
мым в стеке, относительно регистра BP. Например, предположим, что
функция Test в предыдущем примере  представляет  собой  следующую
функцию на Ассемблере (PRMSTACK.ASM):

             .MODEL   SMALL
             .CODE
             PUBLIC   _Test
_Test        PROC
             push   bp
             mov    bp,sp
             mov    ax,[bp+4]    ; получить параметр 1
             add    ax,[bp+6]    ; прибавить параметр 2
                                 ; к параметру 1
             sub    ax,[bp+8]    ; вычесть из суммы 3
             pop    bp
             ret
_Test        ENDP

     Как можно видеть,  функция  Test  получает  передаваемые  из
программы на языке Си параметры через стек, относительно регистра
BP.  (Если вы помните, BP адресуется к сегменту стека.) Но откуда
она знает, где найти параметры относительно BP?

     На Рис.  18.2 показано,  как выглядит стек перед выполнением
первой инструкции в функции Test:

     i = 25;
     j = 4;
     Test(1, j, 1);

                         .                       .
                         .                       .
                         .                       .
                         і                       і
                         ГДДДДДДДДДДДДДДДДДДДДДДДґ
                         і                       і
                         ГДДДДДДДДДДДДДДДДДДДДДДДґ
                SP ДД   і    Адрес возврата     і
                         ГДДДДДДДДДДДДДДДДДДДДДДДґ
                SP + 2   і        25 (i)         і
                         ГДДДДДДДДДДДДДДДДДДДДДДДґ
                SP + 4   і        4 (j)          і
                         ГДДДДДДДДДДДДДДДДДДДДДДДґ
                SP + 6   і           1           і
                         ГДДДДДДДДДДДДДДДДДДДДДДДґ
                         і                       і
                         ГДДДДДДДДДДДДДДДДДДДДДДДґ
                         і                       і
                         .                       .
                         .                       .
                         .                       .

     Рис. 18.2 Состояние стека перед выполнением первой  инструк-
ции функции Test

     Параметры функции Test представляют собой фиксированные  ад-
реса относительно SP, начиная с ячейки, на два байта старше адре-
са, по которому хранится адрес возврата, занесенный туда при  вы-
зове. После загрузки регистра BP значением SP вы можете обращать-
ся к параметрам относительно BP. Однако, вы должны сначала сохра-
нить BP,  так как в вызывающей программе предполагается,  что при
возврате  BP  изменен не будет.  Занесение в стек BP изменяет все
смещения в стеке. На Рис. 18.3 показано состояние стека после вы-
полнения следующих строк кода:

      .
      .
      .
      push  bp
      mov   bp,sp
      .
      .
      .

                      .                       .
                      .                       .
                      .                       .
                      і                       і
                      ГДДДДДДДДДДДДДДДДДДДДДДДґ
             SP ДД   і BP вызывающей прогр.  і  ДД BP
                      ГДДДДДДДДДДДДДДДДДДДДДДДґ
             SP + 2   і    Адрес возврата     і  BP + 2
                      ГДДДДДДДДДДДДДДДДДДДДДДДґ
             SP + 4   і        25 (i)         і  BP + 4
                      ГДДДДДДДДДДДДДДДДДДДДДДДґ
             SP + 6   і        4 (j)          і  BP + 6
                      ГДДДДДДДДДДДДДДДДДДДДДДДґ
             SP + 8   і           1           і  BP + 8
                      ГДДДДДДДДДДДДДДДДДДДДДДДґ
                      і                       і
                      ГДДДДДДДДДДДДДДДДДДДДДДДґ
                      і                       і
                      .                       .
                      .                       .
                      .                       .

     Рис. 18.3 Состояние стека после инструкций PUSH и MOVE

     Организация передачи параметров функции через стек и исполь-
зование его для динамических локальных переменных - это стандарт-
ный прием в языке С++. Как можно заметить, неважно, сколько пара-
метров имеет программа на языке С++:  самый левый параметр всегда
хранится в стеке по адресу,  непосредственно следующим за  сохра-
ненным в стеке адресом возврата,  следующий возвращаемый параметр
хранится непосредственно после самого  левого  параметра  и  т.д.
Поскольку  порядок  и  тип  передаваемых параметров известны,  их
всегда можно найти в стеке.

     Пространство для динамических локальных переменных можно за-
резервировать, вычитая  из  SP  требуемое  число байт.  Например,
пространство для динамического локального массива размером  в 100
байт можно  зарезервировать,  если начать функцию Test с инструк-
ций:

     .
     .
     .
     push  bp
     mov   bp,sp
     sub   sp,100
     .
     .
     .

как показано на Рис. 18.4

                          .                       .
                          .                       .
                          .                       .
                          і                       і
                          ГДДДДДДДДДДДДДДДДДДДДДДДґ
             SP ДД       і                       і Д BP - 100
                          ГДДДДДДДДДДДДДДДДДДДДДДДґ
                          і                       і
                          ГДДДДДДДДДДДДДДДДДДДДДДДґ
                          .                       .
                          .                       .
                          .                       .
                          .                       .
                          і                       і
                          ГДДДДДДДДДДДДДДДДДДДДДДДґ
             SP + 100 ДД і BP вызывающей прогр.  і  ДД BP
                          ГДДДДДДДДДДДДДДДДДДДДДДДґ
             SP + 102     і    Адрес возврата     і  BP + 2
                          ГДДДДДДДДДДДДДДДДДДДДДДДґ
             SP + 104     і        25 (i)         і  BP + 4
                          ГДДДДДДДДДДДДДДДДДДДДДДДґ
             SP + 106     і        4 (j)          і  BP + 6
                          ГДДДДДДДДДДДДДДДДДДДДДДДґ
             SP + 108     і           1           і  BP + 8
                          ГДДДДДДДДДДДДДДДДДДДДДДДґ
                          і                       і
                          ГДДДДДДДДДДДДДДДДДДДДДДДґ
                          і                       і
                          .                       .
                          .                       .
                          .                       .

     Рис. 18.4 Состояние стека после инструкций PUSH,  MOVE и SUB

     Поскольку та часть стека, где хранятся динамические  локаль-
ные переменные, представляет собой более младшие  адреса, чем BP,
для обращения к динамическим  локальным  переменным  используется
отрицательное смещение. Например, инструкция:

      mov   byte ptr  [bp-100]

даст значение первого байта ранее зарезервированного 100-байтово-
го  массива.  При передаче параметров всегда используется положи-
тельная адресация относительно регистра BP.

     Хотя можно выделять пространство для динамических  локальных
переменных описанным выше способом, в Турбо Ассемблере предусмот-
рена специальная версия директивы LOCAL, которая существенно  уп-
рощает выделение  памяти и присваивание имен для динамических ло-
кальных  переменных.  Когда  в  процедуре  встречается  директива
LOCAL, то подразумевается, что она определяет для данной процеду-
ры динамические локальные переменные. Например, директива:

     LOCAL  LocalArray:BYTE:100,LocalCount:WORD=AUTO_SIZE

определяет  динамические  переменные   LocalArray  и  LocalCount.
LocalArray на самом деле представляет собой метку, приравненную к
[BP-100], а LocalCount - это метка, приравненная к [BP-102].  Од-
нако  вы  можете  использовать их, как имена переменных. При этом
вам даже не нужно будет знать их значения. AUTO_SIZE - это  общее
число байт (объем памяти),  необходимых для хранения динамических
локальных переменных.  Чтобы выделить пространство для динамичес-
ких локальных переменных, это значение нужно вычесть из SP.

     Приведем  пример  того,  как  нужно  использовать  директиву
LOCAL:

                .
                .
                .
_TestSub        PROC
                LOCAL
LocalArray:BYTE:100,LocalCount:WORD=AUTO_SIZE
                push  bp          ; сохранить указатель стека
                                  ; вызывающей программы
                mov   bp,sp       ; установить собственный
                                  ; указатель стека
                sub   sp,AUTO_SIZE ; выделить пространство для
                                  ; динамических локальных
                                  ; переменных
                mov   [LocalCount],10 ; установить переменную
                                  ; LocalCount в значение 10
                                  ; (LocalCount это  [BP-102])
                .
                .
                .
                mov   cx,[LocalCount] ; получить значение
                                   ; (счетчик) из локальной
                                   ; переменной
                mov   al,'A'       ; заполним символом 'A'
                lea   bx,[LocalArray] ; ссылка на локальный
                                   ; массив LocalArray
                                   ; (LocalArray это [BP-100])
FillLoop:
                mov   [bx],al      ; заполнить следующий байт
                inc   bx           ; ссылка на следующий байт
                loop  FillLoop     ; обработать следующий байт,
                                   ; если он имеется
                mov   sp,bp        ; освободить память,
                                   ; выделенную для динамичес-
                                   ; ких локальных переменных
                                   ; (можно также использовать
                                   ; add sp,AUTO_SIZE)
                pop   bp           ; восстановить указатель
                                   ; стека вызывающей программы
                ret
_TestSub        ENDP
                .
                .
                .

     В данном примере следует обратить внимание не то, что первое
поле  после  определения данной динамической локальной переменной
представляет собой тип данных для этой  переменной:  BYTE,  WORD,
DWORD,  NEAR и т.д.  Второе поле после определения данной динами-
ческой локальной переменной - это число элементов указанного  ти-
па, резервируемых для данной переменной. Это поле является необя-
зательным и определяет используемый динамический локальный массив
(если он используется). Если данное поле пропущено, то резервиру-
ется один элемент указанного типа.  В итоге LocalArray состоит из
100 элементов размером в 1 байт, а LocalCount - из одного элемен-
та размером в слово (см. пример).

     Отметим также, что строка с директивой LOCAL в данном приме-
ре  завершается полем =AUTO_SIZE. Это поле, начинающееся со знака
равенства, необязательно. Если оно присутствует, то метка, следу-
ющая за знаком равенства,  устанавливается в значение числа  байт
требуемой динамической локальной памяти.  Вы должны затем исполь-
зовать данную метку для выделения и освобождения памяти для дина-
мических локальных переменных, так как директива LABEL только ге-
нерирует метки и не  генерирует  никакого  кода  или  памяти  для
данных.  Иначе говоря, директива LOCAL не выделяет память для ди-
намических локальных переменных, а просто генерирует метки, кото-
рые  вы  можете использовать как для выделения памяти,  так и для
доступа к динамическим локальным переменным.

     Очень удобное свойство директивы LOCAL  заключается  в  том,
что  область  действия  меток динамических локальных переменных и
общего размера динамических локальных переменных  ограничена  той
процедурой, в которой они используются, поэтому вы можете свобод-
но использовать имя динамической локальной  переменной  в  другой
процедуре.

     Как можно заметить, с помощью директивы LOCAL  определять  и
использовать  автоматические  переменные  намного легче. Отметим,
что при использовании в макрокомандах директива LOCAL  имеет  со-
вершенно  другое  значение.

     Кстати, Borland  C++ работает с границами стека так же,  как
мы здесь описали.  Вы  можете  скомпилировать  несколько  модулей
Borland  C++  с параметром -S и посмотреть,  какой код Ассемблера
генерирует Borland C++ и как там создаются и используются границы
стека.

     Все  это  прекрасно,  но  здесь  есть  некоторые  трудности.
Во-первых, такой способ доступа к параметрам, при котором исполь-
зуется постоянное смещение относительно BP достаточно  неприятен:
при  этом  не  только легко ошибиться, но если вы добавите другой
параметр, все другие смещения указателя стека  в  функции  должны
измениться.  Предположим, например, что функция Test воспринимает
три параметра:

     Test(Flag, i, j, 1);

     Тогда i находится по смещению 6, а не по смещению 4, j -  по
смещению 8, а не 6 и т.д. Для смещений параметров можно использо-
вать директиву EQU:

                    .
                    .
                    .
      Flag          EQU  4
      AddParm1      EQU  6
      AddParm2      EQU  8
      SubParm1      EQU  10

                    mov   ax[bp+AddParm1]
                    add   ax,[bp+AddParm1]
                    sub   ax,[bp+SubParm1]
                    .
                    .
                    .

но вычислять смещения и работать с ними довольно  сложно.  Однако
здесь  могут возникнуть и более серьезные проблемы: в моделях па-
мяти с дальним кодом размер занесенного в  стек  адреса  возврата
увеличивается на два байта, как и размеры передаваемых указателей
на код и данные в моделях памяти с дальним кодом и дальними  дан-
ными,  соответственно. Разработка функции, которая с равным успе-
хом будет ассемблироваться и правильно работать с указателем сте-
ка при использовании любой модели памяти было бы весьма непростой
задачей.

     Однако в Турбо Ассемблере предусмотрена директива ARG, с по-
мощью которой можно легко выполнять передачу параметров  в  прог-
раммах на Ассемблере.

     Директива ARG автоматически генерирует правильные смещения в
стеке для заданных вами переменных. Например:

      ARG      FillArray:WORD, Count:WORD, FillValue:BYTE

     Здесь задается три параметра: FillArray, параметр размером в
слово, Count, также параметр размером в слово и FillValue - пара-
метр  размером  в  байт.  Директива  ARG    устанавливает   метку
FillArray   в значение [BP+4] (подразумевается, что код находится
в процедуре ближнего типа), метку Count - в  значение  [BP+6],  а
метку FillValue - в значение [BP+8]. Однако особенно ценна дирек-
тива ARG тем, что вы можете использовать определенные  с  ее  по-
мощью метки не заботясь о тех значениях, в которые они установле-
ны.

     Например, предположим, что у вас есть функция FillSub  кото-
рая вызывается из С++ следующим образом:

     extern "C" {
       void FillSub(
         char *FillArray,
         int Count,
         char FillValue);
     }

        main()
        {
        #define ARRAY_LENGTH 100
           char TestArray[ARRAY_LENGTH];
           FillSub(TestArray,ARRAY_LENGTH,'*');
     }

     В FillSub директиву ARG для работы с параметрами  можно  ис-
пользовать следующим образом:

_FillSub        PROC  NEAR
         ARG    FillArray:WORD, Count:WORD, FillValue:BYTE
         push   bp           ; сохранить указатель стека
                             ; вызывающей программы
         mov    bp,sp        ; установить свой собственный
                             ; указатель стека
         mov    bx,[FillArray] ; получить указатель на
                             ; заполняемый массив
         mov    cx,[Count]   ; получить заполняемую длину
         mov    al,[FillValue] ; получить значение-заполнитель
FillLoop:
         mov    [bx],al      ; заполнить символ
         inc    bx           ; ссылка на следующий символ
         loop   FillLoop     ; обработать следующий символ
         pop    bp           ; восстановить указатель стека
                             ; вызывающей программы
         ret
_FillSub        ENDP

     Не правда ли, удобно работать с параметрами с помощью дирек-
тивы  ARG? Кроме того, директива ARG автоматически учитывает раз-
личные размеры возвратов ближнего и дальнего типа.

                    Сохранение регистров
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     При взаимодействии Турбо Ассемблера и Borland C++ вызываемые
из программы на языке С++ функции Ассемблера могут делать все что
угодно,  но при этом они должны сохранять регистры BP, SP, CS, DS
и SS.  Хотя при выполнении функции Ассемблера эти регистры  можно
изменять,  при  возврате  из  вызываемой  подпрограммы они должны
иметь в точности такие значения,  какие они имели при ее  вызове.
Регистры AX, BX, CX, DX и ES, а также флаги могут произвольно из-
меняться.

     Регистры DI и SI представляют собой особый случай, так как в
Borland C++  они используются для регистровых переменных.  Если в
модуле С++,  из которого вызывается ваша функция  на  Ассемблере,
использование регистровых переменных разрешено, то вы должны сох-
ранить регистры SI и DI,  если же нет,  то сохранять их не нужно.

     Однако неплохо всегда сохранять эти регистры,  независимо от
того,  разрешено или запрещено использование регистровых перемен-
ных.  Трудно заранее гарантировать,  что вам не придется компоно-
вать данный модуль Ассемблера с другим модулем на языке  С++, или
перекомпилировать  модуль С++ с разрешением использования регист-
ровых переменных.  При этом вы можете забыть, что изменения нужно
также внести и в код Ассемблера.

                      Возврат значений
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Вызываемые из программы на языке С++ функции  на Ассемблере,
так  же  как и функции С++,  могут возвращать значения.  Значения
функций возвращаются следующим образом:

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іТип возвращаемого значенияі Где находится возвращаемое значениеі
ГДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і unsigned char            і                AX                  і
і char                     і                AX                  і
і enum                     і                AX                  і
і unsigned short           і                AX                  і
і short                    і                AX                  і
і unsigned int             і                AX                  і
і int                      і                AX                  і
і unsigned long            і                DX:AX               і
і long                     і                DX:AX               і
і float                    і  регистр вершины стека сопроцессораі
і                          і  8087 (ST(0))                      і
і double                   і  регистр вершины стека сопроцессораі
і                          і  8087 (ST(0))                      і
і long double              і  регистр вершины стека сопроцессораі
і                          і  8087 (ST(0))                      і
і near*                    і                AX                  і
і far*                     і                DX:AX               і
АДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     В общем случае 8- и 16-битовые значения возвращаются  в  ре-
гистре  AX,  а 32-битовые значения - в AX:DX (при этом старшие 16
бит значения находятся в регистре DX).  Значения с плавающей точ-
кой возвращаются в регистре ST(0), который представляет собой ре-
гистр вершины стека сопроцессора 8087 или  эмулятора сопроцессора
8087, если используется эмулятор операций с плавающей точкой.

     Со структурами дело обстоит  несколько  сложнее.  Структуры,
имеющие длину 1 или 2 байта, возвращаются в регистре AX, а струк-
туры длиной 4 байта - в регистрах AX:DX. Трехбайтовые структуры и
структуры,  превышающие 4 байта должны храниться в области стати-
ческих данных, при этом должен возвращаться указатель на эти ста-
тические данные. Как и все указатели, указатели на структуры, ко-
торые  имеют  ближний тип (NEAR),  возвращаются в регистре AX,  а
указатели дальнего типа - в паре регистров AX:DX.

     Давайте рассмотрим вызываемую  из  программы  на  языке  С++
функцию на Ассемблере с малой моделью памяти FindLastChar,  кото-
рая возвращает указатель на последний символ передаваемой строки.
На языке С++ прототип этой функции выглядел бы следующим образом:

     extern char * FindLastChar(char * StringToScan);

где StringToScan - это непустая строка, для которой должен  возв-
ращаться указатель на последний символ.

     Функция FindLastChar имеет следующий вид:

                  .MODEL  SMALL
                  .CODE
                  PUBLIC _FindLastChar
_FindLastChar            PROC
                  push  bp
                  mov   bp,sp
                  cld             ; в строковой инструкции нужно
                                  ; выполнять отсчет в прямом
                                  ; направлении
                  mov   ax,ds
                  mov   es,ax     ; теперь ES указывает на
                                  ; ближний сегмент данных
                  mov   di,       ; теперь ES:DI указывает на
                                  ; начало передаваемой строки
                  mov   al,0      ; найти нулевой символ,
                                  ; завершающий строку
                  mov   cx,0ffffh ; работать в пределах
                                  ; 64К-1 байт
                  repne scasb     ; найти нулевой символ
                  dec   di        ; установить указатель
                                  ; обратно на 0
                  dec   di        ; ссылка обратно на
                                  ; последний символ
                  mov   ax,dx     ; возвратить в AX указатель
                                  ; ближнего типа
                  pop   bp
                  ret
_FindLastChar     ENDP
                  END

     Конечный результат, указатель на передаваемую строку,  возв-
ращается в регистре AX.

        Вызов функции Турбо Ассемблера из Borland C++
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Теперь мы рассмотрим пример программы на Borland C++,  вызы-
вающей  функцию  Турбо  Ассемблера.   Модуль   Турбо   Ассемблера
COUNT.ASM содержит функцию LineCount, которая возвращает значение
счетчика числа строк и символов в передаваемой строке:

; Вызываемая из С++ функция на Ассемблере с малой моделью памяти
; для подсчета числа строк и символов в завершающейся нулем
; "строке".
;
; Прототип функции:
;      extern unsigned int LineCount(char * near StringToCount,
;             unsigned int near * CharacterCountPtr);
;
; Ввод:
;      char near * StringToCount: указатель на "строку", в
;      которой нужно выполнить подсчет строк.
;
;      unsigned int near * CharacterCountPtr: указатель на
;      целую переменную, в которую нужно записать значение
;      счетчика
NEWLINE      EQU   0ah        ; символ перевода строки в Си
             .MODEL  SMALL
             .CODE
             PUBLIC  _LineCount
__LineCount   PROC
             push  bp
             mov   bp,sp
             push  si         ; сохранить регистровую
                              ; переменную вызывающей
                              ; программы
             mov   si,[bp+4]  ; SI указывает на строку
             sub   cx,cx      ; установить значение
                              ; счетчика символов в 0
             mov   dx,cx      ; установить в 0 счетчик
                              ; строк
LineCountLoop:
             lodsb            ; получить следующий символ
             and   al,al      ; это 0? конец строки?
             jz    EndLineCount ; да, выполнено
             inc   cx         ; нет, подсчитать следующий
                              ; символ
             cmp   al,NEWLINE ; это новая строка?
             jnz   LineCountLoop ; нет, проверить
                              ; следующий символ
             inc   dx         ; да, подсчитать еще одну
                              ; строку
             jmp   LineCountLoop
EndLineCount:
             inc   dx         ; подсчитать строку, которая
                              ; завершается нулевым символом
             mov   [bx],cx    ; задать значение переменной-
                              ; счетчика
             mov   ax,dx      ; возвратить счетчик строк в
                              ; качестве значения счетчика
             pop   si         ; восстановить регистровую
                              ; переменную вызывающей
                              ; программы
             pop   bp
             ret
_LineCount         ENDP
             END

     Следующий модуль на языке С++ с именем CALLCT.CPP  представ-
ляет собой пример вызова функции LineCount:

     char * TestString="Line 1\nline 2\nline 3";
     extern "C" {
            unsigned int LineCount(char * StringToCount,
            unsigned int near * CharacterCountPtr); }
     main()
     {
        unsigned int LCount;
        unsigned int CCount;

        Lcount = LineCount(TestString, &CCount);
        printf("Lines: %d\nCharacters: %d\n", LCount, CCount);
     }

     Два модуля компилируются и компонуются вместе с помощью  ко-
мандной строки:

        bcc -ms callct.cpp count.asm

     Как здесь показано, функция LineCount будет работать  только
при компоновке с программами на языке С++, в которых используется
малая модель памяти,  так как в других моделях размеры указателей
и адресов в  стеке  изменятся.  Приведем  пример  версии  функции
LineCount (COUNTLG.ASM),  которая будет работать с программами на
С++, использующим большую модель памяти (но не малую модель: пос-
кольку передаются дальние указатель, функция LineCount также опи-
сана, как функция дальнего типа):

; Вызываемая из С++ функция на Ассемблере для подсчета числа
; строк и символов в завершающейся нулем "строке".
;
; Прототип функции:
;      extern unsigned int LineCount(char * far StringToCount,
;             unsigned int far * CharacterCountPtr);
;
; Ввод:
;      char far * StringToCount: указатель на "строку", в
;      которой нужно выполнить подсчет строк.
;
;      unsigned int far * CharacterCountPtr: указатель на
;      целочисленную переменную, в которую нужно записать
;      значение счетчика
NEWLINE      EQU   0ah        ; символ перевода строки в Си
             .MODEL  LARGE
             .CODE
             PUBLIC  _LinaCount
_LineCount   PROC
             push  bp
             mov   bp,sp
             push  si         ; сохранить регистровую
                              ; переменную вызывающей
                              ; программы
             push  ds         ; сохранить стандартный
                              ; сегмент данных
             lds   si,[bp+6]  ; DS:SI указывает на строку
             sub   cx,cx      ; установить значение
                              ; счетчика символов в 0
             mov   dx,cx      ; установить в 0 счетчик
                              ; строк
LineCountLoop:
             lodsb            ; получить следующий символ
             and   al,al      ; это 0? конец строки?
             jz    EndLineCount ; да, выполнено
             inc   cx         ; нет, подсчитать следующий
                              ; символ
             cmp   al,NEWLINE ; это новая строка?
             jnz   LineCountLoop ; нет, проверить
                              ; следующий символ
             inc   dx         ; да, подсчитать еще одну
                              ; строку
             jmp   LineCountLoop
EndLineCount:
             inc   dx         ; подсчитать строку, которая
                              ; завершается нулевым символом
             les   bx,[bp+10] ; ES:BX указывает на ячейку,
                              ; в которой возвращается
                              ; значение счетчика
             mov   es:[bx],cx ; задать значение переменной-
                              ; счетчика
             mov   ax,dx      ; возвратить счетчик строк в
                              ; качестве значения счетчика
             pop   ds         ; восстановить стандартный
                              ; сегмент данных Си
             pop   si         ; восстановить регистровую
                              ; переменную вызывающей
                              ; программы
             pop   bp
             ret
_LineCount         ENDP
             END

     Программу COUNTLG.ASM можно скомпоновать с CALLCT.CPP с  по-
мощью следующей командной строки:

     bcc -ml callct.cpp countlg.asm

     Написание на языке Ассемблера функций-элементов С++
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Хотя можно написать функцию-элемент класса  С++  целиком  на
языке  Ассемблера,  это  далеко  не просто.  Например,  все функ-
ции-элементы классов С++  имеют "откорректированные" имена,   что
обеспечивает безопасную по согласованности типов компоновку функ-
ций и делает возможным переопределение функций, а ваша ассемблер-
ная  функция  должна знать в точности,  какое имя С++ ожидает для
данной функции-элемента.  Для доступа к  переменным-элементам  вы
должны подготовить в ассемблерном коде определение STRUC, опреде-
ляющее все переменные-элементы с точно совпадающими  размерами  и
расположением.  Если ваш класс является производным, то могут су-
ществовать и другие переменные-элементы,  производные от базового
класса. Даже если класс не является производным (порожденным), то
расположение  переменных-элементов  в памяти изменяется в случае,
если класс этот включает в себя какие-либо виртуальные функции.

     Если вы пишете функцию на встроенном Ассемблере, Borland С++
может взять на себя эти вопросы. Однако если вы работаете на язы-
ке  Ассемблера  отдельно  (например,  переделываете уже имеющийся
код),  то существуют некоторые методы,  позволяющие упростить эту
работу.

     Создайте определение  фиктивной функции С++ для ассемблерной
функции.  Это определение удовлетворит компоновщик, так как будет
содержать откорректированное имя функции-элемента.  Эта фиктивная
функция будет вызывать ассемблерную функцию и передавать ей пере-
менные-элементы и прочие параметры.  Так как ассемблерный код бу-
дет иметь все нужные ему параметры посредством аргументов, вы мо-
жете  не  заботиться  об  изменениях  в определении класса.  Ваша
ассемблерная функция может быть описана в  коде  С++  как  extern
"C", что показано в примерах. Например (countadd.cpp):

class count_add {
     // Частные переменные-элементы (private)
     int access_count;   // число обращений
     int count;          // текущий счетчик
   public:
        count_add(void) { access_count=0;
                         count=0;
                      }
        int  get_count (void) {return Count;}

        // Две функции, которые будут фактически написаны на
        // Ассемблере:

        void increment(void);
        void add(int what_to_add=-1);
         // Отметим, что умолчание влияет только
         // на вызовы add; оно не влияет на код add
     }

     extern "C" {
       // Для создания уникальных и осмысленных имен
       // ассемблерных подпрограмм прибавим имя класса к
       // имени ассемблерной подпрограммы. В отличие от прочих
       // ассемблеров, Турбо Ассемблер не имеет проблем с
       // длиной имен.
       void count_add_increment(int *count); // Мы передадим
                                          // указатель на
                                          // переменную count.
                                          // Ассемблер выполнит
                                          // увеличение.
       void count_add_add(int *count,int what_to_add);
     }

     void count_add::increment(void)
     {
       count_add_increment(&count);
     }

     void count_add(int what_to_add)
     {
       count_add(&count, int what_to_add);
     }

     Ваш ассемблерный модуль, определяющий подпрограммы count_add
_increment и count_add_add, должен иметь вид (COUNTADD.ASM):

     .MODEL small   ; выбор модели small (ближние код и данные)
     .CODE
     PUBLIC _count_add_increment
_count_add_increment  PROC
     ARG count_offset:word   ; Адрес переменной-элемента
     push bp                 ; Сохранение записи активации
                             ; вызывающей программы
     mov  bp,sp              ; Установка собственной записи
                             ; активации
     mov  bx,[count_offset]  ; Загрузка указателя
     inc  word ptr [bx]      ; Увеличение переменной-элемента
     pop  bp                 ; Восстановление записи активации
                             ; вызывающей программы
_count_add_increment  ENDP

     PUBLIC _count_add_add
_count_add_add  PROC
     ARG count_offset:word,what_to_add:word
     push bp
     mov  bp,sp
     mov  bx,[count_offset]   ; Загрузка указателя
     mov  ax,[what_to_add]
     add  [bx],ax
     pop  bp
     ret
_count_add_add  ENDP

     end

     Используя данный метод, вы можете не беспокоиться об измене-
ниях  в определении класса.  Даже если вы добавляете или удаляете
переменные-элементы, делаете этот класс производным или добавляе-
те  виртуальные  функции,  вам не требуется изменять ассемблерный
модуль. Переассемблировать модуль нужно только в случае изменения
структуры переменной-элемента count,  либо если вы ходите сделать
версию данного класса для модели памяти large.  Переассемблирова-
ние в этих случаях необходимо, поскольку при обращении к перемен-
ной-элементу count вы имеете дело с сегментом и смещением.

       Соглашения по вызовам, использующиеся в Паскале
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Итак, теперь вы уже знаете,  как обычно в С++ передаются па-
раметры функциям:  вызывающая программа заносит параметры (справа
налево) в стек,  вызывает функцию, и извлекает параметры из стека
(отбрасывает  их) после вызова.  Borland C++ может также работать
по соглашениям, принятым в Паскале. Согласно этим соглашениям па-
раметры  передаются  слева  направо,  а отбрасывает параметры (из
стека) вызываемая программа.  Разрешить использование  соглашений
Паскаля  в Borland C++ можно с помощью параметра командной строки
-p или ключевого слова pascal.

           Примечание: Более подробно соглашения о связях Паскаля
      рассматриваются в Главе 19.

     Приведем пример функции на Ассемблере, в которой используют-
ся соглашения Паскаля:

;
; Вызывается, как: TEST(i, j ,k)
;
i       equ      8               ; левый параметр
j       equ      6
k       equ      4               ; правый параметр
;
                 .MODEL   SMALL
                 .CODE
                 PUBLIC   TEST
TEST             PROC
                 push  bp
                 mov   bp,sp
                 mov   ax,[bp+i] ; получить i
                 add   ax,[bp+j] ; прибавить к i j
                 sub   ax,[bp+k] ; вычесть из суммы k
                 pop   bp
                 ret   6         ; возврат, отбросить
                                 ; 6 байт параметров
                                 ; (очистка стека)
TEST             ENDP
                 END

     Заметим, что для очистки стека  от  передаваемых  параметров
используется инструкция RET 6.

     На Рис.  18.5 показано состояние стека после выполнения инс-
трукции MOV BP,SP:

                      .                       .
                      .                       .
                      .                       .
                      і                       і
                      ГДДДДДДДДДДДДДДДДДДДДДДДґ
             SP ДД   і BP вызывающей прогр.  і  ДД BP
                      ГДДДДДДДДДДДДДДДДДДДДДДДґ
             SP + 2   і    Адрес возврата     і  BP + 2
                      ГДДДДДДДДДДДДДДДДДДДДДДДґ
             SP + 4   і          k            і  BP + 4
                      ГДДДДДДДДДДДДДДДДДДДДДДДґ
             SP + 6   і          j            і  BP + 6
                      ГДДДДДДДДДДДДДДДДДДДДДДДґ
             SP + 8   і          i            і  BP + 8
                      ГДДДДДДДДДДДДДДДДДДДДДДДґ
                      і                       і
                      ГДДДДДДДДДДДДДДДДДДДДДДДґ
                      і                       і
                      .                       .
                      .                       .
                      .                       .

     Рис. 18.5 Состояние стека после инструкции MOV BP,SP

     Соглашения по вызовам Паскаля требуют также, чтобы все внеш-
ние и общедоступные идентификаторы указывались в верхнем регистре
и без предшествующих подчеркиваний. Зачем может потребоваться ис-
пользовать в программе на  С++  соглашения  по  вызовам  Паскаля?
Программа,  использующая соглашения Паскаля, занимает обычно нес-
колько меньше места в памяти  и  работает  быстрее,  чем  обычная
программа  на языке С++,  так как для очистки стека от параметров
не требуется выполнять n инструкций ADD SP.

            Вызов Borland C++ из Турбо Ассемблера
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Хотя больше  принято  для выполнения специальных задач вызы-
вать из С++ функции,  написанные на Ассемблере,  иногда вам может
потребоваться вызывать из Ассемблера функции, написанные на языке
С++. Оказывается, на самом деле легче вызвать функцию Borland C++
из функции Турбо Ассемблера,  чем наоборот,  поскольку со стороны
Ассемблера не требуется отслеживать границы стека.  Давайте расс-
мотрим  кратко требования для вызова функций Borland C++ из Турбо
Ассемблера.

             Компоновка с кодом инициализации С++
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Хорошим правилом является вызов библиотечных функций Borland
C++ только из Ассемблера в программах,  которые компонуются с мо-
дулем инициализации  С++ (используя его в качестве первого компо-
нуемого модуля).  Этот "надежный" класс включает в себя все прог-
раммы,  которые компонуются с помощью командной строки TC.EXE или
TCC.EXE, и программы, в качестве первого компонуемого файла кото-
рых используется файл C0T, C0S, C0C, C0M, C0L или C0H.

     В общем  случае вам не следует вызывать библиотечные функции
Borland C++ из программ, которые не компонуются с модулем инициа-
лизации  Borland  C++,  так  как  некоторые  библиотечные функции
Borland C++ не будут правильно работать, если не выполнялась ком-
поновка с кодом инициализации. Если вы действительно хотите вызы-
вать библиотечные функции Borland C++ из таких программ, мы пред-
лагаем вам взглянуть на код инициализации (файл C0.ASM на дистри-
бутивных дисках Borland C++) и приобрести у фирмы Borland  исход-
ный  код  библиотеки языка С++,  после чего вы сможете обеспечить
правильную инициализацию для нужных библиотечных функций.

      Вызов определяемых  пользователем  функций  С++,  которые в
свою очередь вызывают библиотечные функции языка С++,  попадают в
ту же категорию,  что и непосредственный вызов библиотечных функ-
ций С++.  Отсутствие кода инициализации С++ может вызывать ошибки
в любой программе Ассемблера,  которая прямо или косвенно обраща-
ется к библиотечным функциям С++.

                      Задание сегмента
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Как мы уже говорили ранее,  необходимо  обеспечивать,  чтобы
Borland  C++  и  Турбо Ассемблер использовали одну и ту же модель
памяти,  и чтобы сегменты, которые вы используете в Турбо Ассемб-
лере,  совпадали  с  теми сегментами,  которые использует Borland
C++. В Турбо Ассемблере имеется модель памяти tchuge,которая под-
держивает модель huge Borland C++. Перечень моделей памяти и сег-
ментов можно найти в предыдущем разделе.  Нужно не забывать также
помещать  директиву  EXTRN  для  внешних идентификаторов вне всех
сегментов или внутри правильного сегмента.

                      Выполнение вызова
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Все, что  требуется от вас для передачи параметров в функцию
C++,  это занесение в стек самого правого параметра первым, затем
следующего по порядку параметра и так далее, пока в стеке не ока-
жется самый левый параметр.  После  этого  нужно  просто  вызвать
функцию. Например, при программировании на Borland C++ для вызова
библиотечной функции Borland C++ strcpy  для  копирования  строки
SourceString в строку DestString можно ввести:

     strcpy(DestString, SourceString);

     Для выполнения того же вызова на Ассемблере нужно  использо-
вать инструкции:

     lea   ax,SourceString            ; правый параметр
     push  ax
     lea   ax,DestString              ; левый параметр
     push  ax
     call  _strcpy                    ; скопировать строку
     add   sp,4                       ; отбросить параметры

     При настройке SP после вызова не забывайте очищать  стек  от
параметров.

     Можно упростить ваш код и сделать его независимым  от языка,
воспользовавшись расширением команды Турбо Ассемблера CALL:

     call назначение [язык [,аргумент_1] ...]

где "язык"   -   это   C,  PASCAL,  BASIC,  FORTRAN,  PROLOG  или
NOLANGUAGE, а "аргумент_n" это любой допустимый аргумент програм-
мы, который может быть прямо помещен в стек процессора.

     Используя данное средство, можно записать:

     lea   ax,SourceString
     lea   bx,DestString
     call  strcpy c,bx,ax

     Турбо Ассемблер  автоматически вставит команды помещения ар-
гументов в стек в последовательности, принятой в С++ (сначала AX,
затем BX),  выполнит  вызов _strcopy (перед именами С++ Турбо Ас-
семблер автоматически вставляет символ подчеркивания),  и очищает
стек после вызова.

     Если вы вызываете функцию С++, которая использует соглашения
Паскаля,  заносите в стек параметры слева направо.  После  вызова
настраивать указатель стека SP не требуется.

     lea   ax,DestString              ; левый параметр
     push  ax
     lea   ax,SourceString            ; правый параметр
     push  ax
     call  CTRCPY                     ; скопировать строку

     Можно опять упростить ваш код,  воспользовавшись расширением
команды Турбо Ассемблера CALL:

     lea   bx,DestString              ; самый левый параметр
     lea   ax,SourceString            ; самый правый параметр
     call  strcpy pascal,bx,ax

     Турбо Ассемблер автоматически вставит команды помещения  ар-
гументов в стек в последовательности, принятой в Паскале (сначала
BX, затем AX), и выполнит вызов STRCPY (преобразуя имя к верхнему
регистру, как принято в соглашениях Паскаля).

     В последнем случае конечно подразумевается, что вы  переком-
пилировали  функцию strcpy с параметром -p, так как в стандартной
библиотечной версии данной функции используются соглашения по вы-
зову, принятые в С++, а не в Паскале.

     Функции С++  сохраняют следующие регистры (и только их): SI,
DI,  BP, DS, SS, SP и CS. Регистры AX, BX, CX, DX, ES и флаги мо-
гут произвольно изменяться.

        Вызов из Турбо Ассемблера функции Borland C++
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Одним из случаев,  когда вам может потребоваться вызвать  из
Турбо Ассемблера функцию Borland C++,  является необходимость вы-
полнения сложных вычислений,  поскольку вычисления гораздо  проще
выполнять  на  С++,  чем на Ассемблера.  Особенно это относится к
случаю смешанных вычислений, где используются и значения с плава-
ющей точкой и целые числа.  Лучше возложить функции по выполнению
преобразования типов и реализации арифметики с  плавающей  точкой
на С++.

     Давайте рассмотрим  пример программы на Ассемблере,  которая
вызывает функцию Borland C++, чтобы выполнить вычисления с плава-
ющей точкой.  Фактически в данном примере функция Borland C++ пе-
редает последовательность целых чисел другой  функции  Турбо  Ас-
семблера,  которая  суммирует  числа  и  в  свою очередь вызывает
другую функцию Borland C++ для выполнения вычислений  с плавающей
точкой (вычисление среднего значения).

     Часть программы   CALCAVG.CPP,    реализованная    на    С++
(CALCAVG.CPP), выглядит следующим образом:

     #include 
     extern float Average(int far * ValuePtr, int
                                          NumberOfValues);
     #define NUMBER_OF_TEST_VALUES 10
     int TestValues(NUMBER_OF_TEST_VALUES) = {
         1, 2, 3, 4, 5, 6, 7, 8, 9, 10
     };

     main()
     {
            printf("Среднее арифметическое равно: %f\n",
                   Average(TestValues, NUMBER_OF_TEST_VALUES));
     }
     float IntDivide(int Divedent, int Divisor)
     }
           return( (float) Divident / (float) Divisor );
     }

а часть программы на Ассемблере (AVERAGE.ASM) имеет вид:

     ;
     ; Вызываемая из С++ функция с малой моделью памяти,
     ; которая возвращает среднее арифметическое последова-
     ; тельности целых чисел. Для выполнения завершающего
     ; деления вызывает функцию С++ IntDivide().
     ;
     ; Прототип функции:
     ;          extern float Average(int far * ValuePtr,
     ;                 int NumberOfValues);
     ;
     ; Ввод:
     ;          int far * ValuePtr:      ; массив значений для
     ;                                   ; вычисления среднего
     ;          int NumberOfValues:      ; число значений для
     ;                                   ; вычисления среднего
                    .MODEL   SMALL
                    EXTRN    _IntDivide:PROC
                    .CODE
                    PUBLIC   _Average
     _Average       PROC
                    push  bp
                    mov   bp,sp
                    les   bx,[bp+4]       ; ES:BX указывает на
                                          ; массив значений
                    mov   cx,[bp+8]       ; число значений, для
                                          ; которых нужно
                                          ; вычислить среднее
                    mov   ax,0
     AverageLoop:
                    add   ax,es:[bx]      ; прибавить текущее
                                          ; значение
                    add   ax,2            ; ссылка на следующее
                                          ; значение
                    loop  AverageLoop
                    push  WORD PTR [bp+8] ; получить снова число
                                          ; значений, переданных
                                          ; в функцию IntDivide
                                          ; в правом параметре
                    push  ax              ; передать сумму в
                                          ; левом параметре
                    call  _IntDivide      ; вычислить среднее
                                          ; значение с плавающей
                                          ; точкой
                    add   sp,4            ; отбросить параметры
                    pop   bp
                    ret                   ; среднее значение в
                                          ; регистре вершины
                                          ; стека сопроцессора
                                          ; 8087
     _Average       ENDP
                    END

     Основная функция (main) на языке С++ передает  указатель  на
массив  целых  чисел  TestValues и длину массива в функцию на Ас-
семблере Average.  Эта функция вычисляет сумму целых чисел, а за-
тем  передает эту сумму и число значений в функцию С++ IntDivide.
Функция IntDivide приводит сумму и число значений к типу с плава-
ющей точкой и вычисляет среднее значение (делая это с помощью од-
ной строки на С++,  в то время как на Ассемблере для этого потре-
бовалось бы несколько строк).  Функция IntDivide возвращает сред-
нее значение (Average) в регистре вершины стека сопроцессора 8087
и передает управление обратно основной функции.

     Программы CALCAVG.CPP  и  AVERAGE.ASM можно скомпилировать и
скомпоновать в выполняемую программу CALCAVG.EXE с помощью коман-
ды:

     bcc calcavg.cpp average.asm

     Отметим, что функция Average будет работать как с малой, так
и  с большой моделью данных без необходимости изменения ее исход-
ного кода, так как во всех моделях передается указатель  дальнего
типа. Для поддержки больших моделей кода (сверхбольшой, большой и
средней) пришлось бы только  изменить  соответствующую  директиву
.MODEL.

     Пользуясь преимуществами расширений,  обеспечивающих незави-
симость Турбо Ассемблера от языка, ассемблерный код из предыдуще-
го примера можно записать более сжато (CONSISE.ASM):

        .MODEL  small,C
        EXTRN   C IntDivide:PROC
        .CODE
        PUBLIC  C Average
Average        PROC C ValuePtr:DWORD, NumberOfValues:WORD
        les     bx,ValuePtr
        mov     cx,NumberOfValues
        mov     ax,0
AverageLoop:
        add     ax,es:[bx]
        add     bx,2        ;установить указатель
                            ;на следующее значение
        loop    AverageLoop
        call    _IntDivide C,ax,NumberOfValues
        ret
Average        ENDP
        END

   Глава 19. Интерфейс Турбо Ассемблера с Турбо Паскалем
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В  Турбо  Ассемблере  предусмотрены  расширенные  и   мощные
средства,  позволяющие  вам добавлять код Ассемблера к программам
Турбо Паскаля. В данной главе мы подробно расскажем  вам  о  том,
что  нужно  знать,  чтобы полностью использовать данные средства,
приведем множество примеров и дадим некоторую более глубокую  ин-
формацию.

      Большинство программ,  которые вы захотите написать,  можно
реализовать целиком на Турбо Паскале.  В отличие  от  большинства
других  компиляторов  Паскаля,  Турбо Паскаль позволяет вам с по-
мощью массивов Port[], Mem[], MemW[] и MemL[] непосредственно об-
ращаться   ко  всем  ресурсам  компьютера,  а с помощью  процедур
Intr() и MsDos() вы можете обращаться к базовой системе ввода-вы-
вода (BIOS) и операционной системе.

     Для чего же тогда может потребоваться использовать совместно
с  Турбо  Паскалем  Ассемблер? Для этого существуют две вероятные
причины: выполнение некоторого небольшого числа операций, которые
непосредственно в Турбо Паскале недоступны, и использование преи-
муществ высокой скорости работы,  которые  дает  Ассемблер.  (Сам
Турбо  Паскаль  работает достаточно быстро, потому что он написан
на языке Ассемблера.) В данной главе мы покажем  вам,  как  можно
использовать в Турбо Паскале преимущества Ассемблера.

      Совместное с Турбо Паскалем использование данных
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Далее следует содержимое главы.

       Директива компилятора $L и внешние подпрограммы
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Два ключевых момента при использовании  Турбо  Ассемблера  с
Турбо Паскалем - это директива компилятора (Турбо Паскаля) {$L} и
описание   внешней   (external)   подпрограммы.   Директива   {$L
MYFILE.OBJ}  приводит к тому, что Турбо Паскаль будет искать файл
объектный MYFILE.OBJ (файл в стандартном пригодном для компоновки
формате MS-DOS) и компоновать его с вашей программой Турбо Паска-
ля.  Если у файла в директиве {$L} расширение не указывается,  то
подразумевается расширение .OBJ.

     Каждая процедура или функция Турбо  Ассемблера,  которую  вы
хотите сделать доступной в программе Турбо Паскаля, должна объяв-
ляться, как идентификатор PUBLIC, и ей должно  соответствовать  в
программе описание external (внешняя). Синтаксис описания внешней
процедуры или функции в  Турбо  Паскале  аналогичен  опережающему
(forward) описанию:

     procedure AsmProc(a : integer; b : real); external;

     function AsmFunc(c : word; d : byte); external;

     Эти описания должны соответствовать  следующим  описаниям  в
программе Турбо Ассемблера:

     CODE        SEGMENT BYTE PUBLIC
     AsmProc     PROC NEAR
                 PUBLIC AsmProc
                 .
                 .
                 .
     AsmProc     ENDP
     AsmFunc     PROC FAR
                 PUBLIC Bar
                 .
                 .
                 .
     AsmFunc     ENDP
     CODE        ENDS

     Описание внешней (external) процедуры Турбо  Паскаля  должно
находиться на самом внешнем уровне программы или модуля,  то есть
оно не должно быть вложенным по отношению к другому описанию про-
цедуры или функции.  Попытка описать процедуру или функцию на лю-
бом другом уровне приведет к ошибке этапа компиляции.

     Турбо Паскаль не делает проверку, чтобы убедиться,  что  все
процедуры,  описанные  с  атрибутами  NEAR или FAR, соответствуют
ближним или дальним подпрограммам в программе Турбо Паскаля. Фак-
тически,  он  даже  не  проверяет,  являются  ли  метки AsmProc и
AsmFunc именами процедур. Поэтому  вы  должны  обеспечить,  чтобы
описания в Ассемблере и Паскале были правильными.

                      Директива PUBLIC
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В Турбо Паскале доступны только те метки Ассемблера, которые
объявлены   в  модуле  на  языке  Ассемблера,  как  общедоступные
(PUBLIC). Метки представляют собой единственные объекты,  которые
могут  передаваться  из  языка  Ассемблера в Турбо Паскаль. Более
того, каждой общедоступной метке должно  соответствовать описание
процедуры или функции в программе Турбо Паскаля, иначе компилятор
выдаст сообщение об ошибке. Причем не требуется,  чтобы  общедос-
тупная метка была частью описания PROC. Что касается Турбо Паска-
ля, то для него описания:

     AsmLabel     PROC  FAR
                  PUBLIC Bar
и

     AsmLabel:
                  PUBLIC Bar

эквивалентны.

     Вы можете определять такие идентификаторы как  PUBLIC только
в сегменте CODE. Турбо Паскаль не разрешает определения идентифи-
каторов PUBLIC в сегменте данных,  поэтому создаваемые  вами  ас-
семблерные  модули  для  компоновки с программой на Турбо Паскале
также не должны иметь в сегменте данных.

                       Директива EXTRN
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Модуль Турбо Ассемблера может обращаться к любой  процедуре,
функции, переменной или типизованной константе Турбо Паскаля, ко-
торая описывается на самом внешнем уровне программы или модуля, с
которым  она компонуется. (Заметим, что это включает в себя пере-
менные, описанные после директивы компилятора {$L} и внешние опи-
сания,  связанные  с  данным  модулем.) Метки и обычные константы
Турбо Паскаля языку Ассемблера недоступны.

           Примечание: Эти включает в себя  переменные, указанные
      после  директивы компилятора $L и описаниях external,  свя-
      занных с данным модулем.

     Предположим, в вашем  программе  Турбо  Паскаля  описываются
следующие глобальные переменные:

      var
          a : byte;
          b : word;
          c : shortint;
          d : integer;
          e : real;
          f : single;
          g : double;
          h : extended;
          i : comp;
          j : pointer;

     В программе на языке Ассемблера вы можете получить доступ ко
всем этим переменным с помощью описаний EXTRN:

     EXTRN A : BYTE        ; 1 байт
     EXTRN B : WORD        ; 2 байта
     EXTRN C : BYTE        ; в Ассемблере значения со знаком и
                           ; без знака интерпретируются одинаково
     EXTRN D : WORD        ; то же самое
     EXTRN E : FWORD       ; 6-байтовое действительное значение
                           ; (обрабатывается программно)
     EXTRN F : DWORD       ; 4-байтовое значение с плавающей
                           ; точкой в формате IEEE
     EXTRN G : QWORD       ; 8-байтовое значение с плавающей
                           ; точкой (двойной точности) в
                           ; формате IEEE
     EXTRN H : TBYTE       ; 10-байтовое значение с плавающей
                           ; точкой во временном формате
     EXTRN I : QWORD       ; 8-байтовое целое со знаком в
                           ; формате IEEE (сопроцессор 8087)
     EXTRN J : DWORD       ; указатель Турбо Паскаля

     Аналогичным образом можно получить  доступ  к  процедурам  и
функциям  Турбо Паскаля, включая библиотечные. Предположим, у вас
имеется модуль Турбо Паскаля, который выглядит следующим образом:

     unit Sample;
     { Пример модуля, в котором определяется нескольку процедур
       Паскаля, вызываемых из процедуры на языке Ассемблера }

     interface

     procedure TestSample;

     procedure PublicProc;  { для обращения извне должна
                              быть дальнего типа }
     inplementation

     var
       A : word;

     procedure AsmProc; external;
     {$L ASMPROC.OBJ}

     procedure PublicProc;
        begin { PublicProc }
          Writeln('В PublicProc');
        end   { PublicProc }

     procedure NearProc;   { должна быть ближнего типа }
        begin { NearProc }
          Writeln('B NearProc');
        end;  { NearProc }

     {$F+}
     procedure FarProc     { должна иметь дальний тип согласно
                             директиве компилятора }
        begin { FarProc }
          Writeln('B FarProc');
        end   { FarProc }

     {$F-}

     procedure TestSample;
       begin { TestSample }
         Writeln('B TestSample');
         A := 10;
         Writeln('Значение A перед ASMPROC = ',A);
         AsmProc;
         Writeln('Значение A после ASMPROC = ',A);
       end   { TestSample };

     end.

     Процедура AsmProc вызывает  процедуры  PublicProc,  NearProc
или FarProc, используя директиву EXTRN следующим образом:

  DATA   SEGMENT WORD PUBLIC
         ASSUME  DS:DATA
         EXTRN   A:WORD                ; переменная из модуля
  DATA   ENDS

  CODE   SEGMENT BYTE PUBLIC
         ASSUME  CS:CODE
         EXTRN   PublicProc : FAR      ; дальняя процедура
                                       ; (экспортируется модулем)
         EXTRN   NearProc   : NEAR     ; ближняя процедура
                                       ; (локальная для модуля)
         EXTRN   FarProc    : FAR      ; дальняя процедура
                                       ; (локальна, но задана,
                                       ; как дальняя)
  AsmProc        PROC NEAR
                 PUBLIC AsmProc
                 CALL   FAR PTR PublicProc
                 CALL   NearProc
                 CALL   FAR PTR FarProc
                 mov    cx,ds:A        ; взять переменную из
                                       ; модуля
                 sub    cx,2           ; изменить ее
                 mov    ds:A,cx        ; записать ее обратно
                 RET
  AsmProc        ENDP
  CODE           ENDS
                 END

     Основная программа, которая проверяет эту программу  на  Ас-
семблере и модуль Паскаля, выглядит следующим образом:

      program TSample;
      uses Sample;
      begin
          TestSample;
      end.

     Чтобы сформировать пример программы с  помощью  компилятора,
работающего  в режиме командной строки, и Ассемблера, используйте
следующие команды (или командный файл):

     TASM ASMPROC
     TPC /B SAMPLE
     TSAMPLE

     Так как внешняя подпрограмма должна объявляться в  программе
Турбо  Паскаля на самом внешнем уровне процедур, вы не можете для
доступа к объектам, являющимся локальными по отношению к процеду-
рам  или функциям использовать описания EXTRN. Однако, ваша прог-
рамма на  Турбо  Ассемблере при вызове из программы Турбо Паскаля
может получить эти объекты, как значения параметров-переменных.

      Ограничения при использовании объектов типа EXTRN
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Синтаксис уточненного идентификатора Турбо Паскаля,  при ко-
тором  для  доступа  к объекту в заданном модуле используется имя
модуля и точка, несовместим с синтаксическими правилами Турбо Ас-
семблера и будет, таким образом, отвергнут. Описание:

        EXTRN SYSTEM.Assing : FAR

приведет к тому, что Турбо Ассемблер выдаст сообщение об ошибке.

     Имеется также два других ограничения на использование в Тур-
бо  Паскале  объектов  EXTRN.  Первое из них состоит в том, что в
ссылках на процедуру или функцию не могут  выполняться  арифмети-
ческие операции с адресами. Таким образом, если вы объявите:

        EXTRN PublicProc : FAR

то не сможете записать оператор вида:

        call PublicProc + 42

     Второе ограничение относится к тому, что  компоновщик  Турбо
Паскаля  не  будет распознавать операции, которые разделяют слова
на байты, поэтому вы не можете применять такие операции к  объек-
там EXTRN. Например, если вы объявите:

        EXTRN i : WORD

то не сможете использовать в модуле  Турбо  Ассемблера  выражения
LOW i или HIGH i.

            Использование корректировок сегментов
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Турбо Паскаль генерирует файлы .EXE,  которые  могут  загру-
жаться  в  память компьютера РС по любому доступному адресу. Пос-
кольку в программе заранее неизвестно, куда будет загружен данный
сегмент  программы, компоновщик указывает загрузчику DOS.EXE, что
нужно при загрузке скорректировать в программе все ссылки на сег-
менты. После выполнения этих корректировок все ссылки на сегменты
(такие, как CODE или DATA) будут содержать корректные значения.

     Ваша программа на Турбо Ассемблере  может  использовать  это
средство  для  получения  адресов  объектов  во время выполнения.
Предположим, например, что в вашей программе  требуется  изменить
значение  регистра DS, но вы не хотите сохранять в цикле исходное
содержимое стека или перемещать эти  значения  во  временную  об-
ласть.  Вместо этого вы можете использовать операцию Турбо Ассем-
блера SEG:

     .
     .
     .
     mov   ax,SEG DATA          ; получить фактический
                                ; адрес глобального значения
                                ; DS Турбо Паскаля
     mov   ds,ax                ; поместить его в DS для
                                ; использования Турбо
                                ; Паскалем
     .
     .
     .

     Когда ваша программа будет загружаться, DOS поместит коррек-
тное значение SEG DATA прямо в поле промежуточного операнда инст-
рукции MOV. Это наиболее быстрый  путь  перезагрузки  сегментного
регистра.

     Данный метод нужно также использовать, чтобы программы  обс-
луживания  прерываний  сохраняли информацию в глобальном сегменте
данных Турбо Паскаля. Регистр DS не обязательно во время прерыва-
ния содержит значение DS Турбо Паскаля,  но для получения доступа
к переменным и типизованным константам Турбо  Паскаля  можно  ис-
пользовать указанную выше последовательность.

               Устранение неиспользуемого кода
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В Турбо Паскале имеются средства, обеспечивающие  устранение
неиспользуемого кода. Это означает, что в полученный в результате
файл .EXE не будет включаться код процедур и функций, который ни-
когда не выполняется. Но поскольку нет полной информации о содер-
жимом модулей Турбо Ассемблера, Турбо Паскаль может выполнять для
них только ограниченную оптимизацию.

     Турбо Паскаль будет устранять код модуля .OBJ в том и только
в  том случае, если к любой доступной процедуре или функции этого
модуля нет обращения. Если же на какую либо процедуру или функцию
имеется ссылка, то весь этот модуль используется.

     Чтобы добиться большей эффективности использования  средства
Турбо Паскаля по устранению неиспользуемого кода, неплохо было бы
разбить программу на Ассемблере на небольшие модули, которые  со-
держали  бы  только несколько процедур или функций. Это позволило
бы Турбо Паскалю, если он может это сделать, уменьшить объем  ва-
шей конечной программы.

       Соглашения Турбо Паскаля по передаче параметров
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Турбо Паскаль использует для передачи параметров  стек  цен-
трального  процессора (или, в случае передачи значений параметров
с одинарной, двойной, расширенной точностью  или  сложного  типа,
стек  арифметического сопроцессора). Параметры всегда вычисляются
и заносятся в стек в том порядке, в  котором  они  указываются  в
описании  подпрограммы,  слева направо. В данном разделе мы пояс-
ним, как эти параметры представляются.

                     Параметры-значения
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Параметр-значение - это параметр, значение которого не может
изменяться  подпрограммой,  в которую он передается. В отличие от
многих компиляторов, Турбо Паскаль не выполняет слепого копирова-
ния  в стек каждого параметра-значения: как мы далее поясним, ис-
пользуемый метод зависит от типа.

                       Скалярные типы
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Параметры-значения  всех  скалярных  типов  (boolean,  char,
shortint,  byte, integer, word, longint, отрезки типов и перечис-
лимые типы) передаются как значения через стек  процессора.  Если
размер объекта составляет 1 байт, он заносится в стек, как полное
16-битовое слово,  однако более значащий (старший) байт слова  не
содержит полезной информации. Если размер объекта равен двум бай-
там,  то он просто заносится в стек "как есть". Если объект имеет
размер  4  байта  (длинное целое),  он заносится в стек,  как два
16-битовых слова.  В соответствии со стандартом процессоров серии
8088  наиболее значащее (старшее) слово заносится в стек первым и
занимает в стеке старшие адреса.

                    Вещественные значения
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Параметры-значения вещественного типа (real) передаются, как
6 байт в стеке (в Турбо Паскале это тип представляет собой 6-бай-
товый программно-эмулируемый тип с плавающей точкой).  Это единс-
твенный тип,  превышающий 4 байта, который может передаваться че-
рез стек.

Типы Single, Double, Extended и Comp и типы сопроцессора 8087
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Турбо Паскаль  использует  те же соглашения о передаче пера-
метров для 8087,  что и семейство компиляторов Borland C++. Пара-
метры  передаются  через  главный  стек  центрального процессора,
вместе с остальными параметрами.

                          Указатели
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Значения параметров для всех типов указателей заносятся  не-
посредственно в стек, как указатели дальнего типа: сначала слово,
содержащее сегмент, затем другое слово, содержащее смещение. Сег-
мент занимает старший адрес,  в соответствии с соглашениями фирмы
Intel.  Для извлечения параметра-указателя в программе Турбо  Ас-
семблера можно использовать инструкции LDS или LES.

                           Строки
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Строковые параметры,  независимо от размера,  обычно никогда
не  заносятся  в стек.  Вместо этого Турбо Паскаль заносит в стек
указатель (дальнего типа) на строку.  Вызываемая подпрограмма  не
должна изменять строку,  на которую ссылается указатель. Если это
необходимо,  подпрограмма может создать и работать с копией стро-
ки.

     Единственное исключение из этого правила - это случай, когда
подпрограмма в перекрываемом (оверлейном) модуле A  передает  как
параметр-значение  строковую константу подпрограмме в перекрывае-
мом модуле B.  В этом контексте перекрываемый модуль означает лю-
бой модуль,  скомпилированный  с  директивой  {$O+}  (допускаются
оверлеи). В этом случае перед тем, как будет сделан вызов и адрес
стека  будет передан программе в модуле B,  в стеке для строковой
константы резервируется временная память.

                      Записи и массивы
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     Записи и массивы,  занимающие ровно 1, 2 или 4 байта, дубли-
руются непосредственно в стек и передаются,  как параметры-значе-
ния. Если массив или запись имеет какой-либо другой размер (вклю-
чая 3 байта),  то в стек заносится указатель на этот  массив  или
запись.  В  этом  случае,  если  подпрограмма  модифицирует такую
структуру, то она должна создать ее локальную копию.

                          Множества
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Множества, как и строки,  обычно никогда не заносятся непос-
редственно в стек.  Вместо этого в стек  заносится  указатель  на
множество.  Первый  бит младшего байта множества всегда соответс-
твует элементу базового типа (или порождающего типа) с порядковым
значением 0.

     Единственное исключение из этого правила - это случай, когда
подпрограмма в перекрываемом (оверлейном) модуле A  передает  как
параметр-значение константу-множество подпрограмме  в  оверлейном
модуле  B.  В  этом контексте перекрываемый модуль означает любой
модуль, компилированный с директивой {$O+} (допускаются оверлеи).
В этом случае перед тем, как будет сделан вызов и адрес стека бу-
дет передан программе в модуле B, в стеке для множества-константы
резервируется  временная память.

                    Параметры-переменные
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Все параметры-переменные  (var) передаются точно также:  как
указатель дальнего типа на их действительные адреса в памяти.

                      Обеспечение стека
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Турбо Паскаль  ожидает,  что  перед  возвратом управления из
подпрограммы все параметры в стеке центрального  процессора будут
удалены.

     Есть два способа настройки стека. Вы можете использовать ин-
струкцию RET N (где N - это число байт передаваемых,  то есть за-
несенных в стек, параметров), либо сохранить адрес возврата в ре-
гистрах  (или  в памяти) и извлечь параметры из стека поочередно.
Такую технику извлечения полезно использовать для  оптимизации по
скорости  при  работе с процессором 8086 или 8088 (самые "медлен-
ные" процессоры серии), когда на адресацию типа "база плюс смеще-
ние"  затрачивается минимум 8 циклов за обращение.  Это позволяет
также сэкономить место,  так как инструкция POP  занимает  только
один байт.

           Примечание: Если вы используете директивы .MODEL, PROC
      и ARG, то Ассемблер автоматически добавляет во все инструк-
      ции RET число байт извлекаемых параметров.

                     Доступ к параметрам
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Когда получает управление ваша подпрограмма на Турбо Ассемб-
лере, вершина стека будет содержать адрес возврата (два или четы-
ре слова, в зависимости от того, является ли подпрограмма ближней
или дальней), а далее будут находится передаваемые параметры.

           Примечание: При вычислении  адресов  параметров  нужно
      принимать  во внимание регистры,  такие как BP,  содержимое
      которых также может быть занесено в стек.)

     Существует три основных метода доступа к параметрам, переда-
ваемых Турбо Паскалем вашей подпрограмме на Турбо  Ассемблере. Вы
можете:

     - использовать для адресации к стеку регистр BP;

     - для получения параметров использовать другой  базовый  или
       индексный регистр;

     - извлечь из стека адрес возврата, а затем параметры.

     Первый и второй методы более сложны, и мы расскажем о них  в
следующих  двух разделах. Третий метод предусматривает извлечение
из стека и сохранение адреса возврата, а затем  извлечения  пара-
метров  и  записи их в регистры. Лучше всего этот метод работает,
когда ваша подпрограмма не требует пространства для локальных пе-
ременных.

       Использование для адресации к стеку регистра BP
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Первый и наиболее часто используемый метод доступа  к  пара-
метрам, передаваемым из Турбо Паскаля в Турбо Ассемблер, заключа-
ется в том, чтобы использовать для адресации к стеку регистр  BP.
Например:

CODE       SEGMENT
           ASSUME  CS:CODE
MyProc     PROC    FAR         ; procedure MyProc(i,j : integer);
           PUBLIC  MyProc
j          EQU WORD PTR [bp+6] ; j находится над сохраненным BP
                               ; и адресом возврата
i          EQU WORD PTR [bp+8] ; i располагается над j
           push  bp            ; нужно сохранить BP вызывающей
                               ; программы
           mov   bp,sp         ; BP теперь указывает на вершину
                               ; стека
           mov   ax,i          ; адресуемся к i через BP
           .
           .
           .

     При вычислении смешений в стеке параметров, к которым мы об-
ращаемся  таким  образом, нужно помнить, что 2 байта используются
для сохраненного регистра BP.

     Обратите внимание на использование в данном примере присваи-
ваний. Они позволяют сделать программу более понятной. У них есть
только один недостаток: поскольку для выполнения такого рода при-
сваиваний можно  использовать  только  директиву EQU (а не =),  в
данной исходном файле Турбо Ассемблера вы не сможете  переопреде-
лить идентификаторы i и j. Один из способов обойти это заключает-
ся в том, чтобы использовать более описательные имена параметров,
чтобы они не повторялись,  либо можно ассемблировать каждую подп-
рограмму Ассемблера отдельно.

                        Директива ARG
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Хотя можно обращаться к параметрам через регистр  BP,  Турбо
Ассемблер предусматривает альтернативу вычислению смещений в сте-
ке и выполнению текстовых присваиваний. Это  директива  ARG.  При
использовании  ее в процедуре директива ARG автоматически опреде-
ляет смещения параметров относительно регистра BP.  Она вычисляет
также размер блока параметров и использует его в  инструкции RET.
Поскольку идентификаторы, создаваемые по директиве ARG, определе-
ны только в соответствующей процедуре,  в  каждой  процедуре  или
функции  вам  не требуется использовать уникальные имена парамет-
ров.

     Покажем, как будет  выглядеть  пример  предыдущего  раздела,
если переписать его, используя директиву ARG:

CODE       SEGMENT
           ASSUME  CS:CODE
MyProc     PROC    FAR         ; procedure MyProc(i,j : integer);
                               ; external;
           PUBLIC  MyProc
           ARG j : WORD, i : WORD = RetBytes
           push  bp            ; нужно сохранить BP вызывающей
                               ; программы
           mov   bp,sp         ; BP теперь указывает на вершину
                               ; стека
           mov   ax,i          ; адресуемся к i через BP
           .
           .
           .

     Директива ARG Турбо Ассемблера создает локальные идентифика-
торы для параметров i и j. На время выполнения процедуры строка:

        ARG j : WORD, i : WORD = RetBytes

автоматически приравнивает идентификатор i  к  [WORD  PTR  BP+6],
идентификатор  j  к [WORD PTR BP+8], а идентификатор RetBytes - к
числу 4 (размеру в байтах блока параметров). В значениях учитыва-
ется  и  занесенное в стек значение BP, и размер адреса возврата:
если бы процедура MyProc имела ближний тип, то i было бы  прирав-
нено  к  значению  [BP+4], j - к [BP+6], а RetBytes также было бы
равно 4 (в любом случае процедура MyProc может завершить выполне-
ние с помощью инструкции RET RetBytes).

     При использовании директивы ARG нужно помнить, что параметры
должны  перечисляться в обратном порядке. Последний параметр про-
цедуры или функции Турбо Паскаля нужно размещать в директиве  ARG
первым и наоборот.

     Относительно использования директивы ARG  с  Турбо  Паскалем
можно сделать еще одно замечание. В  отличие  от  других  языков,
Турбо Паскаль всегда заносит в стек параметр-значение  размером в
байт,  как 16-битовое слово. При этом сообщить Турбо Ассемблеру о
дополнительном байте должны вы. Предположим, например, что вы на-
писали функцию, описание которой в Паскале выглядит следующим об-
разом:

     function MyProc(i, j : char) : string; external;

     Директива ARG для этой функции должна была бы выглядеть так:

     ARG j: BYTE: 2, i:BYTE: 2 = RetBytes  RETURN  result: DWORD

     Здесь 2 после каждого аргумента необходимо указывать для то-
го, чтобы сообщить Ассемблеру, что каждый идентификатор заносится
в стек,  как массив из 2 байт (где, в данном случае, младший байт
каждой пары содержит полезную информацию).

     В функции, возвращающей строковое значение (как данная функ-
ция),  параметр  RETURNS в директиве ARG позволяет вам определить
переменную, приравненную к тому месту в стеке, которое  указывает
на временный результат функции. Переменная в RETURNS на размер (в
байтах) блока параметров.

              Турбо Паскаль и директива .MODEL
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Директива .MODEL с параметром TPASCAL задает упрощенную сег-
ментацию, модель памяти и языковую поддержку. Обычно используется
большая модель памяти (large) Ранее мы уже видели, что нужно сде-
лать в программах Ассемблера,  чтобы можно было использовать про-
цедуры и функции Паскаля. Преобразуем пример, используя в нем ди-
рективы .MODEL и PROC:

               .MODEL   large, PASCAL
               .CODE
MyProc         PROC     FAR i:BYTE,j:BYTE result:DWORD
               PUBLIC   MyProc
               mov      ax,i
               .
               .
               .
               ret

     Заметим, что теперь не нужно задавать параметры  в  обратном
порядке.  Не требуется также масса других операторов. Использова-
ние в директиве .MODEL ключевого слова  PASCAL задает использова-
ние  соглашений  Паскаля,  определяет  имена сегментов, выполняет
инструкции PUSH BP и MOV BP,SP и задает также возврат  с  помощью
инструкций POP BP и RETn (где n - число байт параметров).

   Использование другого базового или индексного регистра
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Второй способ доступа к параметрам состоит  в  использовании
для получения этих параметров другого базового или индексного ре-
гистра (BX, SI или DI). Нужно однако помнить,  что  по  умолчанию
сегментным  регистром для них является  регистр DS, а не SS. Поэ-
тому для их использования вам придется применять префикс  переоп-
ределения сегмента.

     Приведем пример использования для получения  параметров  ре-
гистра BX:

CODE          SEGMENT
              ASSUME  CS:CODE
MyProc        PROC FAR         ; procedure MyProc(i,j : integer);
              PUBLIC MyProc
j          EQU WORD PTR SS:[BX+4] ; j находится над сохраненным
                               ; BP и адресом возврата
i          EQU WORD PTR SS:[bp+8] ; i располагается над j
           mov   bx,sp         ; BX теперь указывает на вершину
                               ; стека
           mov   ax,i          ; адресуемся к i через BX
           .
           .
           .

     В тех программах, где нет большого числа ссылок на  парамет-
ры, такой метод позволяет сэкономить время и место. Почему? Пото-
му, что в отличие от BP,  регистр BX не требуется восстанавливать
в конце программы.

             Результаты функции в Турбо Паскале
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В зависимости от типа результата функции Турбо Паскаля возв-
ращают свои результаты различными способами.

               Результаты функции скалярного типа

     Результаты функции скалярных типов возвращаются в  регистрах
центрального  процессора  (ЦП).  Байтовые значения возвращаются в
регистре AL, значения  размером  в  2  байта  -  в  регистре  AX,
4-байтовые значения - в паре регистров DX:AX (старшее слово нахо-
дится в регистре DX).

              Результаты функции вещественного типа

     Результаты используемого в Турбо Паскале  6-байтового  прог-
раммно  эмулируемого  вещественного  типа возвращаются в трех ре-
гистрах ЦП. Наиболее значащее (старшее) слово возвращается в  DX,
среднее - в BX, а наименее значащее - в AX.

            Результаты функции типов сопроцессора 8087

     Результаты типов, использующихся сопроцессором 8087, возвра-
щаются в регистре вершины стека ST(0) (или просто ST).

               Результаты функции строкового типа

     Результаты строкового типа возвращаются во временной рабочей
области, выделяемой Турбо Паскалем перед вызовом. Указатель даль-
него типа на эту область заносится в стек перед занесением перво-
го  параметра.  Заметим,  что  этот  указатель не является частью
списка параметров.

           Примечание: Не удаляйте из стека полученный в  резуль-
      тате  указатель,  так  как Турбо Паскаль ожидает, что после
      вызова он будет доступен.

                Результаты функции типа указатель

     Результаты указатель возвращаются  в  паре  регистров  DX:AX
(сегмент:смещение).

         Выделение пространства для локальных данных
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Ваши программы, написанные на Турбо Ассемблере, могут  выде-
лять  пространство для своих собственных переменных, как постоян-
ных (статических), то есть сохраняющихся в промежутке между вызо-
вами,  так и для временных (которые после вызова будут потеряны).
Оба этих случая обсуждаются в следующих разделах.

                Выделение статической памяти
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Турбо Паскаль позволяет в программах Турбо Ассемблера резер-
вировать пространство для статических переменных в сегментах гло-
бальных данных (DATA или DSEG). Чтобы выделить это  пространство,
можно просто использовать такие директивы, как DB, DW и т.д. Нап-
ример:

     DATA        SEGMENT PUBLIC
     MyInt       DW      ?        ; зарезервировать слово
     MyByte      DB      ?        ; зарезервировать байт
       .
       .
       .
     DATA        ENDS

     Переменных, выделяемых Турбо Ассемблером в сегменте глобаль-
ных данных, касаются два важных ограничения. Во-первых, эти пере-
менными являются "частными", они недоступны программе Турбо  Пас-
каля (хотя вы можете передавать указатели на них). Во-вторых, они
не могут быть предварительно инициализированы,  как  типизованные
константы. Оператор:

      MyInt       DW      42        ; это не инициализирует
                                    ; MyInt значением 42

не вызовет ошибки при компоновке модуля с программой Турбо Паска-
ля, однако MyInt при выполнении программы не будет иметь значение
42.

     Эти ограничения можно обойти, описав переменные или  типизо-
ванные  константы  Турбо  Паскаля  с помощью директивы EXTRN, что
сделает их доступными Турбо Ассемблеру.

                 Выделение временной памяти
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В ваших программах на Турбо  Паскале  можно  выделять  также
временную память (локальные переменные) в стеке на время выполне-
ния каждого вызова. Перед возвратом управления эта память  должна
быть освобождена, а значение регистра BP восстановлено. В следую-
щем примере процедура MyProc резервирует  пространство  для  двух
целых переменных a и b:

CODE          SEGMENT
              ASSUME  CS:CODE
MyProc        PROC    FAR       ; procedure MyProc(i : integer);
              PUBLIC  MyProc
              LOCAL a : WORD, b : WORD = LocalSpace ; a в [bp-2]
                                ; b - в [bp-4]
i             equ   word ptr [bp+6] ; параметр i находится над
                                ; сохраненным BP и адресом
                                ; возврата
              push  bp          ; нужно сохранить BP вызывающей
                                ; программы
              mov   bp,sp       ; теперь BP указывает на
                                ; вершину стека
              sub   sp,LocalSpace ; зарезервировать пространст-
                                ; во для двух слов
              mov   ax,42       ; загрузить в AX начальное
                                ; значение A
              mov   a,ax        ; и в A
              xor   ax,ax       ; очистить регистр AX
              mov   b,ax        ; инициализировать B нулем
              mov   b,ax        ; выполнить нужные действия
              .
              .
              .
              mov   sp,bp       ; восстановить исходное
                                ; значение SP
              mov   bp          ; восстановить исходное
                                ; значение регистра BP
              ret   2
MyProc        ENDP
CODE          ENDS
              END

           Примечание: Директива Турбо Ассемблера LOCAL использу-
      ется для создания идентификаторов и выделения  пространства
      для локальных переменных.

     Оператор:

        LOCAL a : WORD, b : WORD = LocalSpace

на время выполнения процедуры присваивает идентификатору a значе-
ние  [BP-2], идентификатору b - значение [BP-4], а идентификатору
LocalSpace - число 4 (размер области локальных переменных).  Пос-
кольку  нет соответствующего оператора для создания идентификато-
ров, ссылающихся на параметры, вы должны использовать  присваива-
ние i значения [BP+6].

     Более разумный  способ  инициализации  локальных  переменных
заключается  в  том, чтобы вместо уменьшения SP занести в стек их
значения. Таким образом, вы  должны  заменить  SUB  SP,LocalSpace
инструкциями:

     mov   ax,42                ; получить начальное значение
                                ; для a
     push  ax                   ; занести его в a
     xor   ax,ax                ; обнулить AX
     push  ax                   ; и занести 0 в b

     Если вы используете этот способ, нужно внимательно  отслежи-
вать  стек!  Не  следует  ссылаться на идентификаторы a и b перед
тем, как они занесены в стек.

     Другой вид оптимизации предусматривает  использование  инст-
рукции PUSH CONST для инициализации локальных переменных (ее мож-
но использовать при наличии процессором 80186,  80286  и  80386),
или  сохранение  BP  в регистре вместо занесения его в стек (если
есть неиспользованные регистры).

     Примеры подпрограмм на Ассемблере для Турбо Паскаля
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В данном разделе вы дадим некоторые примеры  подпрограмм  на
языке  Ассемблера,  которые  вы можете вызывать из программ Турбо
Паскаля.

одпрограмма шестнадцатиричного преобразования общего назначения
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Содержащиеся в параметре num байты  преобразуются  в  строку
шестнадцатиричных  цифр  длины  (byteCount * 2). Поскольку каждый
байт порождает два символа, максимальное значение byteCount равно
127  (не проверяется). Для преобразования каждой группы (по 4 би-
та) в шестнадцатиричную цифру мы для скорости используем последо-
вательность add-daa-adc-daa.

     Процедура HexStr  (ее  можно найти в файле HEX.ASM) написана
так,  что вызываться она должна с помощью вызова  дальнего  типа.
Это означает, что ее следует описывать в интерфейсной части моду-
ля Турбо Паскаля или с помощью директивы компилятора {$F+}.

CODE           SEGMENT
               ASSUME  cs:CODE,ds:NOTHING

; Параметры (+2 с учетом push bp)

byteCount      equ byte ptr  ss:[bp+6]
num            equ dword ptr ss:[bp+8]

; Адресация к результату функции (+2 с учетом push bp)

resultPtr      equ dword ptr ss:[bp+12]

HexStr         PROC FAR
               PUBLIC HexStr

               push  bp
               mov   bp,sp            ; получить указатель
                                      ; стека
               les   di,resultPtr     ; получить адрес
                                      ; результата функции
               mov   dx,ds            ; сохранить DS Турбо
                                      ; Паскаля в DX
               lds   si,sum           ; получить адрес числа
               mov   al,byteCount     ; сколько байт?
               xor   ah,ah            ; слово
               mov   cx,ax            ; отслеживать число
                                      ; байт в CX
               add   si,ax            ; начать со старшего
                                      ; байта числа
               dec   si
               shl   ax,1             ; сколько цифр?
                                      ; (2/байт)
               cld                    ; сохранить число цифр
                                      ; (работать в прямом
                                      ; направлении)
               stosb                  ; в приемнике - байт
                                      ; длины строки
NextLoop:
               std                    ; сканировать число от
                                      ; старшего байта к
                                      ; младшему
               lodsb                  ; получить следующий
                                      ; байт
               mov   ah,al            ; сохранить его
               shr   al,1             ; выделить старшую
                                      ; группу бит
               shr   al,1
               shr   al,1
               shr   al,1
               add   al,90h           ; специальная после-
                                      ; довательность шестнад-
                                      ; тиричного преобразования
               daa                    ; использование инструкций
                                      ; ADD и DAA
               adc   al,40h
               daa                    ; группа преобразована
                                      ; в код ASCII
               cld                    ; сохраним ASCII и следуем
                                      ; далее
               stosb
               mov   al,ah            ; повторить преобразование
                                      ; для младшей группы
               and   al,0Fh
               add   al,90h
               daa
               adc   al,40h
               daa
               stosb
               loop  HexLoop          ; продолжать, пока не
                                      ; будет выполнено
               mov   ds,dx
               pop   bp
               ret   6                ; параметры занимают
                                      ; 6 байт
HexStr         ENDP
CODE           ENDS
               END

     Пример  программы  на  Паскале,  где  используется   функция
HexStr, имеет следующий вид:

     Program HexTest;
     var
       num : word;
     {$F+}

     function HexStr(var num; byteCount : byte) : string;
                                                   external;

     {$L HEXSTR.OBJ}

     {$F-}
     begin
       num := word;
       Writeln('Преобразованная строка имеет шестнадцатиричное
     представление: ', HexStr(num,Sizeof(num)),'*');
     end.

     Для построения и запуска  примеров  программы на  Паскале  и
программы  Ассемблера  используйте  следующие  команды командного
файла:

     TASM HEXSTR
     TPC HEXTEST
     HEXTEST

     Если вы используете директиву .MODEL,  то  программу  HexStr
можно записать следующим образом (файл HEXMOD.ASM):

               .MODEL   large, PASCAL
               .CODE
HexStr PROC FAR num:DWORD,byteCount:BYTE RETURNS resultPtr:DWORD
               PUBLIC HexStr
               les   di,resultPtr     ; получить адрес
                                      ; результата функции
               mov   dx,ds            ; сохранить DS Турбо
                                      ; Паскаля в DX
               lds   si,sum           ; получить адрес числа
               mov   al,byteCount     ; сколько байт?
               xor   ah,ah            ; слово
               mov   cx,ax            ; отслеживать число
                                      ; байт в CX
               add   si,ax            ; начать со старшего
                                      ; байта числа
               dec   si
               shl   ax,1             ; сколько цифр?
                                      ; (2/байт)
               cld                    ; сохранить число цифр
                                      ; (работать в прямом
                                      ; направлении)
               stosb                  ; в приемнике - байт
                                      ; длины строки
NextLoop:
               std                    ; сканировать число от
                                      ; старшего байта к
                                      ; младшему
               lodsb                  ; получить следующий
                                      ; байт
               mov   ah,al            ; сохранить его
               shr   al,1             ; выделить старшую
                                      ; группу бит
               shr   al,1
               shr   al,1
               shr   al,1
               add   al,90h           ; специальная после-
                                      ; довательность шестнад-
                                      ; тиричного преобразования
               daa                    ; использование инструкций
                                      ; ADD и DAA
               adc   al,40h
               daa                    ; группа преобразована
                                      ; в код ASCII
               cld                    ; сохраним ASCII и следуем
                                      ; далее
               stosb
               mov   al,ah            ; повторить преобразование
                                      ; для младшей группы
               and   al,0Fh
               add   al,90h
               daa
               adc   al,40h
               daa
               stosb
               loop  HexLoop          ; продолжать, пока не
                                      ; будет выполнено
               mov   ds,dx            ; восстановить DS
                                      ; Турбо Паскаля
               ret
HexStr         ENDP
CODE           ENDS
               END

     При этом вы можете использовать ту же программу на Паскале и
просто  ассемблировать альтернативный вариант HexStr и перекомпи-
лировать программу с помощью того же командного файла.

          Пример обмена содержимого двух переменных
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     С помощью данной процедуры (VAREXCH.ASM) вы можете выполнить
обмен содержимого двух переменных размера count. Если count имеет
значение 0, то то процессор попытается перекопировать 64К.

CODE        SEGMENT
            ASSUME cs:CODE,ds:NOTHING

; Параметры (заметим, что из-за push bp смещение
; увеличивается на 2)

var1        equ    DWORD PTR ss:[bp+12]
var2        equ    DWORD PTR ss:[bp+8]
count       equ    WORD  PTR ss:[bp+6]

Exchange    PROC FAR
            PUBLIC Exchange
            cld                   ; обмен в прямом направлении
            mov    dx,ds          ; сохранить регистр DS
            push   bp
            mov    bp,sp          ; получить базу стека
            lds    si,var1        ; получить первый адрес
            les    di,var2        ; получить второй адрес
            mov    cx,count       ; получить число перемещаемых
                                  ; байт
            shr    cx,1           ; получить счетчик слов
                                  ; (младший бит -> перенос)
            jnc    ExchangeWord   ; если не нечетный байт,
                                  ; войти в цикл
            mov    al,es:[di]     ; считать нечетный байт
                                  ; из var2
            movsb                 ; переместить байт из var1
                                  ; в var2
            mov    [si-1],al      ; записать var2 в var1
            jz     Finis          ; выполнено, если нужно
                                  ; выполнить обмен только
                                  ; одного байта
ExchangeWords:
            mov    bx,-2          ; BX - это удобное место
                                  ; для хранения -2
ExchangeLoop:
            mov    ax,es:[di]     ; считать слово из var2
            movsw                 ; переместить из var1
                                  ; в var2
            mov    [bx][si,ax     ; записать слово var2 в
                                  ; var1
            loop   ExchangeLoop   ; повторить count/2 раз
Finis:
            mov    ds,dx          ; получить обратно DS
                                  ; Турбо Паскаля
            pop    bp
            ret    10
Exchange    ENDP
CODE        ENDS
            END

     Программа Турбо Паскаля, которая использует функцию Exchange
(файл varexch.pas), имеет вид:

     program TextExchange;

     type
       EmployeeRecord = record
                          Name     :    string[30];
                          Address  :    string[30];
                          City     :    string[15];
                          State    :    string[2];
                          Zip      :    string[10];
                         end;

     var
       OldEmployee, NewEmployee : EmployeeRecord;

     {$F+}

     procedure Exchange(var var1,var2; count : word); external;
     {$L XCHANGE.OBJ}
     {$F-}
     begin
       with OldEmployee do
       begin
         Name := 'John Smith';
         Address := ' 123 F Street';
         City := 'Scotts Valley';
         State := 'CA';
         Zip := ' 90000-0000';
       end;
       with NewEmployee do
       begin
         Name := 'Mary Jones';
         Address := ' 9471 41st Avenue';
         City := 'New York';
         State := 'NY';
         Zip := ' 10000-1111';
       end;
       Writeln('Before: ',OldEmployee.Name,' ',NewEmployee.Name);
       Exchange(OldEmployee,NewEmployee,sizeof(OldEmployee));
       Writeln('After: ',OldEmployeeName,' ',NewEmployee.Name);
       Exchange(OldEmployee,NewEmployee,sizeof(OldEmployee));
       Writeln('After: ',OldEmployeeName,' ',NewEmployee.Name);
     end.

     Чтобы сформировать и запустить данные программы на Паскале и
Ассемблере, используйте следующие команды командного файла:

     TASM XCHANGE
     TPC  XCHANGE
     XCHANGE

     Если использовать директиву .MODEL, то программа Exchange на
Ассемблере будет выглядеть следующим образом:

            .MODEL  large, PASCAL
            .CODE
Exchange    PROC FAR var1:DWORD,var2:DWORD,count:WORD
            PUBLIC Exchange
            cld                  ; обмен в прямом направлении
            mov    dx,ds         ; сохранить DS
            push   bp
            mov    bp,sp         ; получить базу стека
            lds    si,var1       ; получить первый адрес
            les    di,var2       ; получить второй адрес
            mov    cx,count      ; получить число перемещаемых
                                 ; байт
            shr    cx,1          ; получить счетчик слов
                                 ; (младший бит -> перенос)
            jnc    ExchangeWord  ; если не нечетный байт,
                                 ; войти в цикл
            mov    al,es:[di]    ; считать нечетный байт
                                 ; из var2
            movsb                ; переместить байт из var1
                                 ; в var2
            mov    [si-1],al     ; записать var2 в var1
            jz     Finis         ; выполнено, если нужно
                                 ; выполнить обмен только
                                 ; одного байта
ExchangeWords:
            mov    bx,-2         ; BX - это удобное место
                                 ; для хранения -2
ExchangeLoop:
            mov    ax,es:[di]    ; считать слово из var2
            movsw                ; переместить из var1
                                 ; в var2
            mov    [bx][si,ax    ; записать слово var2 в
                                 ; var1
            loop   ExchangeLoop  ; повторить count/2 раз
Finis:
            mov    ds,dx         ; получить обратно DS
                                 ; Турбо Паскаля
            ret
Exchage     ENDP
CODE        ENDS
            END

     Вы можете использовать ту же программу на Паскале  и  просто
ассемблировать  альтернативный вариант процедуры Exchаnge и пере-
компилировать программу с помощью того же командного файла.

            Пример анализа операционной среды DOS
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     С помощью функции EnvString вы сможете просмотреть  операци-
онную среду DOS и найти строку вида "s=НЕЧТО" и возвратить НЕЧТО,
если это найдено.

DATA           SEGMENT PUBLIC
               EXTRN prefixSeg : Word  ; дает адрес PSP
DATA           ENDS
               SEGMENT PUBLIC
               ASSUME  cs:CODE,ds:DATA

EnvString      PROC FAR
               PUBLIC  EnvString
               push    bp
               cld                     ; работать в прямом
                                       ; направлении
               mov     es,[prefixSeg]  ; посмотреть PSP
               mov     es,es:[2Ch]     ; ES:DI указывают на
                                       ; операционную среду,
               xor     di,di           ; которая выровнена на
                                       ; границу параграфа
               mov     bp,sp           ; найти строку параметров,
               lds     si,ss:[bp+6]    ; которая следует за
                                       ; адресом возврата
               ASSUME  ds:NOTHING
               lodsb                   ; посмотреть длину
               or      al,al           ; она равна 0?
               jz      RetNul          ; да, возврат
               mov     ah,al           ; в противном случае
                                       ; сохранить ее в AH
               mov     dx,si           ; DS:SI содержат указатель
                                       ; на первый параметр
                                       ; char
               xor     al,al           ; сделать его равным 0
Compare:
               mov     ch,al           ; мы хотим, чтобы для
                                       ; следующего отсчета ch=0
               mov     si,dx           ; возвратить указатель на
                                       ; просмотренную строку
               mov     cl,ah           ; получить длину
               mov     si,dx           ; возвратить указатель на
                                       ; строку
               repe    cmpsb           ; сравнить байты
               jne     Skip            ; если сравнение неудач-
                                       ; ное попробовать следу-
                                       ; ющую строку
               cmp     byte ptr es:[di],'=' ; сравнение
                                       ; завершилось успешно
                                       ; следующий символ '='?
               jne     NoEqual         ; если нет, все еще нет
                                       ; совпадения
Found:
               mov     ax,es           ; DI:SI будет указывать
                                       ; на найденную нами строку
               mov     ds,ax
               mov     si,di
               inc     si              ; "пройти" символ '='
               les     bx,ss:[bp+10]   ; получить адрес
                                       ; результата
                                       ; функции
               mov     di,bx           ; занести его в ES:DI
               inc     di              ; байт длины
               mov     cl,255          ; задать максимальную
                                       ; длину
CopyLoop:
               lodsb                   ; получить байт
               or      al,al           ; проверить на 0
               jz      Done            ; если 0, выполнено
               stosb                   ; занести его в результат
               loop    CopyLoop        ; переместить до 255
                                       ; байт
Done:          not     cl              ; при сохранении мы
                                       ; уменьшали от CL до 255
               mov     es:[bx],cl      ; сохранить длину
               mov     ax,SEG DATE
               mov     ds,ax           ; восстановить DS
               ASSUME  ds:DATA
               pop     bp
               ret     4
               ASSUME  ds:NOTHING
Skip:
               dec     di              ; проверить на 0
NoEqual:
               mov     cx,7FFFh        ; длинный поиск, если
                                       ; нужно
               sub     cx,di           ; операционная среда
                                       ; никогда не превышает
                                       ; 32К
               jbe     RetNul          ; если конец, выйти
               repne   scasb           ; посмотреть следующий
                                       ; 0
               jcxz    RetNul          ; выйти, если не найден
               cmp     byte ptr es:[di],al ; второй 0 в строке?
               jne     Compare         ; если нет, попытаться
                                       ; снова
RetNul:
               les     di,ss:[bp+10]   ; получить адрес
                                       ; результата
               stosb                   ; сохранить там 0
               mov     ax,SEG DATA
               mov     ds,ax           ; восстановить DS
               ASSUME  ds:DATA
               pop     bp
               ret     4
EnvString      ENDP
CODE           ENDS
               END

     Программа на Паскале, которая использует функцию  EnvString,
выглядит следующим образом:

     program EnvTest;
     { программа ищет строки операционной среды }

     var
       EnvVariable : string;
       EnvValue    : string;

     {$F+}

     function EnvString(s:string) : string; external;
     {$L ENVSTRING.OBJ}
     {$F-}
     begin
       EnvVariable := 'PROMPT';
       EnvValue := EnvString(EnvVariable);
       if EnvValue = '' then EnvValue := '*** не найдена ***';
       Writeln('Переменная операционной среды: ',
                EnvVariable,' Значение: ',EnvValue);
     end.

     Чтобы сформировать и запустить данные программы на Паскале и
Ассемблере, используйте следующие команды командного файла:

     TASM ENVSTR
     TPC ENVTEST
     ENVTEST

     Если использовать директиву .MODEL,  то функция EnvString на
Ассемблере будет выглядеть следующим образом (ENVMOD.ASM):

               .MODEL   large, PASCAL
               .DATA
               EXTRN prefixSeg : Word  ; дает адрес PSP
               .CODE
EnvString      PROC FAR  EnvVar:DWORD  RETURNS EnvVal:DWORD
               PUBLIC  EnvString
               push    bp
               cld                     ; работать в прямом
                                       ; направлении
               mov     es,[prefixSeg]  ; посмотреть PSP
               mov     es,es:[2Ch]     ; ES:DI указывают на
                                       ; операционную среду,
               xor     di,di           ; которая выровнена на
                                       ; границу параграфа
               mov     bp,sp           ; найти строку параметров,
               lds     si,ss:[bp+6]    ; которая следует за
                                       ; адресом возврата
               ASSUME  ds:NOTHING
               lodsb                   ; посмотреть длину
               or      al,al           ; она равна 0?
               jz      RetNul          ; да, возврат
               mov     ah,al           ; в противном случае
                                       ; сохранить ее в AH
               mov     dx,si           ; DS:SI содержат указатель
                                       ; на первый параметр
                                       ; char
               xor     al,al           ; сделать его равным 0
Compare:
               mov     ch,al           ; мы хотим, чтобы для
                                       ; следующего отсчета ch=0
               mov     si,dx           ; возвратить указатель на
                                       ; просмотренную строку
               mov     cl,ah           ; получить длину
               mov     si,dx           ; возвратить указатель на
                                       ; строку
               repe    cmpsb           ; сравнить байты
               jne     Skip            ; если сравнение неудач-
                                       ; ное, попробовать следу-
                                       ; ющую строку
               cmp     byte ptr es:[di],'=' ; сравнение
                                       ; завершилось успешно
                                       ; следующий символ '='?
               jne     NoEqual         ; если нет, все еще нет
                                       ; совпадения
Found:
               mov     ax,es           ; DI:SI будет указывать
                                       ; на найденную нами строку
               mov     ds,ax
               mov     si,di
               inc     si              ; "пройти" символ '='
               les     bx,ss:[bp+10]   ; получить адрес
                                       ; результата функции
               mov     di,bx           ; занести его в ES:DI
               inc     di              ; байт длины
               mov     cl,255          ; задать максимальную
                                       ; длину
CopyLoop:
               lodsb                   ; получить байт
               or      al,al           ; проверить на 0
               jz      Done            ; если 0, выполнено
               stosb                   ; занести его в результат
               loop    CopyLoop        ; переместить до 255
                                       ; байт
Done:          not     cl              ; при сохранении мы
                                       ; уменьшали от CL до 255
               mov     es:[bx],cl      ; сохранить длину
               mov     ax,SEG DATE
               mov     ds,ax           ; восстановить DS
               ASSUME  ds:DATA
               pop     bp
               ret     4
               ASSUME  ds:NOTHING
Skip:
               dec     di              ; проверять на 0
NoEqual:
               mov     cx,7FFFh        ; длинный поиск, если
                                       ; нужно
               sub     cx,di           ; операционная среда
                                       ; никогда не превышает
                                       ; 32К
               jbe     RetNul          ; если конец, выйти
               repne   scasb           ; посмотреть следующий
                                       ; 0
               jcxz    RetNul          ; выйти, если не найден
               cmp     byte ptr es:[di],al ; второй 0 в строке?
               jne     Compare         ; если нет, попытаться
                                       ; снова
RetNul:
               les     di,ss:[bp+10]   ; получить адрес
                                       ; результата
               stosb                   ; сохранить там 0
               mov     ax,SEG DATA
               mov     ds,ax           ; восстановить DS
               ASSUME  ds:DATA
               ret     4
EnvString      ENDP
CODE           ENDS
               END

     Вы можете использовать ту же программу на Паскале  и  просто
ассемблировать  альтернативный  вариант функции EnvString и пере-
компилировать программу с помощью того же командного файла.

                    Часть 2. ПРИЛОЖЕНИЯ
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Далее следует содержимое приложений.

         Приложение A. Замечания по программированию
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В данном приложении приведена основная информация по постро-
ению программ с конкретными моделями памяти и форматами выполняе-
мого кода.

          Упрощенные директивы определения сегмента
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В следующей  таблице  показаны используемые по умолчанию для
каждой модели памяти атрибуты сегмента.

 Используемые по умолчанию сегменты и типы для модели памяти TINY
                                                      Таблица A.1
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і  Директива  Имя    Выравнивание Комбинирование  Класс   Группаі
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і.CODE      _TEXT    WORD         PUBLIC      'CODE'     DGROUP і
і.FARDATA   FAR_DATA PARA         private     'FAR_DATA'        і
і.FARDATA?  FAR_BSS  PARA         private     'FAR_BSS'         і
і.DATA      _DATA    WORD         PUBLIC      'DATA'     DGROUP і
і.CONST     CONST    WORD         PUBLIC      'CONST;    DGROUP і
і.DATA?     _BSS     WORD         PUBLIC      'BSS'      DGROUP і
іSTACK*     STACK    PARA         STACK       'STACK'    DGROUP і
і                                                               і
і    * -  STACK  не  подразумевается  размещенным в  DGROUP  илиі
іFARSTACK, заданным в директиве MODEL.                          і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

Используемые по умолчанию сегменты и типы для модели памяти SMALL
                                                      Таблица A.2
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і  Директива  Имя    Выравнивание Комбинирование  Класс   Группаі
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і.CODE      _TEXT    WORD         PUBLIC      'CODE'            і
і.FARDATA   FAR_DATA PARA         private     'FAR_DATA'        і
і.FARDATA?  FAR_BSS  PARA         private     'FAR_BSS'         і
і.DATA      _DATA    WORD         PUBLIC      'DATA'     DGROUP і
і.CONST     CONST    WORD         PUBLIC      'CONST;    DGROUP і
і.DATA?     _BSS     WORD         PUBLIC      'BSS'      DGROUP і
іSTACK*     STACK    PARA         STACK       'STACK'    DGROUP і
і                                                               і
і    * -  STACK  не  подразумевается  размещенным в  DGROUP  илиі
і FARSTACK, заданным в директиве MODEL.                         і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

                    Используемые по умолчанию
            сегменты и типы для модели памяти MEDIUM

                                                      Таблица A.3
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і  Директива  Имя    Выравнивание Комбинирование  Класс   Группаі
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і.CODE      имя_TEXT WORD         PUBLIC      'CODE'            і
і.FARDATA   FAR_DATA PARA         private     'FAR_DATA'        і
і.FARDATA?  FAR_BSS  PARA         private     'FAR_BSS'         і
і.DATA      _DATA    WORD         PUBLIC      'DATA'     DGROUP і
і.CONST     CONST    WORD         PUBLIC      'CONST;    DGROUP і
і.DATA?     _BSS     WORD         PUBLIC      'BSS'      DGROUP і
іSTACK*     STACK    PARA         STACK       'STACK'    DGROUP і
і                                                               і
і    * -  STACK  не  подразумевается  размещенным в  DGROUP или і
і FARSTACK, заданным в директиве MODEL.                         і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

                    Используемые по умолчанию
            сегменты и типы для модели памяти COMPACT
                                                      Таблица A.4
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і  Директива  Имя    Выравнивание Комбинирование  Класс   Группаі
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і.CODE      _TEXT    WORD         PUBLIC      'CODE'            і
і.FARDATA   FAR_DATA PARA         private     'FAR_DATA'        і
і.FARDATA?  FAR_BSS  PARA         private     'FAR_BSS'         і
і.DATA      _DATA    WORD         PUBLIC      'DATA'     DGROUP і
і.CONST     CONST    WORD         PUBLIC      'CONST;    DGROUP і
і.DATA?     _BSS     WORD         PUBLIC      'BSS'      DGROUP і
іSTACK*     STACK    PARA         STACK       'STACK'    DGROUP і
і                                                               і
і    * -  STACK  не  подразумевается  размещенным в  DGROUP  илиі
іFARSTACK, заданным в директиве MODEL.                          і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

                    Используемые по умолчанию
        сегменты и типы для модели памяти LARGE или HUGE
                                                      Таблица A.5
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і  Директива  Имя    Выравнивание Комбинирование  Класс   Группаі
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і.CODE      имя_TEXT WORD         PUBLIC      'CODE'            і
і.FARDATA   FAR_DATA PARA         private     'FAR_DATA'        і
і.FARDATA?  FAR_BSS  PARA         private     'FAR_BSS'         і
і.DATA      _DATA    WORD         PUBLIC      'DATA'     DGROUP і
і.CONST     CONST    WORD         PUBLIC      'CONST;    DGROUP і
і.DATA?     _BSS     WORD         PUBLIC      'BSS'      DGROUP і
іSTACK*     STACK    PARA         STACK       'STACK'    DGROUP і
і                                                               і
і    * -  STACK  не  подразумевается  размещенным в  DGROUP  илиі
іFARSTACK, заданным в директиве MODEL.                          і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

                    Используемые по умолчанию
   сегменты и типы для модели памяти HUGE (TCHUGE) Borland C++
                                                      Таблица A.6
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і  Директива  Имя    Выравнивание Комбинирование  Класс   Группаі
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і.CODE      имя_TEXT WORD         PUBLIC      'CODE'            і
і.FARDATA   FAR_DATA PARA         private     'FAR_DATA'        і
і.FARDATA?  FAR_BSS  PARA         private     'FAR_BSS'         і
і.DATA      имя_DATA PARA         private     'DATA'            і
іSTACK*     STACK    PARA         STACK       'STACK'           і
і                                                               і
і    * -  STACK  не  подразумевается  размещенным в  DGROUP  илиі
іFARSTACK, заданным в директиве MODEL.                          і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

                        Программы DOS
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Программы DOS  предназначены для работы под управлением опе-
рационной системы DOS и записываются в двух форматах:

     - формат .EXE;

     - формат .COM.

     Формат EXE позволяет использовать наиболее общую в DOS  сег-
ментацию программы.  Программы  могут иметь насколько сегментов и
могут ссылаться на сегмент или группу сегментов по  имени.  Таким
образом, программы .EXE могут превышать по размеру 64К.

     Формат COM представляет  собой  достаточно  простой  формат.
Программы в таком формате не могут содержать символьных ссылок на
имена групп и сегментов.  Таким образом, программы COM обычно пи-
шутся с использованием модели TINY и ограничены по размеру данных
или кода 64 килобайтами.

     Чтобы строить программы  DOS,  вам  потребуется  компоновщик
(например, TLINK) и утилита построения программ (например, MAKE).
Подробнее об утилитах рассказывается в Приложении D.

             Замечания по программам формата EXE
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     При загрузке программы EXE операционная система устанавлива-
ет регистры следующим образом:

ЪДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і    Регистр      і Значение                                    і
ГДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і    DS, ES       і Содержит адрес параграфа для префикса прог- і
і                 і рамного сегмента  программы (PSP).  PSP со- і
і                 і держит передаваемые  программе  в командной і
і                 і строке аргументы и указатель на строку опе- і
і                 і рационной среды для программы.              і
і                 і                                             і
і    CS:IP        і Содержит начальный адрес, заданный в опера- і
і                 і торе END в  одном из модулей программы, или і
і                 і адрес директивы STARTUPCODE.                і
і                 і                                             і
і    SS:SP        і Содержит адрес  последнего  слова,  которое і
і                 і задает в программе сегмент стека.           і
АДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     В программах  EXE  вы  можете  задавать любую модель памяти.
Следует использовать возможно более простую модель, поскольку это
обеспечивает более  быстрое  выполнение и упрощает программирова-
ние. Например,  если в вашей программе никогда не  предполагается
использовать более  64К  данных и области стека,  то вполне можно
использовать модель TINY.

     Директива STURTUPCODE в модуле генерирует инструкции,  кото-
рые автоматически инициализируют все необходимые регистры,  соот-
ветствующие выбранной модели.  Для использования в программе  она
сохраняет адрес параграфа PSP в сегменте ES.

     Когда вы загружаете программу, операционная система выделяет
программе до ее завершения всю оставшуюся память.  Для  программ,
которые не  используют динамически распределяемую область памяти,
или которые строят в памяти свою собственную динамически  распре-
деляемую область,  такое поведение вполне подходит.  Другие прог-
раммы могут выделять память через DOS. В этом случае через запро-
сом на  память  из  DOS память должна быть освобождена и доступна
операционной системе.

     Для выхода из  программы  используется  прерывание  INT  21,
функция 4Ch.

     Эти вопросы иллюстрируются примером программы EXEPROG.ASM на
дистрибутивном диске.  Чтобы сформировать программу EXE,  исполь-
зуйте утилиту MAKE.  В формирующем файле MAKEFILE следует указать
все модули, с которыми компонуется программа, например:

     EXECPROG.EXE:  EXECPROG.OBJ
        TLINK EXECPROG;
     EXECPROG.OBJ: EXECPROG.ASM
        TASM EXECPROG

             Замечания по программам формата COM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Программы COM представляют собой ограниченные  версии  прог-
рамм EXE.  Каждую  программу  формата  COM  можно представить как
программу EXE,  но не каждую программу EXE можно представить  как
программу формата COM. Здесь действуют следующие ограничения:

     - Программы COM следует писать с использованием модели TINY.

     - В программах COM нельзя использовать предопределенный сег-
       мент стека.

     - Программа COM не может содержать прямых адресных ссылок на
       адрес сегмента или группы.  Это означает, что программа не
       может содержать непосредственных дальних вызовов или  ссы-
       латься на сегменты по имени. Все процедуры в программе COM
       должны описываться как BEAR.

     - Выполнение должно начинаться со смещения 100h  в  сегменте
       кода.  Чтобы это произошло, укажите в качестве первой инс-
       трукции сегмента кода директиву STURTUPCODE.

     Турбо Ассемблер загружает программы COM, начиная со смещения
100h в префиксе программного сегмента программы (PSP).  Для этого
директива STARTUPCODE  для  модели  TINY автоматически помещает в
программу ORG 100h.

     При загрузке программы COM устанавливаются следующие регист-
ры:

ЪДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і   Регистр         і Значение                                  і
ГДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і   CS,DS,ES,SS     і Содержит адрес параграфа в PSP программы. і
і                   і                                           і
і   IP              і Устанавливается в значение 100h.          і
і                   і                                           і
і   SP              і Устанавливается в 0FFFEh (последнее слово і
і                   і в сегменте программы.                     і
АДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Если вы не хотите размещать стек в конце сегмента программы,
то нужно установить новый стек. Для такого стека используйте неи-
нициализированный сегмент данных (UDATASEG).

     Хотя программы  COM  должны  определяться  с  моделью памяти
TINY, с помощью директив CODESEG, DATASEG и UDATASEG можно разде-
лить код данные и неинициализированные данные.

     Как и  в случае программ EXE,  когда вы загружаете программу
COM, Турбо Ассемблер выделяет для ее  завершения  всю  оставшуюся
память. При возврате памяти в DOS убедитесь,  что вы не освободи-
ли непреднамеренно неинициализированные данные.

     Данные вопросы иллюстрируются  файлом-примером COMPROPG.ASM,
который можно найти на дистрибутивных дисках Турбо Ассемблера.

      Чтобы сформировать программу COM, используйте утилиту MAKE.
В формирующем файле MAEKFILE следует указать все модули,  с кото-
рыми компонуется программа, например:

     COMPROG.COM:  COMPROG.OBJ
        TLINK COMPROG;
     COMPROG.OBJ: COMPROG.ASM
        TASM COMPROG

                     Программы Windows
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Турбо Ассемблер  можно  использовать для создания прикладных
программ Windows.  Windows может работать либо в реальном  режиме
(на всех процессорах 8086) или в защищенном режиме (на процессоре
80286 и старше). Таким образом программа, написанная для Windows,
может работать  в защищенном режиме.  С помощью директив CODESEG,
DATASEG и UDATASEG следует аккуратно разделить код и данные и ис-
пользовать директиву  WARN  PRO,  чтобы отмечать любые проблемы с
доступом, которые могут возникать во время ассемблирования. Нако-
нец, в программах защищенного режима не следует пытаться устанав-
ливать сегментные регистры в вычисленные значения параграфов сег-
мента. Значениями  сегментов  в  защищенном  режиме  не  являются
адреса параграфов. Вместо этого используются дескрипторы, которые
не имеют смысла в прикладной программе.

     Кроме Турбо Ассемблера и Турбо отладчика для создания эффек-
тивных прикладных программ Windows требуются другие  средства.  В
частности, вы  должны  располагать компилятором Borland C++ (либо
Microsoft C  2.6 и Windows Software Dewelopment Kit).  Прикладные
программы Windows обычно требуют наличия утилиты-компилятора  ре-
сурсов (RC) этих пакетов.  Должны быть также доступны стандартные
библиотеки.  В Windows  также  необходим  компоновщик  (например,
TLINK) и утилита построения программ (например, MAKE).

     Данное приложение содержит простейшие рекомендации по созда-
нию прикладных программ Windows и динамически компонуемых библио-
тек (DLL). Более полное описание прикладных программ Windows мож-
но найти  в  "Руководстве  пользователя по С++" и соответствующей
документации по Windows.

   Замечания по динамически компонуемым библиотекам Windows
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     Динамически компонуемая  библиотека (DLL) представляет собой
группу процедур,  которую вы можете вызывать из прикладных  прог-
рамм Windows. Библиотеки DLL расширяют интерфейс прикладных прог-
рамм Windows.

     Библиотеки DLL выполняют множество функций. Например, вы мо-
жете в  DLL  неинтерактивные  программы DOS.  С помощью DLL можно
добавить новые средства работы с экраном.

     На дистрибутивном диске Турбо Ассемблера можно  найти пример
программы с именем DLLPROG.ASM, который иллюстрирует DLL.

     Для построения DLL можно использовать утилиту MAKE. Формиру-
ющий файл должен включать в себя все модули, которые должны  ком-
поноваться с DLL, например:

     dllprog.dll: dllprog.obj dllprog.def
        TLINK dllprog,,,,dllprog
        RC dllprog.dll

     dllprog.obj: dllprog.asm
        TASM dllprog

     Данный процесс построения требует наличия  следующего  файла
определений компоновщика DLLPROG.DEF:

     LIBRARY DLLPROG
     EXETYPE WINDOWS
     CODE    PRELOAD MOVEABLE DISCARDABLE   ; CODE применяется к
                                            ; сегментам _TEXT или
                                            ; в классе CODE
     DATA    PRELOAD MOVEABLE SINGLE        ; DATE применяется ко
                                            ; всем сегментам в
                                            ; группе DGROUP и в
                                            ; классе DATA
                                            ; (должен быть
                                            ; SINGLE для всех DLL
     HEAPSIZE 0

        Замечания по прикладным программам Windows
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Прикладная программа Windows  во  многом  аналогична  DLL  с
единственной процедурой   с   именем  WinMain.  Windows  вызывает
WinMain для запуска процедуры.  Прикладная программа имеет обычно
стандартную структуру,  которая  позволяет ей взаимодействовать с
графической операционной средой Windows.

     Пример прикладной программы  Windows  можно  найти  в  файле
WINPROC.ASM на  дистрибутивных дисках Турбо Ассемблера.  В данном
примере для вывода сообщения на экран используются функциональные
возможности, обеспечиваемые предыдущим примером DLL.

     Для построения прикладной программы Wiondows можно использо-
вать утилиту MAKE.  При этом в формирующем файле следует  указать
все модули, компонуемые с данной прикладной программой:

     winproc.exe: winprog.obj winprog.def winprogg.res
        TLINK winprog,,,,winprog
        RC winprog.res

     winproc.res:winproc.rc
        RC -r winproc.rc

     winproc.obj: winprog.asm winprog.inc
        TASM winprog

     Этот процесс  построения  требует  использования  следующего
файла определений компоновщика WINPROG.DEF:

     NAME            WINPROG
     EXETYPE         WINDOWS
     CODE            MOVEABLE DISCARDABLE
     DATA            MOVEABLE MULTIPLE DISCARDABLE
     STACKSIZE 5120                  ; минимум для прикладных
                                     ; программ Windows

     ;-----------------------------------------------------------
     ; Определить импортируемые функции. (Это не обязательно, ес-
     ; ли вы  выполняете компоновку с  библиотекой  импорта  типа
     ; IMPORT.LIB или LIBW.LIB.)
     ;-----------------------------------------------------------
     IMPORTS  DLLPROG.SetHello

 Приложение B. Обзор синтаксических правил Турбо Ассемблера
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В этом приложении для описания  синтаксиса  выражений  Турбо
Ассемблера, используется   модифицированная   форма  Бекуса-Наура
(BNF). Символ ::= описывает синтаксический  результат.  Далее  во
всех разделах многоточие (...) означает,  что предшествующий эле-
мент может быть повторен любое число  раз.  В  данном  приложении
описываются также ключевые слова и их старшинство.

                   Лексическая грамматика
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

допустимая_строка ::=
      пропуск допустимая_строка
      знак_пунктуации допустимая_строка
      числовая_строка допустимая_строка
      идентификатор_строки допустимая_строка
      нуль

пропуск ::=
      символ_пробела пропуск
      символ_пробела

символ_пробела ::=
      все управляющие символы, символы > 128, ' '

идентификатор_строки ::=
      идентификатор_символа идентификатор_строки_2

идентификатор_строки_2 ::=
      идентификатор_символа_2 идентификатор_строки_2
      нуль

идентификатор_символа ::=
      $,%,_,?,символы алфавита

идентификатор_символа_2 ::=
      идентификатор_символов плюс цифры

числовая_строка ::=
      числ_строка
      стр_строка

числ_строка ::=
      цифры буквенно_цифровые_символы
      цифры'.'цифры показатель_степени
      цифры показатель_степени ; Только в режиме MASM в директи-
                               ; вах DD, DQ и DT

цифры ::=
     цифра цифры
     цифра

цифра ::=
     от 0 до 9

алфавитно-цифровые_символы ::=
     цифра буквенно_цифровые_символы
     буква буквенно_цифровые_символы
     нуль

буква ::=
     буквы алфавита

показатель_степени ::=
     Е+цифры
     Е-цифры
     Ецифры
     нуль

стр_строка ::=
     строка в двойных кавычках; кавычка, вводимая двумя кавычками

знак_пунктуации ::=
      любой символ, отличный  от следующих:
       символ_пробела,идентификатор_символ,'"',"'" или цифры

     Символ точки  (.) трактуется различным образом в режиме MASM
и в режиме Ideal.  Этот символ не требуется указывать в числах  с
плавающей запятой в режиме MASM.  Точка не может входить в состав
символического имени в режиме Ideal. В режиме MASM с этого симво-
ла иногда начинаются символические имена,  кроме того, знак пунк-
туации используется иногда в качестве селектора поля структуры.

     Правила интерпретации точки (.):

     1. В режиме Ideal точка  всегда  интерпретируется  как  знак
         пунктуации.

     2. В  режиме MASM точка трактуется как первый символ иденти-
        фикатора в следующих случаях:

        а). Когда она является первым символом в строке и  в ряде
            некоторых  других  специальных случаев,  например,  в
            составе внешних (EXTRN) и общих (PUBLIC)  символичес-
            ких имен, она присоединяется к следующему за ней сим-
            волическому  имени,  если  следующий  за  ней  символ
            представляет  собой  идентификатор_символа_2,  как он
            определен выше.

        б). Если она не является первым символом  в  строке,  или
            если результирующее  имя  идентификатора будет предс-
            тавлять собой определенное имя  идентификатора, тогда
            точка присоединяется к началу следующего за ней иден-
            тификатора.

             Грамматика выражений в режиме MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Синтаксис выражений начинается как MASM_выражение.

MASM_выражение ::=
     выражение_1

м_выражение_1 ::=
     SHORT м_выражение_1
     .TYPE м_выражение_1
     SMALL м_выражение_1 (преобразование в 16-битовое смещение
                      [только для процессора 386])
     LARGE м_выражение_1 (преобразование в 32-битовое смещение
                      [только для процессора 386])
     м_выражение_2

м_выражение_2 ::=
     м_выражение_3 OR м_выражение_3...
     м_выражение_3 ХOR м_выражение_3...
     м_выражение_3

м_выражение_3 ::=
     м_выражение_4 AND м_выражение_4...
     м_выражение_4

м_выражение_4 ::=
     NOT м_выражение_4
     м_выражение_5

м_выражение_5 ::=
     м_выражение_6 'EQ' м_выражение_6...
     м_выражение_6 'NE' м_выражение_6...
     м_выражение_6 'LT' м_выражение_6...
     м_выражение_6 'LE' м_выражение_6...
     м_выражение_6 'GT' м_выражение_6...
     м_выражение_6 'GE' м_выражение_6...
     м_выражение_6

м_выражение_6 ::=
     м_выражение_7 '+' м_выражение_7...
     м_выражение_7 '-' м_выражение_7...
     м_выражение_7

м_выражение_7 ::=
     м_выражение_8 '*' м_выражение_8...
     м_выражение_8 '/' м_выражение_8...
     м_выражение_8 'MOD' м_выражение_8...
     м_выражение_8 'SHR' м_выражение_8...
     м_выражение_8 'SHL' м_выражение_8...
     м_выражение_8

м_выражение_8 ::=
     + выражение_8
     - выражение_8
     выражение_12

м_выражение_10 ::=
     OFFSET указатель
     SEG указатель
     SIZE идентификатор
     LENGTH идентификатор
     WIDTH идентификатор
     MASK идентификатор
     THIS цел_тип
     идентификатор
     ( указатель )
     [ указатель ]

м_выражение_10 ::=
     м_выражение_11 PTR м_выражение_10
     м_выражение_11
     OFFSET м_выражение_10
     SEG м_выражение_10
     LOW м_выражение_10
     HIGH м_выражение_10
     TYPE м_выражение_10
     THIS м_выражение_10

м_выражение_11 ::=
     м_выражение_8 : м_выражение_8...

м_выражение_12 ::=
     м_выражение_13  [м_выражение_13...(подразумеваемое сложение,
                                    только если есть '[' или '(')
     м_выражение_13  (м_выражение_13...(подразумеваемое сложение,
                                    только если есть '[' или '(')
     м_выражение_13'.'м_выражение_10

м_выражение_13 ::=
     LENGTH идентификатор
     SIZE идентификатор
     WIDTH идентификатор
     MASK идентификатор
     ( м_выражение_1 )
     [ м_выражение_1 ]
     м_выражение_10

             Грамматика выражений в режиме Ideal
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Синтаксис начинается, как id_выражение.

id_выражение ::=

указатель

i_тип ::=
     UNKNOWN
     BYTE
     WORD
     DWORD
     FWORD
     QWORD
     PWORD
     TBYTE
     SHORT
     NEAR
     FAR
     PROC
     DATAPTR
     CODEPTR
     имя_структуры
     имя_таблицы
     имя_перечисления
     имя_записи
     TYPE указатель

указатель ::=
     SMALL указатель               ; если 386
     LARGE указатель               ; если 386
     i_тип PTR указатель
     i_тип LOW указатель
     i_тип HIGH указатель
     i_тип указатель
     указатель_2

указатель_2 ::=
     указатель_3.идентификатор (Операция выбора элемента
                                  структуры)
     указатель_3

указатель_3 ::=
     выражение:указатель_3
     выражение

выражение ::=
     SYMTYPE выражение (Операция определения типа символическо-
      го имени)
     выражение_2

выражение_2 ::=
     выражение_3 OR выражение_3...
     выражение_3 ХOR выражение_3...
     выражение_3

выражение_3 ::=
     выражение_4 AND выражение_4...
     выражение_4

выражение_4 ::=
     NOT выражение_4
     выражение_5

выражение_5 ::=
     выражение_6 ЕQ выражение_6...
     выражение_6 NE выражение_6...
     выражение_6 LT выражение_6...
     выражение_6 LE выражение_6...
     выражение_6 GT выражение_6...
     выражение_6 GE выражение_6...
     выражение_6

выражение_6 ::=
     выражение_7 + выражение_7...
     выражение_7 - выражение_7...
     выражение_7

выражение_7 ::=
     выражение_8 * выражение_8...
     выражение_8 / выражение_8...
     выражение_8 MOD выражение_8...
     выражение_8 SHR выражение_8...
     выражение_8 SHL выражение_8...
     выражение_8

выражение_8
     +выражение_8
     -выражение_8
     выражение_9

выражение_9
     HIGH выражение_9
     LOW выражение_9
     выражение_10

выражение_10
     OFFSET указатель
     SEG указатель
     SIZE идентификатор
     LENGTH идентификатор
     WIDTH идентификатор
     MASK идентификатор
     THIS идентификатор
     идентификатор
     константа
     ( указатель )
     [ указатель ]  (Всегда означает "содержимое..")

               Старшинство ключевых слов
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Важно понимать, как Турбо Ассемблер распознает строки исход-
ного текста. Это позволит вам избежать записи кода, который может
привести к  непредсказуемым  результатам.  Рассмотрим,  например,
следующий фрагмент программы:

     NAME SEGMENT

     Если вы  записали эту строку,  рассчитывая открыть сегмент с
именем NAME,  то будете разочарованы. Турбо Ассемблер  распознает
ключевое слово NAME раньше,  чем SEGMENT,  называя ваш код именем
SEGMENT.

     В общем случае определяет значение строки на  основе  первых
двух символов строки. Самый левый символ находится в первой пози-
ции, а символ справа от него находится во второй позиции.

             Старшинство операций в режиме Ideal
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В режиме  Ideal  применяются  следующие  правила старшинства
операций:

     1. Наивысший приоритет (приоритет 1) имеют все ключевые сло-
        ва в первой позиции строки. Они проверяются первыми.

     2. Ключевые слова на второй позиции строки имеют второй при-
        орите и рассматриваются во вторую очередь.

             Старшинство операций в режиме MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Правила синтаксического  анализа  строк в режиме MASM значи-
тельно более сложны, чем в режиме Ideal. Вместо двух здесь имеет-
ся три уровня приоритета:

     1. Наивысший приоритет (приоритет 1) присваивается отдельным
        ключевым словам в первой позиции (таким как NAME и %OUT).

     2. Следующий по старшинству приоритет  (приоритет  2)  имеют
        все идентификаторы, обнаруженные на второй позиции.

     3. Все другие ключевые слова в первой позиции имеют наимень-
        ший (третий) приоритет.

           Примечание: Внутри определений структур Турбо  Ассемб-
      лер  интерпретирует ключевые слова приоритета 1 как приори-
      тет 3. В этом случае ключевые слова приоритета 2 имеют выс-
      ший приоритет.

     Например, в следующем фрагменте кода:

     NAME SEGMENT

NAME -  это  ключевое  слово  первого  приоритета,  а  SEGMENT  -
ключевое слово второго приоритета. Таким образом, Турбо Ассемблер
будет интерпретировать эту строку,  как директиву NAME,  а не как
директиву SEGMENT. В другом примере:

     MOV INSTR,1

MOV - ключевое слово приоритета 3, а INSTR - ключевое слово прио-
ритета 2. Таким образом, Турбо Ассемблер интерпретирует эту стро-
ку как инструкцию INSTR,  а не как инструкцию MOV (как вы  можете
предполагать).

      Ключевые слова и предопределенные идентификаторы
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В данном разделе приведен полный перечень всех ключевых слов
Турбо Ассемблера. Значение в скобках после ключевых слов указыва-
ют их приоритет (1 или 2) в режиме MASM.  Приоритет для  ключевых
слов указан только, если он имеет значение 1 или 2. Для всех дру-
гих ключевых слов подразумевается приоритет  3.  Турбо  Ассемблер
распознает ключевые  слова  только в том случае,  если он находит
их. В режиме MASM ключевые слова приоритета 1 или 3 всегда  нахо-
дятся в первой позиции, а ключевые слова приоритета 2 - во второй
позиции. Символ M после ключевого слово указывает, что оно допус-
тимо только для режима MASM,  а I показывает ключевое слово, дос-
тупное только в режиме Ideal.  Если буква не указана, то ключевые
слова работают в обоих режимах. Номер после ключевого слова пока-
зывает приоритет.

               Ключевые слова директив
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В следующем  списке  содержатся  все ключевые слова директив
Турбо Ассемблера.  Ключевые слова группируются по  версиям  Турбо
Ассемблера, в которых они вводились.

     Следующие ключевые  слова  были  введены  в Турбо Ассемблере
версии 1.0.

       Ключевые слова Турбо Ассемблера 1.0 (VERSION T100)
                                                      Таблица B.1
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і    % (1)             %NOLIST           JZ             SETNLE  і
і    .186 (M)          NOLOCALS          LAHF           SETNO   і
і    .286 (M)          NOMASM51          LDS            SETNP   і
і    .286C (M)         %NOMACS           LEA            SETNS   і
і    .286P (M)         NOMULTERRS        LES            SETNZ   і
і    .287 (M)          NOSMART           LOCK           SETO    і
і    .386 (M)          %NOSYMS           LODS           SETP    і
і    .386C (M)         %NOTRUNCS         LODSB          SETPE   і
і    .386P (M)         NOWARN            LODSW          SETPO   і
і    .387 (M)          ORG               LOOP           SETS    і
і    .486 (M)          %OUT (1)          LOOPE          SETZ    і
і    .486C (M)         P186              LOOPNE         SHLD    і
і    .486P (M)         P286              LOOPNZ         SHRD    і
і    .8086 (M)         P286N             LOOPZ          STOSD   і
і    .8087 (M)         P286P             MOV            LOOPW   і
і    : (2)             P287              MOVS           LOOPWE  і
і    = (2)             P286              MOVSB          LOOPWNE і
і    ALIGN             P386N             MOVSW          LOOPWNZ і
і    .ALPHA            P386P             MUL            LOOPWZ  і
і    ARG               P387              NEG            F2XM1   і
і    ASSUME            P486              NOP            FABS    і
і    %BI               P486N             NOT            FADD    і
і    .CODE (M)         P8086             OR             FADDP   і
і    .CODESEG          P8087             OUT            FBLD    і
і    COMM (10)         PAGE              POP            FBSTP   і
і    COMMENT (1)       %PAGESIZE         PUSH           FCHS    і
і    %CONDS            %PCNT             PUSHF          FCLEX   і
і    CONST             PNO87             RCL            FCOM    і
і    .CONST (M)        %POPLCTL          RCR            FCOMP   і
і    .CREF (M)         PROC (2)          REP            FCOMPP  і
і    %CREF             %PUSHLCTL         REPE           FCOS    і
і    %CREFALL          PUBLIC (1)        REPNE          FDECSTP і
і    %CREFREF          PURGE             REPNZ          FDISI   і
і    %CREFUREF         QUIRKS            REPZ           FDIV    і
і    %CTLS             .RADIX (M)        RET            FDIVP   і
і    .DATA (M)         RADIX             RETF           FDIVR   і
і    .DATA? (M)        RECORD (2)        RETN           FDIVRP  і
і    DATASEG           REPT (1)          ROL            FENI    і
і    DB                .SALL (M)         ROL            FFREE   і
і    DD                SEGMENT (2)       SAHF           FIADD   і
і    %DEPTH            .SEQ (M)          SAL            FICOM   і
і    DF (2)            .SFCOND (M)       SAR            FICOMP  і
і    DISPLAY           SMART             SBB            FIDIV   і
і    DOSSEG            .STACK (M)        SCAS           FIDIVR  і
і    DP (2)            .STARTUP (M)      SCASB          FILD    і
і    DQ (2)            STRUC (2)         SCASW          FIMUL   і
і    DT (2)            SUBTTL (1)        SHL            FINCSTP і
і    DW (2)            %SUBTTL [Р        SHR            FINIT   і
і    ELSE (1)          %SYMS             STC            FIST    і
і    ELSEIF (1)        %TABSIZE          STD            FISTP   і
і    ELSEIF1 (1)       %TEXT             STI            FISUB   і
і    ELSEIF2 (1)       .TFCOND (M)       STOS           FISUBR  і
і    ELSEIFB (1)       TITLE (1)         STOSB          FLD     і
і    ELSEIFDEF (1)     %TITLE            STOSW          FLDCTW  і
і    ELSEIFDIF (1)     %TRUNC            SUB            FLDENV  і
і    ELSEIFDIFI (1)    UDATASEG          TEST           FLDLG2  і
і    ELSEIFE (1)       UFARDATA          WAIT           FLDLN2  і
і    ELSEIFIDN (1)     UNION (2)         WBINV          FLDL2E  і
і    ELSEIFIDNI (1)    USES              XCHG           FLDL2T  і
і    ELSEIFNB (1)      WARN              XLAT           FLDPI   і
і    ELSEIFNDEF (1)    .XALL (M)         XLATB          FLDZ    і
і    EMUL              .XCREF (M)        SOR            FMUL    і
і    END               .XLIST (M)        BOUND          FMULP   і
і    ENDIF (1)         USECS             ENTER          FNCLEX  і
і    ENDM              USEDS             INS            FNDSI   і
і    ENDP (2)          USESS             INSB           FNENI   і
і    ENDS (2)          USEES             INSW           FNINIT  і
і    EQU (2)           USEFS             LEAVE          FNOP    і
і    .ERR (1) (M)      USEFS             OUTS           FNSAVE  і
і    ERR               CATSTR (2)        OUTSB          FNSTCW  і
і    .ERR1 (1) (M)     INSTR (2)         OUTSW          FNSTENV і
і    .ERR2 (1) (M)     SIZESTR (2)       POPA           FNSTSW  і
і    .ERRB (1) (M)     SUBSTR (2)        PUSHA          FPATAN  і
і    .ERRDEF (1) (M)   AAA               ARPL           FPREM   і
і    .ERRDIF (1) (M)   AAD               CTLS           FPTAN   і
і    .ERRDIFI (1) (M)  AAM               LAR            FRNDINT і
і    .ERRE (1) (M)     AAS               LGDT           FRSTOR  і
і    .ERRIDN (1) (M)   ADC               LIDT           FSAVE   і
і    ERRIF             ADD               LLDT           FSCALE  і
і    .ERRDIF (1) (M)   AND               LMSW           FSQRT   і
і    .ERRDIFI (1) (M)  ARPL              LSL            FST     і
і    .ERRE (1) (M)     BSF               LTR            FSTCW   і
і    .ERRIDN (1) (M)   BSR               SGDT           FSTENV  і
і    ERRIF             BSWAP             SIDT           FSTP    і
і    ERRIF1            BT                SLDT           FSTSW   і
і    ERRIF2            BTC               SMSW           FSTSW   і
і    ERRIFB            BT                STR            FSUB    і
і    ERRIFDEF          BTR               VERR           FSUBP   і
і    ERRIFDIF          BTS               VERW           FSUBR   і
і    ERRIFDIFI         CALL              BSF            FSUBRP  і
і    ERRIFE            CBW               BSR            FTST    і
і    ERRIFDIDN         CDQ               BT             FUCOM   і
і    ERRIFDIDNI        CLC               BTC            FUCOMP  і
і    ERRIFNB           CLD               BTR            FUCOMPP і
і    ERRIFNDEF         CLI               BTS            FWAIT   і
і    .ERRIFNB (1) (M)  CLTS              CDQ            FXAM    і
і    .ERRIFDEF (1) (M) CMC               CMPSD          FXCH    і
і    .ERRNZ (1) (M)    CMP               CWDE           FXTRACT і
і    .EVEN             CMPS              INSD           FYL2X   і
і    EVENDATA          CMPS              IRETD          FYL2XP1 і
і    EXITM             CMPXCHG           IJECXZ         FSETPM  і
і    EXTRN (1)         CWD               LPS            FPCOS   і
і    .FARDATA          CWDE              LGS            FPREM1  і
і    FARDATA           DAA               LODSD          FPSIN   і
і    .FARDATA (M)      DAS               LOOPD          FPSINCOSі
і    .FARDATA? (M)     DEC               LOOPDE         FUCOM   і
і    GLOBAL (1)        DIV               LOOPDNE        FUCOMP  і
і    GROUP (2)         ESC               LOOPDNZ        FUCOMPP і
і    %INCL             HLT               LOOPDZ                 і
і    IDEAL             IDIV              LSS                    і
і    IF (1)            IMUL              MOVSD                  і
і    IF1 (1)           IN                MOVSX                  і
і    IF2 (1)           INC               MOVZX                  і
і    IFb (1)           INS               OUTSD                  і
і    IFDEF (1)         INT               POPAD                  і
і    IFDIFI (1)        INVO              POPFD                  і
і    IFE (1)           IRET              PUSHAD                 і
і    IFIDN (1)         JA                PUSHFD                 і
і    FIDNI (1)         JAE               SCASD                  і
і    IFNB (1)          JB                SETA                   і
і    IFNDEF (1)        JBT               SETAE                  і
і    %INCTL (1)        JCXZ              SETB                   і
і    INCLUD (1)        JE                SETBE                  і
і    INCLUDELIB (1)    JG                SETC                   і
і    IRP (1)           JGT               OUTSD                  і
і    IRPC (1)          JL                POPAD                  і
і    JUMPS             JLE               POPFD                  і
і    LABEL (2)         JNA               PUSHAD                 і
і    .LALL (M)         JNAE              PUSHFD                 і
і    .LFCOND (M)       JNB               SCASD                  і
і    %LINUM            JNBE              SETA                   і
і    %LIST             JNC               SETAE                  і
і    .LIST (M)         JNE               SETB                   і
і    LOCAL             JNG               SETBE                  і
і    LOCALS            JNGE              SETC                   і
і    MASM              JNL               SETE                   і
і    %MACS             JNLE              SETG                   і
і    MACRO (2)         JNO               SETGE                  і
і    MODEL             JNP               SETL                   і
і    .MODEL (M)        JNC               SETLE                  і
і    MULTERRS          JNP               SETNA                  і
і    NAME (1)          JNS               SETNAE                 і
і    %NEWPAGE          JNZ               SETNB                  і
і    %NOCONDS          JO                SETNBE                 і
і    %NNOCREF          JP                SETNC                  і
і    %NOCTLS           JPE               SETNE                  і
і    NOEMUL            JPO               SETNG                  і
і    %NOINCL           JS                SETNGE                 і
і    NOJUMPS           JUMP              SETNL                  і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     В Турбо Ассемблере версии 2.0  поддерживаются  все  ключевые
слова версии 1.0 со следующими дополнениями:

  Новые ключевые слова Турбо Ассемблера версии 2.0 (VERSION T200)
                                                      Таблица B.2
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і   BSWAP              P486              STARTUPCODE            і
і   CMPXCHG            P486N             WBINVD                 і
і   INVD               PUBLICDLL(I)      XADD                   і
і   INVLPG             RETCODE                                  і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     В Турбо Ассемблере версии 2.5  поддерживаются  все  ключевые
слова версии 2.0 со следующими дополнениями:

  Новые ключевые слова Турбо Ассемблера версии 2.5 (VERSION T250)
                                                      Таблица B.3
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і  ENTERD              LEAVED                                   і
і  ENTERW              LEAVEW                                   і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     В Турбо Ассемблере версии 3.0  поддерживаются  все  ключевые
слова версии 2.5 со следующими дополнениями:

  Новые ключевые слова Турбо Ассемблера версии 3.0 (VERSION T200)
                                                      Таблица B.4
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і  CLRFLAG             LARGESTACK        TBLINIT                і
і  ENUM(2)             SETFIELD          TBLINST                і
і  FASTIMUL            SETFLAG           TBLPTR                 і
і  FLIPFLAG            SMALLSTACK        TESTFLAG               і
і  GETFIELD            TABLE(2)          VERSION                і
і  GOTO(1)                               WHILE(1)               і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

             Приложение C. Вопросы совместимости
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Турбо Ассемблер в режиме MASM в высокой степени  совместим с
ассемблером MASM версии 5.2. Однако стопроцентная совместимость -
это идеал,  к которому можно только стремиться,  т.к.  формальная
спецификация  языка отсутствует,  и даже различные версии MASM не
полностью совместимы друг с другом.

     Для большинства программ замена MASM на Турбо  Ассемблер  не
повлечет  за  собой каких-либо осложнений.  В некоторых случаях в
Турбо Ассемблере появятся предупреждающие сообщения  и  сообщения
об ошибках там,  где их в MASM не было,  что обычно означает, что
ошибочный оператор не был выявлен макроассемблером  MASM.  Напри-
мер, MASM не обнаруживает ошибок в следующих операторах:

          abc  EQU  [BP+2]
               PUBLIC  abc

и генерирует бессмысленный объектный код.  В Турбо Ассемблере по-
добная конструкция, а также ряд других двусмысленных конструкций,
будут идентифицированы как ошибочные.

     Если при ассемблировании программы  пользователя  с  помощью
Турбо Ассемблера возникнут какие-либо затруднения, то можно попы-
таться использовать директиву QUIRKS.  Например,  если с  помощью
следующей командной строки:

          TASM /JQUIRKS  MYFILE

программа будет  ассемблирована правильно,  то следует добавить в
начало исходного файла директиву  QUIRKS.  Еще  лучше,  используя
сведения из этого приложения,  определить операторы,  для которых
требуется директива QUIRKS, и после этого переписать соответству-
ющие  строки исходного файла так,  чтобы отпала необходимость ис-
пользования директивы QUIRKS.

     Для максимальной совместимости с MASM  следует  использовать
директиву NOSMART и режим QUIRKS.

        Одно- и двухпроходные режимы ассемблирования
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В стандартном режиме Турбо Ассемблер выполняет ассемблирова-
ние  за один проход,  а MASM - за два прохода.  Поэтому Турбо Ас-
семблер - более быстрый ассемблер по сравнению с MASM. Однако од-
нопроходность  Турбо  Ассемблера может  привести  к некоторой его
несовместимости с MASM при разрешении ссылок вперед  и  обработке
конструкций, зависящих  от  прохода.  В TASM имеется параметр ко-
мандной строки (/m), с помощью которого можно задать число прохо-
дов.  Если требуется обеспечить максимум совместимости с MASM, то
нужно указать двухпроходный режим (/m2). (См. Главу 2, где данный
параметр обсуждается более подробно.)

     Использование данного параметра командной строки будет гене-
рировать режим,  совместимый с MASM (два прохода), когда присутс-
твуют следующие конструкции:

     - директивы IF1 и IF2;

     - директивы ERR1 и ERR2;

     - ссылки вперед с IFDEF и IFNDEF;

     - опережающие ссылки с операцией .TYPE;

     - рекурсивно определенные числа, такие, как

              NMBR=NMBR+1;

     - рекурсивно определенные текстовые макрокоманды или тексто-
       вые макрокоманды,  на которые имеются опережающие  ссылки,
       такие, как:

             LNAME   CATSTR   LNAME,<1>

     - макрокоманды, на которые имеются опережающие ссылки.

               Переменные операционной среды
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В Турбо Ассемблере не используются переменные среды для  оп-
ределения параметров, используемых по умолчанию, что отвечает об-
щему подходу фирмы Borland,  используемому при создании программ-
ных продуктов. Вместо этого параметры, используемые по умолчанию,
следует помещать в файл конфигурации,  и для  различных  проектов
создавать соответствующие им файлы конфигурации.

     Если при  использовании MASM для конфигурирования нужным об-
разом системы  использовались   переменные   операционной   среды
INCLUDE  или MASM,  то для использования той же программы с Турбо
Ассемблером нужно создать файл конфигурации.  Все  те  параметры,
которые  были  специфицированы,  используя переменную среды MASM,
нужно поместить непосредственно в  файл  конфигурации.  Каталоги,
указанные  переменной  INCLUDE,  помещаются в файл конфигурации с
помощью параметра /I командной строки.

Формат фирмы Microsoft для двоичных чисел с плавающей точкой
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В ранних  версиях макроассемблера MASM для чисел с плавающей
точкой по умолчанию использовался формат,  несовместимый с форма-
том  для  чисел с плавающей точкой стандарта IEEE.  В MASM версии
5.1 числа с плавающей точкой генерируются в формате IEEE, но име-
ется директива .MSFLOAT,  с помощью которой можно специфицировать
использование ранее использовавшегося формата фирмы Microsoft.

     В Турбо Ассемблере не поддерживается старый формат  чисел  с
плавающей точкой и, следовательно, .MSFLOAT является для него не-
допустимой директивой.

             Приложение D. Утилиты Турбо Ассемблера
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Турбо Ассемблер TASM предоставляет вам семь мощных  автоном-
ных  утилит.  Вы можете использовать их для файлов TASM,  а также
для любых других файлов.

     Это такие утилиты, как:

     ю MAKE (включая утилиту  TOUCH;  автономный  менеджер  прог-
       рамм);

     ю TLINK (компоновщик);

     ю TLIB (библиотекарь);

     ю TASMHELP (оперативный справочник);

     ю GREP (утилита поиска текста в файлах);

     ю OBJXREF  (утилита  для  работы  с перекрестными ссылками в
       объектных модулях);

     ю TCREF (утилита для работы с перекрестными ссылками);

     ю H2ASH (утилита-преобразователь файлов .h в файл .ash).

     Подробности об  использовании  утилит  MAKE,  TOUCH,  TLINK,
GREP, OBJXREF,  TASMHELP,  H2ASH  можно  узнать в документации по
компилятору. TASMHELP работает аналогично утилите THELP, описание
которой также  можно найти в документации по компилятору.  О том,
как использовать утилиту TCREF в текстовых файлах,  можно  узнать
файлах документации  на  дисках  Турбо Ассемблера.  Утилита H2ASH
также описывается в файлах на дисках Турбо  Ассемблера,  но  пос-
кольку это новая утилита,  мы подробнее коснемся ее в данном при-
ложении.

               Утилита-преобразователь H2ASH
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Модули Си  и С++ в программе обычно совместно используют оп-
ределение типов  и  структур  данных.  Это  делается  с   помощью
включения небольших файлов (файлов-заголовков),  которые содержат
определения типов и структуры данных,  используемые в  нескольких
модулях.  Файл  заголовка в Си/С++ имеет обычно имя с расширением
.H. Ассемблируемые модули обычно имеют файлы заголовков с расшире-
нием .ASH (или .INC).

     Программы, содержащие модули,  написанные на Си/С++ и модули
Турбо Ассемблера,  должны иметь возможность совместного определе-
ния типов и структур данных. Этому способствует утилита H2ASH.

     Утилита H2ASH  преобразует  файлы  заголовков Си/С++ в файлы
заголовков  языка  Ассемблера. Как и исходные файлы с расширением
.H полученные  в  результате файлы с расширением .ASH сами не со-
держат программу.  Если для вызова H2ASH вы используете следующий
синтаксис:

     H2ASH [[параметры] <имя_файла> [<имя_файла> ...]]

где каждое  поле "имя_файла" задает имя конвертируемого файла за-
головка. Утилита H2ASH предполагает, что преобразуемый файл имеет
по умолчанию расширение .H. Для каждого обрабатываемого файла со-
ответствующий выходной файл имеет расширение .ASH.

     "Параметры" соответствуют параметрам командной строки компи-
лятора Borland  C++,  а  также  специфическим  параметрам утилиты
H2ASH (которые соответствуют параметрам -q Турбо Ассемблера). См.
"Руководство пользователя  Bоrland C++" и оперативный справочник,
где можно найти описания данных параметров.

     Утилита H2ASH преобразует следующие конструкции:

     - все основные типы языка Си;

     - типы ENUM (в типы ENUM TASM);

     - #IFDEF (в эквивалентные IFDEF Ассемблера);

     - #DEFINE (в определения EQU);

     - структуры и объединения (в структуры и  объединения  Турбо
       Ассемблера);

     - структуры с битовыми полями (в записи Ассемблера RECORD);

     - классы  без  множественного наследования и без виртуальных
       базовых классов;

     - элементы классов;

     - переопределения операций.

     Утилита-преобразователь имеет следующие ограничения:

     - весь преобразуемый код игнорируется,  выполняемый  код  не
       генерируется;

     - директивы #INCLUDE в выходных файлах полностью расширяются;

     - в  выводе  Ассемблера может возникнуть конфликт имен,  так
       как правила области действия С++ существенно отличаются от
       правил Ассемблера (помочь здесь может использование режима
       Ideal);

     Преобразователь H2ASH не только облегчает организацию интер-
фейса между  С/С++ и языком Ассемблера (с максимальной производи-
тельностью). H2ASH  автоматически  преобразует  описания  базовых
классов С++ в эквивалентные объектные описания Ассемблера и опре-
деляет "нескорректированные" имена методов.  При записи  базового
класса на языке Ассемблера мы рекомендуем вам использовать следу-
ющую процедуру:

     1. Написать описание класса в файле заголовка языка Си.

     2. Включить описание файла заголовка Си во все классы-потом-
        ки и модули на языке Си,  которые используют этот базовый
        класс.

     3. Используйте преобразователь H2ASH для файла  заголовка  с
        целью получения  объектного  файла  заголовка  Ассемблера
        (этот процесс можно автоматизировать с помощью  формирую-
        щего файла).

     4. Включите  объектный  файл  заголовка Ассемблера в модуль,
        где записаны методы на языке Ассемблера.

     Более подробную информацию об утилите H2ASH  можно  найти  в
текстовых файлах документации на дисках Турбо Ассемблера.

             Приложение E. Сообщения об ошибках
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В данном приложении описаны все сообщения, генерируемые Тур-
бо  Ассемблером.  Обычно  сообщения выдаются на экран,  однако их
можно переадресовать в файл или на принтер с  помощью стандартных
средств DOS переадресации потоков, т.е. надо указать имя устройс-
тва или файла с предшествующим ему  символом  "больше  чем"  (>).
Например:

                TASM MYFILE > ERRORS

     В Турбо Ассемблере генерируются сообщения следующих типов:

     - информационные сообщения;
     - предупреждающие сообщения;
     - сообщения об ошибках;
     - сообщения о фатальных ошибках.

                  Информационные сообщения
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Турбо Ассемблер обычно выводит два информационных сообщения.
Во-первых,  всегда выдается информационное  сообщение  непосредс-
твенно  перед началом ассемблирования пользовательского исходного
файла (или файлов). Кроме того, выдается информационное сообщение
по окончании ассемблирования каждого файла. Пример информационно-
го сообщения, выдаваемого при запуске Турбо Ассемблера:

Turbo Assembler Version 3.0 Copyright(C) 1991 Borland
                         International Assembling file: TEST.ASM

(Турбо Ассемблер, версия 3.0, продукт фирмы Borland, 1991г.)

     По окончании  ассемблирования исходного файла выдается сооб-
щение с краткой характеристикой процесса ассемблирования. Это со-
общение выглядит следующим образом:

        Error messages: None
        Warning messages: None
        Passes: 1
        Remaining memory: 279K

        (Сообщения об ошибках: Нет
        Проходов: 1
        Предупреждающие сообщения: Нет
        Осталось памяти: 279Кб)

     Подавить все  информационные сообщения можно с помощью пара-
метра командной строки /T.  Информационные сообщения  подавляются
только в случае отсутствия ошибок в процессе ассемблирования. При
наличии ошибок параметр /T никакого влияния не имеет: стандартные
информационные сообщения будут выданы в начале и в конце процесса
ассемблирования.

      Предупреждающие сообщения и сообщения об ошибках
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Предупреждающие сообщения  выдаются для информирования поль-
зователей о возможных нежелательных  последствиях ассемблирования
оператора  исходного  файла.  Предупреждающее сообщение выдается,
например,  в тех случаях, когда использование Turbo Assembler ка-
кого-либо,  вообще говоря, допустимого умолчания может привести к
некорректным результатам. Рекомендуется обязательно проанализиро-
вать причины предупреждающих сообщений,  чтобы не допустить гене-
рации неверного кода. Наличие этих сообщений не влияет на генера-
цию  объектного  кода Turbo Assembler.  Предупреждающие сообщения
имеют следующий формат:

            **Warning** имя_файла(номер_строки) сообщение

     Если предупреждающее сообщение выдается во  время расширения
макрокоманды или блока повторения,  то оно будет содержать допол-
нительную информацию:  имя макрокоманды и номер строки,  при  ас-
семблировании которой возникло это сообщение. Предупреждающее со-
общение в этом случае имеет следующий формат:

      **Warning** имя_файла(номер_строки)
           имя_макрокоманды(номер_строки_в_макрокоманде)сообщение

     В отличие от предупреждающих сообщений,  появление сообщений
об ошибках означает,  что объектный код Турбо Ассемблер генериро-
вать не будет, хотя процесс ассемблирования будет доведен до кон-
ца. Типичное сообщение об ошибке имеет следующий формат:

            **Error** имя_файла(номер_строки) сообщение

     Если сообщение об ошибке выдается во время расширения макро-
са  или блока повтора,  то оно будет содержать дополнительную ин-
формацию: имя макрокоманды и номер  строки,  при  ассемблировании
которой возникло это сообщение. Сообщение об ошибке в этом случае
имеет следующий формат:

        **Error** имя_файла(номер_строки)
           имя_макрокоманды(номер_строки_в_макрокоманде)сообщение

     Далее в алфавитном порядке приводятся тексты предупредитель-
ных сообщений и сообщений об ошибках:

   32-bit segment not allowed without .386
      (32-битовые флаги без директивы .386 не допускаются)

     Это средство расширено.  Теперь в операторе .MODEL можно за-
давать USE32 и LARGESTACK.  Ранее это было сообщение  "USE32  not
allowed without .386").

   Argument needs type override
     (Требуется явно указать тип операнда)

     Требуется явно указать размер,  или тип,  выражения, т.к. он
не может быть определен из контекста. Например, ошибочной являет-
ся следующая команда:

       mov [bx],1

     Ошибки такого  рода обычно корректируются с помощью операции
PTR, позволяющей установить размер операнда:

      mov WORD PTR[bx],1

   Argument to operation or instruction has illegal size
     (Операнд операции или команды имеет недопустимый размер)

     В операции  указан  операнд,  имеющий тип,  недопустимый для
данной операции. Например:

      Q LABEL QWORD
      QNOT = NOT Q ; операнд операции отрицания не может
                   ; иметь тип QWORD

   Arithmetic overflow
     (Арифметическое переполнение)

     Потеря значащих цифр при вычислении значения выражения. Нап-
ример:

      X = 20000h * 20000h ; результат занимает более 32 бит

     Точность всех арифметических операций - 32 бита.

   ASSUME must be segment register
     (В директиве ASSUME должен быть указан сегментный регистр)

     В директиве ASSUME можно указывать только сегментные регист-
ры, во всех остальных случаях выводится данное сообщение об ошиб-
ке. Например, ошибочной является директива:

       ASSUME ax:CODE

   Bad keyword in SEGMENT statement
     (Неверное ключевое слово в операторе SEGMENT)

     Один из параметров директивы SEGMENT:  тип выравнивания, тип
объединения или тип сегмента имеет недопустимое значение.  Напри-
мер:

      DATA SEGMENT PAFA PUBLIC ; вместо PARA указано PAFA

   Can't add relative quantities
     (Нельзя складывать относительные адреса)

     Выражение содержит операцию сложения двух адресов, что явля-
ется бессмысленной операцией. Например:

      ABC   DB  ?
      DEF   =  ABC  +  ABC  ; ошибка: нельзя складывать
                            ; два относительные адреса

     Можно вычитать относительные адреса. Можно добавить констан-
ту к относительному адресу, например:

      XYZ DB 5 DUP(0)
      XYZEND EQU $
      XYZLEN = SYZEND - XYZ    ; совершенно верно
      XYZ2 = XYZ + 2           ; тоже верно

   Can't address with currently ASSUMEd segment registers
     (Невозможна адресация  из текущих,  установленных директивой
     ASSUME, сегментных регистров)

     В выражении содержится ссылка на переменную,  для доступа  к
которой не специфицирован сегментный регистр. Например:

     DSEG SEGMENT
     ASSUME ds:DSEG
     mov si,MPTR ; не определен сегментный регистр, который
                 ; обеспечил бы доступ к сегменту XSEG
     DSEG ENDS
     XSEG SEGMENT
     MPTR DW ?
     XSEG ENDS

   Can't convert to pointer
     (Невозможно преобразование в указатель)

     Часть выражения  не  может быть преобразована в указатель на
память,  например, с помощью операции PTR:

          mov cl,[BYTE PTR al] ; AL нельзя преобразовать
                               ; в указатель

   Can't emulate 8087 instruction
     (Невозможна эмуляция команд сопроцессора 8087)

     В Турбо Ассемблере параметром командной строки /E либо с по-
мощью директивы EMUL установлен режим генерации эмулированных ко-
манд арифметики с плавающей точкой, однако текущая команда не мо-
жет быть эмулирована. Например:

      EMUL
      FNSAVE [WPTR]  ; эта команда не может быть эмулирована

     Некоторые команды не поддерживаются эмуляторами арифметики с
плавающей точкой.  Это команды FNSAVE, FNSTCW, FNSTENV и FNSTSW.

   Can't make variable public
     (Переменная не может быть объявлена как PUBLIC)

     Переменная была  уже ранее объявлена таким образом,  что уже
не может быть определена как общая (PUBLIC). Например:

     EXTRN ABC:NEAR
     PUBLIC ABC    ; ошибка: ABC уже ранее объявлена
                   ; с атрибутом EXTRN

   Can't override ES segment
     (Нельзя переопределить сегмент ES)

     В текущем операторе указан регистр, использование которого в
данной команде недопустимо. Например:

     STOS DS:BYTE PTR[di]

     В команде  STOS  для определения целевого адреса допускается
использовать только регистр ES.

   Can't subtract dissimilar relative quantities
     (Недопустимое вычитание относительных адресов)

     Выражение содержит операцию вычитания двух  адресов, которая
для данных адресов является недопустимой.  Данное сообщение выда-
ется, например, в том случае, если адреса находятся в разных сег-
ментах. Например:

     SEG1
     SEGMENT
  A: SEG1
     ENDS
     SEG2
     SEGMENT B:
     mov ax,B-A ; недопустимо, поскольку A и В находятся
                ; в разных сегментах
     SEG2 ENDS

   Can't use macro name in expression
     (Недопустимо использование  имени  макрокоманды  в  качестве
     операнда выражения)

     Имя макрокоманды указано в качестве операнда выражения. Нап-
ример:

     MyMac MACRO
       ENDM
       mov ax,MyMac   ; ошибка!

   Can't use this outside macro
     (Использование данного  оператора недопустимо вне макроопре-
     деления)

     Вне макроопределения указана директива,  которую допускается
использовать  только внутри макроопределений.  К таким директивам
относятся, например, ENDM и EXITM. Например:

     DATA SEGMENT
       ENDM  ; ошибка: вне макроопределения недопустимо

   Code or data emission to undeclared segment
     (Не объявлен сегмент для кода или данных)

     Оператор, генерирующий код или данные, не принадлежит ни од-
ному из сегментов, объявленных директивами SEGMENT. Например:

     ; Первая строка файла
       inc bx   ; ошибка: не определен сегмент
       END

     Генерировать данные  или код можно только внутри какого-либо
сегмента.

   Constant assumed to mean Immediate const
     (Константа интерпретируется как непосредственная)

     Это предупреждающе  сообщение  выдается  для  выражений типа
[0].  В режиме MASM это выражение интерпретируется как непосредс-
твенная константа, равная 0. Например:

     mov ax,[0]; означает mov ax,0, а не mov ax,ds:[0]

   Constant too large
     (Слишком большая константа)

     Константа имеет, вообще говоря, правильный формат, однако ее
значение превышает допустимую для данного режима величину. Напри-
мер,  числа,  большие 0ffffh, можно использовать, если только ди-
рективой  .386/.386P  или .486/.486Р разрешены команды процессора
386 или i486.

   CS not correctly assumed
     (Некорректное значение в регистре CS)

     Адрес назначения в командах ближнего вызова и ближнего пере-
хода не может находиться в другом сегменте. Например:

      SEG1 SEGMENT
      LAB1 LABEL NEAR
      SEG1 ENDS
      SEG2 SEGMENT
      JMP  LAB1   ; ошибка: неверный сегментный адрес
      SEG2 ENDS

     Такие ошибки возникают только в режиме MASM.  В режиме Ideal
такие переходы и вызовы интерпретируются корректно.

   CS override in protected mode
     (Переопределение регистра CS в защищенном режиме)

     В защищенном  режиме  ассемблирования команд процессора 286,
386 или i486,  установленном директивой Р286Р, P386P или Р486Р, в
текущей  команде требуется переопределение регистра CS. Например:

     P286
     .CODE
CVAL DW ?
     mov CVAL,1 ; генерирует переопределение регистра CS

     Это предупреждающее сообщение  выдается,  если  в  командной
строке указан параметр /Р. В защищенном режиме команды, в которых
переопределяется регистр CS, не будут выполняться без специальных
подготовительных операций.

   CS unreachable from current segment
     (CS недостижим из текущего сегмента)

     При определении метки кода с помощью двоеточия (:) или с по-
мощью  директив LABEL или PROC сегментный регистр не указывает на
текущий кодовый сегмент или группу,  содержащую  текущий  кодовый
сегмент. Например:

     PROG1  SEGMENT
         ASSUME CS:PROG2
     START:    ; ошибка: неверно установлен регистр CS

     Такие ошибки возникают только в режиме MASM.  В режиме Ideal
такие переходы и вызовы обрабатываются корректно.

   Declaration needs name
     (В директиве объявления не указано имя)

     Не указано имя идентификатора в директиве,  для которой спе-
цификация имени является обязательной. Например:

       PROC ; ошибка: в директиве PROC указание имени обязательно
              ret
       ENDP

     В директивах объявления,  таких как SEGMENT, PROC или STRUC,
обязательно должно быть указано имя идентификатора. В режиме MASM
имя указывается перед именем директивы,  а в режиме Ideal - после
имени директивы.

   Directive ignored in Turbo Pascal model
     (В режиме TPASCAL директива игнорируется)

    В модуле Ассемблера,  предназначенном для интерфейса с  Турбо
Паскалем, используется недопустимая директива. Режим интерфейса с
Турбо Паскалем специфицируется директивой .MODEL.  Более подробно
интерфейс с Турбо Паскалем обсуждается в Главе 19.

   Directive not allowed inside structure definition
     (Недопустимая директива внутри определения структуры)

     Внутри блока определения структуры указана недопустимая  ди-
ректива. Например:

       X STRUC
       MEM1 DB ?
          ORG $+4   ; ошибка: директиву ORG нельзя указывать
                    ; внутри структуры
       MEM2 DW ?
       ENDS

     При определении вложенных структур нельзя  определять  новые
структуры на внутренних уровнях. Например:

      F00 STRUC
         F002 STRUC  ; ошибка: определена новая структура
         ENDS
      ENDS

     Для того  чтобы  использовать  одну  структуру внутри другой
структуры,  нужно сначала определить первую  структуру,  а  после
этого во второй структуре можно указывать имя первой.

   Duplicate dummy arguments:_
     (Недопустимо использование  одинаковых  имен  для формальных
     параметров)

     В директиве MACRO определено несколько формальных параметров
с одинаковыми именами. Например:

      XYZ   MACRO  A,A   ; ошибка: дублируются  имена
                         ; формальных параметров
         DB A
         ENDM

     Все формальные параметры макроопределения должны иметь  раз-
личные имена.

   ELSE or ENDIF without IF
     (ELSE или ENDIF без IF)

     Для директивы ELSE или ENDIF нет парной директивы IF,  обоз-
начающей начало условно ассемблируемого блока. Например:

     BUF DB 10 DUP(?)
       ENDIF   ; ошибка: нет парной директивы IFxxx

   Expecting METHOD keyword
     (Требуется ключевое слово METHOD)

     В расширенном структурном операторе для определения объектов
после порождающего объекта требуется ключевое слово METHOD.

   Expecting offset quantity
     (Требуется  указать величину смещения)

     В качестве  операнда  выражения  указано  неверное  значение
вместо ожидаемого смещения внутри сегмента. Например:

     CODE SEGMENT
       mov ax,LOW CODE
     CODE ENDS

   Expecting offset or pointer quantity
     (Требуется  указать смещение или указатель)

     В качестве  операнда  выражения  указано  неверное  значение
вместо  ожидаемого  смещения  внутри специфицированного сегмента.
Например:

      CODE SEGMENT
         mov ax,SEG CODE  ; ошибка: СODE - это сегмент,
                          ; а не адрес внутри сегмента
      CODE ENDS

   Expecting pointer type
     (Операнд должен быть указателем)

     Операндом текущей  команды должен быть адрес памяти.  Напри-
мер:

     LES di,4 ; неверно, т.к. 4 - константа

   Expecting record field name
     (Требуется имя поля записи)

     Вы использовали  инструкцию SETFIELD или GETFIELD без после-
дующего имени поля.

   Expecting register ID
     (Требуется идентификатор регистра)

     В части USES оператору CALL...METHOD требуются имена регист-
ров.

   Expecting scalar type
     (Операнд должен быть константой)

     Операндом текущей команды должна быть константа. Например:

     BB  DB  4
       rol ax,BB   ; ошибка: вторым операндом операции ROL
                   ; должна быть константа

   Expecting segment or group quantity
     (Должно быть указано имя сегмента или группы)

     В операторе вместо имени сегмента или  группы  указано  имя,
которое таковым не является. Например:

         DATA SEGMENT
            ASSUME ds:F00  ; ошибка: F00 не является именем
                           ; сегмента или группы
         F00 DW 0
         DATA ENDS

   Extra characters on line
     (Лишние символы в строке)

     Выражение имеет корректный синтаксис,  однако вслед за  ним,
на той же строке имеются еще лишние символы. Например:

      ABC = 4 shl 3   3   ; нет знака операции
                          ; между двумя тройками

     Данная ошибка обычно является следствием  другой  ошибки,  в
результате которой анализатор выражений преждевременно заканчива-
ет обработку выражения.

   Forward reference needs override
     (Ошибка при использовании умолчания для ссылки вперед)

     В результате  использования умолчания для ссылки вперед было
зарезервировано меньше памяти,  чем это оказалось необходимо. Эта
ошибка возникает  тогда,  когда имя идентификатора,  по умолчанию
означающее адрес ближнего перехода или вызова, переопределяется в
программе  как  дальний  адрес.  Эта ошибка возникает также в тех
случаях,  когда не указан сегмент (отличный от предполагаемого по
умолчанию) для доступа к переменной. Например:

      ASSUME cs:DATA
      call A         ; по умолчанию - ближний вызов
   A PROC FAR        ; а здесь переопределяется как дальний
      mov ax,MEMVAR  ; не известно, что требуется другой сегмент
   DATA  SEGMENT
         MEMVAR DW ? ; здесь ошибка: требуется переопределение

     Эти ошибки исправляются путем явного указания  сегмента  или
типа перехода FAR.

   Global type doesn't match symbol type
     (Тип, указанный в директиве GLOBAL не совпадает  с  действи-
     тельным типом имени идентификатора)

     Это предупреждающее сообщение выдается, если объявление сим-
волического имени директивой GLOBAL находится в том же самом сег-
менте, где определяется это имя идентификатора,  однако тип, ука-
занный в директиве GLOBAL,  не совпадает с  действительным  типом
этого имени идентификатора.

   ID not member of structure
     (Идентификатор не является полем структуры)

     В режиме Ideal после точки (селектора поля структуры) указа-
но имя идентификатора, которое не является именем поля структуры.
Например:

        IDEAL
     STRUC DEMO
        DB ?
     ENDS
     COUNT DW 0
        mov  ax,[(DEMO  bx).COUNT]  ; COUNT  не  является
                                    ; полем структуры

     После точки может быть указано только имя поля той  структу-
ры, имя которой указано перед точкой.

     Данная ошибка  обычно  является следствием другой ошибки,  в
результате которой анализатор выражений преждевременно заканчива-
ет обработку выражения.

   Illegal forward reference
     (Недопустимая ссылка вперед)

     Имя идентификатора, на которое происходит ссылка, еще не бы-
ло  определено,  а в соответствующей директиве не допускается ис-
пользовать ссылки вперед. Например:

     IF MYSYM   ; ошибка: MYSYM еще не определена
                ;
     ENDIF
     MYSYM EQU 1

     Ссылки вперед нельзя использовать в директивах вида IFxxx, а
также в качестве счетчика выражений в операции DUP.

   Illegal immediate
     (Недопустим непосредственный операнд)

     Команда содержит  непосредственный операнд (т.е.  константу)
там, где он недопустим. Например:

      mov 4,al

   Illegal indexing mode
     (Недопустимый режим индексации)

     Команда содержит операнд, использующий недопустимую комбина-
цию регистров. Например:

      mov al,[si+ax]

     Для всех процессоров, за исключением 80386, допустимыми ком-
бинациями индексных регистров являются следующие: BX, BP, SI, DI,
BX+SI, BX+DI, BP+SI, BP+DI.

   Illegal instruction
     (Недопустимая команда)

     Строка исходной программы начинается с имени идентификатора,
которое не является ни именем директивы,  ни мнемоникой  команды.
Например:

     move ax,4  ; должно быть "MOV"

   Illegal instruction for currently selected processor(s)
     (Недопустимая команда для выбранного в настоящий момент про-
     цессора (процессоров))

     Строка программы содержит команду, которая не может быть ас-
семблирована текущим процессором. Например:

       .8086
     PUSH   1234h   ; занесение в  стек непосредственного
                    ; операнда для  процессора 8086 не
                    ; допускается

     При ассемблировании  исходного файла с помощью Турбо Ассемб-
лера по умолчанию будут разрешены команды процессора  8086.  Если
желательно использовать расширенные мнемоники команд,  определен-
ные для процессоров 186/286/386,  то должна быть указана одна  из
директив,  разрешающих  использование  этих  команд (Р186,  Р286,
Р386).

   Illegal local argument
     (Недопустимый локальный параметр)

     В директиве  LOCAL  внутри макроопределения указан параметр,
не являющийся допустимым именем идентификатора. Например:

     X  MACRO
        LOCAL 123  ; это не идентификатор
        ENDM

   Illegal local symbol prefix
     (Недопустимый префикс для локальных имен идентификаторов)

     В директиве  LOCALS специфицируется недопустимый префикс для
локальных  имен идентификаторов. Например:

     LOCALS XYZ  ; ошибка: допускается только 2 символа

     Префикс локальных  идентификаторов  должен состоять ровно из
двух символов и представлять собой допустимое имя идентификатора.
Например,  допустимыми являются следующие комбинации:  __, @@ (по
умолчанию для локальных имен идентификаторов используется префикс
@ @).

   Illegal mаcro argument
     (Недопустимый параметр макрокоманды)

     В директиве  MACRO  для  формального  параметра макрокоманды
указано недопустимое имя идентификатора. Например:

     X  MACRO 123 ; недопустимый формальный параметр
        ENDM

   Illegal memory reference
     (Недопустима ссылка на память)

     Операнд команды содержит ссылку на адрес памяти,  что  недо-
пустимо для данного операнда. Например:

      mov [bx],BYTE PTR A   ; ошибка: недопустима пересылка
                            ; из памяти в память

     В данной команде оба операнда представляют собой адреса  па-
мяти, что недопустимо в команде mov. В командах семейства процес-
соров 80х86 только один из операндов может ссылаться на адрес па-
мяти.

   Illegal number
     (Недопустимое число)

     Число содержит один или более символов, недопустимых для чи-
сел данного формата. Например:

     Z = 0ABCGH

     Здесь G - недопустимый символ для шестнадцатиричных чисел.

   Illegal origin address
     (Недопустимый начальный адрес)

     Указан адрес, недопустимый для установки текущего сегментно-
го адреса ($).  Допускается указывать константу,  выражение,  ис-
пользующее счетчика адреса ($), или имя идентификатора из текуще-
го сегмента.

   Illegal override in structure
     (Недопустимое переопределение в структуре)

     Попытка инициализировать элемент структуры,  определенный  с
помощью операции DUP. Инициализировать можно только те члены, ко-
торые были объявлены без использования операции DUP.

   Illegal override register
     (Недопустимое переопределение регистра)

     В ссылке  на сегмент перед двоеточием был указан регистр, не
являющийся сегментным регистром. К сегментным регистрам относятся
следующие регистры: CS, DS, ES, SS, а также FS и GS для процессо-
ра 80386. Например:

       mov dx:XYZ,1   ; DX не является сегментным регистром

   Illegal radix
     (Недопустимое основание системы счисления)

     В директиве  .RADIX  в  качестве основания системы счисления
указано недопустимое число. Например:

     .RADIX 7 ; неверно

     Основанием системы счисления могут быть следующие  числа: 2,
8, 10 и 16. Это число интерпретируется как десятичное, независимо
от текущего умолчания для основания системы счисления.

   Illegal register for instruction
     (Недопустимый регистр в инструкции)

     В качестве  источника  в  инструкции SETFIELD и GETFIELD ис-
пользован недопустимый регистр.

   Illegal register multiplier
     (Недопустимо указание множителя для регистра)

     Попытка умножить  регистр на какое-либо число,  что является
недопустимой операцией. Например:

     mov ax * 3,1

     Единственный случай, когда допускается умножение регистра на
константное выражение - это при определении масштабного индексно-
го операнда для процессора 80386.

   Illegal segment address
     (Недопустимый сегментный адрес)

     Это сообщение об ошибке выдается,  если для позиционирования
сегмента указывается значение адреса,  превышающее 65535.  Напри-
мер:

     F00 SEGMENT AT 12345h

   Illegal use of constant
     (Недопустимо использование константы)

     В выражении  используется  константа там,  где использование
константы недопустимо. Например:

       mov bx+4,5

   Illegal use of register
     (Недопустимо использование регистра)

     В выражении указывается имя регистра там,  где использование
регистра недопустимо. Например:

       X = 4 shl ax ; в операции SHL нельзя указывать регистры

   Illegal use of segment register
     (Недопустимо использование сегментного регистра)

     В выражении или команде указывается имя сегментного регистра
там,  где использование сегментного регистра недопустимо.  Напри-
мер:

      ADD SS,4      ; в команде ADD нельзя указывать
                    ; сегментные регистры

   Illegal USES register
     (В директиве USES указан недопустимый регистр)

     Указан недопустимый  регистр в командах PUSH и POP при входе
и выходе из процедуры. Допустимы следующие регистры:

      AX            CX               DS               ES
      BX            DI               DX               SI

     Если директивой  .386 или .386Р разрешены команды процессора
80386,  то можно указывать 32-битовые  эквиваленты  перечисленных
выше сегментов.

   Illegal version ID
     (Недопустимый идентификатор версии)

     Эта ошибка происходит,  когда в параметре /U или в операторе
VERSION выбирается недопустимая версия.

   Illegal warning ID
     (Недопустимый идентификатор предупреждающего сообщения)

     Введен неверный трехсимвольный идентификатор предупреждающе-
го сообщения. Список всех допустимых идентификаторов предупрежда-
ющих сообщений приведен в Главе 2.

   Instruction can be compacted with override
     (Возможно сокращение длины команды,  если явно  указать  тип
     имени)

     Из-за наличия ссылки вперед на имя идентификатора генерируе-
мый код содержит дополнительные команды NOP.  Для того чтобы сок-
ратить  код можно убрать ссылку вперед либо явно указать тип сим-
волического имени. Например:

      jmp X ; для этой команды будет выдано предупреждающее
            ; сообщение
      jmp SHORT X ; не будет выдано предупреждающего сообщения
  Х:

   Invalid model type
     (Недопустимая модель памяти)

     В директиве .MODEL для модели  памяти  указано  недопустимое
ключевое слово. Например:

     .Model GIGANTIC

     Для обозначения  моделей памяти допустимы следующие ключевые
слова: TINY, SMALL, COMPACT, MEDIUM, LARGE и HUGE.

   Invalid operand(s) to instruction
     (Недопустимый операнд(ы) для данной команды)

     В команде указана недопустимая комбинация операндов.  Напри-
мер:

      FADD ST(2), ST(3)

     В команде FADD только на один стековый  регистр  можно  ссы-
латься по имени, другой операнд должен быть вершиной стека.

   Labels can't start with numeric characters
     (Метки не могут начинаться с цифровых символов)

     Обнаружено имя, которое не является ни допустимым числом, ни
допустимым именем идентификатора. Например: 123XYZ.

   Line too long - truncated
     (Строка слишком длинная - производится усечение)

     Текущая строка исходного файла содержит более  255 символов.
Лишние символы игнорируются.

   Location counter overflow
     (Переполнение счетчика адреса)

     Текущий сегмент заполнен,  последующий код или данные затрут
начало сегмента. Например:

     ORG 0FFF0h
     ARRAY DW 20 DUP (0)   ; переполнение

   Method call requires object name
     (В вызове метода необходимо имя объекта)

     Оператор CALL...METHOD не может получить тип объекта из  эк-
земпляра указателя. Вы должны указать имя объекта.

   Missing argument list
     (Отсутствует список аргументов)

     В директиве IRP или IRPC,  определяющей блок повторения,  не
указан список аргументов для формального параметра. Например:

         IRP X    ; нет списка аргументов
            DB X
         ENDM

     В директивах IRP и IRPC обязательно должен быть указан  фор-
мальный параметр и список аргументов.

   Missing argument or <
     (Отсутствует аргумент, либо не указана угловая скобка <)

     Не указаны угловые скобки, либо вообще отсутствует выражение
в угловых скобках там, где оно необходимо. Например:

      if b  ; должно быть указано выражение в угловых
            ; скобках

   Missing argument size variable
     (Отсутствует переменная для размера блока параметров)

     В директиве ARG или LOCAL не указано имя идентификатора пос-
ле знака равенства в конце оператора. Например:

      ARG  A:WORD,B:DWORD=   ; ошибка, нет имени после знака=
      LOCAL X:TBYTE=         ; та же ошибка

     В директивах ARG и LOCAL после знака равенства, если он ука-
зан,  обязательно должно быть указано имя переменной для  размера
блока параметров.

   Missing COMM ID
     (Отсутствует идентификатор в директиве COMM)

     В директиве COMM не указано имя идентификатора перед  специ-
фикатором типа. Например:

     COMM NEAR     ; ошибка: отсутствует
                   ; имя идентификатора перед "NEAR"

     В директиве СОММ обязательно должно быть указано имя иденти-
фикатора. Имя идентификатора и спецификатор типа должны быть раз-
делены двоеточием (:).

   Missing dummy argument
     (Отсутствует формальный параметр)

     В директиве IRP или IRPC, определяющей блок повтора, отсутс-
твует формальный параметр. Например:

     IRP
        DB X   ; нет формального параметра
     ENDM

     В директивах IRP и IRPC обязательно должны быть указаны фор-
мальный параметр и список аргументов.

   Missing end quote
     (Отсутствует закрывающая кавычка)

     В конце строковой константы нет закрывающей кавычки.  Напри-
мер:

     DB  "abc        ; отсутствует кавычка в конце ABC
     mov al,'X       ; отсутствует кавычка после  Х

     Строковая константа должна оканчиваться той же кавычкой, ко-
торой она начинается.

   Missing macro ID
     (Отсутствует идентификатор макрокоманды)

     В директиве MACRO,  определяющей  макрокоманду,  отсутствует
имя. Например:

       MACRO   ; ошибка: не указано имя макрокоманды
        DB A
       ENDM

     Имя в определении макрокоманды указывать обязательно.

   Missing module name
     (Отсутствует имя модуля)

     В директиве NAME не указано имя модуля. Напомним, что дирек-
тива NAME действует только в режиме Ideal.

   Missing or illegal language ID
     (Отсутствует или неверно указан идентификатор языка)

     В директиве .MODEL неверно указан идентификатор языка.  Под-
робное описание  директивы  MODEL см.  в Главе 7 настоящего руко-
водства.

   Missing or illegal type specifier
     (Отсутствует или неверно указан спецификатор типа)

     В операторе  отсутствует или неверно указан обязательный па-
раметр - идентификатор типа (BYTE, WORD и т.д.) Например:

      RED LABEL XXX         ; ошибка: "ХХХ" не является
                            ; идентификатором типа

   Missing table member ID
     (Пропущен идентификатор элемента таблицы)

     В операторе   CALL...METHOD  после  ключевого  слова  METHOD
пропущено имя объекта.

   Missing term in list
     (Отсутствует член в списке параметров)

     В режиме Ideal в директиве,  допускающей указание нескольких
параметров (такой как EXTRN, PUBLIC и т.д.), отсутствует параметр
после одной из запятых,  отделяющих параметры друг от друга. Нап-
ример:

       EXTRN XXX:BYTE,,YYY:WORD

     В режиме  Ideal  параметры в любом списке всегда разделяются
только одной запятой, в конце списка запятой быть не должно.

   Missing text macro
     (Отсутствует текстовая макрокоманда)

     В директиве не указан обязательный параметр - текстовая мак-
рокоманда. Например:

     NEWSTR  SUBSTR          ; для SUBSTR должны быть
                             ; указаны параметры

   Model must be specified first
     (Сначала должна быть указана модель памяти)

     Использована одна  из  упрощенных  сегментных  директив  без
предварительной спецификации модели памяти. Например:

     .CODE     ; ошибка: сначала нужно указать директиву
               ; .MODEL

     Перед использованием упрощенных сегментных  директив  должна
быть указана с помощью директивы .MODEL модель памяти.

   Module is pass-dependant - compatibility pass was done
     (Модуль зависит от прохода.  Выполнен проход, обеспечивающий
     совместимость с MASM)

     Это предупреждающее   сообщение  выдается,  если  обнаружена
конструкция, зависящая от прохода,  и в командной  строке  указан
параметр  /m.  В  этом случае выполняется проход,  обеспечивающий
совместимость с MASM.

   Name must come first
     (Имя должно быть указано первым)

     Имя идентификатора  указано после названия директивы,  тогда
когда оно должно находиться перед названием  директивы. Например:

     STRUC ABC      ; ошибка: "ABC" должно стоять перед
                    ; ключевым словом STRUC

     В режиме Ideal имя идентификатора указывается после названия
директивы,  поэтому эта ошибка часто возникает при  попытках  ас-
семблирования в режиме MASM программ,  предназначенных для работы
в режиме Ideal.

   Near jump or call to different CS
     (Адресат ближнего перехода или вызова находится в другом ко-
     довом сегменте)

     Это сообщение об ошибке  выдается  при  попытке  осуществить
ближний вызов или переход по адресу, определенному в области, где
регистр CS указывает на другой сегмент.

   Need address or register
     (Требуется указать адрес или регистр)

     Не указан второй операнд команды,  т.е.  операнд указываемый
после запятой. Например:

      mov ax,   ; нет второго операнда

   Need angle brackets for structure fill
     (Значения для  структуры  должны указываться в угловых скоб-
     ках)

     В операторе выделения памяти под структуру не  указан список
начальных значений. Например:

     STR1 STRUC
     M1 DW ?
     M2 DD ?
     ENDS
     STR1   ; нет списка начальных значений

   Need colon
     (Требуется двоеточие)

     В директиве EXTRN, GLOBAL, ARG и LOCAL отсутствует двоеточие
перед спецификатором типа (BYTE, WORD и т.д.) Например:

      EXTRN X BYTE,Y:WORD ; после Х нет двоеточия

   Need expression
     (Требуется указать выражение)

     Выражение содержит операцию,  для которой не указан операнд.
Например:

     Х = 4 + * 6

   Need file name after INCLUDE
     (В директиве INCLUDE должно быть указано имя файла)

     В директиве INCLUDE не указано имя файла. Например:

     INCLUDE   ; не указано, какой файл должен быть включен

     В режиме Ideal имя файла должно быть заключено в кавычки.

   Need left parenthesis
     (Отсутствует левая круглая скобка)

     Опущена левая  круглая  скобка  там,  где это не допускается
синтаксисом выражения. Например:

     DB 4 DUP 7

     Выражение в операции DUP обязательно должно быть заключено в
круглые скобки.

   Need method name
     (Требуется имя метода)

     Оператор CALL...METHOD  требует после ключевого слова METHOD
имени метода.

   Need pointer expression
     (Требуется выражение-указатель)

     Эта ошибка возникает только в режиме Ideal и  указывает, что
выражение в квадратных скобках ([]) не является указателем на па-
мять. Например:

      mov ax,[word ptr]

     В режиме Ideal в квадратных  скобках  допускается  указывать
только адресные выражения.

   Need quoted string
     (Требуется указать строку в кавычках)

     Ошибка при вводе параметра директивы,  который должен предс-
тавлять собой строку,  заключенную в кавычки.  В режиме Ideal для
ряда директив в качестве параметра указывается строка в кавычках.
Например:

     Ideal
     DISPLAY  "Все сделано"

   Need register in expression
     (В выражении требуется указать имя регистра)

     В выражении  не  указано имя регистра там,  где это является
обязательным.

   Need right angle bracket
     (Отсутствует правая угловая скобка)

     Выражение, используемое для инициализации структуры, объеди-
нения или записи,  не оканчивается правой угловой скобкой  (>)  -
парной  для  левой угловой скобки,  указывающей начало списка на-
чальных значений. Например:

     MYSTRUC STRUCNAME <1,2,3

   Need right curly bracket
     (Требуется правая фигурная скобка)

     Эта ошибка возникает в структуре,  таблице или записи, когда
ожидается }, но она не найдена.

   Need right parenthesis
     (Отсутствует правая круглая скобка)

     Выражение содержит левую круглую скобку без парной ей правой
угловой скобки. Например:

       Х = 5 * (4 + 3

     В выражениях обязательно должно соблюдаться соответствие ле-
вых и правых круглых скобок.

   Need right square bracket
     (Отсутствует правая квадратная скобка)

     Выражение, представляющее собой ссылку  на  память,  указано
без правой квадратной скобки, которая должна соответствовать отк-
рывающей левой квадратной скобке,  обозначающей начало выражения.
Например:

       mov ax,[SI   ; ошибка: нет закрывающей
                    ; скобки (]) после SI

     В выражениях обязательно должно соблюдаться соответствие ле-
вых и правых квадратных скобок.

   Need stack argument
     (Не указан стековый параметр)

     В команде арифметики с плавающей запятой  не  указан  второй
операнд, т.е. операнд, указываемый после запятой. Например:

     FADD ST,

   Need structure member name
     (Не указано имя поля структуры)

     В режиме Ideal после селектора поля  структуры  (т.е.  после
точки) не указано имя поля этой структуры. Например:

      Ideal
     STRUC DEMO
      DB ?
     ENDS
     COUNT  DW 0
       mov,[(DEMO bx).]

     При обращении к полю структуры справа от  точки  обязательно
должно  быть указано поле той структуры,  имя которой стоит слева
от точки.

   Not expecting group or segment quantity
     (Использование имени группы или сегмента недопустимо)

     Указано имя  группы  или сегмента там,  где это недопустимо.
Например:

     CODE SEGMENT
        rol ax,CODE   ; ошибка: здесь нельзя указывать
                      ; имя сегмента

   One non-null field allowed per union expansion
     (При расширении объединения допускается указывать только од-
     но поле непустым)

     При инициализации  объединения,   определенного   директивой
UNION, указано более одного значения. Например:

      U  UNION
         DW ?
         DD ?
      ENDS
      UINST U <1,2>  ;ошибка: можно указать  либо <1,?>

     В объединении можно инициализировать только одно поле.

   Only one startup sequence allowed
     (Допускается только одна директива генерации кода  инициали-
     зации)

     Это сообщение  выдается,  если  в модуле указано более одной
директивы .STARTUP или STARTUPCODE.

   Open conditional
     (Открытый условный блок)

     Обнаружена директива END,  означающая конец исходного файла.
Однако условно ассемблируемый блок,  открытый одной  из  директив
вида IFxxx, не был закрыт директивой ENDIF. Например:

     IF BIGBUF
     END        ; нет директивы ENDIF перед директивой END

     Эта ошибка обычно выдается,  если вместо директивы окончания
условного блока ENDIF, ошибочно указана директива END.

   Open procedure
     (Открытая процедура)

     Обнаружена директива END,  означающая конец исходного файла.
Однако блок описания процедуры,  открытый директивой PROC, не был
закрыт директивой ENDР. Например:

       MYFUNC PROC
       END        ; нет директивы ENDР перед директивой END

     Эта ошибка обычно выдается, если вместо директивы конца бло-
ка процедуры - ENDP ошибочно указана директива END.

   Open segment
     (Открытый сегмент)

     Обнаружена директива END,  означающая конец исходного файла.
Однако сегмент, открытый директивой SEGMENT, не был закрыт дирек-
тивой ENDS. Например:

       DATA SEGMENT
            END      ; нет директивы ENDS перед директивой END

     Эта ошибка обычно выдается, если вместо директивы конца сег-
мента - ENDS ошибочно указана директива END.

   Open structure definition
     (Не указан конец определения структуры)

     Обнаружена директива END,  означающая конец исходного файла.
Однако  определение структуры,  начало которой указано директивой
STRUCTURE, не было завершено директивой ENDS. Например:

     X  STRUC
     VAL1 DW ?
     END      ; нет директивы ENDS перед директивой END

     Эта ошибка обычно выводится,  если  вместо  директивы  конца
структуры ENDS ошибочно указана директива END.

   Operand types do not match
     (Не совпадают типы операндов)

     Тип одного из операндов команды не совпадает с типом другого
операнда  либо не является допустимым для данной команды.  Напри-
мер:

     ABC DB 5
     ...
     mov ax,ABC

   Operation illegal for static table member
     (Для статического элемента таблицы операция не допускается)

     Для получения адреса статического элемента таблицы использо-
вана операция точки. Это не допускается.

   Pass-dependant construction encountered
     (Обнаружена конструкция, зависящая от прохода)

     Действие оператора  возможно  не совпадает с ожидаемым из-за
однопроходности Турбо Ассемблера. Например:

     IF1
                  ; на шаге ассемблирования
     ENDIF
     IF2
                  ; на шаге листинга
     ENDIF

     Большинство конструкций,  с  которыми связано это сообщение,
может быть скорректировано  так,  чтобы  это  сообщение  исчезло.
Обычно для этого достаточно убрать ссылки вперед.

   Pointer expression needs brackets
     (Адресное выражение должно быть заключено в квадратные скоб-
     ки)

     В режиме   Ideal  операнд,  содержащий  имя  идентификатора,
представляющее собой ссылку на память,  не заключен в  квадратные
скобки. В режиме Ideal квадратные скобки означают ссылку на адрес
памяти. Например:

     B DB 0
       mov al,B  ; предупреждение: в режиме Ideal
                 ; должно быть указано [B]

     Т.к. в режиме MASM квадратные скобки не обязательны,  то это
сообщение выдается как предупреждающее.

   Positive count expecting
     (Счетчик должен быть положительным)

     В  выражении для DUP в качестве счетчика повторений
указано отрицательное число. Например:

       BUF  -1 DUP (?)   ; ошибка: отрицательный счетчик

     Счетчик в операции DUP должен быть равен или больше 1.

   Record field too large
     (Слишком длинное поле в записи)

     В определении записи сумма длин всех полей превышает 32  би-
та. Например:

       AREC  RECORD RANGE:12,TOP:12,BOTTOM:12

   Record member not found
     (Не найден статический элемент записи)

     Элемент записи задан в заполнителе указанной записи, который
не является частью заданной записи.

   Recursive definition not allowed for EQU
     (Рекурсивное определение не допустимо в директиве EQU)

     В выражении директивы EQU содержится то же самое имя,  кото-
рое определяется этой директивой. Например:

        ABC EQU TWOTIMES ABC

   Register must be AL or AX
     (Допустимо указание только регистра AL или AX)

     Неверен операнд команды. Допускается использовать только ре-
гистры AL и AX. Например:

      IN CL,dx   ; ошибка: в первом операнде команды IN
                 ; допускается указывать только регистры AL и AX

   Register must be DX
     (Допустимо указание только регистра DX)

     Неверен операнд команды. Допускается использовать только ре-
гистр DX. Например:

      IN AL,cx  ; ошибка: вместо СХ должен быть указан регистр DX

   Relative jump out of range by __ bytes
     (Адрес назначения  условного  перехода  превышает допустимый
     предел на __ байт)

     Адрес назначения в команде условного перехода  находится вне
допустимого диапазона, т.е. не принадлежит интервалу (-127, +128)
от текущего адреса. В 32-битовом сегменте адрес назначения услов-
ного  перехода  должен находиться в диапазоне от -32767 до +32768
байт от текущего адреса.

   Relative quantity illegal
     (Недопустимый относительный адрес)

     Команда или директива содержит операнд, ссылающийся на адрес
памяти таким способом,  что эта ссылка не может быть разрешена на
этапе ассемблирования.  Такие  ссылки в Турбо Ассемблере являются
недопустимыми. Например:

    DATA SEGMENT PUBLIC
    X  DB 0
    IF OFFSET X GT 127 ; на этапе ассемблирования
                       ; адрес не известен

   Reserved word used as symbol
     (Зарезервированное слово используется в качестве имени иден-
     тификатора)

     В программе  пользователя  определяется  имя идентификатора,
совпадающее с одним из зарезервированных слов  Турбо  Ассемблера.
Программа будет ассемблироваться правильно, однако переопределять
зарезервированные в Турбо Ассемблере слова не рекомендуется.

   Rotate count must be constant or CL
     (Счетчик в  командах  сдвига  должен  быть  указан с помощью
     константы или регистра CL)

     В команде сдвига или циклического сдвига указан операнд, от-
личный от константы и регистра CL. Например:

     ROL  ax,DL   ; ошибка: регистр DL нельзя указывать
                  ; в качестве счетчика

     В командах сдвига и циклического сдвига в  качестве  второго
операнда можно указывать только константу или регистр CL.

   Rotate count out of range
     (Недопустимое значение для счетчика сдвига)

     В команде сдвига или циклического сдвига второй операнд пре-
вышает допустимое значение. Например:

     .8086
     SHL  DL,3       ; ошибка: в командах процессора 8086
                     ; возможен сдвиг только на один разряд
     .286
     ROR  ax,40      ; ошибка:  максимальное допустимое
                     ; значение для счетчика сдвига равно 31

     Максимальное допустимое значение для счетчика сдвига  в  ко-
мандах процессора 8086 равно 1, для других процессоров это значе-
ние может быть равно 31.

   Segment alignment not strict enough
     (Выравнивание сегмента не достаточно точное)

     Указано недопустимое  значение для границы выравнивания сег-
мента.  Либо оно не является степенью двойки,  либо специфицирует
более  точное  выравнивание  чем то,  которое указано в директиве
SEGMENT. Например:

     DATA SEGMENT PARA
        ALIGN 32   ; ошибка: PARA означает только 16
        ALIGN 3    ; ошибка: не является степенью двойки

   Segment attributes illegally redefined
     (Недопустимое переопределение атрибутов сегмента)

     Директивой SEGMENT повторно открывается уже определенный ра-
нее сегмент,  при этом указываются новые значения  для  атрибутов
этого сегмента. Например:

      DATA SEGMENT BYTE PUBLIC
      DATA ENDS
      DATA SEGMENT PARA         ; ошибка: ранее было указано
                                ; выравнивание на байт
      DATA ENDS

     При повторном  открытии  сегмента атрибуты либо должны иметь
те же самые значения,  либо вообще быть опущены. Если при повтор-
ном открытии сегмента атрибуты не указаны,  то используются атри-
буты из предыдущего определения.

   Segment name is superfluous
     (Имя сегмента игнорируется)

     Это предупреждающее  сообщение выдается в тех случаях, когда
в директиве .CODE указано имя сегмента, а в текущей модели памяти
не допускается использовать более одного сегмента.

   String too long
     (Слишком длинная строка)

     Указанная в кавычках строка имеет длину,  превышающую макси-
мально допустимую - 255 символов.

   Symbol already defined:__
     (Имя идентификатора уже определено)

     Указанное имя идентификатора уже было ранее объявлено  с тем
же самым типом. Например:

     BB DB 1,2,3
     BB DB ?   ; ошибка: BB уже определено

   Symbol already different kind
     (Имя идентификатора уже объявлено с другим типом)

     Указанное идентификатора  имя  было ранее объявлено с другим
типом, например:

     BB DB 1,2,3
     BB DW ?  ; ошибка: BB уже объявлено с типом BYTE

   Symbol has no width or mask
     (Имя идентификатора не может быть использовано  в  операциях
     WIDTH и MASK)

     Операнд операции  WIDTH  или  MASK не является именем записи
или именем поля записи. Например:

     B DB 0
        mov ax,MASK B  ; В не является полем записи

   Symbol is not a segment or already part of a group
     (Имя идентификатора не является именем сегмента либо уже оп-
     ределено в группе)

     Либо имя идентификатора уже определено в группе, либо не яв-
ляется именем сегмента. Например:

     DATA SEGMENT
     DATA ENDS
     DGROUP GROUP DATA
     DGROUP2 GROUP DATA    ; ошибка: DATA уже определено в DGROUP

   Text macro expansion exceeds maximum line length
     (Расширение текстовой макрокоманды превышает максимально до-
     пустимую длину)

     Это сообщение об ошибке выдается, когда расширение текстовой
макрокоманды превышает максимально допустимую длину.

   Too few operands to instruction
     (В команде не хватает операндов)

     В команде должно быть указано большее число операндов.  Нап-
ример:

     ADD  ax  ; отсутствует второй операнд

   Too many errors or warnings
     (Слишком много ошибок или предупреждений)

     Сообщения об ошибках больше выдаваться не будут.  Максималь-
ное число сообщений об ошибках,  которое выдается Турбо Ассембле-
ром,  равно 100. Это максимально допустимое число ошибок превыше-
но.  Ассемблирование программы тем  не  менее  будет  продолжено,
однако далее будут печататься только предупреждающие сообщения.

   Too many initial values
     (Слишком много начальных значений)

     При инициализации структуры или объединения  указано слишком
много значений. Например:

     XYZ   STRUC
     A1  DB ?
     A2  DB ?
     XYZ   ENDS
     ANXYZ   XYZ <1,2,3>  ; ошибка: в XYZ определены
                          ; только два поля

     При инициализации полей структур и  объединений  допускается
указывать меньше значений,  чем число полей,  но нельзя указывать
больше значений.

   Too many register multipliers in expression
     (В выражении содержится слишком много множителей для регист-
     ров)

     Для процессора  80386 допускается коэффициент индексных опе-
рандов. Однако коэффициент можно указывать не более, чем у одного
регистра. Например:

       mov EAX,[2*EBX+4*EDX]       ; слишком много
                                   ; коэффициентов

   Too many registers in expression
     (В выражении указано слишком много регистров)

     В выражении указано более одного индексного и одного  базис-
ного регистра. Например:

     mov ax,[BP+SI+DI]   ; нельзя одновременно указывать SI и DI

   Too many USES registers
     (Слишком много регистров в директиве USES)

     В директиве USES для текущей процедуры указано более  8  ре-
гистров.

   Trailling null value assumed
     (Предполагается конечное пустое значение)

     Директива определения данных (DB,  DW и  т.д.)  оканчивается
запятой. TASM интерпретирует ее как пустое значение. Например:

      db  'привет',13,10   ; то же, что и db'привет',13,10?

   Undefined symbol
     (Идентификатор не определен)

     Оператор содержит идентификатор,  который не был ранее опре-
делен в исходном файле.

   Unexpected end of file (no END directive)
     (Неожиданный конец файла (нет директивы END))

     В исходном файле отсутствует директива  END.  Директива  END
обязательно должна быть указана в конце исходного файла.

   Unknown character
     (Неизвестный символ)

     Текущая строка исходной программы содержит  символ,  который
не принадлежит набору символов,  допустимых для построения симво-
лических имен и выражений в Турбо Ассемблере. Например:

      add  ax,!1      ; ошибка:  восклицательный  знак -
                      ; недопустимый символ

   Unmatched ENDP:_
     (Непарная директива ENDP:_)

     В директиве ENDP указано имя, не совпадающее с именем проце-
дуры, которую закрывает данная директива. Например:

      ABC  PROC
      XYZ  ENDP   ; ошибка: вместо XYZ должно быть указано ABC

   Unmatched ENDS:_
     (Непарная директива ENDS:_)

     В директиве  ENDS указано имя,  не совпадающее с именем сег-
мента,  который закрывает данная директива, либо не совпадающее с
именем  структуры или объединения,  оканчивающегося этой директи-
вой. Например:

    ABC  STRUC
    XYZ  ENDP    ; ошибка: вместо XYZ должно быть указано ABC
    DATA  SEGMENT
    CODE  ENDS   ; ошибка: вместо CODE должно быть указано DATA

   User-generated error
     (Ошибка, сгенерированная пользователем)

     Ошибка выдана  в результате выполнения одной из директив ге-
нерирования ошибки. Например:

     .ERR   ; попадание в это место является ошибкой

                   Оглавление
Руководство ...................................................14
Часть 1. Предопределенные идентификаторы.......................14
Часть 2. Операции..............................................17
Старшинство операций в режиме Ideal............................17
Старшинство операций в режиме MASM.............................17
Операции.......................................................18
Операция ()                                   Режимы Ideal,
 MASM..........................................................18
Операция *                                    Режимы Ideal,
 MASM..........................................................18
Операция + (бинарная)                         Режимы Ideal,
 MASM..........................................................18
Операция + (унарная)                          Режимы Ideal,
 MASM..........................................................18
Операция - (бинарная)                         Режимы Ideal,
 MASM..........................................................18
Операция - (унарный)                          Режимы Ideal,
 MASM..........................................................19
Операция .                                    Режимы Ideal,
 MASM..........................................................19
Операция /                                    Режимы Ideal,
 MASM..........................................................19
Операция :                                    Режимы Ideal,
 MASM..........................................................19
Операция ?                                    Режимы Ideal,
 MASM..........................................................19
Операция []                                   Режимы Ideal,
 MASM..........................................................19
Операция AND                                  Режимы Ideal,
 MASM..........................................................20
Операция BYTE                                        Режим
 Ideal.........................................................20
Операция BYTE PTR                             Режимы Ideal,
 MASM..........................................................20
Операция CODEPTR                              Режимы Ideal,
 MASM..........................................................20
Операция DATAPTR                                     Режим
 Ideal.........................................................20
Операция DUP                                  Режимы Ideal,
 MASM..........................................................20
Операция DWORD                                       Режим
 Ideal.........................................................21
Операция DWORD PTR                            Режимы Ideal,
 MASM..........................................................21
Операция EQ                                   Режимы Ideal,
 MASM..........................................................21
Операция FAR                                         Режим
 Ideal.........................................................21
Краткое справочное руководство.................................14
Часть 1. Предопределенные идентификаторы.......................14
Часть 2. Операции..............................................17
Старшинство операций в режиме Ideal............................17
Старшинство операций в режиме MASM.............................17
Операции.......................................................18
Операция ()                                   Режимы Ideal,
 MASM..........................................................18
Операция *                                    Режимы Ideal,
 MASM..........................................................18
Операция + (бинарная)                         Режимы Ideal,
 MASM..........................................................18
Операция + (унарная)                          Режимы Ideal,
 MASM..........................................................18
Операция - (бинарная)                         Режимы Ideal,
 MASM..........................................................18
Операция - (унарный)                          Режимы Ideal,
 MASM..........................................................19
Операция .                                    Режимы Ideal,
 MASM..........................................................19
Операция /                                    Режимы Ideal,
 MASM..........................................................19
Операция :                                    Режимы Ideal,
 MASM..........................................................19
Операция ?                                    Режимы Ideal,
 MASM..........................................................19
Операция []                                   Режимы Ideal,
 MASM..........................................................19
Операция AND                                  Режимы Ideal,
 MASM..........................................................20
Операция BYTE                                        Режим
 Ideal.........................................................20
Операция BYTE PTR                             Режимы Ideal,
 MASM..........................................................20
Операция CODEPTR                              Режимы Ideal,
 MASM..........................................................20
Операция DATAPTR                                     Режим
 Ideal.........................................................20
Операция DUP                                  Режимы Ideal,
 MASM..........................................................20
Операция DWORD                                       Режим
 Ideal.........................................................21
Операция DWORD PTR                            Режимы Ideal,
 MASM..........................................................21
Операция EQ                                   Режимы Ideal,
 MASM..........................................................21
Операция FAR                                         Режим
 Ideal.........................................................21
Операция FAR PTR                              Режимы Ideal,
 MASM..........................................................21
Операция FASTIMUL                             Режимы Ideal,
 MASM..........................................................21
Операция FLIPFLAG                             Режимы Ideal,
 MASM..........................................................21
Операция FWORD                                       Режим
 Ideal.........................................................22
Операция FWORD PTR                            Режимы Ideal,
 MASM..........................................................23
Операция GE                                   Режимы Ideal,
 MASM..........................................................23
Операция GETFIELD                             Режимы Ideal,
 MASM..........................................................23
Операция GT                                   Режимы Ideal,
 MASM..........................................................23
Операция HIGH                                 Режимы Ideal,
 MASM..........................................................23
Операция HIGH                                        Режим
 Ideal.........................................................23
Операция LARGE                                Режимы Ideal,
 MASM..........................................................23
Операция LE                                   Режимы Ideal,
 MASM..........................................................25
Операция LENGTH                               Режимы Ideal,
 MASM..........................................................25
Операция LOW                                  Режимы Ideal,
 MASM..........................................................25
Операция LOW                                         Режим
 Ideal.........................................................25
Операция LT                                   Режимы Ideal,
 MASM..........................................................25
Операция MASK                                 Режимы Ideal,
 MASM..........................................................25
Операция MAKEFLAG                             Режимы Ideal,
 MASM..........................................................26
Операция MOD                                  Режимы Ideal,
 MASM..........................................................27
Операция NE                                   Режимы Ideal,
 MASM..........................................................27
Операция NEAR                                 Режимы Ideal,
 MASM..........................................................27
Операция NEAR PTR                             Режимы Ideal,
 MASM..........................................................27
Операция NOT                                  Режимы Ideal,
 MASM..........................................................27
Операция OFFSET                               Режимы Ideal,
 MASM..........................................................27
Операция OR                                   Режимы Ideal,
 MASM..........................................................28
Операция PROC                                        Режим
 Ideal.........................................................28
Операция PROC PTR                             Режимы Ideal,
 MASM..........................................................28
Операция PTR                                  Режимы Ideal,
 MASM..........................................................28
Операция PWORD                                       Режим
 Ideal.........................................................28
Операция PWORD PTR                            Режимы Ideal,
 MASM..........................................................28
Операция QWORD                                       Режим
 Ideal.........................................................29
Операция QWORD PTR                            Режимы Ideal,
 MASM..........................................................29
Операция SEG                                  Режимы Ideal,
 MASM..........................................................29
Операция SETFIELD                             Режимы Ideal,
 MASM..........................................................30
Операция SETFLAG                              Режимы Ideal,
 MASM..........................................................31
Операция SHL                                  Режимы Ideal,
 MASM..........................................................31
Операция SHORT                                Режимы Ideal,
 MASM..........................................................31
Операция SHR                                  Режимы Ideal,
 MASM..........................................................32
Операция SIZE                                 Режимы Ideal,
 MASM..........................................................32
Операция SMALL                                Режимы Ideal,
 MASM..........................................................32
Операция SYMTYPE                                     Режим
 Ideal.........................................................32
Операция TBYTE                                       Режим
 Ideal.........................................................32
Операция TBYTE PTR                             Режим Ideal,
 MASM..........................................................32
Операция TESTFLAG                             Режимы Ideal,
 MASM..........................................................33
Операция THIS                                  Режим Ideal,
 MASM..........................................................34
Операция .TYPE                                        Режим
 MASM..........................................................34
Операция TYPE                                        Режим
 Ideal.........................................................34
Операция TYPE                                         Режим
 MASM..........................................................34
Операция UNKNOWN                                     Режим
 Ideal.........................................................34
Операция WIDTH                                 Режим Ideal,
 MASM..........................................................34
Операция WORD                                        Режим
 Ideal.........................................................35
Операция WORD PTR                             Режимы Ideal,
 MASM..........................................................35
Операция XOR                                  Режимы Ideal,
 MASM..........................................................35
Специальные макрооперации......................................36
Операция &                                    Режимы Ideal,
 MASM..........................................................36
Операция <>                                   Режимы Ideal,
 MASM..........................................................36
Операция !                                    Режимы Ideal,
 MASM..........................................................36
Операция %                                    Режимы Ideal,
 MASM..........................................................36
Операция ;;                                   Режимы Ideal,
 MASM..........................................................36
Часть 3. Директивы.............................................37
Директива .186                                        Режим
 MASM..........................................................37
Директива .286                                        Режим
 MASM..........................................................37
Директива .286C                                       Режим
 MASM..........................................................37
Директива .286P                                       Режим
 MASM..........................................................37
Директива .287                                        Режим
 MASM..........................................................37
Директива .386                                        Режим
 MASM..........................................................37
Директива .386C                                       Режим
 MASM..........................................................38
Директива .386P                                       Режим
 MASM..........................................................38
Директива .387                                        Режим
 MASM..........................................................38
Директива .486                                        Режим
 MASM..........................................................38
Директива .486C                                       Режим
 MASM..........................................................38
Директива .486P                                       Режим
 MASM..........................................................38
Директива .8086                                       Режим
 MASM..........................................................39
 :                                   Режимы Ideal,
 MASM..........................................................39
Директива =                                    Режим Ideal,
 MASM..........................................................39
Директива ALIGN                                Режим Ideal,
 MASM..........................................................39
Директива .ALPHA                                      Режим
 MASM..........................................................39
Директива ARG                                  Режим Ideal,
 MASM..........................................................40
Директива ASSUME                              Режимы Ideal,
 MASM..........................................................40
Директива %BI                                 Режимы Ideal,
 MASM..........................................................40
Директива CALL                                Режимы Ideal,
 MASM..........................................................40
Директива CATSTR                            Режимы Ideal,
 MASM51........................................................41
Директива .CODE                                       Режим
 MASM..........................................................41
Директива CODESEG                             Режимы Ideal,
 MASM..........................................................41
Директива COMM                                Режимы Ideal,
 MASM..........................................................42
Директива COMMENT                                     Режим
 MASM..........................................................42
Директива %COND                               Режимы Ideal,
 MASM..........................................................42
Директива CONST                                Режимы
 Ideal, MASM...................................................43
Директива .CREF                                       Режим
 MASM..........................................................43
Директива %CREF                               Режимы Ideal,
 MASM..........................................................43
Директива %CREFALL                            Режимы Ideal,
 MASM..........................................................43
Директива %CREFREF                            Режимы Ideal,
 MASM..........................................................43
Директива %CREFUREF                           Режимы Ideal,
 MASM..........................................................44
Директива %CREFUREF                           Режимы Ideal,
 MASM..........................................................44
Директива %CTLS                               Режимы Ideal,
 MASM..........................................................44
Директива .DATA                                       Режим
 MASM..........................................................44

              Краткое справочное руководство
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     "Краткое справочное руководство по Турбо Ассемблеру 3.0" со-
держит  краткое  описание  предопределенных идентификаторов TASM,
операций и директив (Части 1,  2 и 3), а также инструкций процес-
сора и сопроцессора (Части 4 и 5).

         Часть 1. Предопределенные идентификаторы
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Примечание: Все  предопределенные  идентификаторы  можно ис-
пользовать в режиме MASM и Ideal.

     Идентификатор $
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Представляет текущий счетчик адреса в текущем сегменте.

     Идентификатор @32Bit
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Числовое значение, указывающее, описан сегмент в текущей мо-
дели как 16- или как 32-битовый.

     Идентификатор @code
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Псевдоним (текстовое  присваивание)  имени   сегмента   кода
.CODE.

     Идентификатор @CodeSize
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Числовое значение,  которое  указывает  модель  памяти  (0 -
near, 1 - far).

     Идентификатор @Cpu
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Числовое значение,  возвращающее информацию о  текущем  про-
цессоре. Значение, возвращаемое @Cpu, дает в битовых полях инфор-
мацию о типе процессора.
     Идентификатор @curseg
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Псевдоним имени текущего сегмента.

     Идентификатор @data
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Псевдоним группового имени данных ближнего типа.

     Идентификатор @DataSize
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Числовое значение, указывающее модель памяти для данных (0 -
near, 1 - far, 2 - huge).

     Идентификатор ??date
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Строковое значение текущей даты.

     Идентификатор @fardata
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Псевдоним имени инициализированного сегмента данных.

     Идентификатор @fardata?
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Псевдоним имени неинициализированного сегмента данных.

     Идентификатор @FileName
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Псевдоним имени текущего ассемблируемого файла.

     Идентификатор ??filename
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Строковое значение имени текущего ассемблируемого файла.

     Идентификатор @Model
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Строковое значение,  представляющее текущую действующую  мо-
дель памяти.
     Идентификатор @Object
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Текстовая макрокоманда, содержащая имя текущего объекта.

     Идентификатор @Startup
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Метка, которая отмечает начало кода инициализации.

     Идентификатор @Table_<имя_объекта>
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Тип данных, содержащий таблицу методов объекта.

     Идентификатор @TableAddr_<имя_объекта>
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Метка, описывающая адрес реализации таблицы виртуальных  ме-
тодов объекта.

     Идентификатор ??time
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Строковое значение текущего времени.

     Идентификатор ??version
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Строковое значение номера текущей версии Турбо Ассемблера.

     @WordSize
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Строковое значение,  которое  указывает  16 или 32-разрядные
сегменты (2 - 16-разрядные, 2 - 32-разрядные).

                      Часть 2. Операции
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В данной части в соответствии с их  старшинством описываются
операции Турбо Ассемблера. В двух приведенных ниже таблицах стар-
шинство операций режимов Ideal и MASM определяется более подробно

             Старшинство операций в режиме Ideal
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В следующем списке операции указаны в соответствии с их при-
оритетом (начиная с наивысшего приоритета):

     - (), [], LENGTH, MASK, OFFSET, SEG, SIZE, WIDTH
     - HIGH, LOW
     - +, - (унарные)
     - *, /, MOD, SHL, SHR
     - +, - (бинарные)
     - EQ, GE, GT, LE, LT, NE
     - NOT
     - AND
     - OR, XOR
     - : (переопределение сегмента)
     - . (выбор элемента структуры)
     - HIGH (перед указателем),  LARGE,  LOW, (перед указателем),
       PTR, SHORT, SMALL, SYMTYPE

             Старшинство операций в режиме MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     - <, (), [], LENGTH, MASK, SIZE, WIDTH
     - . (операция выбора элемента структуры)
     - HIGH, LOW
     - +, - (унарные)
     - : (переопределение сегмента)
     - OFFSET, PTR, SEG, THIS, TYPE
     - *, /, MOD, SHL, SHR
     - +, - (бинарные)
     - EQ, GE, GT, LE, LT, NE
     - NOT
     - NOT
     - OR, XOR
     - LARGE, SHORT, SMALL, .TYPE

                          Операции
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Ниже в алфавитном порядке приводятся все операции TASM.

Операция ()                                   Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     (выражение)

     Выделяет выражение для приоритетного вычисления.

Операция *                                    Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     выражение_1 * выражение_2

     Перемножает два целочисленных  выражения.  Использует  также
режимы адресации процессора 80386 (когда одно выражение находится
в регистре).

Операция + (бинарная)                         Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     выражение_1 + выражение_2

     Выполняет сложение двух выражений.

Операция + (унарная)                          Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     +выражение

     Указывает, что выражение является положительным.

Операция - (бинарная)                         Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     выражение_1 - выражение_2

     Выполняет вычитание двух выражений.

Операция - (унарный)                          Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     -выражение

     Изменяет знак выражения.

Операция .                                    Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     указатель_элемента.имя_поля

     Выбирает элемент структуры.

Операция /                                    Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     выражение_1/выражение_2

     Выполняет деление двух целочисленных выражений.

Операция :                                    Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     сегмент_или_группа:выражение

     Генерирует переопределение сегмента или группы.

Операция ?                                    Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Dx ?

     Выполняет инициализацию с неопределенными данными (где  Dx -
это DB, DD, DF, DP, DQ, DT или DW).

Операция []                                   Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     выражение_1[выражение_2]
     [выражение_1][выражение_2]

     Режим MASM:  Операция [] может  использоваться  для  задания
сложения или косвенных операндов в памяти.

     Режим Ideal: Операция [] задает ссылку на память.

Операция AND                                  Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     выражение_1 AND выражение_2

     Выполняет для двух выражений поразрядную логическую операцию
AND (И).

Операция BYTE                                        Режим Ideal
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     BYTE выражение

     Приводит адресное выражение к размеру в байт.

Операция BYTE PTR                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     BYTE PTR выражение

     Приводит адресное выражение к размеру в байт.

Операция CODEPTR                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     CODEPTR выражение

     Возвращает используемый по умолчанию размер адреса  процеду-
ры.

Операция DATAPTR                                     Режим Ideal
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Приводит адресное выражение к размеру, зависящему от модели.

Операция DUP                                  Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     счетчик DUP (выражение[,выражение]...)

     Повторяет операцию  выделения памяти для данных столько раз,
сколько задано значением "счетчик".

Операция DWORD                                       Режим Ideal
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     DWORD выражение

     Приводит адресное выражение к размеру в двойное слово.

Операция DWORD PTR                            Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     DWORD PTR выражение

     Приводит адресное выражение к размеру в двойное слово.

Операция EQ                                   Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     выражение_1 EQ выражение_2

     Возвращает значение True, если выражения равны.

Операция FAR                                         Режим Ideal
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     FAR выражение

     Приводит к тому,  что адресные выражения будут дальними ука-
зателями.

Операция FAR PTR                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     FAR PTR выражение

     Приводит к тому,  что адресные выражения будут дальними ука-
зателями.

Операция FASTIMUL                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

  FASTIMUL <регистр_приемник>,<регистр/память_источник>,<значение>

     Генерирует код,  который перемножает регистр или адрес в па-
мяти на значение и помещает его в целевой регистр.

Операция FLIPFLAG                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     См. синтаксис инструкции процессора XOR.

     Оптимизированная форма инструкции XOR, которое выполняет по-
разрядное дополнение  с  помощью максимально коротких инструкций.
Используется только в том случае,  если содержимое регистров фла-
гов значения не имеет.

Операция FWORD                                       Режим Ideal
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     FWORD выражение

     Приводит к  тому,  что адресные выражения будут иметь размер
32-разрядных дальних указателей.

Операция FWORD PTR                            Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     FWORD PTR выражение

     Приводит к тому,  что адресные выражения будут иметь  размер
32-разрядных дальних указателей.

Операция GE                                   Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     выражение_1 GE выражение_2

     Возвращает значение  True,  если  одно  выражение больше или
равно другому.

Операция GETFIELD                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

  GETFIELD <имя_поля><регистр_приемник>,<регистр/память_источник>

     Генерирует код,  который извлекает значение поля из регистра
или адреса памяти и устанавливает в это значение приемник.

Операция GT                                   Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     выражение_1 GT выражение_2

     Возвращает значение True,  если одно выражение больше друго-
го.

Операция HIGH                                 Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     HIGH выражение

     Возвращает старшую часть (8 бит размера типа) выражения.

Операция HIGH                                        Режим Ideal
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     тип HIGH выражение

     Возвращает старшую часть (8 бит размера типа) выражения.

Операция LARGE                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     LARGE выражение

     Задает для смещения выражения размер 32 бита. В режиме Ideal
эта операция допустима только в том случае,  если разрешена гене-
рация кода процессора 80386.

Операция LE                                   Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     выражение_1 LE выражение_2

     Возвращает значение  True,  если  одно  выражение меньше или
равно другому.

Операция LENGTH                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     LENGTH имя

     Возвращает число элементов данных, выделенных для имени.

Операция LOW                                  Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     LOW выражение

     Возвращает младшую часть (8 бит или размер типа) выражения.

Операция LOW                                         Режим Ideal
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     тип LOW выражение

     Возвращает младшую часть (8 бит или размер типа) выражения.

Операция LT                                   Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     выражение_1 LT выражение_2

     Возвращает значение True,  если одно выражение меньше друго-
го.

Операция MASK                                 Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     MASK имя_поля_записи
     MASK запись

     Возвращает битовую маску для поля записи или всей записи.

Операция MAKEFLAG                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     См. синтаксис инструкции процессора AND.

     Оптимизированная форма инструкции AND,  которая очищает биты
с помощью максимально короткой инструкции.  Используется только в
том случае, если регистры флагов значения не имеют.

Операция MOD                                  Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     выражение_1 MOD выражение_2

     Возвращает остаток от деления двух выражений.

Операция NE                                   Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     выражение_1 NE выражение_2

     Возвращает значение True,  если одно выражение не равно дру-
гому.

Операция NEAR                                 Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     NEAR выражение

     Приводит к тому, что адресное выражение будет ближним указа-
телем на код.

Операция NEAR PTR                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     NEAR PTR выражение

     Приводит к тому, что адресное выражение будет ближним указа-
телем на код.

Операция NOT                                  Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     NOT выражение

     Выполняет поразрядное дополнение (инвертирование) выражения.

Операция OFFSET                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     OFFSET выражение

     Возвращает смещение выражения в текущем сегменте (или в группе
которой принадлежит сегмент, если используются упрощенные директивы
определения сегментов или режим Ideal).

Операция OR                                   Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     выражение_1 OR выражение_2

     Выполняет для двух выражений поразрядную логическую операцию
ИЛИ.

Операция PROC                                        Режим Ideal
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     PROC выражение

     Приводит к  тому,  что адресное выражение будет представлять
собой ближний или дальний указатель на код.

Операция PROC PTR                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     PROC PTR выражение

     Приводит к тому,  что адресное выражение будет  представлять
собой ближний или дальний указатель на код.

Операция PTR                                  Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     тип PTR выражение

     Приводит к  тому,  что адресное выражение будет иметь размер
типа.

Операция PWORD                                       Режим Ideal
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     PWORD выражение

     Приводит к тому,  что адресное выражение будет иметь  размер
32-разрядного дальнего указателя.

Операция PWORD PTR                            Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     PWORD PTR выражение

     Приводит к  тому,  что адресное выражение будет иметь размер
32-разрядного дальнего указателя.

Операция QWORD                                       Режим Ideal
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     QWORD выражение

     Приводит к тому,  что адресное выражение будет иметь  размер
четверного слова.

Операция QWORD PTR                            Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     QWORD PTR выражение

     Приводит к  тому,  что адресное выражение будет иметь размер
четверного слова.

Операция SEG                                  Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     SEG выражение

     Возвращается адрес сегмента выражения со ссылкой на память.

Операция SETFIELD                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

    SETFIELD<имя_поля><регистр/память_приемник>,<регистр_источник>

     Генерирует код, присваивающий значение полю записи. Устанав-
ливает значение  поля  (целевой регистр или адрес памяти) в соот-
ветствии с содержимым регистра-источника.

Операция SETFLAG                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     См. синтаксис инструкции процессора OR.

     Оптимизированная форма инструкции OR,  которая устанавливает
биты  с  помощью  максимально  короткой инструкции.  Используется
только в том случае, если регистры флагов значения не имеют.

Операция SHL                                  Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     выражение SHL счетчик

     Сдвигает выражение влево на число бит,  заданных  счетчиком.
Отрицательное  значение счетчика задает сдвиг данных в противопо-
ложном направлении.

Операция SHORT                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     SHORT выражение

     Приводит к тому,  что выражение будет указателем на код  ко-
роткого  типа  (в  границах  -128 до +127 байт от текущего адреса
программы).

Операция SHR                                  Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Сдвигает значение выражения вправо на  число  бит,  заданных
значением счетчика.  Отрицательное значение приводит к тому,  что
данные будут сдвигаться в противоположную сторону.

Операция SIZE                                 Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     SIZE имя

     Возвращает размер элемента данных,  выделенного для перемен-
ной  с  указанным именем.  В режиме MASM операция SIZE возвращает
значение LENGTH имя,  умноженное на TYPE имя. В режиме Ideal опе-
рация SIZE возвращает значение счетчика байт,  указанное в опера-
ции DUP для имени.

Операция SMALL                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     SMALL выражение

     Задает для смещения выражения размер 16 бит.  В режиме Ideal
данная операция допустима только в том случае, если разрешена ге-
нерация кода для процессора 80386.

Операция SYMTYPE                                     Режим Ideal
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     SYMTYPE

     Возвращает байт, описывающий выражение.

Операция TBYTE                                       Режим Ideal
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     TBYTE выражение

     Приводит к тому,  что адресное выражение будет иметь 10-бай-
товый размер.

Операция TBYTE PTR                             Режим Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Приводит к тому,  что адресное выражение будет иметь 10-бай-
товый размер.

Операция TESTFLAG                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     См. синтаксис инструкции процессора TEST.

     Оптимизированная форма  инструкции  TEST,  которая проверяет
биты с помощью максимально короткой инструкции.

Операция THIS                                  Режим Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     THIS тип

     Создает операнд,  адресом  которого  будет текущий сегмент и
счетчик адреса.  Тип описывает размер операнда и то, представляет
ли он собой код или данные.

Операция .TYPE                                        Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     .TYPE выражение

     Возвращает байт,  описывающий режим и область действия выра-
жения.

Операция TYPE                                        Режим Ideal
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     TYPE имя_1 имя_2

     Применяет тип существующей переменной или элемента структуры
к другой переменной или элементу структуры.

Операция TYPE                                         Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Возвращает число, указывающее размер или тип выражения.

Операция UNKNOWN                                     Режим Ideal
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     UNKNOWN выражение

     Удаляет из адресного выражения информацию о типе.

Операция WIDTH                                 Режим Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     WITH имя_поля_записи
     WITH запись

     Возвращает длину поля записи или всей записи в битах.

Операция WORD                                        Режим Ideal
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     WORD выражение

     Приводит к тому, что адресное выражение будет иметь размер в
слово.

Операция WORD PTR                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     WORD PTR выражение

     Приводит к тому, что адресное выражение будет иметь размер в
слово.

Операция XOR                                  Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     выражение_1 XOR выражение_2

     Выполняет для двух выражений поразрядную логическую операцию
"исключающее ИЛИ".  Для  форматной  печати включается безусловный
перевод страницы.

                  Специальные макрооперации
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

Операция &                                    Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     & имя

     Подставляет фактическое   значение   параметра  макрокоманды
"имя".

Операция <>                                   Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Интерпретирует текст,  как литерал,  независимо от  возможно
содержащихся в нем специальных символов.

Операция !                                    Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     !символ

     Интерпретирует символ,  как литерал, независимо от специаль-
ного значения, которое он может иметь.

Операция %                                    Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     %текст

     Интерпретирует текст,  как выражение, вычисляет его значение
и заменяет текст полученным результатом.  Текстом может быть либо
числовое выражение, либо текстовое присваивание.

Операция ;;                                   Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ;комментарий

     Подавляет для комментария в макроопределении выделение памя-
ти.

                     Часть 3. Директивы
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Ниже в алфавитном порядке описаны все директивы TASM.

Директива .186                                        Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование инструкций процессора 80186.

Директива .286                                        Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование   непривилегированных   инструкций
процессора 80286  (реальный  режим)  и инструкций арифметического
сопроцессора 80287.

Директива .286C                                       Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование   непривилегированных   инструкций
процессора 80286  (реальный  режим)  и инструкций арифметического
сопроцессора 80287.

Директива .286P                                       Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование всех инструкций  процессора  80286
(включая защищенный режим) и инструкций арифметического сопроцес-
сора 80287.

Директива .287                                        Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование  всех  инструкций  арифметического
сопроцессора 80287.

Директива .386                                        Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование   непривилегированных   инструкций
процессора 80386  (реальный  режим)  и инструкций арифметического
сопроцессора 80387.

Директива .386C                                       Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование   непривилегированных   инструкций
процессора 80386  (реальный  режим)  и инструкций арифметического
сопроцессора 80387.

Директива .386P                                       Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование всех инструкций  процессора  80386
(включая защищенный режим) и инструкций арифметического сопроцес-
сора 80387.

Директива .387                                        Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование  всех  инструкций  арифметического
сопроцессора 80387.

Директива .486                                        Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование   непривилегированных   инструкций
процессора i486 (реальный режим).

Директива .486C                                       Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование   непривилегированных   инструкций
процессора i486 (реальный режим).

Директива .486P                                       Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование всех  инструкций  процессора  i486
(включая защищенный режим).

Директива .8086                                       Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование  инструкций защищенного режима для
процессора 80486.

Директива .8087                                       Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование инструкций арифметического  сопро-
цессора.  Этот  режим  инструкций сопроцессора используется Турбо
Ассемблером по умолчанию.

Директива :                                   Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     имя:

     Определяет для кода ближнюю метку с указанным именем.

Директива =                                    Режим Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     имя = выражение

     Определяет или переопределяет числовое присваивание.

Директива ALIGN                                Режим Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ALIGN граница

     Округляет счетчик инструкций до адреса, который представляет
собой степень двойки (2, 4, 8, ...).

Директива .ALPHA                                      Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Задает упорядочивание  сегментов по алфавиту.  Ту же функцию
выполняет параметр командной строки /a.

Директива ARG                                  Режим Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ARG аргумент[,аргумент]...[=идентификатор]
      [RETURNS аргумент[,аргумент]]

     Заносит аргументы  в  стек  для процедур.  Каждому аргументу
присваивается положительное смещение от  регистра  BP.  При  этом
предполагается, что адрес возврата процедуры и регистр BP вызыва-
ющей программы уже занесены в стек. Каждый аргумент имеет следую-
щий синтаксис:

имя_аргумента[[счетчик_1]][:[отладочный_размер][тип][:счетчик_2]]

    Необязательный "отладочный_размер" имеет следующий синтаксис:

    [тип]PTR

Директива ASSUME                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ASSUME сегмент:имя[,сегмент:имя]...
     ASSUME сегментный_регистр:NOTHING
     ASSUME NOTHING

     Задает сегментный регистр,  который будет использоваться для
вычисления действующего адреса для всех меток и переменных, опре-
деленных  для  сегмента  или группы сегментов с указанным именем.
Ключевое слово NOTHING отменяет связь между указанным  сегментным
регистром и именем сегмента или группы.

Директива %BI                                 Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     %BIN размер

     Задает размер поля объектного кода в файле листинга (в пози-
циях).

Директива CALL                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     CALL <указатель_экземпляра>METHOD[<имя_объекта>:]
       <имя_метода>{USES[{сегм_регистр:}регистр_смещения}
       {<параметры_расширенного_вызова}

     Вызывает процедуру метода.

Директива CATSTR                            Режимы Ideal, MASM51
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     имя CATSTR строка[,строка]...

     Выполняет конкатенацию нескольких строк в одну строку с ука-
занным именем.

Директива .CODE                                       Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     .CODE[имя]

     При использовании с директивой .MODEL определяет начало сег-
мента кода.  Если вы задали среднюю или большую модель памяти, то
за  директивой .CODE может следовать необязательное имя,  которое
указывает имя сегмента.

Директива CODESEG                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     CODESEG[имя]

     При использовании с директивой .MODEL определяет начало сег-
мента кода.  Если вы задали среднюю или большую модель памяти, то
за директивой .CODESEG может следовать необязательное имя,  кото-
рое указывает имя сегмента.

Директива COMM                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     COMM определение[,определение]

     Определяет общую  переменную.  Каждое  определение описывает
идентификатор и имеет следующий формат:

[расстояние][язык]имя_идентификатора[[счетчик_1]]:тип[:счетчик_2]

где "расстояние" - это NEAR или FAR (если оно не задается,  то по
умолчанию  соответствуют  используемой модели памяти для данных),
"язык" - это C,  PASCAL,  BASIC,  FORTRAN или NOLANGUAGE (язык не
определен)  и задает применение к "имени_идентификатора" соглаше-
ний,  специфических для языка.  "Имя_идентификатора" - это  общая
переменная (или переменные, разделенные запятыми). Если в качест-
ве расстояния указывается NEAR, то компоновщик для вычисления об-
щего   размера  массива  использует  значение  "счетчик_1".  Если
"расстояние" - это FAR, то компоновщик для указания того, сколько
имеется элементов размера "счетчик_1" * на основной размер, опре-
деляемый типом,  использует значение "счетчик_2".  "Типом"  может
быть BYTE,  WORD,  DATAPTR,  CODEPTR, DWORD, FWORD, PWORD, QWORD,
TBYTE или имя структуры.  "Счетчик_2" задает,  сколько  элементов
определяет данная общая переменная.  По умолчанию значения "счет-
чик_1" и "счетчик_2" равны 1.

Директива COMMENT                                     Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     COMMENT разделитель[текст]
     [текст]
     разделитель[текст]

     Начинает комментарий, состоящий из нескольких строк. Ограни-
чителем является первый ненулевой символ, следующий за COMMENT.

Директива %COND                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Выводит в листинге все операторы в условном блоке.  Этот ре-
жим используется в Турбо Ассемблере по умолчанию.

Директива CONST                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Определяет начало сегмента данных-констант.

Директива .CREF                                       Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Позволяет собирать для всех идентификаторов, начиная от дан-
ной  точки  и  далее в исходном файле,  информацию о перекрестных
ссылках. Директива .CREF имеет обратный эффект по сравнению с ди-
рективами %XCREF или .XCREF, которые запрещают сбор информации.

Директива %CREF                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Позволяет собирать для всех идентификаторов, начиная от дан-
ной точки и далее в исходном  файле,  информацию  о  перекрестных
ссылках. Директива .CREF имеет обратный эффект по сравнению с ди-
рективами %XCREF или .XCREF, которые запрещают сбор информации.

Директива %CREFALL                            Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Приводит к тому,  что в листинге перекрестных  ссылок  будут
выводиться все идентификаторы, которые встречаются далее в исход-
ном коде.  В Турбо Ассемблере этот режим используется по  умолча-
нию.  Директива  %CREFALL  изменяет  действие предыдущих директив
%CREFREF или %CREFUREF,  которые запрещают вывод в листинге иден-
тификаторов с имеющими или отсутствующими на них ссылками, на об-
ратное.

Директива %CREFREF                            Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Запрещает вывод в листинге перекрестных ссылок идентификато-
ров, ссылки на которые отсутствуют.

Директива %CREFUREF                           Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Запрещает вывод в листинге перекрестных ссылок идентификато-
ров, ссылки на которые отсутствуют.

Директива %CREFUREF                           Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Выводи в листинг перекрестных ссылок только те идентификато-
ры, на которые нет ссылок.

Директива %CTLS                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Приводит к тому,  что в листинге будут присутствовать управ-
ляющие директивы (такие, как %LIST, %INCL и т.д.).

Директива .DATA                                       Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Определяет в вашем модуле начало инициализированного сегмен-
та  данных.  Для  определения  модели  памяти  вы  должны сначала
использовать директиву .MODEL. Сегмент данных помещается в группу
с именем DGROUP,  которая содержит также сегменты, определенные с
помощью директив .STACK, .CONST и .DATA?.

Директива DATASEG                                    Режим Ideal
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Определяет в вашем модуле начало инициализированного сегмен-
та  данных.  Для  определения  модели  памяти  вы  должны сначала
использовать директиву .MODEL. Сегмент данных помещается в группу
с именем DGROUP,  которая содержит также сегменты, определенные с
помощью директив .STACK, .CONST и .DATA?.

Директива .DATA?                                      Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Определяет в вашем модуле начало неинициализированного  сег-
мента  данных.  Для  определения  модели памяти вы должны сначала
использовать директиву .MODEL. Сегмент данных помещается в группу
с именем DGROUP,  которая содержит также сегменты, определенные с
помощью директив .STACK, .CONST и .DATA.

Директива DB                                  Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     [имя] DB выражение[,выражение]

     Выделяет и инициализирует байт  памяти.  "Имя"  представляет
собой  идентификатор,  который  вы  будете затем использовать для
ссылки на данные.  "Выражение" может представлять  собой  выраже-
ние-константу, вопросительный знак, строку символов или выражение
с операцией DUP.

Операция DD                                  Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     [имя] DD[тип PTR][ выражение[,выражение]

     Выделяет и инициализирует 4 байта  памяти  (двойное  слово).
"Имя" - это идентификатор, который вы будете впоследствии исполь-
зовать для ссылки на данные.  "Тип",  за которым следует PTR, до-
бавляет  к  определяемому  идентификатору информацию для отладки,
благодаря чему Турбо отладчик сможет правильно выводить ее содер-
жимое.  Тип может быть следующим:  BYTE,  WORD, DATAPTR, CODEPTR,
DWORD,  FWORD,  PWORD,  QWORD,  TBYTE,  SHORT,  NEAR, FAR или имя
структуры. "Выражение" может быть выражением-константой, вопроси-
тельным знаком или выражением с DUP.

Директива %DEPTH                               Режим Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     %DEPTH

     Устанавливает размер  поля  глубины в файле листинга в соот-
ветствии со значением "длина".  По умолчанию это  значение  равно
одному столбцу.

Директива DF                                  Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     [имя] DF[тип PTR] выражение[,выражение]...

     Выделяет и  инициализирует  6 байт памяти (дальний указатель
типа far).  "Имя" - это идентификатор,  который вы будете позднее
использовать для ссылки на данные. "Тип",  указываемый после PTR,
добавляет к определяемому идентификатору информацию  для отладки,
благодаря которой Турбо отладчик сможет правильно выводить ее со-
держимое. Тип может быть следующим: BYTE, WORD, DATAPTR, CODEPTR,
DWORD, FWORD,  PWORD,  QWORD,  TBYTE, SHORT, NEAR, FAR или именем
структуры. "Выражение" может быть  выражением-константой,  знаком
вопроса, адресным выражением или выражением с DUP.

Директива DISPLAY                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     DISPLAY "текст"

     Выводит заключенную в кавычки строку (текст) на экран.

Директива DOSSEG                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает переопределение сегментов DOS во время компоновки.
Используйте данную директиву  только  при  разработке  автономных
программ на  Ассемблере.  Укажите директиву DOSSEG один раз в ис-
ходном основном модуле, где определяется начальный адрес програм-
мы.

Директива DP                                  Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     [имя] DP[тип PTR] выражение[,выражение]...

     Выделяет и  инициализирует  6 байт памяти (дальний указатель
типа far).  "Имя" - это идентификатор,  который вы будете позднее
использовать для ссылки на данные. "Тип",  указываемый после PTR,
добавляет к определяемому идентификатору информацию  для отладки,
благодаря которой Турбо отладчик сможет правильно выводить ее со-
держимое. Тип может быть следующим: BYTE, WORD, DATAPTR, CODEPTR,
DWORD, FWORD,  PWORD,  QWORD,  TBYTE, SHORT, NEAR, FAR или именем
структуры. "Выражение" может быть  выражением-константой,  знаком
вопроса, адресным выражением или выражением с DUP.

Директива DQ                                  Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     [имя] DQ выражение[,выражение]...

     Выделяет и инициализирует 8 байт памяти  (четверное  слово).
"Имя" представляет собой идентификатор, который вы будете позднее
использовать для ссылки на данные. "Выражение" может быть выраже-
нием-константой,  64-разрядным числом с плавающей точкой,  знаком
вопроса или выражением с DUP.

Директива DT                                  Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     [имя] DT выражение[,выражение]...

     Выделяет и инициализирует 10 байт памяти (четверное слово).
"Имя" представляет собой идентификатор, который вы будете позднее
использовать  для ссылки на данные.  "Выражение" может быть выра-
жением-константой, 64-разрядным числом с плавающей точкой, знаком
вопроса или выражением с DUP.

Директива DW                                  Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     [имя] DP[тип PTR] выражение[,выражение]...

     Выделяет и инициализирует 2 байта памяти (слово) "Имя" - это
идентификатор,  который вы будете позднее использовать для ссылки
на данные.  Тип, указываемый после PTR, добавляет к определяемому
идентификатору информацию для отладки,  благодаря  которой  Турбо
отладчик сможет правильно выводить ее содержимое.  Тип может быть
следующим:  BYTE,  WORD,  DATAPTR,  CODEPTR, DWORD, FWORD, PWORD,
QWORD,  TBYTE, SHORT, NEAR, FAR или именем структуры. "Выражение"
может быть выражением-константой,  знаком вопроса, адресным выра-
жением или выражением с DUP.

Директива ELSE                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     IF условие
        операторы_1
     [ELSE
       операторы_2]
     ENDIF

     Начинает альтернативный блок условного ассемблирования. Опе-
раторы, определяемые в ветви ELSE  (операторы_2), ассемблируются,
если вычисление условия дает False.

Директива ELSEIF                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ELSEIF
     IF условие_1
        операторы_1
     [ELSEIF условие_2
        операторы_2]
     ENDIF

     Начинает вложенный блок условного ассемблирования, если "ус-
ловие_2" принимает значение True.  Поддерживаются также некоторые
другие формы  ELSEIF:  ELSEIF1,  ELSEIF2,   ELSEIFB,   ELSEIFDEF,
ELSEIFDIF, ELSEIFDIFI,  ELSEIFE,  ELSEIFE, ELSEIFIDN, ELSEIFIDNI,
ELSEIFNB и ELSEIFNDEF.

Директива EMUL                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Приводит к тому, что все последующие инструкции сопроцессора
будут генерироваться, как эмулируемые инструкции, а не как реаль-
ные инструкции. При выполнении программы  у вас должен быть уста-
новлен пакет  программной эмуляции инструкций с плавающей точкой,
в противном случае эти инструкции не будут корректно работать.

Директива END                                 Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     END [начальный_адрес]

     Отмечает начало исходного файла. "Начальный_адрес" - это ид-
ентификатор или  выражение,  которое задает адрес вашей программы
в начале выполнения.  Турбо Ассемблер игнорирует любой текст, ко-
торый встречается после директивы END.

Директива ENDIF                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ENDIF
     IF условие
        операторы
     ENDIF

     Отмечает конец блока условного ассемблирования  в  одной  из
директив IFхххх.

Директива ENDM                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Определяет конец блока повторения или макроопределения.

Директива ENDP                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ENDP [имя_программы]
     [имя_программы] ENDP

     Отмечает конец процедуры.  Если указывается  имя  программы,
оно должно соответствовать имени, которое задано в директиве PROC
в начале определения процедуры.

Директива ENDS                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ENDS [имя_сегмента | имя_структуры]
     [имя_сегмента | имя_структуры]ENDS

     Отмечает конец текущего сегмента, структуры или объединения.
Если вы указываете необязательное имя,  то оно должно совпадать с
именем, заданным  в соответствующей директиве SEGMENT,  STRUC или
UNION.

Директива ENUM                                 Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

    ENUM имя[переменная_перечисления[,переменная_перечисления...]]
   имя ENUM я[переменная_перечисления[,переменная_перечисления...]]

     Описывает перечислимый тип данных.

Директива EQU                                 Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     имя EQU выражение

     Определяет "имя", как строку, псевдоним или числовое присва-
ивание, содержащее результат вычисления выражения.

Директива .ERR                                        Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     .ERR <строка>

     Приводит к тому,  что при обнаружении данной директиве в ис-
ходном коде в данной строке возникает ошибка,  и в качестве сооб-
щения об ошибке выводится необязательная строка.

Директива ERR                                         Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ERR <строка>

     Приводит к тому,  что при обнаружении данной директиве в ис-
ходном коде в данной строке возникает ошибка,  и в качестве сооб-
щения об ошибке выводится необязательная строка.

Директива .ERR1                                       Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     .ERR1 <строка>

     Приводит к тому, что на первом проходе ассемблирования  воз-
никает ошибка,  и в качестве сообщения об ошибке выводится необя-
зательная строка.

Директива .ERR2                                       Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     .ERR2 <строка>

     Если разрешен  многопроходный  режим  (который   управляется
директивой командной строки /m), то на втором проходе ассемблиро-
вания возникает ошибка, и в качестве сообщения об ошибке выводит-
ся необязательная строка.

Директива .ERRB                                       Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     .ERRB аргумент <строка>

     Приводит к  ошибке,  если  аргумент  пуст,  и   в   качестве
сообщения об ошибке выводится необязательная строка.

Директива .ERRDEF                                     Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     .ERRDEF идентификатор <строка>

     Приводит к ошибке, если идентификатор определен, и в качест-
ве сообщения об ошибке выводится необязательная строка.

Директива .ERRDIF                                     Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     .ERRDIF аргумент_1,аргумент_2 <строка>

     Приводит к ошибке, если аргументы различны. Регистр символов
при сравнении учитывается, и в качестве сообщения об ошибке выво-
дится необязательная строка.

Директива .ERRDIFI                                    Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     .ERRDIFI аргумент_1,аргумент_2 <строка>

  Приводит к  ошибке,  если аргументы различны.  Регистр символов
при сравнении  не  учитывается,  и в качестве сообщения об ошибке
выводится необязательная строка.

Директива .ERRE                                       Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     .ERRE выражение <строка>

     Приводит к ошибке,  если при вычислении выражения получается
значение False  (0),  a  в качестве сообщения об ошибке выводится
необязательная строка.

Директива .ERRIDN                                     Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     .ERRIDN аргумент_1,аргумент_2 <строка>

     Приводит к  ошибке,  если аргументы совпадают.  Регистр букв
при сравнении  не  учитывается,  и в качестве сообщения об ошибке
выводится необязательная строка.

Директива ERRIF                                Режимы Ideal,MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ERRIF выражение <строка>

     Приводит к ошибке,  если выражение дает  значение  True  (не
равно нулю),  и в качестве сообщения об ошибке выводится необяза-
тельная строка.

Директива ERRIF1                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ERRIF1 <строка>

     Приводит к ошибке на первом проходе ассемблирования, и в ка-
честве сообщения об ошибке выводится необязательная строка.

Директива ERRIF2                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ERRIF2 <строка>

     Если разрешен  многопроходный режим (который управляется па-
раметром командной строки /m),  то приводит к  ошибке  на  втором
проходе ассемблирования,  и  в качестве сообщения об ошибке выво-
дится необязательная строка.

Директива ERRIFB                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ERRIFB аргумент <строка>

     Приводит к  ошибке,  если  аргумент  пуст,  и   в   качестве
сообщения об ошибке выводится необязательная строка.

Директива ERRIFDEF                            Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ERRIFDEF идентификатор <строка>

     Приводит к ошибке, если идентификатор определен, и в качест-
ве сообщения об ошибке выводится необязательная строка.

Директива ERRIFDIF                            Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ERRIFDIF аргумент_1,аргумент_2 <строка>

     Приводит к ошибке, если аргументы различны. Регистр символов
при сравнении  учитывается.  В качестве сообщения об ошибке выво-
дится необязательная строка.

Директива ERRIFDIFI                           Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ERRIFDIFI аргумент_1,аргумент_2 <строка>

     Приводит к ошибке, если аргументы различны. Регистр символов
при сравнении не учитывается.  В качестве сообщения об ошибке вы-
водится необязательная строка.

Директива ERRIFE                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ERRIFDIF выражение <строка>

     Приводит к  ошибке,  если  аргументы выражение дает значение
False (0).  В качестве сообщения об ошибке выводится необязатель-
ная строка.

Директива ERRIFDIDN                           Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ERRIFDIDN аргумент_1,аргумент_2 <строка>

     Приводит к ошибке,  если аргументы совпадают. Регистр симво-
лов при сравнении учитывается. В качестве сообщения об ошибке вы-
водится необязательная строка.

Директива ERRIFDIDNI                          Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ERRIFDIDNI аргумент_1,аргумент_2 <строка>

     Приводит к ошибке,  если аргументы совпадают. Регистр симво-
лов при сравнении не учитывается.  В качестве сообщения об ошибке
выводится необязательная строка.

Директива ERRIFNB                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ERRIFNB аргумент <строка>

     Приводит к ошибке, если аргумент не пуст, и в качестве сооб-
щения об ошибке выводится необязательная строка.

Директива ERRIFNDEF                           Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ERRIFNDEF идентификатор <строка>

     Приводит к ошибке,  если идентификатор не определен, и в ка-
честве сообщения об ошибке выводится необязательная строка.

Директива .ERRIFNB                                    Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     .ERRIFNB аргумент <строка>

     Приводит к ошибке, если аргумент не пуст, и в качестве сооб-
щения об ошибке выводится необязательная строка.

Директива .ERRIFDEF                                   Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     .ERRNDEF идентификатор <строка>

     Приводит к  ошибке,  если  идентификатор  не  определен, и в
качестве сообщения об ошибке выводится необязательная строка.

Директива .ERRNZ                                      Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     .ERRNZ выражение <строка>

     Приводит к ошибке,  если выражение имеет значение  True  (не
равно нулю).  В  качестве  сообщения об ошибке выводится необяза-
тельная строка.

Директива .EVEN                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Округляет счетчик адреса до следующего четного адреса.

Директива EVENDATA                            Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Округляет счетчик адреса до следующего нечетного адреса.

Директива .EXIT                                       Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     .EXIT [возвращаемое_значение]

     Генерирует код  завершения.  Используется  только  в  режиме
MASM. Эквивалентна директиве EXITCODE.

Директива EXITCODE                            Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     EXITCODE [возвращаемое_значение]

     Генерирует код завершения. Вы можете использовать эту дирек-
тиву в любой желаемой точке выхода. "Возвращаемое_значение" - это
число, которое должно возвращаться операционной системе.  Если вы
не задаете это значение, то возвращается значение, содержащееся в
регистре AX.

Директива EXITM                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Завершает расширение макрокоманды или блока повторения и во-
звращает управление оператору,  следующему за  макрокомандой  или
блоком повторения.

Директива EXTRN                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     EXTRN определение[,определение]...

     Указывает, что идентификатор определен в другом модуле.  Оп-
ределение описывает идентификатор и имеет следующий формат:

     [язык] имя[счетчик_1]:тип[:счетчик_2]

где "язык" задает, что к идентификатору с указанным именем должны
применяться соглашения   заданного   языка   (C,  PASCAL,  BASIC,
FORTRAN, ASSEMBLER или PROLOG).  "Имя" - это идентификатор, кото-
рый определен в другом модуле и за которым может следовать "счет-
чик_1", множитель элемента массива,  значение которого по умолча-
нию равно  1.  "Тип"  должен соответствовать типу идентификатора,
указанному при его определении,  и может  быть  следующим:  NEAR,
FAR, PROC,  BYTE,  WORD,  DWORD,  DATAPTR, CODEPTR, FWORD, PWORD,
QWORD, TBYTE, ABS или именем структуры. Значение "счетчика_2" за-
дает,  сколько элементов определяет данный внешний идентификатор.
Если оно не задается, то по умолчанию равно 1.

Директива .FARDATA                                    Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     .FARDATA [имя_сегмента]

     Определяет начало инициализированного  сегмента данных даль-
него типа   (far).   "Имя_сегмента",   если   оно   присутствует,
переопределяет имя сегмента, используемое по умолчанию.

Директива FARDATA                              Режим MASM, Ideal
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     FARDATA [имя_сегмента]

     Определяет начало инициализированного  сегмента данных даль-
него типа   (far).   "Имя_сегмента",   если   оно   присутствует,
переопределяет имя сегмента, используемое по умолчанию.

Директива .FARDATA?                                   Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     .FARDATA? [имя_сегмента]

     Определяет  начало  неинициализированного  сегмента   данных
дальнего типа (far). "Имя_сегмента", если оно присутствует, пере-
определяет имя сегмента, используемое по умолчанию.

Директива GLOBAL                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     GLOBAL определение[,определение]

     Используется для  определения   глобального   идентификатора
(символического имени) и действует, как комбинация директив EXTRN
и PUBLIC. "Определение" описывает идентификатор и имеет следующий
формат:

     [язык] имя[[счетчик_1]] :тип[:счетчик_2]

где "язык" задает, что к идентификатору с указанным именем должны
применяться соглашения   заданного   языка   (C,  PASCAL,  BASIC,
FORTRAN, ASSEMBLER или PROLOG).  Если "имя"  определено в текущем
исходном файле, оно становится общедоступным, как при использова-
нии директивы  PUBLIC.  В противном случае оно описывает  внешний
идентификатор типа "тип",  как при использовании директивы EXTRN.
За именем может следовать необязательный "счетчик_1", коэффициент
элемента массива,  значение которого по умолчанию равно 1.  "Тип"
должен соответствовать типу идентификатора,  указанному  при  его
определении, и может быть следующим: NEAR, FAR, PROC, BYTE, WORD,
DWORD, DATAPTR, CODEPTR, FWORD, PWORD, QWORD, TBYTE, ABS или име-
нем структуры.  Значение "счетчика_2" определяет, сколько элемен-
тов определяет данный внешний идентификатор.  Если оно не задает-
ся, то по умолчанию равно 1.

Директива GOTO                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     GOTO целевой_идентификатор:

     Указывает Турбо Ассемблеру, что выполнение нужно возобновить
с заданного идентификатора. Директива GOTO завершает любой услов-
ный блок, в котором она встречается.

Директива GROUP                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     GROUP имя_группы имя_сегмента[,имя_сегмента]...
     имя_группы GROUP имя_сегмента[,имя_сегмента]...

     Связывает "имя_группы" с одним или более именами  сегментов,
так что смещения для всех меток и переменных, определенных в дан-
ных сегментах, будут вычисляться относительно начала группы "имя_
группы".  "Именем_сегмента"  может  быть определенное ранее с по-
мощью директивы SEGMENT имя сегмента или выражение,  начинающееся
с SEG. В режиме MASM при доступе к идентификатору в сегменте, ко-
торый является частью группы,  вы должны использовать переопреде-
ление группы. В режиме Ideal[ Турбо Ассемблер автоматически гене-
рирует для каждого идентификатора переопределения группы.

Директива IDEAL                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Устанавливает режим   ассемблирования  Ideal.  Данный  режим
будет действовать,  пока он не будет отменен директивами  MASM  и
QUIRKS.

Директива IF                                  Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     IF выражение
        операторы_true
     [ELSE
        операторы_false]
     ENDIF

    Начинает условный блок,  который, если "выражение" имеет зна-
чение True (истинно) приводит к ассемблированию операторов  "опе-
раторы_true" вплоть до необязательной директивы ELSE.

Директива IF1                                 Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     IF1
        операторы_true
     [ELSE
        операторы_false]
     ENDIF

    Начинает условный блок, который, если текущим является первый
проход ассемблирования,  приводит  к  ассемблированию  операторов
"операторы_true" вплоть до необязательной директивы ELSE.

Директива IF2                                 Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     IF2
        операторы_true
     [ELSE
        операторы_false]
     ENDIF

    Начинает условный блок, который, если разрешен многопроходный
режим (им можно управлять с помощью  параметра  командной  строки
/m) и текущим является второй проход ассемблирования,  приводит к
ассемблированию операторов "операторы_true"  вплоть  до  необяза-
тельной директивы ELSE.

Директива IFDEF                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     IFDEF идентификатор
         операторы_true
     [ELSE
        операторы_false]
     ENDIF

    Начинает условный блок,  который, если "идентификатор"  опре-
делен, приводит  к  ассемблированию  операторов  "операторы_true"
вплоть до необязательной директивы ELSE.

Директива IFDIFI                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     IFDIFI аргумент_1,аргумент_2
         операторы_true
     [ELSE
        операторы_false]
     ENDIF

    Начинает условный  блок,  который,  если  аргументы различны,
приводит к ассемблированию операторов "операторы_true"  вплоть до
необязательной директивы  ELSE.  При сравнении аргументов регистр
букв не учитывается.

Директива IFE                                 Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     IFDE выражение
         операторы_true
     [ELSE
        операторы_false]
     ENDIF

    Начинает условный блок,  который, если выражение имеет значе-
ние False (ложно),  приводит к ассемблированию операторов "опера-
торы_true" вплоть до необязательной директивы ELSE.

Директива IFIDN                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     IFIDN аргумент_1,аргумент_2
         операторы_true
     [ELSE
        операторы_false]
     ENDIF

    Начинает условный  блок,  который,  если аргументы совпадают,
приводит к ассемблированию операторов "операторы_true"  вплоть до
необязательной  директивы ELSE.  При сравнении аргументов регистр
букв учитывается.

Директива IFIDNI                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     IFIDNI аргумент_1,аргумент_2
         операторы_true
     [ELSE
        операторы_false]
     ENDIF

    Начинает условный  блок,  который,  если аргументы совпадают,
приводит к ассемблированию операторов "операторы_true"  вплоть до
необязательной  директивы ELSE.  При сравнении аргументов регистр
букв не учитывается.

Директива IFNB                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     IFDNB аргумент
         операторы_true
     [ELSE
        операторы_false]
     ENDIF

    Начинает условный блок,  который, если аргумент не пуст, при-
водит к ассемблированию операторов "операторы_true" вплоть до не-
обязательной директивы ELSE.  При  сравнении  аргументов  регистр
букв не учитывается.

Директива IFNDEF                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     IFNDEF идентификатор
         операторы_true
     [ELSE
        операторы_false]
     ENDIF

    Начинает условный блок,  который, если идентификатор не опре-
делен, приводит  к  ассемблированию  операторов  "операторы_true"
вплоть до необязательной директивы ELSE. При сравнении аргументов
регистр букв не учитывается.

Директива %INCTL                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает листинг включаемых файлов. Этот режим устанавлива-
ется по умолчанию.

Директива INCLUDE                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     INCLUDE имя_файла или
     INCLUDE "имя_файла"

     Включает исходный код из файла с указанным именем  в текущей
позиции ассемблируемого модуля.

Директива INCLUDELIB                          Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     INCLUDELIB имя_файла или
     INCLUDELIB "имя_файла"

     Приводит к тому,  что компоновщик во время компоновки  будет
включать  библиотечный  файл с указанным именем.  Если расширение
имени файла не указывается, то предполагается расширение .LIB.

Директива INSTR                             Режимы Ideal, MASM51
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     имя INSTR [начало,]строка_1,строка_2

     "Имя" присваивается позиции первого вхождения  "строки_2"  в
"строку_1". Поиск начинается с позиции "начало" (или с позиции 1,
если "начало" не задано).  Если "строка_2" нигде в "строке_1"  не
встречается, то "имя" устанавливается в ноль.

Директива IRP                                 Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     IRP параметр, аргумент_1[,аргумент_2]...
         операторы
     ENDM

     Повторяет блок  операторов  со  строковой подстановкой.  Для
каждого  имеющегося аргумента ассемблирование  выполняется только
один раз.  Аргументами может быть любой текст:  символы,  строки,
числа и т.д. При каждом ассемблировании блока для каждого вхожде-
ния "параметра" в "операторах" подставляется следующий аргумент в
списке.

Директива IRPC                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     IRPC параметр, строка
         операторы
     ENDM

     Повторяет блок операторов со  символьной  подстановкой.  Для
каждого  имеющегося  символа в строке ассемблирование выполняется
только один раз.  При каждом ассемблировании  блока  для  каждого
вхождения "параметра" в "операторах" подставляется следующий сим-
вол в строке.

Директива JMP                                 Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     JMP <указатель_экземпляра>METHOD{<имя_объекта>:}
        <имя_метода>{USES{сегментный_регистр:}смещение}

     Действует аналогично CALL...METHOD, но генерирует вместо ин-
струкции CALL инструкцию JMP и очищает стек при наличие  в  стеке
локальных переменных  (LOCAL) или переменных в стеке,  заданных с
помощью USES.

Директива JUMPS                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Приводит к тому, что Турбо Ассемблер ищет по целевому адресу
инструкцию условного перехода,  и если она не может достичь целе-
вого смещения с помощью короткого перехода,  генерирует  условный
переход (через  обычную  инструкцию  перехода)  с противоположным
смыслом, что позволяет достичь целевого адреса.  Данная директива
имеет тот  же  эффект,  что  и  использование параметра командной
строки /JJUMPS.

Директива LABEL                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     имя LABEL тип
     LABEL имя тип

     Задает для  имени  идентификатора  указанный  тип.  "Имя" не
должно быть определенным в исходном файле ранее.  Тип может  быть
следующим:  NEAR, FAR, PROC, BYTE, WORD, DWORD, DATAPTR, CODEPTR,
FWORD, PWORD, QWORD, TBYTE или именем структуры.

Директива .LALL                                       Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает листинг всех макрорасширений.

Директива LARGESTACK                                  Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Указывает, что стек 32-битовый.

Директива .LFCOND                                     Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Выводит в листинге все операторы в условных блоках.

Директива %LINUM                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     %LINUM размер

     Задает размер поля номеров строк в  листинге  (в  позициях).
По умолчанию это значение равно 4.

Директива %LIST                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Выводит в  листинге строки исходного кода.  Этот режим уста-
навливается по умолчанию.

Директива .LIST                                       Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Выводит в  листинге строки исходного кода.  Этот режим уста-
навливается по умолчанию.

Директива LOCAL                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В макрокомандах:
     LOCAL идентификатор[,идентификатор]...

     В процедурах:
     LOCAL элемент[,элемент]...[=идентификатор]

     Определяет локальные  переменные  в макрокомандах и процеду-
рах. Внутри макроопределения директива LOCAL определяет временные
имена идентификаторов, которые при каждом расширении макрокоманды
заменяются уникальными именами идентификаторов.  Директива  LOCAL
должна указываться перед всеми другими операторами в макроопреде-
лении.

     В процедуре директива LOCAL определяет имена,  которые  дос-
тупны в  стеке через отрицательные смещения относительно регистра
BP. Если вы заканчиваете список аргументов знаком равенства (=) и
идентификаторов, то  этому   идентификатору  будет  присваиваться
полный объем блока локальный идентификаторов в  стеке  в  байтах.
Каждый "элемент" имеет следующий синтаксис (внутренние квадратные
скобки - это литералы):

имя_идентиф[[счетчик_1]][:[отладочный_размер][:тип][:счетчик_2]]

где "тип" - это тип данных аргумента.  Он может  быть  следующим:
BYTE,  WORD, DATAPTR, CODEPTR, DWORD, FWORD, PWORD, QWORD, TBYTE,
SHORT, NEAR, FAR или именем структуры. Если тип не задан, то под-
разумевается тип WORD.

     "Счетчик_2" задает, сколько элементов данного типа определя-
ет идентификатор.  Если это значение не задается, то по умолчанию
оно равно 1.

     "Счетчик_2" - это множитель элементов массива. Объем памяти,
выделенной для идентификатора,  представляет  собой  произведение
"счетчика_2" на длину, заданную полем "тип", и на "счетчик_1". По
умолчанию, если значение "счетчика_1" не задается, оно равно 1.

     Необязательный отладочный размер имеет следующий синтаксис:

     [тип]PTR

Директива LOCALS                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     LOCALS [префикс]

     Разрешает локальные идентификаторы, имена которых начинаются
с двух  символов @@ или двухсимвольного префикса (если он задан).
В режиме Ideal локальные идентификаторы разрешаются автоматически.

Директива MACRO                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     MACRO имя[параметр[,параметр]...]
     имя MACRO [параметр[,параметр]...]

     Определяет макрокоманду,  которая  будет впоследствии расши-
ряться при обнаружении имени "имя". Вместо "параметра" при вызове
макрокоманды вы можете указывать (в данной позиции) значение фак-
тического аргумента.

Директива %MACS                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает листинг макрорасширений.

Директива MASM                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Задает режим ассемблирования MASM.  Этот режим  используется
Турбо Ассемблером по умолчанию.

Директива MASM51                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование некоторых улучшений MASM 5.1.

Директива MODEL                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     MODEL [модификатор_модели] модель_памяти[имя_модуля]
         [,[модификатор_языка]язык][,модификатор_модели]

     Задает модель памяти  для  упрощенных  директив  определения
сегментов. "Модификатор_модели"  может указываться перед "моделью
памяти или в конце оператора и может (если задается) представлять
собой NEARSTACK  или  FARSTACK.  "Модель_памяти" может быть TINY,
SMALL, MEDIUM,  COMPACT или TCHUGE.  "Имя_модуля  используется  в
больших моделях  для  описания  имени  сегмента кода.  "Модифика-
тор_языка" - это WINDOWS,  ODDNEAR,  ODDFAR или NORMAL. Он задает
генерацию записи процедуры MSWindows и код выхода. "Язык" опреде-
ляет, из какого языка будет выполняться вызов для доступа к  про-
цедурам в  данном  модуле.  Это  может  быть  C,  PASCAL,  BASIC,
FORTRAN, PROLOG или NOLANGUAGE (язык не задан). При использовании
директив PROC и ENDP Турбо Ассемблер автоматически генерирует со-
ответствующие запись процедуры и код выхода.  "Язык" также указы-
вает Турбо Ассемблеру,  какие соглашения об именах должны исполь-
зоваться для общедоступных и внешних идентификаторов  и  в  каком
порядке аргументы процедуры заносились в стек вызывающим модулем.
Кроме того,  для удаления аргументов из стека перед возвратом ге-
нерируется соответствующая форма инструкции RET.

Директива .MODEL                                      Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     .MODEL [модификатор_модели] модель_памяти[имя_модуля]
         [,[модификатор_языка]язык][,модификатор_модели]

     См. директиву MODEL.

Директива MULTERRS                            Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает выводить  в  одной строке исходного кода несколько
сообщений об ошибках.

Директива NAME                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     NAME имя_модуля

     Задает имя модуля объектного файла. В режиме MASM эта дирек-
тива не действует, она работает только в режиме Ideal.

Директива %NEWPAGE                            Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Начинает в файле листинга новую страницу.

Директива %NOCONDS                            Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Запрещает включение в файл листинга операторов условных бло-
ков.

Директива %NNOCREF                            Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     %NOCREF[идентификатор,...]

     Запрещает сбор информации для листинга  перекрестных  ссылок
(CREF). Если  вы  укажете  одно  или более имен,  то перекрестные
ссылки будут запрещены только для данных идентификаторов.

Директива %NOCTLS                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Запрещает помещение в файл  листинга  управляющих  директив.
Турбо Ассемблер использует этот режим по умолчанию.

Директива NOEMUL                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Приводит к  тому,  что  все последующие инструкции арифмети-
ческого сопроцессора будут генерироваться,  как реальные инструк-
ции,  а  не  эмулируемые.  При  выполнении вашей программы должен
присутствовать сопроцессор 80х87,  иначе эти инструкции не  будут
правильно работать. В Турбо Ассемблере этот режим ассемблирования
с плавающей точкой используется автоматически.

Директива %NOINCL                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Запрещает листинг исходного кода включаемых файлов.

Директива NOJUMPS                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

    Запрещает удлинение условных переходов, разрешенное по дирек-
тиве JUMPS.  Этот  режим иcпользуется в Турбо Ассемблере по умол-
чанию.

Директива %NOLIST                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Запрещает вывод в файл листинга.

Директива NOLOCALS                            Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Запрещает локальные идентификаторы, разрешенные по директиве
LOCALS.  Для режима MASM Турбо  Ассемблера  это  используется  по
умолчанию.

Директива %NOMACS                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Выводит только те макрорасширения,  которые генерируют  код.
Этот режим  вывода в файл листинга макрокоманд используется Турбо
Ассемблером по умолчанию.

Директива NOMASM51                            Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Запрещает ассемблирование определенных улучшений  MAWSM 5.1,
разрешенных по директиве MASM51.  В Турбо Ассемблере данный режим
используется по умолчанию.

Директива NOMULTERRS                          Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает вывод на одной строке исходного кода только одного
сообщения об  ошибке.  Этот режим вывода сообщений об ошибках ис-
пользуется в Турбо Ассемблере по умолчанию.

Директива NOSMART                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Запрещает оптимизации кода,  при которых  генерируется  код,
отличный от MASM.

Директива %NOSYMS                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Запрещает вывод в файл листинга таблицы идентификаторов.

Директива %NOTRUNCS                           Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Предотвращает усечение полей, размер который превышает длину
соответствующего поля в файле листинга.

Директива NOWARN                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     NOWARN [класс_предупреждений]

     Запрещает вывод предупреждающих сообщений  с идентификатором
предупреждений  "класс_предупреждений",  или всех предупреждающих
сообщений, если "класс_предупреждений" не задан.

Директива ORG                                 Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     ORG выражение

     Устанавливает счетчик инструкций в текущем сегменте в  соот-
ветствии с адресом, задаваемым "выражением".

Директива %OUT                                        Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     %OUT текст

     Выводит текст на экран.

Директива P186                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирования инструкций процессора 80186.

Директива P286                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование  всех  инструкций процессора 80286
(включая защищенный режим) и инструкций арифметического сопроцес-
сора 80287.

Директива P286N                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование  непривилегированных (реальный ре-
жим) инструкций процессора  80286  и  инструкций  арифметического
сопроцессора 80287.

Директива P286P                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование  всех  (включая  защищенный режим)
инструкций процессора 80286 и инструкций  арифметического  сопро-
цессора 80287.

Директива P287                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование  инструкций арифметического сопро-
цессора 80287.

Директива P286                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование всех  (включая  защищенный  режим)
инструкций процессора 386 и инструкций сопроцессора 387.

Директива P386N                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование  непривилегированных (реальный ре-
жим) инструкций процессора 386 и инструкций арифметического  соп-
роцессора 80387.

Директива P386P                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование  всех  (включая  защищенный режим)
инструкций процессора 386 и инструкций сопроцессора 387.

Директива P387                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование инструкций арифметического  сопро-
цессора 387.

Директива P486                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование  всех  инструкций  процессора i486
(включая защищенный режим).

Директива P486N                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование   непривилегированных   инструкций
процессора i486 (реальный режим).

Директива P8086                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование только инструкций процессора 8086.
В Турбо Ассемблере этот режим используется по умолчанию.

Директива P8087                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает ассемблирование только  инструкций арифметического
сопроцессора  8087.  В Турбо Ассемблере этот режим назначается по
умолчанию.

Директива PAGE                                        Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     PAGE[строки][,столбцы]

     Устанавливает высоту и ширину страниц листинга, начинает но-
вую страницу. См. описание директивы %PAGESIZE.

Директива %PAGESIZE                           Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     %PAGESIZE[строки][,столбцы]

     Устанавливает высоту и ширину страниц листинга, начинает но-
вую страницу. Параметр "строки" задает число строк, которые будут
выводиться на страницу листинга (от 10 до 255),  параметр "столб-
цы" задает ширину страницы в позициях (от 59 до 255).  Если пара-
метры опущены,  их текущие значения остаются без изменения.  Если
за директивой %PAGESIZE указывается знак +,  то начинается  новая
страница, номер раздела увеличивается, а номер страницы начинает-
ся с 1.  Директива %PAGESIZE без аргументов вызывает  переход  на
новую страницы, при этом номер раздела не изменяется.

Директива %PCNT                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     %PCNT размер

     Устанавливает длину поля "сегмен:смещение" в  файле листинга
в  соответствии с параметром "размер".  По умолчанию это значение
равно 4 для 16-разрядных сегментов и 8 для 32-разрядных.

Директива PNO87                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Предотвращает ассемблирование инструкций числового сопроцес-
сора (реальных или эмулируемых).

Директива %POPLCTL                            Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Сбрасывает параметры управления листингом в значения,  кото-
рые они имели, когда была дана последняя директива %PUSHLCTL.

Директива PROC                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     PROC[модификатор_языка][язык] имя [расстояние]
        [USES элементы,][аргумент[,аргумент]...]
        [RETURNS аргумент[,аргумент]...]
     имя PROC [модификатор_языка][язык][расстояние]
        [USES элементы,][аргумент[,аргумент]...]
        [RETURNS аргумент [,аргумент]...]

     Определяет начало процедуры с указанным именем. "Модификатор
_языка" - это WINDOWS или NOWINDOWS.  Он  задает  генерацию  кода
входа/выхода MSWindows. "Язык" определяет, из какого языка выпол-
няется вызов для доступа к данной процедуре:  C,  PASCAL,  BASIC,
FORTRAN,  PROLOG или NOLANGUAGE.  Этим определяются соглашения по
именам идентификатором, порядок аргументов в стеке и то, останут-
ся  ли  аргументы  в  стеке при возврате управления из процедуры.
"Расстояние" - это NEAR или FAR.  Оно определяет  тип  инструкции
RET,  которая будет ассемблироваться в конце процедуры.  "Элемен-
ты" - это список регистров и/или элементов данных,  состоящих  из
одной лексемы,  которые должны заноситься в стек при входе в про-
цедуру и извлекаться из стека при выходе из нее.  "Аргумент" опи-
сывает аргумент,  с которым вызывается процедура. Каждый аргумент
имеет следующий синтаксис:

   имя_аргумента[[счетчик_1]][[:расстояние][PTR]тип][:счетчик_2]

где "имя_аргумента" - это имя, которое вы будете использовать для
ссылки  на  данный аргумент в процедуре.  "Расстояние" - это NEAR
или FAR,  оно показывает, что аргумент является указателем задан-
ного размера.  "Тип" - это тип данных аргумента, оно может предс-
тавлять собой BYTE,  WORD,  DWORD, FWORD, PWORD, QWORD, TBYTE или
имя структуры. Если тип не задается, то подразумевается тип WORD.
"Счетчик_1" и "счетчик_2" - это число элементов  указанного типа.
PTR сообщает Турбо Ассемблеру,  что нужно включить информацию для
отладки. Благодаря этому Турбо отладчик будет знать, что аргумент
является указателем на элемент данных.  Если использовать PTR без
"расстояния",  то размер указателя будет основываться на  текущей
модели памяти и размере адреса сегмента.  RETURNS задает один или
более аргументов,  которые нежелательно извлекать  из  стека  при
возврате управления из процедуры.

Директива PUBLIC                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     PUBLIC [язык] идентификатор [,[язык] идентификатор]...

     Описывает идентификатор,  как  доступный  из других модулей.
Если задан "язык"  (C,  PASCAL,  BASIC,  FORTRAN,  ASSEMBLER  или
PROLOG),  то идентификатор становится доступным с учетом примене-
ния к нему соглашений по именам, принятым в указанном языке.

Директива PUBLICDDL                           Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     PUBLICDDL [язык] идентификатор [,[язык] идентификатор]...

     Описывает идентификаторы,  как динамические точки  входа  из
других  модулей  для компоновки.  "Идентификатор" (PROC или метка
программы, имя переменной, или числовая константа, определенная с
помощью  EQU) становится доступной для других программ под управ-
лением  OS/2.  Если  задан  язык  (C,  PASCAL,  BASIC,   FORTRAN,
ASSEMBLER или PROLOG),  то идентификатор становится общедоступным
с учетом применения к нему соглашений по именам,  принятым в ука-
занном языке.

Директива PURGE                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     PURGE имя_макрокоманды[,имя_макрокоманды]...

     Удаляет макроопределение "имя_макрокоманды".

Директива %PUSHLCTL                           Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Сохраняет в  16-уровневом стеке текущие параметры управления
листингом.

Директива QUIRKS                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Позволяет вам ассемблировать исходный файл,  в  котором  ис-
пользуются специфические "странности" MASM.

Директива .RADIX                                      Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     .RADIX основание

     Задает основание  системы  счисления для целочисленных конс-
тант (2, 8, 10 или 16).

Директива RADIX                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     RADIX основание

     Задает основание системы счисления для  целочисленных  конс-
тант (2, 8, 10 или 16).

Директива RECORD                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     имя RECORD поле[,поле]...
     RECORD имя поле[,поле]...

     Определяет имя записи, которая содержит битовые поля. Каждое
поле описывает группу бит в записи, и имеет следующий формат:

     имя_поля:длина[=выражение]

где "имя_поля" - это имя поля в записи.  "Длина" (от 1 до 16) за-
дает число бит в поле. Если общее число бит во всех полях равно 8
или меньше, то запись будет занимать 1 байт, 9-16 бит будут зани-
мать 2 байта,  в противном случае запись будет занимать 4  байта.
"Выражение" задает для поля значение по умолчанию.

Директива REPT                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     REPT выражение
          операторы
     ENDM

     Повторяет блок операторов столько раз,  сколько задается вы-
ражением.

Директива RETCODE                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Генерирует ближний (2-байтовое смещение) или дальний (4-бай-
товое смещение) возврат,  в зависимости от модели памяти, описан-
ной  в  директиве .MODULE.  Крохотная  (TINY),  малая (SMALL) или
компактная (COMPACT) модели приводят к ближнему возврату, а сред-
няя (MEDIUM), большая (LARGE) и сверхбольшая (HUGE) модели приво-
дят к дальнему возврату.  Более подробно об этом рассказывается в
описании инструкции RET в Главе 4.

Директива RETF                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Генерирует возврат из процедуры дальнего (FAR) типа  (4-бай-
товое смещение). Подробнее об этом рассказывается в Главе 4.

Директива RETN                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Генерирует ближний  (NEAR)  возврат из процедуры (4-байтовое
смещение). Подробнее об этом рассказывается в Главе 4.

Директива .SALL                                       Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Подавляет листинг всех операторов в макрорасширении.

Директива SEGMENT                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

SEGMENT имя[выравнивание][комбинирование][использование]['класс']
имя SEGMENT[выравнивание][комбинирование][использование]['класс']

     Определяет имя сегмента с полным управлением атрибутом. Если
вы уже определили сегмент с этим именем,  то данный  сегмент  ин-
терпретируется, как продолжение предыдущего. "Выравнивание" опре-
деляет тип границы памяти,  где должен начинаться сегмент:  BYTE,
WORD, DWORD, PARA (по умолчанию) или PAGE. "Комбинирование" опре-
деляет, как сегменты с одним и тем же именем, но из различных мо-
дулей  должны  комбинироваться во время компоновки:  AT выражение
(сегмент помещается по абсолютному адресу параграфа "выражение"),
COMMON  (данный сегмент и все другие сегменты с этим именем поме-
щаются по одному адресу),  MEMORY (выполняется конкатенация  всех
сегментов  с  одинаковым  именем  в  один  непрерывный  сегмент),
PRIVATE (данный сегмент не комбинируется  с  другими  сегментами;
это задается по умолчанию,  если аргумент не указывается),  STACK
(выполняется конкатенация всех сегментов с одним и тем  же именем
для  формирования одного непрерывного сегмента,  затем регистр SS
инициализируется значением начала сегмента, а SP - длиной сегмен-
та)  или VIRTUAL (определяется сегмент специального вида, который
будет интерпретироваться,  как общая область и  присоединяться  к
другому сегменту во время компоновки). "Использование" задает ис-
пользуемый по умолчанию для сегмента размер слова (если разрешена
генерация  кода  процессора  386)  и  может быть USE16 или USE32.
"Класс" управляет упорядочиванием сегментов на  этапе компоновки.
Сегменты  с  одним  и  тем  же именем класса загружаются в память
вместе,  независимо от порядка,  в котором они следуют в исходном
файле.

Директива .SEQ                                        Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Задает последовательное упорядочивание сегментов. Этот режим
упорядочивания используется Турбо Ассемблером по  умолчанию.  Ди-
ректива .SEQ имеет ту же функцию, что и параметр командной строки
/s.

Директива .SFCOND                                    Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Предотвращает включение  в файл листинга операторов условных
блоков с ложным (False) условием.

Директива SIZESTR                           Режимы Ideal, MASM51
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     имя SIZESTR строка

     Выравнивает число  символов в строке по имени "имя". Нулевая
строка имеет нулевую длину.

Директива SMART                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает все оптимизации кода.

Директива .STACK                                      Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     .STACK [размер]

     Определяет начало сегмента стека, выделяя "размер" байт. Ес-
ли "размер" не указывается, выделяется 1024 байта.

Директива STACK                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     STACK [размер]

     Определяет начало сегмента стека, выделяя "размер" байт. Ес-
ли "размер" не указывается, выделяется 1024 байта.

Директива STARTUP                                    Режимы MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Обеспечивает код инициализации. Используется только в режиме
MASM. Эквивалентна директиве STARTUPCODE.

Директива STARTUPCODE                         Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Обеспечивает код инициализации и отмечает начало программы.

Директива STRUC                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     имя STRUC
         поля
     [имя] ENDS
     STRUC имя
       поля
     ENDS [имя]

     Определяет структуру с именем "имя", содержащую поля. В каж-
дом поле для определения его размера используются обычные  дирек-
тивы выделения данных (DB,  DW и т.д.). Поля могут быть именован-
ными или нет.  При использовании режима MASM имена  полей  должны
быть уникальными. В режиме Ideal этого не требуется.

Директива SUBSTR                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     имя SUBSTR строка,позиция[,размер]

     Определяет новую  строку  "имя",  содержащую  символы строки
"строка", начиная с указанной позиции длины "размер". Если размер
не задан, то имени присваиваются все оставшиеся в строке символы,
начиная с "позиции".

Директива SUBTTL                                      Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     SUBTTL текст

     Задает подзаголовок файла листинга.

Директива %SUBTTL                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     %SUBTTL текст

     Задает подзаголовок файла листинга.

Директива %SYMS                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Разрешает вывод в файле листинга таблицы  идентификаторов. В
Турбо Ассемблере этот режим используется по умолчанию.

Директива %TABSIZE                            Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     %TABSIZE размер

     Устанавливает число  столбцов  между  символами  табуляции в
файле листинга в соответствии со значением "размер". По умолчанию
это 8 позиций.

Директива TBLINIT                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Инициализирует указатель в объекте  на  таблицу  виртуальных
методов.

Директива TBLINST                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     TBLINST

     Создает экземпляр  таблицы  виртуальных методов для текущего
объекта и определяет @TableAddr_<объект>.  Эта  директива  должна
использоваться после каждого определения объекта, который включа-
ет в себя таблицу виртуальных  методов,  таким  образом,  таблица
виртуальных методов  выделяется.  Эта  директива должны использо-
ваться только в одном модуле программы.

Директива TBLPTR                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     TBLPTR

     Помещает указатель таблицы  виртуальных  методов  на  объект
данных. Определяет элемент структуры с именем @Mptr_<объект>. Это
можно использовать только в определении объекта.

Директива %TEXT                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     %TEXT длина

     Задает длину поля исходного текста в листинге в соответствии
с указанным значением.

Директива .TFCOND                                    Режимы MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Переключает режим вывода в файл  листинга  блоков  условного
ассемблирования.

Директива TITLE                                       Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     TITLE текст

     Задает заголовок файла листинга ("текст").

Директива %TITLE                              Режимы MASM, Ideal
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     %TITLE "текст"

     Задает заголовок файла листинга ("текст").

Директива %TRUNC                              Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Усекает слишком длинные поля листинга.

Директива TYPEDEF                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     TYPEDEF имя_типа сложный тип
     имя_типа TYPEDEF сложный_тип

     Определяет именованный тип.

Директива UDATASEG                            Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Определяет начало неинициализированного сегмента данных.

Директива UFARDATA                            Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Определяет начало  дальнего  неинициализированного  сегмента
данных.

Директива UNION          Режимы Ideal, MASM (QUIRKS запрещается)
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     UNION имя
       поля
     ENDS [имя]
     имя UNION
       поля
     [имя] ENDS

     Определяет объединение с именем  "имя".  Объединение  анало-
гично структуре, но все его элементы имеют нулевое смещение отно-
сительно начала объединения.  Это позволяет получить набор перек-
рывающихся полей,  благодаря чему можно ссылаться на определяемую
объединением с помощью различных имен и разных  размеров  данных.
Размер объединения  соответствует размеру наибольшего элемента, а
не равен сумме длин всех элементов, как в структуре. "Поля" опре-
деляют поля,  составляющие  объединение.  Каждое  поле определяет
обычные директивы определения данных (DB, DW и т.д.).

Директива USES                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     USES элемент[,элемент]...

     Показывает, какие регистры или элементы данных, состоящие из
одной лексемы,  вы  хотите  занести  в стек в начале охватывающей
процедуры. Перед возвратом управления из процедуры  эти  регистры
будут извлекаться из стека.  Вы должны использовать эту директиву
перед первой инструкцией,  которая  генерирует в процедуре реаль-
ный код.

Директива VERSION                             Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     VERSION <идентификатор_версии>

     Переводит Турбо Ассемблер в  режим  работы,  соответствующий
указанной версии.

Директива WARN                                Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     WARN [класс_предупреждений]

     Разрешает вывод предупреждающих сообщений, тип которых опре-
деляется "классом_предупреждений", или всех предупреждающих сооб-
щений, если "класс_предупреждений" не задан.  "Класс_предупрежде-
ний" может быть следующим: ALN, ASS, DRK, ICG,LCO, OPI, OPS, OVF,
PDC, PRO, PQR, RES или TPI.

Директива WHILE                               Режимы Ideal, MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     WHILE выражение
       тело_макрокоманды
     ENDM

     Повторяет тело   макрокоманды,   пока  "выражение"  равно  0
(false).

Директива .XALL                                       Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Вызывает вывод  в  файл листинга только тех макрорасширений,
которые генерируют код или данные.

Директива .XCREF                                      Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Запрещает сбор информации для листинга  перекрестных  ссылок
(CREF).

Директива .XLIST                                      Режим MASM
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Запрещает последующий вывод в файл листинга.

               Часть 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 - нет, данного префикса инструкции нет.                  і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

              Размер атрибута адреса для стека
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Инструкции, в  которых  стек  используется неявно (например,
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 и требует полностью определять форму адресации.

ЪДДДДДДДДДДДДВДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДї
і   Префикс  і Префикс раз- і Префикс раз-  і Переопределение   і
і инструкции і мера адреса  і мера операнда і    сегмента       і
ГДДДДДДДДДДДДБДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДґ
і  0 или 1        0 или 1         0 или 1         0 или 1       і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і                          Число байт                           і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

ЪДДДДДДДДДДДДДВДДДДДДДДВДДДДДДДДДВДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДї
і     Код     і ModR/V і   SIB   і  Смещение і Непосредственное і
і  операции   і        і         і           і    значение      і
ГДДДДДДДДДДДДДБДДДДДДДДБДДДДДДДДДБДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДґ
і   1 или 2    0 или 1   0 или 1    0, 1, 2     0, 1, 2 или 4   і
і                                    или 4                      і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і                         Число байт                            і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Рис. 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
ЪДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДї
і      Mod      і   Регистр/Код операции   і        R/M         і
АДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДЩ

                            Байт SIB

   7        6        5        4        3       2       1       0
ЪДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДї
і      SS       і         Индекс           і      База          і
АДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДЩ

     Рас. 4.2. Формат байт ModR/M и SIB

     Значения и соответствующие виды адресации байт ModR/M  и SIB
показаны в таблицах 4.2, 4.3 и 4.4

    Виды 16-разрядной адресации с байтом ModR/M    Таблица 4.2
ЪДДДДДДДДДДДДДДДДДВДДДДДВДДДДДВДДДДДВДДДДДВДДДДДВДДДДДВДДДДДВДДДї
і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]        і 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  і
АДДДДДДДДДДДДДДДДДБДДДДБДДДДБДДДДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДДЩ

     - "dis8" обозначает 8-битовое смещение,  следующее за байтом
       ModR/M,  которое должно расширяться по знаку и добавляться
       к индексу;

     - "dis16" обозначает 16-итовое смещение, следующее за байтом
       ModR/M, которое должно добавляться к индексу;

     По умолчанию для действующего адреса,  содержащего индексный
регистр BP,  действующим адресом является регистр SS.  Для других
действующих адресов сегментным регистром будет регистр DS.

           Виды 32-разрядной адресации с байтом ModR/M
                  (только для процессора 80386)       Таблица 4.3
ЪДДДДДДДДДДДДДДДДДВДДДДДВДДДДДВДДДДДВДДДДДВДДДДДВДДДДДВДДДДДВДДДї
і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]            і 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  і
АДДДДДДДДДДДДДДДДДБДДДБДДДДБДДДДДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДДЩ

     - [..][..] обозначает байт SIB,  следующий за байтом ModR/M;

     - "dis8" обозначает 8-битовое смещение,  следующее за байтом
       SIB, которое  должно  расширяться по знаку и добавляться к
       индексу;

     - "dis32" обозначает 32-битовое смещение,  следующее за бай-
       том ModR/M, которое должно добавляться к индексу.

            Виды 32-разрядной адресации с байтом SIB
                  (только для процессора 80386)       Таблица 4.4
ЪДДДДДДДДДДДДДДДДДВДДДДДВДДДДДВДДДДДВДДДДДВДДДДДВДДДДДВДДДДДВДДДї
і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     виде                               і
ГДДДДДДДДДДДДДДДДДЕДДДВДДДДДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДДДґ
і[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   і
АДДДДДДДДДДДДДДДДДБДДДБДДДДДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДДДЩ

     - [*] и Mod = 00 означает "dis32" без базы, в противном слу-
чае [ESP]. Это обеспечивает следующие режимы адресации:

     dis[индекс]        (MOD = 00)
     dis8[EBP][индекс]  (MOD = 01)
     dis32[EPB][индекс] (MOD = 10)

            Как пользоваться описанием инструкций
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Приведем примерный формат описаний данной главы:

     Название             Что означает название инструкции
     инструкции           Какой процессор работает с инструкцией
                          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
                          O   D    I    T    S    Z    A   P   C
                          Информационные флаги

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і    Код операции                     Такты                     і
ГДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДВДДДДДДДДДДДґ
і                    і        386     і     286     і    86     і
ГДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДБДДДДДДДДДДДґ
і                    і Таблица, содержащая информацию о тактах  і
АДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

                            Флаги
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     Каждая запись  в  этом  разделе включает в себя информацию о
том, какие флаги регистра флагов процессора  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
        ?                           ?      ?      *      ?      *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция   Такты            Описание            і
ГДДДДДДДДДДДВДДДДДДДДДДДВДДДДВДДДДВДДДДДВДДВДДДДДДДДДДДДДДДДДДДДґ
і           і           і486 і386 і286  і86і                    і
ГДДДДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
і37         і AAA       і3   і4   і3    і8 іВыравнивание ASCII  і
і           і           і    і    і     і  іпосле сложения.     і
АДДДДДДДДДДДБДДДДДДДДДДДБДДДДБДДДДБДДДДДБДДБДДДДДДДДДДДДДДДДДДДДЩ

     Выполняйте инструкцию 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
        ?                           *      *      ?      *      ?

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции  Инструкция   Такты            Описание           і
ГДДДДДДДДДДДВДДДДДДДДДДДДВДДДДВДДДДВДДДДВДДДВДДДДДДДДДДДДДДДДДДДґ
і           і            і486 і386 і286 і 86і                   і
ГДДДДДДДДДДДЕДДДДДДДДДДДДЕДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДґ
іD5 0A      і  AAD       і14  і19  і14  і 60іВыравнивание ASCII і
і           і            і    і    і    і   іперед делением.    і
АДДДДДДДДДДДБДДДДДДДДДДДДБДДДДБДДДДБДДДДБДДДБДДДДДДДДДДДДДДДДДДДЩ

     Инструкция AAD используется для подготовки  двух  нераспако-
ванных двоично-десятичных  чисел  (младшие  цифры  в регистре AL,
старшие - в AH) для операции деления,  которая дает распакованный
результат. Это выполняется путем установки регистра AL в AL + (10
* AH),  а затем регистра AH в 0.  После этого содержимое AX равно
двоичному эквиваленту  исходного  распакованного  числа  из  двух
цифр.

AAM     Выравнивание (ASCII) регистра AX после умножения.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
        ?                           *      *      ?      *      ?

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция   Такты            Описание            і
ГДДДДДДДДДДДДВДДДДДДДДДДВДДДДВДДДДВДДДДДВДДВДДДДДДДДДДДДДДДДДДДДґ
і            і          і486 і386 і286  і86і                    і
ГДДДДДДДДДДДДЕДДДДДДДДДДЕДДДДЕДДДДЕДДДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
іD4 0A       іAAM       і15  і17  і16   і83іВыравнивание (ASCII)і
і            і          і    і    і     і  іAX после умножения. і
АДДДДДДДДДДДДБДДДДДДДДДДБДДДДБДДДДБДДДДДБДДБДДДДДДДДДДДДДДДДДДДДЩ

     Выполняйте инструкцию AAM только после выполнения инструкции
MUL над двумя распакованными двоично-десятичными цифрами, которая
дает результат в регистре AX.  Поскольку результат меньше 100, он
целиком содержится в регистре AL.  Инструкция  AAM  распаковывает
результат в регистре AL путем деления AL на 10.  При этом частное
(более значащая цифра) остается в регистре AH,  а остаток  (менее
значащая цифра) - в AL.

AAS     Выравнивание (ASCII) после вычитания.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
        ?                           ?      ?      *      ?      *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции  Инструкция   Такты            Описание           і
ГДДДДДДДДДДДДВДДДДДДДДДДДВДДДДВДДДДВДДДДВДДДВДДДДДДДДДДДДДДДДДДДґ
і            і           і486 і386 і286 і 86і                   і
ГДДДДДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДґ
і3F          і AAS       і3   і4   і3   і 8 іВыравнивание ASCII і
і            і           і    і    і    і   іAL после вычитания.і
АДДДДДДДДДДДДБДДДДДДДДДДДБДДДДБДДДДБДДДДБДДДБДДДДДДДДДДДДДДДДДДДЩ

     Выполняйте инструкцию 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
        *                           *      *      *      *      *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция   Такты           Описание             і
ГДДДДДДДДВДДДДДДДДДДДДДДДДВДДДДВДДДДВДДДДВДДДДДДДВДДДДДДДДДДДДДДґ
і        і                і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.          і
АДДДДДДДДБДДДДДДДДДДДДДДДДБДДДДБДДДДБДДДДБДДДДДДДБДДДДДДДДДДДДДДЩ

     Операция ADC выполняет целочисленное сложение двух операндов
(приемник и источник) с флагом переноса. Результат сложения прис-
ваивается первому операнду (приемнику), и соответствующим образом
устанавливаются  флаги. Обычно операция ADC выполняется как часть
многобайтовой или многословной  операции сложения.  Когда к  опе-
ранду  размером в слово или двойное слово прибавляется непосредс-
твенное байтовое значение, то оно сначала расширяется по знаку до
размера слова или двойного слова.

ADD     Сложение.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
        *                           *      *      *      *      *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция    Такты                 Описание      і
ГДДДДДДДДДВДДДДДДДДДДДДДДДДВДДДДВДДДДВДДДДДВДДДДДВДДДДДДДДДДДДДДґ
і         і                і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 реги-і
і         і                і    і    і     і     істром размеромі
і         і                і    і    і     і     ів двойное сло-і
і         і                і    і    і     і     іво.           і
АДДДДДДДДДБДДДДДДДДДДДДДДДДБДДДДБДДДДБДДДДДБДДДДДБДДДДДДДДДДДДДДЩ

     Операция ADD выполняет целочисленное сложение двух операндов
(приемника, и источника). Результат сложения присваивается перво-
му  операнду (приемнику). Соответствующим образом устанавливаются
флаги.

     Когда к операнду размером в слово или двойное слово добавля-
ется непосредственное  байтовое  значение,  оно  расширяется   по
знаку размера слова или двойного слова.

AND     Логическая операция И.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
        0                           *      *      ?      *      0

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция    Такты            Описание           і
ГДДДДДДДДВДДДДДДДДДДДДДДДВДДДДВДДДДВДДДДДВДДДДДДДВДДДДДДДДДДДДДДґ
і        і               і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.          і
і        і               і    і    і     і       і              і
АДДДДДДДДБДДДДДДДДДДДДДДДБДДДДБДДДДБДДДДДБДДДДДДДБДДДДДДДДДДДДДДЩ

     Если соответствующие  биты операндов равны 1,  то каждый бит
результата после выполнения инструкции AND будет равен 1.  В про-
тивном случае он принимает нулевое значение.

ARPL    Выравнивает поле RPL селектора.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
                                           *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция  Такты            Описание             і
ГДДДДДДДДВДДДДДДДДДДДДДДДВДДДДВДДДДДДДДВДДДДДДДДДВДДДДДДДДДДДДДДґ
і        і               і486 і386     і286      і              і
ГДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДЕДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДДДДДДґ
і63 /r   і APPL r/m16,r16і9/9 іpm=20/21іpm=10/11 іДелает    так,і
і        і               і    і        і         ічтобы      RPLі
і        і               і    і        і         іr/m16 было  неі
і        і               і    і        і         іменьше,    чемі
і        і               і    і        і         іRPL r16.      і
АДДДДДДДДБДДДДДДДДДДДДДДДБДДДДБДДДДДДДДБДДДДДДДДДБДДДДДДДДДДДДДДЩ

     Инструкция ARPL имеет два операнда. Первый операнд представ-
ляет собой  16-битовую переменную в памяти или регистр размером в
слово, который содержит значение селектора.  Второй операнд - это
регистр размером  в  слово.  Если  поле RPL ("requested privilege
level" - запрос уровня привилегий,  младшие два бита) меньше, чем
поле RPL второго операнда,  то флаг нуля устанавливается в значе-
ние 1,  а поле RPL первого операнда увеличивается таким  образом,
чтобы совпадать со вторым операндом. В противном случае флаг нуля
устанавливается в значение 0, и первый операнд не изменяется.

     Инструкция ARPL встречается не в прикладных программах,  а в
системном программном обеспечении. Она используется для обеспече-
ния того,  чтобы параметр селектора  подпрограммы  не  запрашивал
больше привилегий, чем этого допускает вызывающая программа. Вто-
рой операнд инструкции ARPL обычно  представляет  собой  регистр,
который содержит значение селектора CS вызывающей программы.

BOUND   Проверка индекса массива и сравнение его с границами.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
                                           *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция    Такты          Описание             і
ГДДДДДДДДДВДДДДДДДДДДДДДДДДВДДДДВДДДДДВДДДВДДДДДДДДДДДДДДДДДДДДДґ
і         і                і486 і386  і286і                     і
ГДДДДДДДДДЕДДДДДДДДДДДДДДДДЕДДДДЕДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДґ
і62 /r    і   BOUND r16,7  і7   і10   і13 іПроверяет,  находитсяі
і         і                і    і     і   іли   r16  в  границахі
і         і                і    і     і   іm16&16.              і
і         і                і    і     і   і                     і
ГДДДДДДДДДЕДДДДДДДДДДДДДДДДЕДДДДЕДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДґ
і62 /r    і   BOUND r32,7  і7   і10   і   іПроверяет,  находитсяі
і         і                і    і     і   іли   r32  в  границахі
і         і                і    і     і   іm32&32.              і
і         і                і    і     і   і                     і
АДДДДДДДДДБДДДДДДДДДДДДДДДДБДДДДБДДДДДБДДДБДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция BOUND обеспечивает,  что индекс массива будет на-
ходится в границах,  заданных блоком памяти, состоящем из верхней
и нижней границы.  Каждая граница использует одно слово для атри-
бута размера операнда 16 бит и двойное слово для атрибута размера
операнда 32 бита. Первый операнд (регистр) должен быть больше или
равен первой границе в памяти (нижняя граница) или больше или ра-
вен второй (верхняя граница). Если регистр не находится в указан-
ных границах, то происходит прерывание 5. При возврате EIP указы-
вает на инструкцию BOUND.

     Границы, описывающие структуру данных, помещают обычно перед
самим массивом,  что позволяет адресоваться к границам через сме-
щение-константу относительно начала массива.

BSF     Просмотр бит в прямом направлении.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
                                           *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция  Такты            Описание             і
ГДДДДДДДДДДВДДДДДДДДДДДДДВДДДДДДДДДДВДДДДДВДДДДДДДДДДДДДДДДДДДДДґ
і          і             і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.           і
і          і             і          і     і                     і
АДДДДДДДДДДБДДДДДДДДДДДДДБДДДДДДДДДДБДДДДДБДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция BSF просматривает биты во втором операнде  разме-
ром в  слово или двойное слово,  начиная с бита 0.  Если все биты
равны 0,  то флаг ZF очищается,  в противном случае флаг ZF уста-
навливается, и целевой регистр загружается индексом первого уста-
новленного бита.

BSR     Просмотр бит в обратном направлении.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
                                           *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция  Такты            Описание             і
ГДДДДДДДДДДВДДДДДДДДДДДДДВДДДДДДДДДДВДДДДДВДДДДДДДДДДДДДДДДДДДДДґ
і          і             і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.   і
і          і             і          і     і                     і
АДДДДДДДДДДБДДДДДДДДДДДДДБДДДДДДДДДДБДДДДДБДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция BSR  просматривает  в  обратном  направлении  (от
старшего к младшему биту) биты во втором операнде размером в сло-
во или двойное слово, начиная с бита 0. Если все биты равны 0, то
флаг ZF очищается,  в противном случае флаг ZF устанавливается, и
целевой регистр загружается индексом первого установленного бита,
обнаруженного при просмотре в обратном направлении.

BSWAP   Выполняет свопинг байт.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция  Такты            Описание             і
ГДДДДДДДДДДДДВДДДДДДДДДДДВДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і            і           і486   і                               і
ГДДДДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F C8/r     іBSWAP r32  і1     іВыполняет свопинг  (перестанов-і
і            і           і      іку) байт в 32-разрядном регист-і
і            і           і      іре для конвертирования  форматаі
і            і           і      ідаты.                          і
АДДДДДДДДДДДДБДДДДДДДДДДДБДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция BSWAP  изменяет  порядок  байт в 32-разрядном ре-
гистре на обратный,  преобразуя формат  даты  ("малый/большой"  в
"большой/малый"). Когда инструкция BSWAP используется с операндом
размером 16 бит,  то результат,  остающийся в целевом регистре не
определен.

BT      Проверка бита (только для процессоров 386 и i486).
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
                                                                *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция  Такты            Описание             і
ГДДДДДДДДДДВДДДДДДДДДДДДДВДДДДДВДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і          і             і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 іСохраняет бит во флаге пе-і
і          і             і     і     іреноса.                   і
АДДДДДДДДДДБДДДДДДДДДДДДДБДДДДДБДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция BT  сохраняет  значение  бита,  указанного  базой
(первый операнд)  и смещения бита (второй операнд) во флаге пере-
носа.

BTC     Проверка бита и дополнение (только для 386 и i486).
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
                                                                *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция   Такты           Описание             і
ГДДДДДДДДДДВДДДДДДДДДДДДДДВДДДДДВДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і          і              і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іСохраняет бит во флаге пе-і
і          і              і     і    іреноса и дополняет его.   і
і          і              і     і    і                          і
АДДДДДДДДДДБДДДДДДДДДДДДДДБДДДДДБДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция BTC сохраняет  значение  бита,  указанного  базой
(первый операнд)  и смещения бита (второй операнд) во флаге пере-
носа, а затем дополняет бит.

BTR     Проверка бита и сброс.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
                                                                *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция   Такты       Описание                 і
ГДДДДДДДДДДВДДДДДДДДДДДДДДВДДДДДВДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДґ
і          і              і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  іСохраняет бит  во   флагеі
і          і              і     і     іпереноса   и   сбрасываеті
і          і              і     і     іего.                     і
і          і              і     і     і                         і
АДДДДДДДДДДБДДДДДДДДДДДДДДБДДДДДБДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция BTC сохраняет  значение  бита,  указанного  базой
(первый операнд)  и смещения бита (второй операнд) во флаге пере-
носа, а затем сбрасывает бит, записывая в него 0.

BTS     Проверка бита и установка.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
                                                                *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция    Такты      Описание                 і
ГДДДДДДДДДДВДДДДДДДДДДДДДДДВДДДДДВДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДґ
і          і               і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 іСохраняет бит  во   флагеі
і          і               і     і    іпереноса  и устанавливаеті
і          і               і     і    іего.                     і
і          і               і     і    і                         і
АДДДДДДДДДДБДДДДДДДДДДДДДДДБДДДДДБДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция BTC сохраняет  значение  бита,  указанного  базой
(первый операнд)  и смещения бита (второй операнд) во флаге пере-
носа, а затем устанавливает бит, записывая в него 1.

CALL    Вызов процедуры.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция   Такты                 Описание       і
ГДДДДДВДДДДДДДДДДДДДВДДДДДДВДДДДДВДДДДДВДДДДДДДДВДДДДДДДДДДДДДДДґ
і     і             і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 цикл дляі
ікаждого байта.                                                 і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

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

CBW     Преобразование байта в слово.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция     Такты               Описание       і
ГДДДДДДДДДДДДВДДДДДДДДВДДДДДДВДДДДДВДДДДДВДДДДДДВДДДДДДДДДДДДДДДґ
і            і        і486   і386  і286  і86    і               і
ГДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДґ
і98          іCWB     і3     і3    і2    і2     іРегистр AX  бу-і
і            і        і      і     і     і      ідет   представ-і
і            і        і      і     і     і      ілять собой рас-і
і            і        і      і     і     і      іширение по зна-і
і            і        і      і     і     і      іку регистра AL.і
АДДДДДДДДДДДДБДДДДДДДДБДДДДДДБДДДДДБДДДДДБДДДДДДБДДДДДДДДДДДДДДДЩ

     Инструкция CBW  преобразует байт  со  знаком в регистре AL в
слово со знаком в регистре AX,  распространяя старший бит AL (бит
знака) на все биты регистра AH.

CDQ     Преобразование двойного слова в четверное (только для
        процессоров 386 и i486)
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция     Такты               Описание       і
ГДДДДДДДДДДДДВДДДДДДДДВДДДДДДВДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і            і        і486   і386  і                            і
ГДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і99          іCDQ     і3     і2    іРегистры EDX:EAX будут пред-і
і            і        і      і     іставлять собой расширение поі
і            і        і      і     ізнаку регистра EAX          і
АДДДДДДДДДДДДБДДДДДДДДБДДДДДДБДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция CDQ преобразует двойное слово со знаком в регист-
ре  EAX в четверное слово со знаком (64-битовое целое) в паре ре-
гистров EDX:EAX, распространяя старший бит регистра EAX (бит зна-
ка) на все биты регистра EDX.

CLC     Очистка флага переноса.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
                                                                0

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция    Такты                Описание       і
ГДДДДДДДДДДДДВДДДДДДДДВДДДДДВДДДДДВДДДДВДДДВДДДДДДДДДДДДДДДДДДДДґ
і            і        і486  і386  і286 і86 і                    і
ГДДДДДДДДДДДДЕДДДДДДДДЕДДДДДЕДДДДДЕДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДґ
іF8          іCLC     і2    і2    і2   і2  іОчищает флаг перено-і
і            і        і     і     і    і   іса.                 і
АДДДДДДДДДДДДБДДДДДДДДБДДДДДБДДДДДБДДДДБДДДБДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция CLC присваивает флагу переноса  нулевое значение.
На состояние других флагов или регистров она не влияет.

CLD     Очистка флага направления.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
               0

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция   Такты                 Описание       і
ГДДДДДДДДДДДДВДДДДДДДДВДДДДВДДДДДВДДДДДВДДДВДДДДДДДДДДДДДДДДДДДДґ
і            і        і486 і386  і286  і86 і                    і
ГДДДДДДДДДДДДЕДДДДДДДДЕДДДДЕДДДДДЕДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДґ
іC           іCLD     і2   і2    і2    і2  іОчищает флаг направ-і
і            і        і    і     і     і   іления.              і
АДДДДДДДДДДДДБДДДДДДДДБДДДДБДДДДДБДДДДДБДДДБДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция CLD присваивает флагу направления нулевое  значе-
ние. На состояние других флагов или регистров она не влияет. Пос-
ле выполнения инструкции CLD строковые операции будут увеличивать
значения используемых индексных регистров (SI или DI).

CLI     Очистка флага прерывания.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
                      0

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция   Такты           Описание             і
ГДДДДДДДДДДДДВДДДДДДДДВДДДДВДДДДДВДДДДДВДДВДДДДДДДДДДДДДДДДДДДДДґ
і            і        і486 і386  і286  і86і                     і
ГДДДДДДДДДДДДЕДДДДДДДДЕДДДДЕДДДДДЕДДДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДґ
іFA          іCLI     і5   і3    і3    і2 іОчистка флага  преры-і
і            і        і    і     і     і  івания.               і
АДДДДДДДДДДДДБДДДДДДДДБДДДДБДДДДДБДДДДДБДДБДДДДДДДДДДДДДДДДДДДДДЩ

     Если текущий  уровень  привилегий  не  меньше заданного IOPL
(уровень привилегий  ввода-вывода),  инструкция  CLI  присваивает
флагу  переноса нулевое значение.  На состояние других флагов или
регистров она не влияет. В конце инструкции CLI или в другой точ-
ке  с  момента установки флага прерывания переорганизация внешних
прерываний не выполняется.

CLTS    Очистка флага переключения задач (только для защищенного
        режима процессоров 80286/386/i486).
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

        TS = 0 (TS находится в CR0, а не в регистре флагов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция   Такты      Описание                  і
ГДДДДДДДДДДДДВДДДДДДДДВДДДДВДДДДДВДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і            і        і486 і386  і286і                          і
ГДДДДДДДДДДДДЕДДДДДДДДЕДДДДЕДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 006      іCLTS    і7   і5    і2  іОчистка флага переключенияі
і            і        і    і     і   ізадач.                    і
АДДДДДДДДДДДДБДДДДДДДДБДДДДБДДДДДБДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция CLTS  очищает  флаг переключения задач в регистре
CR0. Этот флаг устанавливается  процессором 386 каждый раз, когда
происходит переключение задач.  Флаг TS используется для управле-
ния расширениями процессора:

     - если флаг TS установлен,  каждое выполнение инструкции ESC
       перехватывается;

     - если установлены оба флага TS и MP, то перехватывается вы-
       полнение инструкции WAIT.

     Таким образом,  если выполнение инструкции  произошло  после
начала выполнения инструкции ESC, то перед тем, как сможет выпол-
няться новая инструкция ESC,  может потребоваться сохранения  со-
держимого расширения процессора.

     Инструкция CLTS встречается не в прикладных программах,  а в
системном программном обеспечении. Это привилегированная инструк-
ция,  которая может выполняться только на уровне нулевого приори-
тета.

CMC     Дополнение флага переноса.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
                                                                *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция   Такты                 Описание       і
ГДДДДДДДДДДДДВДДДДДДДДВДДДДВДДДДДВДДДДДВДДДВДДДДДДДДДДДДДДДДДДДДґ
і            і        і486 і386  і286  і86 і                    і
ГДДДДДДДДДДДДЕДДДДДДДДЕДДДДЕДДДДДЕДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДґ
іА5          іCMC     і2   і2    і2    і2  іДополнение флага пе-і
і            і        і    і     і     і   іреноса.             і
АДДДДДДДДДДДДБДДДДДДДДБДДДДБДДДДДБДДДДДБДДДБДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция CMC изменяет значение флага переноса на обратное.
Другие флаги не изменяются.

CMP     Сравнение двух операндов.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
        *                           *      *      *      *      *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция     Такты                Описание      і
ГДДДДДДДДДДДДВДДДДДДДДДДДДДДДВДДДВДДДВДДДВДДДДДДДВДДДДДДДДДДДДДДґ
і            і               і486і386і286і86     і              і
ГДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і3C ib       іCMP AL,imm8    і1  і2  і3  і4      іСравнение  не-і
і            і               і   і   і   і       іпосредственно-і
і            і               і   і   і   і       іго байта с AL.і
ГДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і3D iw       іCMP AX,imm16   і1  і2  і   і       іСравнение  не-і
і            і               і   і   і   і       іпосредственно-і
і            і               і   і   і   і       іго   слова   сі
і            і               і   і   і   і       іEAX.          і
ГДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і3D id       іCMP AX,imm32   і1  і2  і   і       іСравнение  не-і
і            і               і   і   і   і       іпосредственно-і
і            і               і   і   і   і       іго    двойногоі
і            і               і   і   і   і       іслова с EAX.  і
і            і               і   і   і   і       і              і
ГДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і80 /7 ib    іCMP r/m8,imm8  і1/2і2/5і3/6і4/10+EAіСравнение  не-і
і            і               і   і   і   і       іпосредственно-і
і            і               і   і   і   і       іго   байта   сі
і            і               і   і   і   і       ібайтом r/m.   і
ГДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і81 /7 iw    іCMP r/m32,imm32і1/2і2/5і3/6і4/10+EAіСравнение  не-і
і            і               і   і   і   і       іпосредственно-і
і            і               і   і   і   і       іго   слова  соі
і            і               і   і   і   і       ісловом r/m.   і
ГДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і81 /7 id    іCMP r/m32,imm32і1/2і2/5і   і       іСравнение  не-і
і            і               і   і   і   і       іпосредственно-і
і            і               і   і   і   і       іго    двойногоі
і            і               і   і   і   і       іслова с  двой-і
і            і               і   і   і   і       іным     словомі
і            і               і   і   і   і       іr/m.          і
ГДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і83 /7 ib    іCMP r/m16,imm8 і1/2і2/5і   і       іСравнение  не-і
і            і               і   і   і   і       іпосредственно-і
і            і               і   і   і   і       іго байта, рас-і
і            і               і   і   і   і       іширенного   поі
і            і               і   і   і   і       ізнаку, со сло-і
і            і               і   і   і   і       івом r/m.      і
ГДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і83 /7 ib    іCMP r/m32,imm8 і1/2і2/5і   і       іСравнение  не-і
і            і               і   і   і   і       іпосредственно-і
і            і               і   і   і   і       іго байта, рас-і
і            і               і   і   і   і       іширенного   поі
і            і               і   і   і   і       ізнаку, с двой-і
і            і               і   і   і   і       іным     словомі
і            і               і   і   і   і       іr/m.          і
ГДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і38 /r       іCMP r/m8,r8    і1/2і2/5і2/7і3/9+EA іСравнение бай-і
і            і               і   і   і   і       ітового регист-і
і            і               і   і   і   і       іра   с  байтомі
і            і               і   і   і   і       іr/m.          і
ГДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і39 /r       іCMP r/m16,r16  і1/2і2/5і2/7і3/9+EA іСравнение  ре-і
і            і               і   і   і   і       ігистра  разме-і
і            і               і   і   і   і       іром в слово соі
і            і               і   і   і   і       ісловом r/m.   і
ГДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і39 /r       іCMP r/m32,r32  і1/2і2/5і   і       іСравнение  ре-і
і            і               і   і   і   і       ігистра  разме-і
і            і               і   і   і   і       іром  в двойноеі
і            і               і   і   і   і       іслово с  двой-і
і            і               і   і   і   і       іным     словомі
і            і               і   і   і   і       іr/m.          і
ГДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і3A /r       іCMP r8,r/m32   і1/2і2/6і2/6і3/9+EA іСравнение бай-і
і            і               і   і   і   і       іта r/m с  бай-і
і            і               і   і   і   і       ітовым  регист-і
і            і               і   і   і   і       іром.          і
ГДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і3B /r       іCMP r16,r/m8   і1/2і2/6і2/6і3/9+EA іСравнение сло-і
і            і               і   і   і   і       іва r/m с реги-і
і            і               і   і   і   і       істром   разме-і
і            і               і   і   і   і       іром в слово.  і
ГДДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і3B /r       іCMP r32,r/m32  і1/2і2/6і   і       іСравнение дво-і
і            і               і   і   і   і       ійного    словаі
і            і               і   і   і   і       іr/m с  регист-і
і            і               і   і   і   і       іром размером ві
і            і               і   і   і   і       ідвойное слово.і
АДДДДДДДДДДДДБДДДДДДДДДДДДДДДБДДДБДДДБДДДБДДДДДДДБДДДДДДДДДДДДДДЩ

     Инструкция CMP вычитает второй операнд из первого, но, в от-
личие от инструкции SUB, не сохраняет результат, а только изменя-
ет значения флагов.  Инструкция CMP обычно используется в сочета-
нии с условными переходами и  инструкцией  SETсс.  Если  операнд,
превышающий один  байт,  сравнивается с непосредственным байтовым
значением, то байт расширяется по знаку.

CMPS    Сравнение двух операндов.
 CMPSB  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
 CMPSW  O      D      I      T      S      Z      A      P      C
 CMPSD  *                           *      *      *      *      *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция   Такты              Описание          і
ГДДДДДДДДДДВДДДДДДДДДДДДДДДВДДДВДДДВДДДВДДДДДВДДДДДДДДДДДДДДДДДДґ
і          і               і486і386і286і86   і                  і
ГДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДґ
іA6        іCMPS m8,m8     і8  і10 і8  і22   іСравнение байт ES:і
і          і               і   і   і   і     і[(E)DI]    (второйі
і          і               і   і   і   і     іоперанд) и [(E)SI]і
і          і               і   і   і   і     і(первый операнд). і
ГДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДґ
іA7        іCMPS m16,m16   і8  і10 і8  і22   іСравнение слов ES:і
і          і               і   і   і   і     і[(E)DI]    (второйі
і          і               і   і   і   і     іоперанд) и [(E)SI]і
і          і               і   і   і   і     і(первый операнд). і
ГДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДґ
іA7        іCMPS m32,m32   і8  і10 і   і     іСравнение  двойныхі
і          і               і   і   і   і     іслов    ES:[(E)DI]і
і          і               і   і   і   і     і(второй операнд) иі
і          і               і   і   і   і     і[(E)SI]    (первыйі
і          і               і   і   і   і     іоперанд).         і
ГДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДґ
іA6        іCMPSB          і8  і10 і8  і22   іСравнение байт ES:і
і          і               і   і   і   і     і[(E)DI] и DS[SI]. і
ГДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДґ
іA7        іCMPSW          і8  і10 і8  і22   іСравнение слов ES:і
і          і               і   і   і   і     і[(E)DI] и DS[SI]. і
ГДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДґ
іA7        іCMPSBD         і8  і10 і   і     іСравнение двойных і
і          і               і   і   і   і     іслов ES:[(E)DI] и і
і          і               і   і   і   і     іDS[SI].           і
АДДДДДДДДДДБДДДДДДДДДДДДДДДБДДДБДДДБДДДБДДДДДБДДДДДДДДДДДДДДДДДДЩ

     Инструкция CMPS сравнивает байт, слово или двойное слово, на
которое указывает источник (индексный регистр) с  байтом,  словом
или двойным словом,  на которое указывает приемник (индексный ре-
гистр).

     Если атрибут размера адреса в данной инструкции равен 16, то
в качестве  исходного  и целевого индексных регистров (источник и
приемник) будут использоваться регистры SI и DI. В противном слу-
чае будут  использоваться  регистры ESI и EDI.  Перед выполнением
инструкции CMPS загрузите в регистры SI и DI правильные индексные
значения.

     Сравнение выполняется  путем вычитания операнда,  на который
указывает индексный регистр приемника,  с операндом,  на  который
указывает индексный регистр источника.

     Заметим, что направлением вычитания для CMPS является [SI] -
[DI] или [EDI] - [EDI].  Левый операнд (SI или  DI)  представляет
собой источник,  а  правый (DI или EDI) - приемник.  Это обратный
порядок по сравнению с тем,  который обычно принят фирмой  Intel,
когда левый операнд - это приемник, а правый - источник.

     Результат вычитания не сохраняется, изменение отражают толь-
ко флаги. Типы операндов определяют, будут ли сравниваться байты,
слова или двойные слова.  Если не присутствует байт переопределе-
ния сегмента,  то для первого операнда (SI или ESI)  используется
регистр DI. Второй операнд (DI или EDI) должен адресоваться через
регистр ES. Переопределение сегмента не допускается.

     После выполнения сравнения индексный регистр источника и ин-
дексный регистр  приемника автоматически продвигаются.  Если флаг
направления равен 0 (выполнена инструкция CLD),  то регистры уве-
личиваются. Если  флаг  направления  равен 1 (была выполнена инс-
трукция STD), то значения регистров уменьшаются. Если сравнивают-
ся байты,  то  регистры уменьшаются или увеличиваются на 1,  если
сравниваются слова - на 2, а если двойные слова - то на 4.

     Синонимами инструкции CMPS для байта, слова и двойного слова
являются инструкции CMPSB, CMPSW и CMPSD соответственно.

     Инструкции CMPS при сравнении блоков байт,  слов или двойных
слов CX или ECX может предшествовать префикс REPE или REPNE.  Бо-
лее подробно об этой операции рассказывается в описании REP.

CMPXCHG Сравнение и обмен (только для процессоров i486).
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
        *                           *      *      *      *      *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция   Такты              Описание          і
ГДДДДДДДДВДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДґ
і        і                 і486              і                  і
ГДДДДДДДДЕДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДґ
і0F A6/r іCMPXCHG r/m8,r8  і6/7, если сравне-іСравнение  AL    сі
і        і                 іние выполнено ус-ібайтом  r/m.  Еслиі
і        і                 іпешно; 6/10, еслиіони равны, то  ус-і
і        і                 ісравнение  завер-ітанавливается флагі
і        і                 ішилось неудачно  іZF,   и   байтовыйі
і        і                 і                 ірегистр загружает-і
і        і                 і                 іся в байт  r/m.  Ві
і        і                 і                 іпротивном   случаеі
і        і                 і                 іфлаг ZF очищается,і
і        і                 і                 іи байт r/m  загру-і
і        і                 і                 іжается в AL.      і
ГДДДДДДДДЕДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДґ
і0F A7/r іCMPXCHG r/m16,r16і6/7, если сравне-іСравнение  AX   cоі
і        і                 іние выполнено ус-ісловом  r/m.  Еслиі
і        і                 іпешно; 6/10, еслиіони равны, то  ус-і
і        і                 ісравнение  завер-ітанавливается флагі
і        і                 ішилось неудачно  іZF, и регистр раз-і
і        і                 і                 імером в слово заг-і
і        і                 і                 іружается в слово rі
і        і                 і                 і/m.  В   противномі
і        і                 і                 іслучае   флаг   ZFі
і        і                 і                 іочищается, и словоі
і        і                 і                 іr/m  загружается ві
і        і                 і                 ірегистр AX.       і
ГДДДДДДДДЕДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДґ
і0F A7/r іCMPXCHG r/m32,r32і6/7, если сравне-іСравнение  EAX   cі
і        і                 іние выполнено ус-ідвойным     словомі
і        і                 іпешно; 6/10, еслиіr/m. Если они рав-і
і        і                 ісравнение  завер-іны, то  устанавли-і
і        і                 ішилось неудачно  івается флаг  ZF, иі
і        і                 і                 ірегистр размером ві
і        і                 і                 ідвойное слово заг-і
і        і                 і                 іружается в двойноеі
і        і                 і                 іслово r/m.  В про-і
і        і                 і                 ітивном случае флагі
і        і                 і                 іZF очищается,    иі
і        і                 і                 ідвойное  слово r/mі
і        і                 і                 ізагружается в  ре-і
і        і                 і                 ігистр EAX.        і
АДДДДДДДДБДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДЩ

     Инструкция CMPXCHG сравнивает аккумулятор (регистр  AL,  AX,
или EAX) с приемником.  Если они равны, то источник загружается в
приемник, в противном случае источник загружается в аккумулятор.

     Исключительные ситуации защищенного режима: #GP(0), если ре-
зультат находится в сегменте, запись в который запрещена; #GP(0),
если в сегментах  CS,  DS,  ES,  FS или GS находится недопустимый
действующий адрес операнда в памяти;  #SS(0),  если в сегменте SS
находится недопустимый адрес;  #PF (сбой) при сбое страницы;  #AC
при невыровненной ссылке на память (если текущим уровнем привиле-
гий является уровень 3).

     Исключительные ситуации реального режима:  если любая  часть
операнда лежит  вне  действующего  пространства  адресов (от 0 до
0FFFFh), то возникает прерывание 13.

     Исключительные ситуации виртуального режима процессора 8086:
прерывание 13, как в реальном режиме, и #PF и #AC, как в защищен-
ном режиме.

           Примечание: Данная инструкция может  использоваться  с
      префиксом LOCK. Чтобы упростить интерфейс с шиной процессо-
      ра, операнд-приемник получает цикл записи безотносительно к
      результату сравнения.  Если сравнение заканчивается неудач-
      но,  то приемник записывается обратно, в противном случае в
      приемник записывается источник.  (Процессор никогда не соз-
      дает чтение с блокировкой без записи с блокировкой.)

CWD     Преобразование слова в двойное слово (только для
        процессоров 386 и i486).
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция   Такты              Описание          і
ГДДДДДДДДДДДДВДДДДДДДДДДДДВДДДДВДДДДВДДДДВДДДВДДДДДДДДДДДДДДДДДДґ
і            і            і486 і386 і286 і86 і                  і
ГДДДДДДДДДДДДЕДДДДДДДДДДДДЕДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДДДДДДДДДДДДґ
і99          іCWD         і3   і2   і2   і5  іВ DX:AX  записыва-і
і            і            і    і    і    і   іется AX с расшире-і
і            і            і    і    і    і   інием знака.       і
АДДДДДДДДДДДДБДДДДДДДДДДДДБДДДДБДДДДБДДДДБДДДБДДДДДДДДДДДДДДДДДДЩ

     Инструкция CWD преобразует слово со знаком в регистре  AX  в
двойное слово  со  знаком  в паре регистров DX:AX,  распространяя
старший бит AX на все биты DX.  Заметим, что инструкция CWD отли-
чается от инструкции CWDE.  Инструкция CWDE использует в качестве
приемника вместо DX:AX EAX.

CWDE    Преобразование слова в двойное слово (только для
        процессоров 386 и i486).
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция   Такты              Описание          і
ГДДДДДДДДДДДДВДДДДДДДДДДДДВДДДДВДДДДВДДДДВДДДВДДДДДДДДДДДДДДДДДДґ
і            і            і486 і386 і286 і86 і                  і
ГДДДДДДДДДДДДЕДДДДДДДДДДДДЕДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДДДДДДДДДДДДґ
і98          іCWDE        і3   і3   і    і   іВ   EAX  записыва-і
і            і            і    і    і    і   іется AX с расшире-і
і            і            і    і    і    і   інием знака.       і
АДДДДДДДДДДДДБДДДДДДДДДДДДБДДДДБДДДДБДДДДБДДДБДДДДДДДДДДДДДДДДДДЩ

     Инструкция CWDE преобразует слово со знаком в регистре  AX в
двойное слово со знаком в регистрe EAX, распространяя старший бит
AX на старшие байты EAX.  Заметим, что инструкция CWDE отличается
от инструкции CWD. Инструкция CWDE использует в качестве приемни-
ка вместо EAX пару регистров DX:AX.

DAA     Десятичная настройка регистра AL после сложения.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
        ?                           *      *      *      *      *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция   Такты              Описание          і
ГДДДДДДДДДДДДВДДДДДДДДДДДДВДДДДВДДДДВДДДДВДДДВДДДДДДДДДДДДДДДДДДґ
і            і            і486 і386 і286 і86 і                  і
ГДДДДДДДДДДДДЕДДДДДДДДДДДДЕДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДДДДДДДДДДДДґ
і27          іDAA         і2   і4   і3   і4  іДесятичная   наст-і
і            і            і    і    і    і   іройка регистра  ALі
і            і            і    і    і    і   іпосле сложения.   і
АДДДДДДДДДДДДБДДДДДДДДДДДДБДДДДБДДДДБДДДДБДДДБДДДДДДДДДДДДДДДДДДЩ

     Выполняйте инструкцию DAA только после выполнения инструкции
ADD, которая  оставляет  байтовый результат из двух двоично-деся-
тичных цифр в регистре AL.  Операнды инструкции DAA должны состо-
ять из двух упакованных двоично-десятичных цифр (BCD). Инструкция
DAA настраивает AL таким образом,  чтобы он  содержал  корректный
упакованный десятичный результат из двух цифр.

DAS     Десятичная настройка регистра AL после вычитания.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
        ?                           *      *      *      *      *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция   Такты              Описание          і
ГДДДДДДДДДДДДВДДДДДДДДДДДДВДДДДВДДДДВДДДДВДДДВДДДДДДДДДДДДДДДДДДґ
і            і            і486 і386 і286 і86 і                  і
ГДДДДДДДДДДДДЕДДДДДДДДДДДДЕДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДДДДДДДДДДДДґ
і2F          іDAS         і2   і4   і3   і4  іДесятичная   наст-і
і            і            і    і    і    і   іройка регистра  ALі
і            і            і    і    і    і   іпосле вычитания.  і
АДДДДДДДДДДДДБДДДДДДДДДДДДБДДДДБДДДДБДДДДБДДДБДДДДДДДДДДДДДДДДДДЩ

     Выполняйте инструкцию DAS только после выполнения инструкции
вычитания, которая оставляет байтовый результат  из  двух  двоич-
но-десятичных цифр в регистре AL.  Операнды инструкции DAS должны
состоять из двух упакованных двоично-десятичных цифр (BCD).  Инс-
трукция DAS настраивает AL таким образом,  чтобы он содержал кор-
ректный упакованный десятичный результат из двух цифр.

DEC     Уменьшение на 1.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
        *                           *      *      *      *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция Такты               Описание           і
ГДДДДДДДДДДВДДДДДДДДДДВДДДДВДДДДВДДДДВДДДДДДДВДДДДДДДДДДДДДДДДДДґ
і          і          і486 і386 і286 і86     і                  і
ГДДДДДДДДДДЕДДДДДДДДДДЕДДДДЕДДДДЕДДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДґ
іFE /1     іDEC r/m8  і1/3 і2/6 і2/7 і3/15+EAіУменьшение   байтаі
і          і          і    і    і    і       іr/m на единицу.   і
ГДДДДДДДДДДЕДДДДДДДДДДЕДДДДЕДДДДЕДДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДґ
іFF /1     іDEC r/m16 і1/3 і2/6 і2/7 і3/15+EAіУменьшение   словаі
і          і          і    і    і    і       іr/m на единицу.   і
ГДДДДДДДДДДЕДДДДДДДДДДЕДДДДЕДДДДЕДДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДґ
і          іDEC r/m32 і1/3 і2/6 і    і       іУменьшение двойно-і
і          і          і    і    і    і       іго слова   r/m  наі
і          і          і    і    і    і       іединицу.          і
ГДДДДДДДДДДЕДДДДДДДДДДЕДДДДЕДДДДЕДДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДґ
і48+rw     іDEC r16   і1   і2   і2   і3      іУменьшение регист-і
і          і          і    і    і    і       іра размером в сло-і
і          і          і    і    і    і       іво на 1.          і
ГДДДДДДДДДДЕДДДДДДДДДДЕДДДДЕДДДДЕДДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДґ
і48+rw     і EC r32   і1   і2   і    і       іУменьшение регист-і
і          і          і    і    і    і       іра размером      ві
і          і          і    і    і    і       ідвойное  слово  наі
і          і          і    і    і    і       і1.                і
АДДДДДДДДДДБДДДДДДДДДДБДДДДБДДДДБДДДДБДДДДДДДБДДДДДДДДДДДДДДДДДДЩ

     Инструкция DEC вычитает из операнда  1.  Флаг  переноса  при
этом не  изменяется.  Чтобы изменялся флаг переноса,  используйте
инструкцию SUB с непосредственным операндом и 1.

DIV     Беззнаковое деление.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
        ?                           ?      ?      ?      ?      ?

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция Такты       Описание                   і
ГДДДДДДДДДДВДДДДДДДДДДВДДДДДВДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і          і          і486  і386    і                           і
ГДДДДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іF6/6      іDIV r/m8  і16/16і14/17  іБеззнаковое деление  AX  наі
і          і          і     і       ібайт r/m (AL=  частное, AH=і
і          і          і     і       іостаток).                  і
ГДДДДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іF7/6      іDIV r/m16 і24/24і22/25  іБеззнаковое  деление  DX:AXі
і          і          і     і       іна слово  r/m  (AL=частное,і
і          і          і     і       іAH= остаток).              і
ГДДДДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іF7/6      іDIV r/m32 і40/40і38/41  іБеззнаковое деление EDX:EAXі
і          і          і     і       іна двойное     слово    r/mі
і          і          і     і       і(AL=частное, AH=остаток).  і
АДДДДДДДДДДБДДДДДДДДДДБДДДДДБДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Операция DIV выполняет беззнаковое деление. Делимое задается
неявно. В качестве операнда  задается  только  делитель.  Остаток
всегда меньше меньше чем делитель. Тип делителя определяет, какие
регистры нужно использовать:

   ЪДДДДДДДДВДДДДДДДДДВДДДДДДДДДДДВДДДДДДДДДДДВДДДДДДДДДДДДДДДДДї
   іРазмер  іДелимое  іДелитель   іЧастное    іОстаток          і
   ГДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДґ
   ібайт    іAX       іr/m        іAL         іAH               і
   іcлово   іDX:AX    іr/m16      іAX         іDX               і
   ідвойное і         і           і           і                 і
   іслово   іEDX:EAX  іr/m32      іEAX        іEDX (только для  і
   і        і         і           і           іпроцессора 386)  і
   АДДДДДДДДБДДДДДДДДДБДДДДДДДДДДДБДДДДДДДДДДДБДДДДДДДДДДДДДДДДДЩ

ENTER   Устанавливает границы стека для параметров процедуры
        (только для процессоров 80186/286/386/486).
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция Такты                Описание          і
ГДДДДДДДДДДВДДДДДДДДДДДДДДДДДВДДДДВДДДДВДДДДДВДДДДДДДДДДДДДДДДДДґ
і          і                 і486 і386 і286  і                  і
ГДДДДДДДДДДЕДДДДДДДДДДДДДДДДДЕДДДДЕДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДґ
іC8 iw 00  іEnter imm16,0    і14  і10  і11   іУстанавливает гра-і
і          і                 і    і    і     іницы стека  проце-і
і          і                 і    і    і     ідуры.             і
ГДДДДДДДДДДЕДДДДДДДДДДДДДДДДДЕДДДДЕДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДґ
іC8 iw 01  іEnter imm16,1    і17  і12  і15   іУстанавливает гра-і
і          і                 і    і    і     іницы стека для па-і
і          і                 і    і    і     іраметров  процеду-і
і          і                 і    і    і     іры.               і
ГДДДДДДДДДДЕДДДДДДДДДДДДДДДДДЕДДДДЕДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДґ
іC8 iw ib  іEnter imm16,imm8 і17+ і15+ і12+  іУстанавливает гра-і
і          і                 і3n  і4(n-і4(n- іницы стека для па-і
і          і                 і    і1)  і1)   іраметров  процеду-і
і          і                 і    і    і     іры.               і
АДДДДДДДДДДБДДДДДДДДДДДДДДДДДБДДДДБДДДДБДДДДДБДДДДДДДДДДДДДДДДДДЩ

     Команда ENTER создает границы стека, необходимые в большинс-
тве блочно-структурированных   языков   высокого  уровня.  Первый
операнд задает число байт динамической памяти, выделяемых в памя-
ти для подпрограммы,  в которую осуществляется вход.  Второй опе-
ранд задает лексический уровень вложенности (от 0 до 31) подпрог-
раммы в исходном коде языка высокого уровня.  Он определяет число
указателей границ стека, копируемых в новые границы стека из пре-
дыдущих границ. Текущим указателем границы стека является регистр
BP (или EBP, если атрибут размера операнда равен 32 битам).

     Если атрибут размера операнда равен 16 битам, то процессор в
качестве указателя  границы  использует регистр BP,  а в качестве
указателя стека - SP.  Если атрибут размера операнда равен 32, то
процессор  в качестве указателя границы использует регистр EBP, а
в качестве указателя стека - ESP.

     Если второй операнд равен 0,  то  инструкция  ENTER  заносит
указатель границы стека (BP или EBP) в стек. Затем ENTER вычитает
из указателя стека первый операнд и устанавливает границу стека в
значение текущего указателя стека.

     Например, процедура  с 12 байтами локальный переменных имела
бы в качестве точки входа  инструкцию  ENTER  12,0  и  инструкцию
LEAVE перед  каждой инструкцией RET.  К 12 локальным байтам стека
можно при этом адресоваться через отрицательные смещения  относи-
тельно указателя стека.

                         Оглавление

HLT     Останов.................................................5
IDIV    Деление со знаком.......................................5
IMUL    Умножение со знаком.....................................7
IN      Ввод из порта...........................................9
INC     Увеличение на 1........................................11
INS     Увеличение на 1........................................12
INT     Вызов процедуры обработки прерывания...................13
INVD    Запрещает использование кэш-памяти (только для
 процессора....................................................15
INVLPG  Запрещает запись TBL (только для процессора i486)......17
IRET    Возврат из прерывания (только для процессоров 386,
 i486).........................................................17
JCC     Переход, если удовлетворяется условие..................19
JMP     Переход................................................27
LAHF    Загрузка флагов в регистр AH...........................30
LAR     Загрузка байта полномочий доступа (только для
 защищенного...................................................30
LEA     Загрузка действующего смещения адреса..................31
LEAVE   Выход из процедуры высокого уровня ....................33
LGDT/   Загружает регистр глобальных
 дескрипторов/прерываний.......................................33
LGS     Загрузка полного указателя (LGS/LSS/LFS только для.....34
LLDT    Загрузка регистра таблицы  локальных дескрипторов......36
LMSW    Загрузка слова состояния машины (только для
 защищенного...................................................36
LOCK    Выдает сигнальный префикс LOCK#........................38
LODS    Загружает строковый операнд............................40
LOOP    Управление циклом с помощью счетчика CX................41
LSL     Загрузка границы сегмента (только для защищенного
 режима........................................................42
LTR     Загрузка регистра задачи...............................44
MOV     Перемещение данных.....................................44
MOV     Перемещение данных в специальные регистры и из них.....46
MOVS   Перемещение данных из строки в строку (MOWSD только.....48
MOVSX   Перемещение с расширением по знаку.....................49
MOVZX   Перемещение с расширением по нулю......................49
MUL     Беззнаковое умножение AL или AX........................50
NEG     Отрицание (дополнение до двух).........................51
NOP     Пустая операция........................................52
NOT     Отрицание (дополнение до 1)............................52
OR      Логическая операция ИЛИ................................52
OUT     Вывод данных в порт....................................55
OUTS     Вывод строки в порт (инструкции OUTS/OUTSB/OUTSW
 толь-.........................................................56
POP       Извлекает слово из стека.............................58
POPA     Извлекает из стека все общие регистры (инструкция
 POPA..........................................................60
POPF      Извлекает из стека регистр FLAGS (регистр
 флагов) или...................................................60
PUSH      Заносит операнд в стек...............................61
PUSHA     Заносит в стек  все  общие  регистры (инструкция
 PUSHA.........................................................62
PUSHF    Заносит в  стек  регистр  флагов (инструкция
 PUSHFD -......................................................63
RCR       Циклический сдвиг....................................63
REP      Повторения последующей строковой операции.............68
RET      Возврат из процедуры..................................73
SAHF      Запись регистра AH в регистр флагов..................74
SAL      Инструкции сдвига.....................................74
SBB      Целочисленное вычитание с заемом......................78
SCAS     Сравнение строковых данных (SCASD - только для........80
SETcc     Установка байта по условию (только для
 процессоров...................................................82
SGDT     Сохранение таблицы глобальных дескрипторов/таблицы....84
SHLD      Сдвиг влево с двойной точностью (только для
 процессоров...................................................86
SHRD     Сдвиг  вправо с двойной точностью.....................87
SLDT     Запись таблицы локальных дескрипторов (только для.....88
SMSW     Запись  слова состояния машины (только для
 защищенного...................................................88
STC       Установка флага переноса.............................89
STD       Установка флага направления..........................89
STI       Установка флага разрешения прерывания................90
STOS     Запись строковых данных (инструкция STOSD - только
 для...........................................................90
STR      Запись регистра задачи (только для защищенного
 режима........................................................91
SUB     Целочисленное вычитание................................93
TEST      Логическое сравнение.................................94
VERR      Проверка сегмента для чтения или записи (только
 для...........................................................96
WAIT      Ожидание, пока разряд BUSY# будет неактивным.........98
WBINVD    Запись и запрещение кэш-буфера.......................98
XADD      Обмен и сложение (только для процессора i486)........99
XCHG      Обмен содержимого памяти/регистра с регистром.......100
XLAT     Трансляция таблицы...................................101
XOR       Логическая операция "исключающее ИЛИ"...............102
Часть 5. Инструкции сопроцессора..............................104
F2XM1     Вычисление 2^x - 1..................................105
FABS      Абсолютное значение.................................105
FADD      Целочисленное сложение..............................105
FADDP     Сложение вещественных чисел и извлечение из
 стека........................................................106
FBLD      Упакованная десятичная загрузка (BCD)...............106
FBSTP     Запись упакованного десятичного значения (BCD) и....106
FCHS      Изменение знака.....................................108
FCLEX     Очистка исключительных прерываний...................108
FCOM      Сравнение вещественных чисел........................108
FCOMP     Сравнение вещественных чисел и извлечение из
 стека........................................................109
FCOMPP    Сравнение вещественных чисел и извлечение из
 стека........................................................109
FCOS      Косинус ST(0) (только для процессоров 387 и
 i486)........................................................110
FDECSTP   Уменьшение указателя стека..........................110
FDISI    Запрещение прерывания (только для сопроцессора
 8087)........................................................110
FDIV      Деление вещественных чисел..........................111
FDIVP     Деление вещественных чисел и извлечение из стека....111
FDIVR     Деление вещественных чисел с обращением.............112
FDIVRP    Деление вещественных чисел с обращением и
 извлечение из................................................112
FENI     Разрешение прерываний (только для сопроцессора
 8087)........................................................113
FFREE     Освобождение регистра...............................113
FIADD     Целочисленное сложение..............................113
FICOM     Целочисленное сравнение.............................114
FICOMP    Целочисленное сравнение и извлечение из стека.......114
FIDIV     Деление целых чисел.................................115
FIDIVR    Деление целых чисел с обращением....................115
FILD      Загрузка целого.....................................116
FIMUL     Целочисленное умножение.............................116
FINCSTP   Увеличение указателя стека..........................116
FINIT    Инициализация процессора.............................118
FIST      Запись целого значения..............................118
FISTP     Запись целого значения и извлечение из стека........119
FISUB     Целочисленное вычитание.............................119
FISUBR    Целочисленное вычитание с обращением................120
FLD       Загрузка вещественного значения.....................120
FLDCTW    Загрузка слова управления...........................121
FLDENV    Загрузка операционной среды.........................121
FLDLG2    Загрузка log10 2....................................121
FLDLN2    Загрузка ln 2.......................................122
FLDL2E    Загрузка log2 e.....................................122
FLDL2T    Загрузка log2 10....................................122
FLDPI     Загрузка числа Pi...................................123
FLDZ      Загрузка +0.0.......................................123
FLD1      Загрузка +1.0.......................................123
FMUL      Умножение вещественных чисел........................124
FMULP     Умножение вещественных чисел и извлечение из
 стека........................................................124
FLNOP     Нет операции........................................126
FPATAN    Дробный арктангенс..................................126
FPREM     Дробный остаток.....................................126
FPREM1    Дробный остаток (только для процессоров 387 и
 i487)........................................................127
FPTAN     Дробный тангенс.....................................127
FRNDINT   Округление до целого................................128
FRSTOR    Восстановление сохраненного состояния...............128
FSAVE    Сохранение состояния.................................129
FSCALE    Масштабирование.....................................129
FSETPM    Установка защищенного режима........................130
FSIN      Синус ST(0) (только для защищенного режима
 процессоров..................................................130
FSINCOS  Синус и косинус  ST(0) (только для защищенного
 режима.......................................................131
FSQRT     Квадратный корень...................................131
FST       Запись вещественного значения.......................132
FSTCW    Запись слова управления..............................132
FSTENV   Сохранение операционной среды........................133
FSTP     Сохранение вещественного значения и извлечение из
 стека........................................................133
FSTSW    Запись слова состояния...............................134
FSTSW AX  Запись слова состояния в регистр AX.................134
FSUB     Вычитание вещественных значений......................135
FSUBP    Вычитание вещественных значений и извлечение из
 стека........................................................135
FSUBR    Вычитание вещественных значений с обращением.........136
FSUBRP    Вычитание вещественных значений с обращением........137
FTST      Проверка вершины стека на +0.0......................137
FUCOM     Неупорядоченное сравнение...........................138
FUCOMP    Неупорядоченное  сравнение (только  для
 сопроцессоров................................................138
FUCOMPP  Неупорядоченное сравнение (только  для
 сопроцессоров................................................138
FWAIT     Ожидание............................................139
FXAM      Проверка вершины стека..............................139
FXCH      Обмен содержимого регистров.........................139
FXTRACT   Выделение экспоненты и значащей части...............140
FYL2X     Y * log2 X..........................................140
FYL2XP1   Y * log2 (X+1)......................................140
F2XM1     2 с степени X, минус 1..............................140

HLT     Останов.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция Такты                Описание          і
ГДДДДДДДДДДДВДДДДДДДДДДДДДДДВДДДВДДДВДДДВДДДДВДДДДДДДДДДДДДДДДДДґ
і           і               і486і386і286і86  і                  і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДґ
іF4         і HLT           і4  і5  і2  і2   іВыполняет останов.і
АДДДДДДДДДДДБДДДДДДДДДДДДДДДБДДДБДДДБДДДБДДДДБДДДДДДДДДДДДДДДДДДЩ

     Инструкция HLT останавливает выполнение инструкций и перево-
дит процессор х86 в  состояние  останова.  Разрешение  прерывания
(NMI) или  сброс возобновит выполнение.  Прерывание (включая NMI)
используется для возобновления выполнения после HLT.  На инструк-
цию после HLT указывает значение CS:IP (или CS:EIP для процессора
386).

IDIV    Деление со знаком.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
        ?                           ?      ?      ?      ?      ?

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция Такты                     Описание     і
ГДДДДДДДДДДВДДДДДДДДДДВДДДДДВДДДДДВДДДДДДВДДДДДДДДВДДДДДДДДДДДДДґ
і          і          і486  і386  і286   і86      і             і
ГДДДДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДґ
іF6/7      іIDIV r/m8 і19/20і19   і17/20 і101-    іДеление    соі
і          і          і     і     і      і112/107-ізнаком AX  наі
і          і          і     і     і      і118+EA  ібайт r/m (AL=і
і          і          і     і     і      і        ічастное,  AH=і
і          і          і     і     і      і        іостаток).    і
і          і          і     і     і      і        і             і
ГДДДДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДґ
іF7/7      іIDIV r/m16і27/28і27   і25/28 і165-    іДеление    соі
і          і          і     і     і      і184/171-ізнаком  DX:AXі
і          і          і     і     і      і190+EA  іна  слово  EAі
і          і          і     і     і      і        і(AX= частное,і
і          і          і     і     і      і        іDX= остаток).і
ГДДДДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДґ
іF7/7      іIDIV r/m32і43/44і43   і      і        іДеление    соі
і          і          і     і     і      і        ізнаком   парыі
і          і          і     і     і      і        ірегистров EDXі
і          і          і     і     і      і        і:EDX на двой-і
і          і          і     і     і      і        іное     словоі
і          і          і     і     і      і        і(EAX=   част-і
і          і          і     і     і      і        іное, EDX= ос-і
і          і          і     і     і      і        ітаток).      і
АДДДДДДДДДДБДДДДДДДДДДБДДДДДБДДДДДБДДДДДДБДДДДДДДДБДДДДДДДДДДДДДЩ

     Операция IDIV выполняет деление со знаком.  Делимое, частное
и остаток размещаются неявно в фиксированных регистрах. В качест-
ве явного операнда r/m задается только делитель. Тип делителя оп-
ределяет, какие регистры будут использоваться:

ЪДДДДДДДДДДДВДДДДДДДДДВДДДДДДДДДДВДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДї
і   Размер  і Частное і Делитель і  Остаток  і  Делимое         і
ГДДДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДґ
і   байт    і AL      і r/m      і  AH       і  AH              і
і   cлово   і AX      і r/m16    і  DX       і  DX:AX           і
і   двойное і         і          і           і                  і
і   слово   і EAX     і r/m32    і  EDX      і  EDX:EAX (только і
і           і         і          і           і  для процессора  і
і           і         і          і           і  386)            і
АДДДДДДДДДДДБДДДДДДДДДБДДДДДДДДДДБДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДЩ

     Если полученное в результате частное слишком велико и не мо-
жет разместиться  в приемнике,  или выполняется деление на 0,  то
генерируется  прерывание 0.  Нецелое частное усекается в  сторону
нуля. Остаток имеет тот же знак, что и делимое, а абсолютное зна-
чение остатка всегда меньше, чем абсолютное значение делителя.

IMUL    Умножение со знаком.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
        *                           ?      ?      ?      ?      *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод       Инструкция  Такты                       Описание     і
іoперации                                                       і
ГДДДДДДДДДВДДДДДДДДДДВДДДДДВДДДДДВДДДДДДВДДДДДДДДВДДДДДДДДДДДДДДґ
і         і          і486  і386  і286   і86      і              і
ГДДДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДґ
іF6/5     іIMUL r/m8 і13-  і19-  і13/16 і80-98/86іAX <- AL* байті
і         і          і18/13і14/12і      і-104+EA іr/m.          і
і         і          і-18  і-17  і      і        і              і
і         і          і     і     і      і        і              і
ГДДДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДґ
іF7/5     іIMUL r/m16і13-  і9-   і21/24 і128-154/іDX:AX  <-  AL*і
і         і          і26/13і22/12і      і134-160 іслово r/m.    і
і         і          і-26  і-25  і      і+EA     і              і
і         і          і     і     і      і        і              і
ГДДДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДґ
іF7/5     іIMUL r/m32і12-  і9-   і      і        іEDX:EAX <- EALі
і         і          і42/13і38/12і      і        і* двойное сло-і
і         і          і-42  і-41  і      і        іво r/m.       і
і         і          і     і     і      і        і              і
ГДДДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДґ
іOF AF/r  іIMUL r16, і13-  і9-   і      і        іРегистр разме-і
і         іrm/16     і26/13і22/12і      і        іром в слово <-і
і         і          і-26  і-25  і      і        ірегистр разме-і
і         і          і     і     і      і        іром в слово  *і
і         і          і     і     і      і        іслово r/m.    і
і         і          і     і     і      і        і              і
ГДДДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДґ
і6B /r ib іIMUL r16, і13-  і9-   і21/24 і        іРегистр разме-і
і         іrm/16,imm8і26/13і14/12і      і        іром в слово <-і
і         і          і-26  і-17  і      і        іr/m16  *   не-і
і         і          і     і     і      і        іпосредственныйі
і         і          і     і     і      і        ібайт,   расши-і
і         і          і     і     і      і        іренный по зна-і
і         і          і     і     і      і        іку.           і
і         і          і     і     і      і        і              і
ГДДДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДґ
і6B /r ib іIMUL r32, і13-42і9-   і      і        іРегистр разме-і
і         іrm/32,imm8і     і14/12і      і        іром в  двойноеі
і         і          і     і-17  і      і        іслово <- r/m16і
і         і          і     і     і      і        і*   непосредс-і
і         і          і     і     і      і        ітвенный  байт,і
і         і          і     і     і      і        ірасширенный поі
і         і          і     і     і      і        ізнаку.        і
і         і          і     і     і      і        і              і
ГДДДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДґ
і6B /r ib іIMUL r16, і13-26і9-   і21/24 і        іРегистр разме-і
і         іimm8      і     і14/12і      і        іром  в   словоі
і         і          і     і-17  і      і        і<-     регистрі
і         і          і     і     і      і        іразмером     ві
і         і          і     і     і      і        іслово *    не-і
і         і          і     і     і      і        іпосредственныйі
і         і          і     і     і      і        ібайт,   расши-і
і         і          і     і     і      і        іренный по зна-і
і         і          і     і     і      і        іку.           і
і         і          і     і     і      і        і              і
ГДДДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДґ
і6B /r ib іIMUL r32, і13-42і9-   і      і        іРегистр разме-і
і         іimm8      і     і14/12і      і        іром  в двойноеі
і         і          і     і-17  і      і        іслово   <- ре-і
і         і          і     і     і      і        ігистр размеромі
і         і          і     і     і      і        ів двойное сло-і
і         і          і     і     і      і        іво    *    не-і
і         і          і     і     і      і        іпосредственныйі
і         і          і     і     і      і        ібайт,   расши-і
і         і          і     і     і      і        іренный по зна-і
і         і          і     і     і      і        іку.           і
і         і          і     і     і      і        і              і
ГДДДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДґ
і6B /r iw іIMUL r16, і13-26і9-   і21/24 і        іРегистр разме-і
і         іr/m16,    і/13- і22/12і      і        іром  в   словоі
і         іimm16     і26   і-25  і      і        і<- непосредст-і
і         і          і     і     і      і        івенное   словоі
і         і          і     і     і      і        іr/m16.        і
і         і          і     і     і      і        і              і
ГДДДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДґ
і69 /r id іIMUL r16, і13-26і9-   і21/24 і        іРегистр разме-і
і         іr/m16,    і/13- і22/12і      і        іром  в двойноеі
і         іimm16     і26   і-25  і      і        іслово r/m32 <-і
і         і          і     і     і      і        і*    посредст-і
і         і          і     і     і      і        івенное двойноеі
і         і          і     і     і      і        іслово.        і
і         і          і     і     і      і        і              і
ГДДДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДґ
і69 /r iw іIMUL r16, і13-26і9-   і      і        іРегистр разме-і
і         іimm16     і/13- і22/12і      і        іром  в   словоі
і         і          і26   і-25  і      і        і<- r/m16 * не-і
і         і          і     і     і      і        і*    посредст-і
і         і          і     і     і      і        івенное слово. і
і         і          і     і     і      і        і              і
ГДДДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДґ
і69 /r id іIMUL r32, і13-42і9-   і      і        іРегистр разме-і
і         іimm32     і/13- і38/12і      і        іром  в двойноеі
і         і          і42   і-41  і      і        іслово <- r/m32і
і         і          і     і     і      і        і*    посредст-і
і         і          і     і     і      і        івенное двойноеі
і         і          і     і     і      і        іслово.        і
і         і          і     і     і      і        і              і
АДДДДДДДДДБДДДДДДДДДДБДДДДДБДДДДДБДДДДДДБДДДДДДДДБДДДДДДДДДДДДДДЩ

     Инструкция IMUL выполняет  умножение  со  знаком.  Некоторые
формы этой  инструкции  используют  неявные регистровые операнды.
Сочетания операндов для всех  форм  инструкций  показаны  ниже  в
столбце "Описание". При следующих условиях инструкция IMUL очища-
ет флаг переполнения и флаг переноса:

   ЪДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
   і Форма инструкции і Условия очистки флагов CF (переноса) и  і
   і                  і OF (переполнения)                       і
   ГДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
   і r/m8             і AL = расширение по знаку AL до 16 бит   і
   і                  і                                         і
   і r/m16            і AX = расширение по знаку AX до 32 бит   і
   і                  і                                         і
   і r/m32            і EDX:EAX = расширение по знаку EAX до 32 і
   і                  і бит                                     і
   і                  і                                         і
   і r16,r/m16        і Результат умещается равно в 16 бит      і
   і                  і                                         і
   і r32,r/m32        і Результат умещается равно в 32 бита     і
   і                  і                                         і
   і r16,r/m16,imm16  і Результат умещается равно в 16 бит      і
   і                  і                                         і
   і r16,r/m32,imm32  і Результат умещается равно в 32 бита     і
   АДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

IN      Ввод из порта.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод     Инструкция Такты                  Описание             і
іоперации                                                       і
ГДДДДДВДДДДДДДДДДДВДДДДДДДДВДДДДДДДВДДДВДДВДДДДДДДДДДДДДДДДДДДДДґ
і     і           і486     і386    і286і86і                     і
ГДДДДДЕДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДґ
іE4 ibіIN AL,imm8 і14,     і12,    і5  і10іВвод непосредственно-і
і     і           іpm=8/28,іpm=6/26і   і  іго значения из  портаі
і     і           іvm=27   і       і   і  і(байта)  и запись егоі
і     і           і        і       і   і  ів регистр AL.        і
і     і           і        і       і   і  і                     і
ГДДДДДЕДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДґ
іE5 ibіIN AX,imm8 і14,     і12,    і5  і10іВвод непосредственно-і
і     і           іpm=8/28,іpm=6/26і   і  іго значения из  портаі
і     і           іvm=27   і       і   і  і(слова) и запись его і
і     і           і        і       і   і  ів регистр AX.        і
і     і           і        і       і   і  і                     і
ГДДДДДЕДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДґ
іE5 ibіIN AX,imm8 і14,     і12,    і   і  іВвод непосредственно-і
і     і           іpm=8/28,іpm=6/26і   і  іго значения из  портаі
і     і           іvm=27   і       і   і  і(двойного   слова)  иі
і     і           і        і       і   і  ізапись его  в регистрі
і     і           і        і       і   і  іEAX.                 і
і     і           і        і       і   і  і                     і
ГДДДДДЕДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДґ
іEC   іIN AL,DX   і14,     і12,    і5  і8 іВвод байта  из  портаі
і     і           іpm=8/28,іpm=7/27і   і  іDX и запись в регистрі
і     і           іvm=27   і       і   і  іAL.                  і
і     і           і        і       і   і  і                     і
ГДДДДДЕДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДґ
іED   іIN AX,DX   і14,     і12,    і5  і8 іВвод слова  из  портаі
і     і           іpm=8/28,іpm=7/27і   і  іDX и запись в регистрі
і     і           іvm=27   і       і   і  іAX.                  і
і     і           і        і       і   і  і                     і
ГДДДДДЕДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДґ
іED   іIN EAX,DX  і14,     і12,    і5  і8 іВвод  двойного  словаі
і     і           іpm=8/28,іpm=7/27і   і  іиз порта DX и  записьі
і     і           іvm=27   і       і   і  ів регистр EAX.       і
і     і           і        і       і   і  і                     і
ГДДДДДБДДДДДДДДДДДБДДДДДДДДБДДДДДДДБДДДБДДБДДДДДДДДДДДДДДДДДДДДДґ
і   8 - если CPL <= IOPL                                        і
і  28 - если CPL > IOPL или в виртуальном режиме процессора 8086і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция IN пересылает байт или слово данных из порта, но-
мер которого указан вторым операндом в регистр (AL,  AX или EAX),
который задается  первым операндом.  Доступ к порту от 0 до 65535
можно получить, поместив номер порта в регистр DX и используя ин-
струкцию IN с регистром DX в качестве второго параметра. Эти инс-
трукции ввода-вывода  можно  сократить,  используя  в  инструкции
8-битового порта ввода-вывода. При использовании 8-битового ввода
-вывода из порта старшие 8 бит порта будут равны 0.

INC     Увеличение на 1.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
        *                           *      *      *      *      *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод     Инструкция Такты                      Описание         і
іоперации                                                       і
ГДДДДДВДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДВДДДДДДДВДДДДДДДДДДДДДДДДДґ
і     і           і486    і386    і286і86     і                 і
ГДДДДДЕДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДґ
іFE /0іINC r/m8   і1/3    і2/6    і2/7і3/15+EAіУвеличивает  байті
і     і           і       і       і   і       іr/m на 1.        і
і     і           і       і       і   і       і                 і
ГДДДДДЕДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДґ
іFF /0іINC r/m16  і1/3    і2/6    і2/7і3/15+EAіУвеличивает  сло-і
і     і           і       і       і   і       іво r/m на 1.     і
і     і           і       і       і   і       і                 і
ГДДДДДЕДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДґ
іFF /6іINC r/m32  і1/3    і       і   і       іУвеличивает двой-і
і     і           і       і       і   і       іное слово r/m  наі
і     і           і       і       і   і       і1.               і
і     і           і       і       і   і       і                 і
ГДДДДДЕДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДґ
і40+rwіINC r16    і1      і       і   і       іУвеличивает   ре-і
і     і           і       і       і   і       ігистр  размером ві
і     і           і       і       і   і       іслово на 1.      і
і     і           і       і       і   і       і                 і
ГДДДДДЕДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДґ
і40+rdіINC r32    і1      і       і   і       іУвеличивает   ре-і
і     і           і       і       і   і       ігистр  размером ві
і     і           і       і       і   і       ідвойное  слово наі
і     і           і       і       і   і       і1.               і
і     і           і       і       і   і       і                 і
АДДДДДБДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДБДДДДДДДБДДДДДДДДДДДДДДДДДЩ

     Инструкция INC прибавляет к операнду 1. Флаг переноса она не
изменяет.  Чтобы повлиять на флаг переноса,  используйте инструк-
цию ADD со вторым операндом 1.

INS     Увеличение на 1.
 INSB   ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
 INSW   O      D      I      T      S      Z      A      P      C
 INSD

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод      Инструкция Такты                Описание              і
іоперации                                                       і
ГДДДДВДДДДДДДДДДДДДВДДДДДДДДДВДДДДДДДВДДДВДДДДДДДДДДДДДДДДДДДДДДґ
і    і             і486      і386    і286і                      і
ГДДДДЕДДДДДДДДДДДДДЕДДДДДДДДДЕДДДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДґ
і6C  іINS r/m8,DX  і17,      і15,    і5  іСчитывает байт из пор-і
і    і             іpm=10/32,іpm=9/29і   іта DX в ES:(E)DI.     і
і    і             іvm=30    і       і   і                      і
і    і             і         і       і   і                      і
ГДДДДЕДДДДДДДДДДДДДЕДДДДДДДДДЕДДДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДґ
і6D  іINS r/m16,DX і17,      і15,    і5  іСчитывает  слово   из-і
і    і             іpm=10/32,іpm=9/29і   іпорта DX в ES:(E)DI.  і
і    і             іvm=30    і       і   і                      і
і    і             і         і       і   і                      і
ГДДДДЕДДДДДДДДДДДДДЕДДДДДДДДДЕДДДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДґ
і6D  іINS r/m32,DX і17,      і15,    і5  іСчитывает двойное сло-і
і    і             іpm=10/32,іpm=9/29і   іво из порта DX  в  ES:і
і    і             іvm=30    і       і   і(E)DI.                і
і    і             і         і       і   і                      і
ГДДДДЕДДДДДДДДДДДДДЕДДДДДДДДДЕДДДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДґ
і6C  іINSB         і17,      і15,    і5  іСчитывает байт из пор-і
і    і             іpm=10/32,іpm=9/29і   іта DX в ES:(E)DI.     і
і    і             іvm=30    і       і   і                      і
і    і             і         і       і   і                      і
ГДДДДЕДДДДДДДДДДДДДЕДДДДДДДДДЕДДДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДґ
і6D  іINSw         і17,      і15,    і5  іСчитывает  слово   из-і
і    і             іpm=10/32,іpm=9/29і   іпорта DX в ES:(E)DI.  і
і    і             іvm=30    і       і   і                      і
і    і             і         і       і   і                      і
ГДДДДЕДДДДДДДДДДДДДЕДДДДДДДДДЕДДДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДґ
і6D  іINSD         і17,      і15,    і5  іСчитывает двойное сло-і
і    і             іpm=10/32,іpm=9/29і   іво из порта DX  в  ES:і
і    і             іvm=30    і       і   і(E)DI.                і
і    і             і         і       і   і                      і
ГДДДДБДДДДДДДДДДДДДБДДДДДДДДДБДДДДДДДБДДДБДДДДДДДДДДДДДДДДДДДДДДґ
і   10 и 9, если CPL <= IOPL                                    і
і   32 и 29, если CPL > IOPL или в виртуальном режиме процессораі
і   8086.                                                       і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция INS  пересылает  данные из порта,  номер которого
указан в регистре DX,  в байт или слово в памяти,  индекс которых
задается регистром ES:приемник.  Операнд в памяти должен быть ад-
ресуемым через ES,  переопределение сегмента невозможно. Если ат-
рибут размера адреса в инструкции равен 16,  то целевым регистром
(приемником) является регистр DI,  а если атрибут размера  адреса
равен 32 - то EDI.

     В инструкции  INS не допускается задавать номер порта в виде
непосредственного операнда. К порту нужно адресоваться через зна-
чение регистра  DX.  Перед выполнением инструкции INS загрузите в
регистр DX корректное значение.

     Адрес приемника определяется содержимым  целевого индексного
регистра. Перед  выполнением инструкции INS загрузите в индексный
регистр приемника корректный индекс.

     После выполнения пересылки регистры DI или EDI автоматически
продвигаются. Если  флаг  направления  равен  0  (была  выполнена
инструкция CLD), то регистр DI или EDI увеличивается, а если флаг
направления  равен  1 (была выполнена инструкция STD),  то DI или
EDI уменьшается. При вводе байта DI увеличивается или уменьшается
на 1, при вводе слова - на 2, а при вводе двойного слова - на 4.

     Инструкции INSB,  INSW и INSD являются синонимами инструкции
INS, работающими с байтами,  словами и двойными словами соответс-
твенно. Инструкции INS может предшествовать префикс REP. При этом
выполняется ввод блока из CX байт или слов.  Подробности об  этой
операции можно узнать в описании REP.

INT     Вызов процедуры обработки прерывания.
 INTO   ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
                      0      0

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод     Инструкция Такты                        Описание       і
іоперации                                                       і
ГДДДДДДВДДДДДДДДДВДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДВДДДДДДДДДДДДДДДґ
і      і         і486      і386    і286    і86  і               і
ГДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДДДДДДДДґ
іCC    іINT3     і26       і33     і23     і52  іПрерывание  3 -і
і      і         і         і       і       і    іперехват управ-і
і      і         і         і       і       і    іления  отладчи-і
і      і         і         і       і       і    іком.           і
і      і         і         і       і       і    і               і
ГДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДДДДДДДДґ
іCC    іINT3     і44       іpm=59  і40     і    іПрерывание  3 -і
і      і         і         і       і       і    ізащищенный  ре-і
і      і         і         і       і       і    іжим.           і
і      і         і         і       і       і    і               і
ГДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДДДДДДДДґ
іCC    іINT3     і77       іpm=99  і78     і    іПрерывание  3 -і
і      і         і         і       і       і    ізащищенный  ре-і
і      і         і         і       і       і    іжим.           і
і      і         і         і       і       і    і               і
ГДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДДДДДДДДґ
іCC    іINT3     і82       іpm=119 і       і    іПрерывание  3 -і
і      і         і         і       і       і    іиз режима V86 ві
і      і         і         і       і       і    іPL0 .          і
і      і         і         і       і       і    і               і
ГДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДДДДДДДДґ
іCC    іINT3     і37+ts    іts     і167    і    іПрерывание  3 -і
і      і         і         і       і       і    ізащищенный  ре-і
і      і         і         і       і       і    іжим.           і
і      і         і         і       і       і    і               і
ГДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДДДДДДДДґ
іCD ib іINTimm8  і30       і37     і23     і51  іПрерывание, но-і
і      і         і         і       і       і    імер    которогоі
і      і         і         і       і       і    ізадается   пос-і
і      і         і         і       і       і    іредственным    і
і      і         і         і       і       і    ібайтом.        і
і      і         і         і       і       і    і               і
ГДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДДДДДДДДґ
іCD ib іINTimm8  і44       іpm=59  і40     і    іПрерывание: за-і
і      і         і         і       і       і    іщищенный режим.і
і      і         і         і       і       і    і               і
ГДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДДДДДДДДґ
іCD ib іINTimm8  і77       іpm=99  і78     і    іПрерывание: за-і
і      і         і         і       і       і    іщищенный режим.і
і      і         і         і       і       і    і               і
ГДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДДДДДДДДґ
іCD ib іINTimm8  і86       іpm=119 і       і    іПрерывание: из-і
і      і         і         і       і       і    ірежима  V86   ві
і      і         і         і       і       і    іPL0.           і
і      і         і         і       і       і    і               і
ГДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДДДДДДДДґ
іCD ib іINTimm8  і37+ts    іts     і167    і    іПрерывание: за-і
і      і         і         і       і       і    іщищенный режим.і
і      і         і         і       і       і    і               і
ГДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДДДДДДДДґ
іCE    іINTO     іPass:28, іFail:3,іFail:3,іFailіПрерывание   4,і
і      і         іFail:3   іpm=3   іPass:24і:4, іесли флаг пере-і
і      і         і         іPass:35і       іPassіполнения  равені
і      і         і         і       і       і:53 і1.             і
і      і         і         і       і       і    і               і
ГДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДДДДДДДДґ
іCE    іINTO     і46       іpm=59  і41     і    іПрерывание  4 -і
і      і         і         і       і       і    ізащищенный  ре-і
і      і         і         і       і       і    іжим.           і
і      і         і         і       і       і    і               і
ГДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДДДДДДДДґ
іCE    іINTO     і73       іpm=99  і79     і    іПрерывание  4 -і
і      і         і         і       і       і    ізащищенный  ре-і
і      і         і         і       і       і    іжим.           і
і      і         і         і       і       і    і               і
ГДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДДДДДДДДґ
іCE    іINTO     і84       іpm=119 і       і    іПрерывание  4 -і
і      і         і         і       і       і    іиз режима V86 ві
і      і         і         і       і       і    іPL0.           і
і      і         і         і       і       і    і               і
ГДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДДДДДДДДґ
іCE    іINTO     і39+ts    іts     і168    і    іПрерывание  4 -і
і      і         і         і       і       і    ізащищенный  ре-і
і      і         і         і       і       і    іжим.           і
і      і         і         і       і       і    і               і
ГДДДДДДБДДДДДДДДДБДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДБДДДДДДДДДДДДДДДґ
і   * -  добавляется  1  цикл для каждого байта следующей выпол-і
іняемой инструкции.                                             і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция INT  n  генерирует  через программное обеспечение
обращение к  обработчику  прерываний.  Непосредственный   операнд
(значение от  0 до 255) задает номер индекса в таблице дескрипто-
ров прерываний (IDT) вызываемой обработки прерываний.  В защищен-
ном режиме IDT содержит массив восьмибайтовых дескрипторов. Деск-
риптор вызываемого  прерывания   должен   указывать   прерывание,
ловушку или  вентиль  задачи.  В  реальном  режиме  адресации IDT
представляет собой массив из четырех указателей размером  в байт.
В защищенном  и  реальном режиме адресации базовый линейный адрес
IDT определяется содержимым IDTR.

     Инструкции прерывания INT n идентична  условной  программной
инструкции INTO, но номер прерывания неявно равен 4, а прерывание
выполняется,  если флаг переполнения процессоров 86, 286 или 386.

     Первые 32 прерывания зарезервированы фирмой Intel  для  сис-
темных целей. Некоторые из этих прерываний используются для внут-
ренних генерируемых исключительных ситуаций.

     Инструкция INT n в общем случае ведет себя как вызов дальне-
го типа,  но  регистр  флагов  заносится  в  стек  перед  адресом
возврата. Процедуры обработки  прерывания  возвращают  управление
через инструкцию  IRET,  которая извлекает из стека флаги и адрес
возврата.

     В реальном режиме адресации инструкция INT n заносит  в стек
флаги, регистр CS и адрес возврата (IP) в указанном порядке и пе-
реходит к длинному  указателю,  индекс  которого  указан  номером
прерывания.

INVD    Запрещает использование кэш-памяти (только для процессора
         i486).
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод     Инструкция Такты  Описание                             і
іоперации                                                       і
ГДДДДДДВДДДДДДДДДВДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і      і         і486     і                                     і
ГДДДДДДЕДДДДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 08 іINVD     і4       іЗапрещает использование всей  кэш-па-і
і      і         і        імяти.                                і
АДДДДДДБДДДДДДДДДБДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Внутренний кэш-буфер сбрасывается, и выполняется специальная
функция цикла шины, которая указывает, что внешний кэш-буфер так-
же должен сбрасываться. Данные, содержащиеся в записываемых внеш-
них кэш-буферах, отбрасываются.

          Примечание: Данная инструкция зависит от конкретной ре-
     ализации. В будущих процессорах фирмы Intel она может реали-
     зовываться по-разному.

     Ответственность за возврат информации об очистке внешней кэш
-памяти ложится на аппаратное обеспечение.

INVLPG  Запрещает запись TBL (только для процессора i486).
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод       Инструкция Такты  Описание                           і
іоперации                                                       і
ГДДДДДДДВДДДДДДДДДВДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і       і         і486      і                                   і
ГДДДДДДДЕДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 01/7іINVLPG m і 12      іЗапрещает запись таблицы TBL.      і
АДДДДДДДБДДДДДДДДДБДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция INVLPG  используется для запрещения отдельной за-
писи в таблице TBL.  Для записи таблицы используется  кэш-память.
Если таблица  TBL содержит допустимую запись,  которая отображает
адрес операнда в памяти, то запись TBL отмечается, как недопусти-
мая.

     И в  защищенном  режиме,  и  в виртуальном режиме процессора
8086 при использовании регистрового операнда  генерируется  недо-
пустимый код операции.

          Примечание: Данная инструкция зависит от конкретной ре-
     ализации. В будущих процессорах фирмы Intel она может реали-
     зовываться по-разному.

IRET    Возврат из прерывания (только для процессоров 386, i486)
 IRETD  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
        *      *      *      *      *      *      *      *      *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод       Инструкция Такты                 Описание            і
іоперации                                                       і
ГДДДДДДДВДДДДДДДДДВДДДДДВДДДДДДДДВДДДДДВДДВДДДДДДДДДДДДДДДДДДДДДґ
і       і         і486  і386     і286  і86і                     і
ГДДДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДґ
іCF     іIRET     і15   і22,     і17   і32іВозврат из прерыванияі
і       і         і     іpm=38   іpm=31і  і(возврат дальнего ти-і
і       і         і     і        і     і  іпа и извлечение  фла-і
і       і         і     і        і     і  ігов).                і
і       і         і     і        і     і  і                     і
ГДДДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДґ
іCF     іIRET     іts+32іpm=82   і55   і  іВозврат  из  прерыва-і
і       і         і     і        і     і  іния.                 і
і       і         і     і        і     і  і                     і
ГДДДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДґ
іCF     іIRETD    іts   і22,     і     і  іВозврат из прерыванияі
і       і         і     іpm=38   і     і  і(возврат дальнего ти-і
і       і         і     і        і     і  іпа и извлечение  фла-і
і       і         і     і        і     і  ігов).                і
і       і         і     і        і     і  і                     і
ГДДДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДґ
іCF     іIRETD    і36   іpm=82   і     і  іВозврат из прерыванияі
і       і         і     і        і     і  іc меньшими привилеги-і
і       і         і     і        і     і  іями.                 і
і       і         і     і        і     і  і                     і
ГДДДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДґ
іCF     іIRETD    і15   іpm=60   і     і  іВозврат из прерыванияі
і       і         і     і        і     і  ів режиме V86.        і
і       і         і     і        і     і  і                     і
ГДДДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДґ
іCF     іIRETD    іts+32іts      і     і  іВозврат  из  прерыва-і
і       і         і     і        і     і  іния.                 і
і       і         і     і        і     і  і                     і
АДДДДДДДБДДДДДДДДДБДДДДДБДДДДДДДДБДДДДДБДДБДДДДДДДДДДДДДДДДДДДДДЩ

     В реальном режиме адресации  инструкция  IRET  извлекает  из
стека указатель инструкций,  регистр CS и регистр флагов и возоб-
новляет выполнение прерванной подпрограммы.

     В защищенном режиме  действие  инструкции  IRET  зависит  от
установки флага вложенной задачи (бита NT) в регистре флагов. При
извлечении нового образа флага из стека бит IOPL в регистре изме-
няется только тогда, когда CPL = 0.

     Если NT равно 0, то инструкция IRET возвращает управление из
процедуры обработки прерывания без переключения задачи.  Програм-
ма, куда возвращается управление, должна иметь меньшие или равные
привилегии, чем  процедура  обработки  прерывания (это показывают
биты RPL селектора CS, извлеченного из стека). Если целевая прог-
рамма имеет меньшие привилегии, то инструкция IRET извлекает так-
же из стека указатель стека и регистр SS.

     Если NT не равно 0,  то инструкция IRET резервирует операцию
CALL или  INT,  которая  вызывает переключение задач.  Измененное
состояние задачи,  выполняющей инструкцию IRET,  сохраняется в ее
сегменте состояния задачи. Если позднее вновь последует вхождение
в задачу, то выполняется код, следующий за инструкцией IRET.

JCC     Переход, если удовлетворяется условие.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод      Инструкция Такты                  Описание            і
іоперации                                                       і
ГДДДДДВДДДДДДДДДВДДДДДВДДДДДДДДВДДДДДДВДДДДВДДДДДДДДДДДДДДДДДДДДґ
і     і         і486  і386     і286   і86  і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і77 cbіJA rel8  і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли  выше (CF   = 0і
і     і         і     і        і      і    іи ZF = 0.           і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і73 cbіJAE rel8 і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли  выше или равноі
і     і         і     і        і      і    і(CF = 0).           і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і72 cbіJB rel8  і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли ниже (CF = 1). і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і76 cbіJBE rel8 і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли  ниже или равноі
і     і         і     і        і      і    і(CF =  1,  или  ZF =і
і     і         і     і        і      і    і1).                 і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і72 cbіJC rel8  і3/1  і7+m,3   і7,3   і16,4іКороткий    переход і
і     і         і     і        і      і    іпри переносе  (если і
і     і         і     і        і      і    іCF = 1).            і
і     і         і     і        і      і    і= 1.                і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іE3 cbіJCXZ rel8і3/1  і9+m,5   і8,4   і18,3іКороткий    переход,і
і     і         і     і        і      і    іесли регистр CX ра- і
і     і         і     і        і      і    івен 0.              і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іE3 cbіJCXZ rel8і3/1  і9+m,5   і      і    іКороткий    переход,і
і     і         і     і        і      і    іесли  регистр   ECX і
і     і         і     і        і      і    іравен 0.            і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і74 cbіJT rel8  і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли равно (ZF = 0).і
і     і         і     і        і      і    і                    і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і7F cbіJG rel8  і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли больше  (ZF  = і
і     і         і     і        і      і    і0 и SF = OF).       і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і7D cbіJGE rel8 і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли больше или рав-і
і     і         і     і        і      і    іно (SF = 0).        і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і7C cbіJT rel8  і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли  меньше  (SF <>і
і     і         і     і        і      і    іOF).                і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і7E cbіJLE rel8 і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли меньше или рав-і
і     і         і     і        і      і    іно (ZF = 1  и  SF <>і
і     і         і     і        і      і    іOF).                і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і7E cbіJLE rel8 і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли не выше (CF = 1і
і     і         і     і        і      і    іили ZF = 1).        і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і72 cbіJNAE rel8і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли не  выше  (CF =і
і     і         і     і        і      і    і1).                 і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і73 cbіJNB rel8 і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли не  нижe  (CF =і
і     і         і     і        і      і    і0).                 і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і77 cbіJNBE rel8і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли   не  ниже  илиі
і     і         і     і        і      і    іравно  CF = 0 и ZF =і
і     і         і     і        і      і    і0).                 і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і73 cbіJNC rel8 і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли  нет   переносаі
і     і         і     і        і      і    і(CF = 0).           і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і75 cbіJNE rel8 і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли  не равно (ZF =і
і     і         і     і        і      і    і0).                 і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і7E cbіJNG rel8 і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли не больше (ZF =і
і     і         і     і        і      і    і1 или SF <> OF).    і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і7C cbіJNGT rel8і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли не  больше  илиі
і     і         і     і        і      і    іравно (SF <> OF).   і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і7D cbіJNL rel8 і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли  не меньше  (SFі
і     і         і     і        і      і    і<> OF).             і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і7F cbіJNLE rel8і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли  не меньше  илиі
і     і         і     і        і      і    іравно (SF = 0 и SF =і
і     і         і     і        і      і    іOF).                і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і71 cbіJNO rel8 і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли нет  переполне-і
і     і         і     і        і      і    іния (OF = 0).       і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і7B cbіJNH rel8 і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли  нет   четностиі
і     і         і     і        і      і    і(PF = 0).           і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і79 cbіJNS rel8 і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли SF = 0.        і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і75 cbіJNZ rel8 і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли ZF = 0.        і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і70 cbіJO  rel8 і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іесли    переполнениeі
і     і         і     і        і      і    і(OF = 0).           і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і7A cbіJP  rel8 і3/1  і7+m,3   і7,3   і16,4іКороткий переход по,і
і     і         і     і        і      і    іпаритету (если  PF =і
і     і         і     і        і      і    і1).                 і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і7A cbіJPE rel8 і3/1  і7+m,3   і7,3   і16,4іКороткий    переход,і
і     і         і     і        і      і    іпо   четности (PF  =і
і     і         і     і        і      і    і= 1).               і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і71 cbіJPO rel8 і3/1  і7+m,3   і7,3   і16,4іКороткий переход  поі
і     і         і     і        і      і    інечетности (PF = 0).і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і78 cbіJS  rel8 і3/1  і7+m,3   і7,3   і16,4іКороткий переход  поі
і     і         і     і        і      і    ізнаку (SF = 0).     і
і     і         і     і        і      і    і                    і
ГДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДґ
і74 cbіJZ  rel8 і3/1  і7+m,3   і7,3   і16,4іКороткий переход  поі
і     і         і     і        і      і    інулю (ZF = 1).      і
і     і         і     і        і      і    і                    і
АДДДДДБДДДДДДДДДБДДДДДБДДДДДДДДБДДДДДДБДДДДБДДДДДДДДДДДДДДДДДДДДЩ

                                                      Продолжение
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод       Инструкция Такты                 Описание            і
іоперации                                                       і
ГДДДДДДДДДДДВДДДДДДДДДДДДДВДДДВДДДДДВДДДВДДВДДДДДДДДДДДДДДДДДДДДґ
і           і             і486і386  і286і86і                    і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 87 cw/cdіJA   rel16/32і3/1і7+m,3і   і  іКороткий    переход,і
і           і             і   і     і   і  іесли выше (CF = 0  иі
і           і             і   і     і   і  іZF = 1).            і
і           і             і   і     і   і  і                    і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 83 cw/cdіJAE  rel16/32і3/1і7+m,3і   і  іКороткий    переход,і
і           і             і   і     і   і  іесли ниже (CF  = 0).і
і           і             і   і     і   і  і                    і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 82 cw/cdіJB   rel16/32і3/1і7+m,3і   і  іКороткий    переход,і
і           і             і   і     і   і  іесли ниже (CF = 1). і
і           і             і   і     і   і  і                    і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 86 cw/cdіJBE  rel16/32і3/1і7+m,3і   і  іКороткий    переход,і
і           і             і   і     і   і  іесли ниже или  равноі
і           і             і   і     і   і  і(CF =  1  или   ZF =і
і           і             і   і     і   і  і1).                 і
і           і             і   і     і   і  і                    і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 82 cw/cdіJC   rel16/32і3/1і7+m,3і   і  іКороткий    переход,і
і           і             і   і     і   і  іесли  перенос  (CF =і
і           і             і   і     і   і  і1).                 і
і           і             і   і     і   і  і                    і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 84 cw/cdіJE   rel16/32і3/1і7+m,3і   і  іКороткий    переход,і
і           і             і   і     і   і  іесли равно (ZF = 1).і
і           і             і   і     і   і  і                    і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 84 cw/cdіJZ   rel16/32і3/1і7+m,3і   і  іКороткий    переход,і
і           і             і   і     і   і  іесли 0 (ZF = 1).    і
і           і             і   і     і   і  і                    і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 8F cw/cdіJG   rel16/32і3/1і7+m,3і   і  іКороткий    переход,і
і           і             і   і     і   і  іесли больше (ZF =  0і
і           і             і   і     і   і  іи SF = 0).          і
і           і             і   і     і   і  і                    і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 8D cw/cdіJGE  rel16/32і3/1і7+m,3і   і  іКороткий    переход,і
і           і             і   і     і   і  іесли больше или рав-і
і           і             і   і     і   і  іно (SF = OF).       і
і           і             і   і     і   і  і                    і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 8C cw/cdіJL   rel16/32і3/1і7+m,3і   і  іКороткий    переход,і
і           і             і   і     і   і  іесли  меньше ( SF <>і
і           і             і   і     і   і  іOF).                і
і           і             і   і     і   і  і                    і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 8E cw/cdіJLE  rel16/32і3/1і7+m,3і   і  іКороткий    переход,і
і           і             і   і     і   і  іесли меньше или рав-і
і           і             і   і     і   і  іно (ZF = 1  и  SF <>і
і           і             і   і     і   і  іOF).                і
і           і             і   і     і   і  і                    і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 86 cw/cdіJNA  rel16/32і3/1і7+m,3і   і  іКороткий    переход,і
і           і             і   і     і   і  іесли не выше (CF = 1і
і           і             і   і     і   і  іи ZF = 1).          і
і           і             і   і     і   і  і                    і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 82 cw/cdіJNAE rel16/32і3/1і7+m,3і   і  іКороткий    переход,і
і           і             і   і     і   і  іесли   не  выше  илиі
і           і             і   і     і   і  іесли   не  выше  илиі
і           і             і   і     і   і  іравно (CF = 1).     і
і           і             і   і     і   і  і                    і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 8F3cw/cdіJNB  rel16/32і3/1і7+m,3і   і  іКороткий    переход,і
і           і             і   і     і   і  іесли не  ниже  (CF =і
і           і             і   і     і   і  і= 0).               і
і           і             і   і     і   і  і                    і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 87 cw/cdіJNBE  rel16/3і 3/і 7+m,і   і  іКороткий    переход,і
і           і             і   і     і   і  іесли   не  ниже  илиі
і           і             і   і     і   і  іравно (CF = 0 и ZF =і
і           і             і   і     і   і  і0).                 і
і           і             і   і     і   і  і                    і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 83 cw/cdіJNC  rel16/32і3/1і7+m,3і   і  іКороткий    переход,і
і           і             і   і     і   і  іесли  нет переноса иі
і           і             і   і     і   і  іZF = 0).            і
і           і             і   і     і   і  і                    і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 85 cw/cdіJNE  rel16/32і3/1і7+m,3і   і  іКороткий    переход,і
і           і             і   і     і   і  іесли не равно (ZF  =і
і           і             і   і     і   і  і0).                 і
і           і             і   і     і   і  і                    і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 8E cw/cdіJNG  rel16/32і3/1і7+m,3і   і  іКороткий    переход,і
і           і             і   і     і   і  іесли не больше (ZF =і
і           і             і   і     і   і  і1 или SF <> OF).    і
і           і             і   і     і   і  і                    і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 8C cw/cdіJNGE rel16/32і3/1і7+m,3і   і  іКороткий    переход,і
і           і             і   і     і   і  іесли не  больше  илиі
і           і             і   і     і   і  іравно (SF <> OF).   і
і           і             і   і     і   і  і                    і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 8D cw/cdіJNL  rel16/32і3/1і7+m,3і   і  іКороткий    переход,і
і           і             і   і     і   і  іесли не меньше (SF =і
і           і             і   і     і   і  іOF).                і
і           і             і   і     і   і  і                    і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 8F cw/cdіJNLE rel16/32і3/1і7+m,3і   і  іКороткий    переход,і
і           і             і   і     і   і  іесли  не  меньше илиі
і           і             і   і     і   і  іравно (ZF = 0 и SF =і
і           і             і   і     і   і  іOF).                і
і           і             і   і     і   і  і                    і
АДДДДДДДДДДДБДДДДДДДДДДДДДБДДДБДДДДДБДДДБДДБДДДДДДДДДДДДДДДДДДДДЩ

JMP     Переход.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

     Флаги: все при переключении задачи,  ни одного, если нет пе-
реключения задачи.

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод    Инструкция  Такты                      Описание         і
іоперации                                                       і
ГДДДДДВДДДДДДДДДДДДВДДДДДВДДДДДДВДДДДДДВДДДДДДВДДДДДДДДДДДДДДДДДґ
і     і            і486  і386   і286   і86    і                 і
ГДДДДДЕДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДґ
іEB cbіJMP rel8    і3    і7+m   і7     і15    іКороткий переход.і
і     і            і     і      і      і      і                 і
ГДДДДДЕДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДґ
іE9 cwіJMP rel16   і3    і7+m   і7     і15    іБлижний переход. і
і     і            і     і      і      і      і                 і
ГДДДДДЕДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДґ
іFF /4іJMP r/m16   і5/5  і+m/   і7/11  і11/18 іКосвенный ближнийі
і     і            і     і0+m   і      і+AE   іпереход.         і
і     і            і     і      і      і      і                 і
ГДДДДДЕДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДґ
іEA cdіJMP ptr16:16і17pm і2+m,  і11,   і15    іМежсегментный пе-і
і     і            і=19  іm=27+mіpm=23 і      іреход, 4-байтовыйі
і     і            і     і      і      і      інепосредственный і
і     і            і     і      і      і      іадрес.           і
і     і            і     і      і      і      і                 і
ГДДДДДЕДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДґ
іEA cdіJMP ptr16:16і32   іpm    і38    і      іПереход для вызо-і
і     і            і     і5+m   і      і      іва вентиля, те жеі
і     і            і     і      і      і      іпривилегии.      і
і     і            і     і      і      і      і                 і
ГДДДДДЕДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДґ
іEA cdіJMP ptr16:16і42+  іts    і175   і      іПереход     черезі
і     і            іts   і      і      і      ісегмент состоянияі
і     і            і     і      і      і      ізадачи.          і
і     і            і     і      і      і      і                 і
ГДДДДДЕДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДґ
іEA cdіJMP ptr16:16і42+  іts    і180   і 24+EAіПереход     черезі
і     і            іts   і      і      і      івентиль задачи.  і
і     і            і     і      і      і      і                 і
ГДДДДДЕДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДґ
іFF /5іJMP   m16:16і13,  і3+m,  і15,   і      іКосвенный переході
і     і            іpm=  іm=31+mіpm=26 і      іr/m16:16 (межсег-і
і     і            і18   і      і      і      іментный).        і
і     і            і     і      і      і      і                 і
ГДДДДДЕДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДґ
іFF /5іJMP   m16:16і31   іpm=49+і41    і      іПереход для вызо-і
і     і            і     іm     і      і      іва вентиля, те жеі
і     і            і     і      і      і      іпривилегии.      і
і     і            і     і      і      і      і                 і
ГДДДДДЕДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДґ
іFF /5іJMP   m16:16і41+  і5+ts  і178   і      іПереход     черезі
і     і            іts   і      і      і      ісегмент состоянияі
і     і            і     і      і      і      ізадачи.          і
і     і            і     і      і      і      і                 і
ГДДДДДЕДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДґ
іFF /5іJMP   m16:16і42+  і5+ts  і183   і      іПереход     черезі
і     і            іts   і      і      і      івентиль задачи.  і
і     і            і     і      і      і      і                 і
ГДДДДДЕДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДґ
іE9 cdіJMP rel32   і3    і7+m   і      і      іБлижний переход. і
і     і            і     і      і      і      і                 і
ГДДДДДЕДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДґ
іFF /4іJMP r/m32   і5/5  і7+m,10іm     і      іБлижний переход. і
і     і            і     і      і      і      і                 і
ГДДДДДЕДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДґ
іEA cpіJMP ptr16:32і13pm і2+m,  і      і      іМежсегментный пе-і
і     і            і=18  іpm=27+і      і      іреход, 6-байтовыйі
і     і            і     іm     і      і      інепосредственный і
і     і            і     і      і      і      іадрес.           і
і     і            і     і      і      і      і                 і
ГДДДДДЕДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДґ
іEA cpіJMP ptr16:32і31   іpm=45+і      і      іПереход для вызо-і
і     і            і     іm     і      і      іва вентиля, те жеі
і     і            і     і      і      і      іпривилегии.      і
і     і            і     і      і      і      і                 і
ГДДДДДЕДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДґ
іEA cpіJMP ptr16:32і42+  іts    і      і      іПереход     черезі
і     і            іts   і      і      і      ісегмент состоянияі
і     і            і     і      і      і      ізадачи.          і
і     і            і     і      і      і      і                 і
ГДДДДДЕДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДґ
іFF /5іJMP ptr16:32і43+  іts    і      і      іПереход     черезі
і     і            іts   і      і      і      івентиль задачи.  і
і     і            і     і      і      і      і                 і
ГДДДДДЕДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДґ
іFF /5іJMP   m16:32і13,  іpm=43+і      і      іМежсегментный пе-і
і     і            іpm=  іm     і      і      іреход по адресу ві
і     і            і18   іpm=27+і      і      ідвойном     словеі
і     і            і     іm     і      і      іr/m.             і
і     і            і     і      і      і      і                 і
ГДДДДДЕДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДґ
іFF /5іJMP   m16:32і31   іpm=49+і      і      іПереход для вызо-і
і     і            і     іm     і      і      іва вентиля, те жеі
і     і            і     і      і      і      іпривилегии.      і
і     і            і     і      і      і      і                 і
ГДДДДДЕДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДґ
іFF /5іJMP   m16:32і41+  і5+ts  і      і      іПереход     черезі
і     і            іts   і      і      і      ісегмент состоянияі
і     і            і     і      і      і      ізадачи.          і
ГДДДДДЕДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДґ
іFF /5іJMP   m16:32і42+  і5+ts  і      і      іПереход     черезі
і     і            іts   і      і      і      івентиль задачи.  і
АДДДДДБДДДДДДДДДДДДБДДДДДБДДДДДДБДДДДДДБДДДДДДБДДДДДДДДДДДДДДДДДЩ

     Инструкция JMP передает управление в другую точку  в  потоке
инструкций без записи информации о возврате.

     Действие различных форм инструкции показано ниже.

     Переходы, где цель задана операндами r/m16,  r/m32,  rel16 и
rel32, представляют собой ближние переходы и не связаны с измене-
нием значения сегментного регистра.

     Инструкции JMP  rel16  и  JMP rel32 для определения целевого
адреса прибавляют смещение к адресу инструкции, следующему за ин-
струкцией JMP.  Форма  rel16 используется,  когда атрибут размера
операнда равен 16 (только при атрибуте размера  сегмента  16),  а
форма rel32  -  когда  атрибут  размера  операнда  равен 32 битам
(только при атрибуте размера сегмента 32). Результат записывается
в 32-битовый  регистр EIP.  При использовании формы rel16 старшие
16 бит регистра EIP очищаются,  что дает в  результате  смещение,
значение которого не превышает 16 бит.

     Инструкции JMP  r/m16 и JMP r/m32 задают регистр или адрес в
памяти, из которого выбирается абсолютное  смещение  относительно
процедуры. Смещение,  выбираемое из r/m, имеет размер 32 бита при
атрибуте размера операнда 32 (r/m32) или 16 бит при атрибуте раз-
мера операнда 16 (r/m16).

     Формы инструкции JMP ptr16:16 и ptr16:32в качестве длинного
указателя целевого адреса используют  4-байтовый  или  6-байтовый
операнд. Инструкции  JMP  ptr16:16 или ptr16:32 извлекают из ука-
занного адреса памяти длинный указатель (косвенность).  В  режиме
реальной или виртуальной адресации процессора 8086 длинный указа-
тель предусматривает 16 бит для регистра CS и 16 или 32  бита для
регистра EIP (в зависимости от атрибута размера операнда).  В за-
щищенном режиме обе формы с длинным указателем анализируют полно-
мочия доступа (байт AR) в дескрипторе,  индекс которого  указыва-
ется  селектором  длинного  указателя.  В зависимости от значения
байта AR переход будет выполнять один из следующих типов передачи
управления:

     - переход на сегмент кода с тем же уровнем привилегий;

     - переключение задачи.

LAHF    Загрузка флагов в регистр AH.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод    Инструкция Такты                  Описание              і
іоперации                                                       і
ГДДДДДДВДДДДДДДДДВДДДДДВДДДДДДВДДДДДДВДДДВДДДДДДДДДДДДДДДДДДДДДДґ
і      і         і486  і386   і286   і86 і                      і
ГДДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДґ
і9H    іLAHF     і3    і2     і2     і4  іЗагружает в AH  флаги:і
і      і         і     і      і      і   іSF,  ZF,  xx,  AF, xx,і
і      і         і     і      і      і   іPF, xx, CF.           і
АДДДДДДБДДДДДДДДДБДДДДДБДДДДДДБДДДДДДБДДДБДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция LAHF  пересылает  младший  байт  регистра  флагов
(размером в слово) в AH. При этом пересылаются следующие биты (от
старшего к младшему):  флаг знака,  нуля, неопределенный бит, до-
полнительного переноса,  неопределенный бит, флаг четности, неоп-
ределенный бит и флаг переноса.

LAR     Загрузка байта полномочий доступа (только для защищенного
         режима процессором 80286/386/486).
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод     Инструкция    Такты                Описание            і
іоперации                                                       і
ГДДДДДДДВДДДДДДДДДДДДДВДДДДДВДДДДДДДДВДДДДДВДДДДДДДДДДДДДДДДДДДДґ
і       і             і486  і386     і286  і                    і
ГДДДДДДДЕДДДДДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 02/rіLAR r16,r/m16і11/11іpm=15/16і14/16іr16 <-r/m16 с маскойі
і       і             і     і        і     іFF00.               і
і       і             і     і        і     і                    і
ГДДДДДДДЕДДДДДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іOF 02/rіLAR r32,r/m32і11/11іpm=15/16і     іr32 <-r/m32 с маскойі
і       і             і     і        і     і00FxFF00.           і
і       і             і     і        і     і                    і
АДДДДДДДБДДДДДДДДДДДДДБДДДДДБДДДДДДДДБДДДДДБДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция LAR отмеченную форму второго двойного слова деск-
риптора для исходного селектора,  если селектор,  видимый  в  CPL
(модифицирован RPL селектора) и представляет собой допустимый тип
дескриптора.  Целевой регистр загружается старшим двойным  словом
дескриптора,  отмеченным  00FxFF00,  а  ZF устанавливается в 1 (x
указывает, что четыре бита, соответствующие старшим четырем битам
границы  не  определены  в загружаемом инструкцией LAR значении).
Если селектор не является видимым или имеет недопустимый тип, что
флаг ZF очищается.

     Если задан 32-битовый размер операнда, то в 32-битовый целе-
вой регистр  загружается  все  32-битовое  значение.  Если  задан
16-битовый размер операнда,  то младшие 16 бит этого значения за-
писываются в 16-битовый целевой регистр.

     Для LAR  допустим  есть  код  и дескрипторы сегмента данных.
(Допустимые типы сегмента и дескриптора вентиля описываются в ру-
ководстве фирмы Intel.)

LEA     Загрузка действующего смещения адреса.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод     Инструкция  Такты                Описание              і
іоперации                                                       і
ГДДДДДДДВДДДДДДДДДДДВДДДДДВДДДДВДДДВДДДДДВДДДДДДДДДДДДДДДДДДДДДДґ
і       і           і486  і386 і286і86   і                      і
ГДДДДДДДЕДДДДДДДДДДДЕДДДДДЕДДДДЕДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДДґ
і8D/r   іLEA r16,m  і1    і2   і3  і2+EA іЗаписывает действующийі
і       і           і     і    і   і     іадрес  m  в   регистреі
і       і           і     і    і   і     іr16.                  і
і       і           і     і    і   і     і                      і
ГДДДДДДДЕДДДДДДДДДДДЕДДДДДЕДДДДЕДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДДґ
і8D/r   іLEA r32,m  і1    і2   і   і     іЗаписывает действующийі
і       і           і     і    і   і     іадрес  m  в   регистреі
і       і           і     і    і   і     іr32.                  і
і       і           і     і    і   і     і                      і
ГДДДДДДДЕДДДДДДДДДДДЕДДДДДЕДДДДЕДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДДґ
і8D/r   іLEA r16,m  і1    і2   і   і     іЗаписывает действующийі
і       і           і     і    і   і     іадрес  m  в   регистреі
і       і           і     і    і   і     іr16.                  і
і       і           і     і    і   і     і                      і
ГДДДДДДДЕДДДДДДДДДДДЕДДДДДЕДДДДЕДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДДґ
і8D/r   іLEA r32,m  і1    і2   і   і     іЗаписывает действующийі
і       і           і     і    і   і     іадрес  m  в   регистреі
і       і           і     і    і   і     іr32.                  і
і       і           і     і    і   і     і                      і
АДДДДДДДБДДДДДДДДДДДБДДДДДБДДДДБДДДБДДДДДБДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция LEA  вычисляет  действующий  адрес  (смещение)  и
записывает его в заданном регистре. Атрибут размера операнда инс-
трукции определяется выбранным регистром.  Атрибут размера адреса
определяется атрибутом USE сегмента,  содержащего второй операнд.
Атрибуты размера операнда и размера адреса на действие, выполняе-
мое инструкцией LEA, влияют следующим образом:

ЪДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і  Размер операндаі Размер адресаі Выполняемое действие         і
ГДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і  16             і 16           і Вычисляется и записывается в і
і                 і              і в требуемом 16-битовом целе- і
і                 і              і вом регистре 16-битовый дей- і
і                 і              і ствующий адрес.              і
і                 і              і                              і
ГДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і  16             і 32           і Вычисляется и записывается в і
і                 і              і в требуемом 16-битовом целе- і
і                 і              і вом регистре 32-битовый дей- і
і                 і              і ствующий адрес.              і
і                 і              і                              і
ГДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і  32             і 16           і Вычисляется и записывается в і
і                 і              і в требуемом 32-битовом целе- і
і                 і              і вом регистре 16-битовый дей- і
і                 і              і ствующий адрес.              і
і                 і              і                              і
ГДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і  32             і 32           і Вычисляется и записывается в і
і                 і              і в требуемом 32-битовом целе- і
і                 і              і вом регистре 32-битовый дей- і
і                 і              і ствующий адрес.              і
і                 і              і                              і
АДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

LEAVE   Выход из процедуры высокого уровня
         (только для процессоров 80186/286/386/486).
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод     Инструкция    Такты            Описание                і
іоперации                                                       і
ГДДДДДДДВДДДДДДДДДДДДДВДДДДДВДДДДВДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДґ
і       і             і486  і386 і286  і                        і
ГДДДДДДДЕДДДДДДДДДДДДДЕДДДДДЕДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
іC9/r   іLEAVE        і5    і4   і5    іУстанавливает SP в BP.  і
і       і             і     і    і     і                        і
ГДДДДДДДЕДДДДДДДДДДДДДЕДДДДДЕДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
іC9/r   іLEAVE        і5    і4   і     іУстанавливает ESP в EBP.і
і       і             і     і    і     і                        і
АДДДДДДДБДДДДДДДДДДДДДБДДДДДБДДДДБДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция LEAVE выполняет действие, обратное по отношению к
инструкции ENTER.  Путем копирования указателя  границы  стека  в
указатель стека  инструкция LEAVE освобождает пространство стека,
используемое процедурой для своих  локальный  переменных.  Старый
указатель стека извлекается и записывается в BP или EBP,  восста-
навливая границы стека вызывающей программы. Последующая инструк-
ция RET  nn удаляет все аргументы,  занесенные в стек процедурой,
из которой выполняется выход.

LGDT/   Загружает регистр глобальных дескрипторов/прерываний
 LIDT    (только защищенный режим процессоров 80286/386/486).
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод     Инструкция    Такты         Описание                   і
іоперации                                                       і
ГДДДДДДДВДДДДДДДДДДДДДВДДДДДВДДДДВДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і       і             і486  і386 і286і                          і
ГДДДДДДДЕДДДДДДДДДДДДДЕДДДДДЕДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF 01/2іLGDT m16&32  і11   і11  і11 іЗагружает m в регистр таб-і
і       і             і     і    і   ілицы глобальных дескрипто-і
і       і             і     і    і   іров.                      і
і       і             і     і    і   і                          і
ГДДДДДДДЕДДДДДДДДДДДДДЕДДДДДЕДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF 01/2іLIDT m16&32  і11   і11  і12 іЗагружает m в регистр таб-і
і       і             і     і    і   ілицы дескрипторов прерыва-і
і       і             і     і    і   іний.                      і
і       і             і     і    і   і                          і
АДДДДДДДБДДДДДДДДДДДДДБДДДДДБДДДДБДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкции LIDT и LGTD загружают линейный  базовый  адрес  и
граничное значение из шестибайтового операнда в памяти в регистры
IDTR и GDTR соответственно. Если в LGTD или LIDT используется 16-
битовый операнд,  то в регистр загружается  16-битовое  граничное
значение и 24-битовая база,  а старшие 8 бит 6-байтового операнда
не используются.  Если используется 32-битовый операнд, то загру-
жаются 16-битовое граничное значение и 32-битовая база, а старшие
8 бит 6-байтового операнда используются в  качестве  старших  бит
базового адреса.

     Инструкции SGDT и SIDT всегда записывают все 48 бит данных 6
-байтового операнда.  В  процессоре 80286 старшие 8 бит после вы-
полнения инструкции SGDT или SIDT  не  определены.  В  процессоре
80386 как  для  16,  так и для 32-битового операнда старшие 8 бит
записываются в старшие 8 бит адреса.  Если  инструкции  LGDT  или
LIDT используются  с  16-битовым операндом для загрузки регистра,
сохраненного по инструкции SGDT или SIDT,  то старшие 8 бит запи-
сываются как нули.

     Инструкции LGDT  и LIDT используются в системном программном
обеспечении и не применяются в прикладных программах.  Это единс-
твенные инструкции,  которые в защищенном режиме процессора 80386
непосредственно загружают линейный адрес (то есть не адрес  отно-
сительно сегмента).

LGS     Загрузка полного указателя (LGS/LSS/LFS только для
 LSS     процессоров 386 и i486).
 LFS     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
 LDS     O      D      I      T      S      Z      A      P      C
 LES

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод     Инструкция     Такты                  Описание         і
іоперации                                                       і
ГДДДДДДДВДДДДДДДДДДДДДДВДДДДВДДДДДВДДДДДВДДДДДВДДДДДДДДДДДДДДДДДґ
і       і              і486 і386  і286  і86   і                 і
ГДДДДДДДЕДДДДДДДДДДДДДДЕДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДґ
іC5 /r  іLDS r16,m16:16і6/12і7,   і7,   і     іЗагружает  DS:r16і
і       і              і    іpm=22іpm=21і16+EAіуказателем из па-і
і       і              і    і     і     і     імяти.            і
і       і              і    і     і     і     і                 і
ГДДДДДДДЕДДДДДДДДДДДДДДЕДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДґ
іC5 /r  іLDS r32,m16:32і6/12і7,   і     і     іЗагружает  DS:r32і
і       і              і    іpm=22і     і     іуказателем из па-і
і       і              і    і     і     і     імяти.            і
і       і              і    і     і     і     і                 і
ГДДДДДДДЕДДДДДДДДДДДДДДЕДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДґ
іOF B2/rіLSS r16,m16:32і6/12і7,   і     і     іЗагружает  SS:r16і
і       і              і    іpm=22і     і     іуказателем из па-і
і       і              і    і     і     і     імяти.            і
і       і              і    і     і     і     і                 і
ГДДДДДДДЕДДДДДДДДДДДДДДЕДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДґ
іOF B2/rіLSS r32,m16:32і6/12і7,   і     і     іЗагружает  ES:r16і
і       і              і    іpm=22і     і     іуказателем из па-і
і       і              і    і     і     і     імяти.            і
і       і              і    і     і     і     і                 і
ГДДДДДДДЕДДДДДДДДДДДДДДЕДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДґ
іC4 /r  іLES r16,m16:16і6/12і7,   і 7,  і 16  іЗагружает  ES:r16і
і       і              і    іpm=22і pm=2і +EA іуказателем из па-і
і       і              і    і     і     і     імяти.            і
і       і              і    і     і     і     і                 і
ГДДДДДДДЕДДДДДДДДДДДДДДЕДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДґ
іC4 /r  іLES r32,m16:32і6/12і7,   і     і     іЗагружает  ES:r32і
і       і              і    іpm=22і     і     іуказателем из па-і
і       і              і    і     і     і     імяти.            і
і       і              і    і     і     і     і                 і
ГДДДДДДДЕДДДДДДДДДДДДДДЕДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДґ
іOF B2/rіLFS r16,m16:16і6/12і7,   і     і     іЗагружает  FS:r16і
і       і              і    іpm=22і     і     іуказателем из па-і
і       і              і    і     і     і     імяти.            і
і       і              і    і     і     і     і                 і
ГДДДДДДДЕДДДДДДДДДДДДДДЕДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДґ
іOF B2/rіLSS r32,m16:32і6/12і7,   і     і     іЗагружает  FS:r32і
і       і              і    іpm=22і     і     іуказателем из па-і
і       і              і    і     і     і     імяти.            і
і       і              і    і     і     і     і                 і
ГДДДДДДДЕДДДДДДДДДДДДДДЕДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДґ
іOF B2/rіLGS r16,m16:16і6/12і7,   і     і     іЗагружает  GS:r16і
і       і              і    іpm=22і     і     іуказателем из па-і
і       і              і    і     і     і     імяти.            і
і       і              і    і     і     і     і                 і
ГДДДДДДДЕДДДДДДДДДДДДДДЕДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДґ
іOF B2/rіLSS r32,m16:32і6/12і7,   і     і     іЗагружает  GS:r32і
і       і              і    іpm=22і     і     іуказателем из па-і
і       і              і    і     і     і     імяти.            і
і       і              і    і     і     і     і                 і
АДДДДДДДБДДДДДДДДДДДДДДБДДДДБДДДДДБДДДДДБДДДДДБДДДДДДДДДДДДДДДДДЩ

     Данные инструкции считывают из памяти полный указатель и за-
писывают его в выбранном сегментном регистре (паре регистров). 16
бит полного указателя загружаются в сегментный  регистр  SS,  DS,
ES, FS или GS. В другой регистр загружаются 32 бита, если атрибут
размера операнда равен 32, и 16 бит, если атрибут размера операн-
да равен 16. Другой 16 или 32-битовый регистр, который нужно заг-
рузить, определяется тем,  задан ли регистровый операнд  r16  или
r32.

     При выполнении  присваивания одному из сегментных  регистров
дескриптор также загружается в сегментный регистр. Данные для ре-
гистра получаются  из  записи таблицы дескриптора для данного се-
лектора.

     Нулевой селектор (значения 0000 - 0003) могут  загружаться в
регистры DS,  ES, FS или GS не вызывая исключительных ситуаций по
нарушению защиты.  (Все последующие ссылки на сегмент,  соответс-
твующий сегментный  регистр которого загружается нулевым селекто-
ром, вызывают исключительную ситуацию #GP(0).  Ссылок на память в
этом сегменте не происходит.)

LLDT    Загрузка регистра таблицы  локальных дескрипторов
        (только для защищенного режима процессоров 80286/386/486).
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод      Инструкция      Такты        Описание                 і
іоперации                                                       і
ГДДДДДДДДВДДДДДДДДДДВДДДДДВДДДДДВДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДґ
і        і          і486  і386  і286  і                         і
ГДДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF 00 /2іLLDT r/m16і11/11і20   і17/19іЗагружает в LDTR селекторі
і        і          і     і     і     іr/m16.                   і
АДДДДДДДДБДДДДДДДДДДБДДДДДБДДДДДБДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция LLDT загружает регистр таблицы локальных дескрип-
торов (LDTR).  Операнд  инструкции  LLDT размером в слово (память
или регистр) должен содержать селектор таблицы локальных дескрип-
торов. Если это так,  то регистр загружается из записи.  Дескрип-
торные регистры DS,  ES,  SS,  FS, GS и CS не затрагиваются. Поле
LDT в сегменте состояния задачи не изменяется.

     Операнд-селектор может быть нулевым.  Если это так,  то LDTR
отмечается как недопустимая. Все ссылки на дескрипторы (кроме ин-
струкций LAR, VERR, VERW или LSL) приводят с сбою #GP.

     Инструкция LLDT используется в системном программном обеспе-
чении, в прикладных программах она не применяется.

LMSW    Загрузка слова состояния машины (только для защищенного
        режима процессоров 80286/386/486).
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод      Инструкция      Такты       Описание                  і
іоперации                                                       і
ГДДДДДДДДВДДДДДДДДДДВДДДДДВДДДДДВДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і        і          і486  і386  і286 і                          і
ГДДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF 01 /6іLMSW r/m16і13/13і10/13і3/6 іЗагружает  r/m16  в  словоі
і        і          і     і     і    ісостояния машины.         і
АДДДДДДДДБДДДДДДДДДДБДДДДДБДДДДДБДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция LMSW загружает слово состояния машины (часть CR0)
из операнда-источника.  Данную инструкцию можно использовать  для
переключения в защищенный режим. В этом случае за ней должен сле-
довать межсегментный переход для очистки очереди инструкций. Инс-
трукция LMSW  не  будет  выполнять обратного переключения в режим
реальной адресации.

     Инструкция LMSW используется только в  системном программном
обеспечении, в прикладных программах она не применяется.

LOCK    Выдает сигнальный префикс LOCK#.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод      Инструкция    Такты          Описание                 і
іоперации                                                       і
ГДДДДДДДДВДДДДДДДДВДДДДДВДДДДДВДДДДВДДВДДДДДДДДДДДДДДДДДДДДДДДДДґ
і        і        і486  і386  і286 і86і                         і
ГДДДДДДДДЕДДДДДДДДЕДДДДДЕДДДДДЕДДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДґ
іF0      іLOCK    і1    і0    і0   і2 іДобавляет  для  следующейі
і        і        і     і     і    і  іинструкции сигнал LOCK#. і
АДДДДДДДДБДДДДДДДДБДДДДДБДДДДДБДДДДБДДБДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Префикс LOCK  (блокировка)  вызывает при выполнении инструк-
ции,  которая за ним следует,  сигнал LOCK#.  В многопроцессорном
окружении данный сигнал можно использовать,  чтобы обеспечить си-
туацию,  когда процессор после выдачи LOCK# получает исключитель-
ные  права на использование разделяемой памяти.  В процессоре 386
для реализации проверки и установки используется обычно  инструк-
ция BTS,  которая реализует обычно применяемую для этого последо-
вательность "чтение-модификация-запись".

     В процессорах 386 и i486 префикс LOCK  функционирует  только
со следующими инструкциями:

         ЪДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДї
         і  BT, BTS, BTR, BTC      і    mem, reg/imm  і
         і  XCHG                   і    reg, mem      і
         і  XCHG                   і    mem, reg      і
         і  ADD, OR, ADC, SBB      і    mem, reg/imm  і
         і  NOT, NEG, INC, DEC     і    mem           і
         АДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДЩ

     Если префикс  LOCK используется с другими инструкциями,  от-
личными от перечисленных выше,  то будет генерироваться  перехват
неопределенного кода операции.

     Инструкция XCHG всегда добавляет LOCK#,  независимо от нали-
чия или отсутствия префикса LOCK.

     Целостность LOCK не нарушается при выравнивании поля в памя-
ти. Блокировка  памяти соблюдается для произвольных невыровненных
полей.

     Блокировка доступа не обеспечивается,  если другой процессор
параллельно выполняет инструкцию, которая имеет одну из следующих
характеристик:

     - перед ней не указан префикс LOCK;

     - она не является инструкцией из приведенного выше списка;

     - заданный операнд в памяти не перекрывает в  точности  опе-
       ранд-приемник (блокировка не обеспечивается для частичного
       перекрытия, даже если один операнд в памяти целиком содер-
       жится внутри другого).

LODS    Загружает строковый операнд.
 LODSB  (Инструкция LODSD работает только на  процессорах  386  и
 LODSW  i486.)
 LODSD  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод    Инструкция      Такты          Описание                 і
іоперации                                                       і
ГДДДДДДВДДДДДДДДДДВДДДДДВДДДДДВДДДДВДДВДДДДДДДДДДДДДДДДДДДДДДДДДґ
і      і          і486  і386  і286 і86і                         і
ГДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДґ
іAC    іLODS m18  і5    і5    і5   і2 іЗагружает   в    AL  байті
і      і          і     і     і    і  і[(E)SI].                 і
і      і          і     і     і    і  і                         і
ГДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДґ
іAD    іLODS m16  і5    і5    і5   і12іЗагружает   в    AX словоі
і      і          і     і     і    і  і[(E)SI].                 і
і      і          і     і     і    і  і                         і
ГДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДґ
іAD    іLODS m32  і5    і5    і5   і12іЗагружает  в  EAX двойноеі
і      і          і     і     і    і  іслово [(E)SI].           і
і      і          і     і     і    і  і                         і
ГДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДґ
іAC    іLODSB     і5    і5    і5   і2 іЗагружает   в    AL  байті
і      і          і     і     і    і  іDS:[(E)SI].              і
і      і          і     і     і    і  і                         і
ГДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДґ
іAD    іLODSW     і5    і5    і5   і12іЗагружает   в    AX словоі
і      і          і     і     і    і  іDS:[(E)SI].              і
і      і          і     і     і    і  і                         і
ГДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДґ
іAD    іLODSD     і5    і5    і5   і12іЗагружает  в  EAX двойноеі
і      і          і     і     і    і  іслово DS:[(E)SI].        і
і      і          і     і     і    і  і                         і
АДДДДДДБДДДДДДДДДДБДДДДДБДДДДДБДДДДБДДБДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция LODS  загружает  регистр  AL,  AX или EAX байтом,
словом или двойным словом из памяти по адресу,  который указывает
исходный индексный  регистр.  После выполнения пересылки исходный
индексный регистр автоматически продвигается  (увеличивается  или
уменьшается). Если  флаг направления равен 0 (была выполнена инс-
трукция CLD) индекс источника увеличивается,  если флаг направле-
ния равен  1 (была выполнена инструкция STD),  то он уменьшается.
При загрузке байта индекс увеличивается или уменьшается на 1, при
загрузке слова - на 2, а при загрузке двойного слова - на 4.

     Если атрибут  размера  адреса для инструкции равен 16,  то в
качестве индексного регистра источника используется регистр SI. В
противном случае  атрибут  размера  адреса равен 32 битам,  и ис-
пользуется регистр ESI. Адрес исходных данный определяется исклю-
чительно содержимым  ESI/SI.  Перед  выполнением  инструкции LODS
загрузите в регистр SI корректное  значение  индекса.  Синонимами
для инструкции LODS при работе с байтом,  словом и двойным словом
являются инструкции LODS, LODSW и LODSD.

     Инструкции LODS может предшествовать префикс REP. Однако бо-
лее часто LODS используется в конструкции LOOP,  поскольку обычно
требуется дальнейшая обработка данных, загруженных в регистр EAX,
AX или AL.

LOOP    Управление циклом с помощью счетчика CX.
 LOOPусл Управление циклом с помощью счетчика  CX/ECX (только для
         процессоров 386 и i486).
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод    Инструкция      Такты               Описание            і
іоперации                                                       і
ГДДДДДДВДДДДДДДДДДДВДДДДДВДДДДДВДДДДДВДДДДДВДДДДДДДДДДДДДДДДДДДДґ
і      і           і486  і386  і286  і86   і                    і
ГДДДДДДЕДДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іE2 cb іLOOP rel8  і2,6  і11+m і8,   і17,  іУменьшить   счетчик,і
і      і           і     і     іnoj=4іnoj=5іперейти    (короткийі
і      і           і     і     і     і     іпереход),      если і
і      і           і     і     і     і     ісчетчик равен 0.    і
і      і           і     і     і     і     і                    і
ГДДДДДДЕДДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іE1 cb іLOOPE rel8 і9,6  і11+m і8,   і17,  іУменьшить   счетчик,і
і      і           і     і     іnoj=4іnoj=6іперейти    (короткийі
і      і           і     і     і     і     іпереход), если счет-і
і      і           і     і     і     і     ічик равен 0 и ZF=1. і
і      і           і     і     і     і     і                    і
ГДДДДДДЕДДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іE1 cb іLOOPZ rel8 і9,6  і11+m і8,   і17,  іУменьшить   счетчик,і
і      і           і     і     іnoj=4іnoj=6іперейти    (короткийі
і      і           і     і     і     і     іпереход), если счет-і
і      і           і     і     і     і     ічик равен 0 и ZF=1. і
і      і           і     і     і     і     і                    і
ГДДДДДДЕДДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іE0 cb іLOOPNE rel8і9,6  і11+m і8,   і19,  іУменьшить   счетчик,і
і      і           і     і     іnoj=4іnoj=5іперейти    (короткийі
і      і           і     і     і     і     іпереход), если счет-і
і      і           і     і     і     і     ічик равен 0 и ZF=0. і
і      і           і     і     і     і     і                    і
ГДДДДДДЕДДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іE0 cb іLOOPNZ rel8і9,6  і11+m і8,   і19,  іУменьшить   счетчик,і
і      і           і     і     іnoj=4іnoj=5іперейти    (короткийі
і      і           і     і     і     і     іпереход), если счет-і
і      і           і     і     і     і     ічик равен 0 и ZF=0. і
і      і           і     і     і     і     і                    і
АДДДДДДБДДДДДДДДДДДБДДДДДБДДДДДБДДДДДБДДДДДБДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция LOOP  уменьшает регистр-счетчик без изменения ка-
ких-либо флагов.  Затем проверяются условия в соответствии с фор-
мой используемой инструкции LOOP. Если эти условия удовлетворяют-
ся, то выполняется короткий переход на метку,  заданную операндом
LOOP. Если атрибут размера адреса равен 16, то в качестве регист-
ра-счетчика используется регистр CX, в противном случае использу-
ется регистр ECX (только для процессора 386).  Операнд инструкции
LOOP должен лежать в диапазоне от 128 (десятичных) байт  до  инс-
трукции до 127 байт после инструкции.

     Инструкции LOOP обеспечивают итеративный контроль и комбини-
руют управление с помощью индекса цикла с переходом  по  условию.
Используйте инструкцию LOOP,  загружая беззнаковое значение счет-
чика итерации,  а затем кодируя LOOP в  конце  последовательности
повторяемых инструкций.  Целевым адресом LOOP является метка, ко-
торая указывает на начало итерации.

LSL     Загрузка границы сегмента (только для защищенного режима
         процессоров 80286/386 и i486).
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
                                           *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод      Инструкция      Такты             Описание            і
іоперации                                                       і
ГДДДДДДДДВДДДДДДДДДДДДДВДДДДДВДДДДДДДДВДДДВДДДДДДДДДДДДДДДДДДДДДґ
і        і             і486  і386     і286і                     і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДґ
іOF 03 /rіLSL r16,r/m16і10/10іpm=20/21і14/іЗагрузка: r16<-грани-і
і        і             і     і        і16 іца сегмента, селекторі
і        і             і     і        і   іr/m16 (с точностью доі
і        і             і     і        і   ібайта).              і
і        і             і     і        і   і                     і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДґ
іOF 03 /rіLSL r32,r/m32і10/10іpm=20/21і   іЗагрузка: r32<-грани-і
і        і             і     і        і   іца  сегмента, границаі
і        і             і     і        і   ісегмента     селекторі
і        і             і     і        і   іr/m32 (с точностью доі
і        і             і     і        і   ібайта).              і
і        і             і     і        і   і                     і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДґ
іOF 03 /rіLSL r16,r/m16і10/10іpm=25/26і14/іЗагрузка: r16<-грани-і
і        і             і     і        і16 іца сегмента,  границаі
і        і             і     і        і   ісегмента,    селекторі
і        і             і     і        і   іr/m16 (с точностью доі
і        і             і     і        і   істраницы).           і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДґ
іOF 03 /rіLSL r32,r/m32і10/10іpm=26/26і   іЗагрузка: r32<-грани-і
і        і             і     і        і   іца сегмента, селекторі
і        і             і     і        і   іr/m32 (с точностью доі
і        і             і     і        і   істраницы).           і
АДДДДДДДДБДДДДДДДДДДДДДБДДДДДБДДДДДДДДБДДДБДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция LSL  загружает в регистр границу сегмента и уста-
навливает регистр ZF в значение 1, обеспечивая доступность исход-
ного селектора в CPL (RPL),  и что тип дескриптора воспринимается
LSL. В  противном случае ZF сбрасывается в 0,  а целевой  регистр
не изменяется.  Граница сегмента загружается, как значение с точ-
ностью до байта.  Если дескриптор имеет границу сегмента  с  точ-
ностью до страницы,  то перед загрузкой в целевой регистр LSL бу-
дет транслировать его в  байтовую  границу  (сдвиг  влево  на  12
20-битовой "необработанной" границы от дескриптора,  затем опера-
ция OR с 000000FFFH).

     32-битовая форма этой инструкции записывает в 16-битовом це-
левом регистре границу с точностью до 32 бит.

     Допустимыми для LSL являются сегмент кода и сегмент данных.

LTR     Загрузка регистра задачи
        (только для защищенного режима процессоров 80286/386/486)
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод      Инструкция  Такты                 Описание            і
іоперации                                                       і
ГДДДДДДДДВДДДДДДДДДДДВДДДДДВДДДДДДДДВДДДДДВДДДДДДДДДДДДДДДДДДДДДґ
і        і           і486  і386     і286  і                     і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДДЕДДДДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДґ
іOF 03 /3іLTR r/m156 і20/20іpm=23/27і14/16іЗагрузка слова  EA  ві
і        і           і     і        і     ірегистр задачи.      і
АДДДДДДДДБДДДДДДДДДДДБДДДДДБДДДДДДДДБДДДДДБДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция LTR загружает регистр задачи из исходного регист-
ра или  ячейки  памяти,  заданной  операндом.  Сегмент  состояния
загруженной задачи отмечается, как занятый. Переключения задач не
происходит.

     Инструкция LTR  используется  только в системном программном
обеспечении, в прикладных программах она не применяется.

MOV     Перемещение данных.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод    Инструкция    Такты                  Описание           і
іоперации                                                       і
ГДДДДДДВДДДДДДДДДДДДДВДДДВДДДДДВДДДДДВДДДДДДВДДДДДДДДДДДДДДДДДДДґ
і      і             і486і 386 і286  і86    і                   і
ГДДДДДДЕДДДДДДДДДДДДДБВДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДґ
і88 /r іMOV r/m8,r8   і1 і2/2  і2/3  і2/9+EAіПеремещает байтовыйі
і      і              і  і     і     і      ірегистр в байт r/m.і
і      і              і  і     і     і      і                   і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДґ
і89 /r іMOV r/m16,r16 і1 і2/2  і2/3  і2/9+EAіПеремещает  регистрі
і      і              і  і     і     і      іразмером в слово  ві
і      і              і  і     і     і      ібайт r/m.          і
і      і              і  і     і     і      і                   і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДґ
і8A /r іMOV r/m8,r8   і1 і2/2  і/5   і2/8+EAіПеремещает байт r/mі
і      і              і  і     і     і      ів регистр  размеромі
і      і              і  і     і     і      ів байт.            і
і      і              і  і     і     і      і                   і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДґ
і8B /r іMOV r16,r/m16 і1 і2/2  і/5   і2/9+EAіПеремещает    словоі
і      і              і  і     і     і      іr/m в регистр  раз-і
і      і              і  і     і     і      імером в слово.     і
і      і              і  і     і     і      і                   і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДґ
і8B /r іMOV r32,r/m32 і1 і2/2  і     і      іПеремещает  двойноеі
і      і              і  і     і     і      іслово r/m в регистрі
і      і              і  і     і     і      іразмером  в двойноеі
і      і              і  і     і     і      іслово.             і
і      і              і  і     і     і      і                   і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДґ
і8C /r іMOV r/m16,Sregі3/і 2/2 і/3   і2/9+EAіПеремещает  двойноеі
і      і              і  і     і     і      іслово r/m в регистрі
і      і              і  і     і     і      іразмером  в двойноеі
і      і              і  і     і     і      іслово.             і
і      і              і  і     і     і      і                   і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДґ
і8D /r іMOV Sreg,r/m16і3/і 2/5 і/3   і2/9+EAіПеремещает    словоі
і      і              і  і pm= іm=17/і9     іr/m  в   сегментныйі
і      і              і  і 1/19і     і      і                   і
і      і              і  і     і     і      і                   і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДґ
іA0    іMOV AL,moffs8 і1 і 4   і     і10    іПеремещает байт  поі
і      і              і  і     і     і      іадресу    (сегмент:і
і      і              і  і     і     і      ісмещение) в AX.    і
і      і              і  і     і     і      і                   і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДґ
іA1    іMOV AX,moffs16і1 і 4   і     і10    іПеремещает слово поі
і      і              і  і     і     і      іадресу    (сегмент:і
і      і              і  і     і     і      ісмещение) в AX.    і
і      і              і  і     і     і      і                   і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДґ
іA2    іMOV EAX,      і1 і 4   і     і10    іПеремещает  двойноеі
і      і moffs32      і  і     і     і      іслово    по  адресуі
і      і              і  і     і     і      і(сегмент:смещение) і
і      і              і  і     і     і      ів регистр EAX.     і
і      і              і  і     і     і      і                   і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДґ
іA2    іMOV moffs8,AL і1 і 4   і     і10    іПеремещает   AL  поі
і      і              і  і     і     і      іадресу    (сегмент:і
і      і              і  і     і     і      ісмещение).         і
і      і              і  і     і     і      і                   і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДґ
іA3    іMOV moffs16,AXі1 і 2   і     і10    іПеремещает   AX  поі
і      і              і  і     і     і      іадресу    (сегмент:і
і      і              і  і     і     і      ісмещение).         і
і      і              і  і     і     і      і                   і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДґ
іA3    іMOV moffs16,  і1 і 2   і     і10    іПеремещает  регистрі
і      і    EAX       і  і     і     і      іEAX по адресу (сег-і
і      і              і  і     і     і      імент:смещение).    і
і      і              і  і     і     і      і                   і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДґ
іB0    іMOV reg8,imm8 і1 і 2   і     і4     іПеремещает   непос-і
і      і              і  і     і     і      іредственный байт  ві
і      і              і  і     і     і      ірегистр.           і
і      і              і  і     і     і      і                   і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДґ
іB8+rw іMOV reg16,    і1 і 2   і     і4     іПеремещает   непос-і
і      і    imm16     і  і     і     і      іредственное слово ві
і      і              і  і     і     і      ірегистр.           і
і      і              і  і     і     і      і                   і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДґ
іB8+rd іMOV reg32,    і1 і 2   і     і      іПеремещает   непос-і
і      і    imm32     і  і     і     і      іредственное   двой-і
і      і              і  і     і     і      іное слово   в   ре-і
і      і              і  і     і     і      ігистр.             і
і      і              і  і     і     і      і                   і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДґ
іC6    іMOV r/m8,imm8 і  і2/2 2і3    і/10+EAіПеремещает   непос-і
і      і              і  і     і     і      іредственный байт  ві
і      і              і  і     і     і      ібайт r/m.          і
і      і              і  і     і     і      і                   і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДґ
іC7    іMOV r/m8,imm8 і  і2/2 2і3    і/10+EAіПеремещает   непос-і
і      і              і  і     і     і      іредственное слово ві
і      і              і  і     і     і      іслово r/m.         і
і      і              і  і     і     і      і                   і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДґ
іC7    іMOV r/m32,    і  і2/2  і     і      іПеремещает   непос-і
і      і    imm32     і  і     і     і      іредственное двойноеі
і      і              і  і     і     і      іслово   в   двойноеі
і      і              і  і     і     і      іслово r/m.         і
і      і              і  і     і     і      і                   і
АДДДДДДБДДДДДДДДДДДДДДБДДБДДДДДБДДДДДБДДДДДДБДДДДДДДДДДДДДДДДДДДЩ

     Инструкция MOV копирует второй операнд в первый операнд.

     Если целевым операндом (приемником) является сегментный  ре-
гистр (DS,  ES, SS и т.д.), то в регистр также загружаются данные
из дескриптора.  Данные для регистра получаются из записи таблицы
дескриптора для  заданного селектора.  Нулевой селектор (значения
от 0000 до 0003) могут загружаться в регистры DS и ES  не вызывая
исключительной ситуации,  однако,  использование регистров DS или
ES вызывает #GP(0), и ссылок на память не происходит.

     Загрузка с помощью инструкции MOV в регистр SS предотвращает
все  прерывания  до  выполнения  следующей инструкции (предпочти-
тельнее, чтобы это была инструкция MOV в SP).

MOV     Перемещение данных в специальные регистры и из них
        (только для процессоров 386 и i486).
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод      Инструкция   Такты    Описание                        і
іоперации                                                       і
ГДДДДДДДДВДДДДДДДДДДДДВДДДВДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і        і            і486і386 і                                і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF 22 /rіMOV CR0,r32 і16 і    іПеремещает данные из регистра  ві
і        і            і   і    іуправляющий регистр.            і
і        і            і   і    і                                і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF 20 /rіMOV r32,CR0/і4  і6   іПеремещает данные из управляюще-і
і        і    CR2/CR3 і   і    іго регистра в регистр.          і
і        і            і   і    і                                і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF 22 /rіMOV CR0/CR2/і4  і10/ іПеремещает   данные  отладочногоі
і        і    CR3,r32 і   і4/5 ірегистра в регистр.             і
і        і            і   і    і                                і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF 21 /rіMOV r32,DR0-і10 і22  іПеремещает   данные  отладочногоі
і        і            і   і    ірегистра в регистр.             і
і        і            і   і    і                                і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF 21 /rіMOV r32,DR6/і10 і14  іПеремещает   данные  отладочногоі
і        і    DR7     і   і    ірегистра в регистр.             і
і        і            і   і    і                                і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF 23 /rіMOV DR6/DR7,і11 і22  іПеремещает   данные  из регистраі
і        і    r32     і   і    ів отладочный регистр.           і
і        і            і   і    і                                і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF 24 /rіMOV r32,TR6/і4  і12  іПеремещает   данные из  тестово-і
і        і    TR7     і   і    іго регистра в регистр.          і
і        і            і   і    і                                і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF 26 /rіMOV TR6/TR7,і11 і22  іПеремещает   данные  из тестово-і
і        і    r32     і   і    іго регистра в регистр.          і
і        і            і   і    і                                і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF 24 /rіMOV r32,TR3 і   і3   іПеремещает   данные  из регистраі
і        і    r32     і   і    ів тестовый регистр.             і
і        і            і   і    і                                і
АДДДДДДДДБДДДДДДДДДДДДБДДДБДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Эти формы  инструкции  MOV  используются для загрузки из ре-
гистров общего назначения следующих специальных регистров или за-
писи из регистров общего назначения в специальные регистры:

     - управляющие регистры CR0, CR2 и CR3;

     - отладочные регистры DR0, DR1, DR2, DR3, DR6 и DR7;

     - тестовые регистры TR3, TR4, TR5, TR6 и TR7.

     С этими  инструкциями всегда используются 32-битовые операн-
ды, независимо от атрибута размера операнда.

MOVS   Перемещение данных из строки в строку (MOWSD только
 MOVSB  для процессоров 386 и i486).
 MOVSW  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
 MOVSD  O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод    Инструкция    Такты         Описание                    і
іоперации                                                       і
ГДДДДДВДДДДДДДДДДДДДВДДДВДДДВДДДВДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і     і             і486і386і286і86і                            і
ГДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іA4   іMOVS m8,m8   і7  і7  і5  і18іПеремещает байт из [(E)SI] ві
і     і             і   і   і   і  іES:[(E)DI].                 і
і     і             і   і   і   і  і                            і
ГДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іA5   іMOVS m16,m16 і7  і7  і5  і18іПеремещает слово  из [(E)SI]і
і     і             і   і   і   і  ів ES:[(E)DI].               і
і     і             і   і   і   і  і                            і
ГДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іA5   іMOVS m32,m32 і7  і7  і   і  іПеремещает двойное слово из і
і     і             і   і   і   і  і[(E)SI] в ES:[(E)DI].       і
і     і             і   і   і   і  і                            і
ГДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іA4   іMOVSB        і7  і7  і5  і18іПеремещает   байт   из  DS: і
і     і             і   і   і   і  і[(E)SI]в ES:[(E)DI].        і
і     і             і   і   і   і  і                            і
ГДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іA5   іMOVSW        і7  і7  і5  і18іПеремещает  слово   из  DS: і
і     і             і   і   і   і  і[(E)SI]в ES:[(E)DI].        і
і     і             і   і   і   і  і                            і
ГДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іA5   іMOVSD        і7  і7  і5  і18іПеремещает   двойное  слово і
і     і             і   і   і   і  іиз  DS:[(E)SI]в ES:[(E)DI]. і
і     і             і   і   і   і  і                            і
АДДДДДБДДДДДДДДДДДДДБДДДБДДДБДДДБДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция MOVS копирует байт слова по адресу [(E)SI] в байт
или слово  в ES:[(E)DI].  Операнд-приемник должен быть адресуемым
через регистр ES,  переопределение сегмента в целевом операнде не
допускается. В  операнде-источнике  переопределение  сегмента ис-
пользовать можно. По умолчанию используется регистр DS.

     Адреса исходного и целевого операнда  определяются  исключи-
тельно содержимым регистров E(SI) и E(DI). Перед выполнением инс-
трукции MOVS  загрузите  в  (E)SI  и  (E)DI  корректные  значения
индекса. Синонимами инструкции MOVS для работы с байтами, словами
и двойными словами являются инструкции MOVSB, MOVSW и MOVSD.

     После перемещения данных выполняется автоматическое  продви-
жение регистров (E)SI и (E)DI. Если флаг направления равен 0 (бы-
ла выполнена инструкция CLD),  то регистры инкрементируются (уве-
личиваются), если  флаг  направления равен 1 (была выполнена инс-
трукция STD),  то декрементируются.  При загрузке байта  регистры
увеличиваются или уменьшаются на 1,  при загрузке слова - на 2, а
при загрузке двойного слова - на 4.

     Инструкции MOVS может предшествовать префикс REP.  Это дела-
ется для перемещения блока из CX байт или слов.  Подробности этой
операции можно найти в описании инструкции REP.

MOVSX   Перемещение с расширением по знаку
         (только для процессора 386 и i486).
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод       Инструкция      Такты    Описание                    і
іоперации                                                       і
ГДДДДДДДДВДДДДДДДДДДДДДДДДВДДДВДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і        і                і486і386 і                            і
ГДДДДДДДДЕДДДДДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF BE /rіMOVSX r16,r/m8  і3/3і3/6 іПеремещает байт  в  слово  сі
і        і                і   і    ірасширением знака.          і
і        і                і   і    і                            і
ГДДДДДДДДЕДДДДДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF BE /rіMOVSX r32,r/m8  і3/3і3/6 іПеремещает  байт  в  двойноеі
і        і                і   і    іслово.                      і
і        і                і   і    і                            і
ГДДДДДДДДЕДДДДДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF BE /rіMOVSX r32,r/m16 і3/3і3/6 іПеремещает слово  в  двойноеі
і        і                і   і    іслово.                      і
і        і                і   і    і                            і
АДДДДДДДДБДДДДДДДДДДДДДДДДБДДДБДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция MOVS считывает содержимое действующего адреса или
регистра, как байта или слова, распространяет знак значения в со-
ответствии с атрибутом размера операнда (16 или 32 бита) и сохра-
няет результат в регистре-приемнике.

MOVZX   Перемещение с расширением по нулю
         (только для процессора 386 и i486).
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод       Инструкция      Такты    Описание                    і
іоперации                                                       і
ГДДДДДДДДВДДДДДДДДДДДДДДДДВДДДВДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і        і                і486і386 і                            і
ГДДДДДДДДЕДДДДДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF B6 /rіMOVZX r16,r/m8  і3/3і3/6 іПеремещает байт  в  слово  сі
і        і                і   і    ірасширением по нулю.        і
і        і                і   і    і                            і
ГДДДДДДДДЕДДДДДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF B6 /rіMOVZX r32,r/m8  і3/3і3/6 іПеремещает  байт  в  двойноеі
і        і                і   і    іслово.                      і
і        і                і   і    і                            і
ГДДДДДДДДЕДДДДДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF B7 /rіMOVZX r32,r/m16 і3/3і3/6 іПеремещает слово  в  двойноеі
і        і                і   і    іслово.                      і
і        і                і   і    і                            і
АДДДДДДДДБДДДДДДДДДДДДДДДДБДДДБДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция MOVS считывает содержимое действующего адреса или
регистра, как байта или слова, расширяет значение по нулю в соот-
ветствии с атрибутом размера операнда (16 или 32 бита) и сохраня-
ет результат в регистре-приемнике.

MUL     Беззнаковое умножение AL или AX.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
        *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод     Инструкция      Такты              Описание            і
іоперации                                                       і
ГДДДДДДВДДДДДДДДДВДДДДДДВДДДДДВДДДДДВДДДДДДВДДДДДДДДДДДДДДДДДДДДґ
і      і         і486   і386  і286  і86    і                    і
ГДДДДДДЕДДДДДДДДДЕДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іF8 /4 іMUL r/m8 і13/18,і9-14/і13/16і70-77/іБеззнаковое  умноже-і
і      і         і13/18 і12-17і     і76-83 іние  (AX[(AL  *  r/mі
і      і         і      і     і     і+EA   ібайт).              і
і      і         і      і     і     і      і                    і
ГДДДДДДЕДДДДДДДДДЕДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іF7 /4 іMUL r/m16і13/26,і9-22/і21/24і118-  іБеззнаковое  умноже-і
і      і         і13/26 і12-25і     і113/  іние(DX:AX[(AX * сло-і
і      і         і      і     і     і124-  іво r/m).            і
і      і         і      і     і     і139+EAі                    і
і      і         і      і     і     і      і                    і
ГДДДДДДЕДДДДДДДДДЕДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іF7 /4 іMUL r/m32і13/42,і9-38/і     і      іБеззнаковое  умноже-і
і      і         і13/26 і12-41і     і      іние (EDX:EAX[(EAX * і
і      і         і      і     і     і124-  ідвойное слово r/m). і
і      і         і      і     і     і139+EAі                    і
і      і         і      і     і     і      і                    і
АДДДДДДБДДДДДДДДДБДДДДДДБДДДДДБДДДДДБДДДДДДБДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция MOV выполняет беззнаковое умножение.  Ее действие
зависит от размера операнда:

     - Байтовый  операнд  умножается на AL,  результат остается в
       AX. Если AH = 0, то флаги переноса и переполнения устанав-
       ливаются в 0.  В противном случае они устанавливаются в 1.

     - Операнд размером в слово умножается на AX, результат оста-
       ется в DX:AX.  Регистр DX содержит старшие 16 бит произве-
       дения. Если DX = 0, то флаги переноса и переполнения уста-
       навливаются в 0.  В противном случае они устанавливаются в
       1.

     - Операнд размером в слово умножается на EAX,  результат ос-
       тается в EDX:EAX. Регистр EDX содержит старшие 16 бит про-
       изведения.  Если EDX = 0, то флаги переноса и переполнения
       устанавливаются в 0. В противном случае они устанавливают-
       ся в 1 (только для процессора 386).

NEG     Отрицание (дополнение до двух).
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
        *                           *      *      *      *      *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод     Инструкция      Такты             Описание             і
іоперации                                                       і
ГДДДДДДВДДДДДДДДДВДДДДДВДДДДДВДДДДДВДДДДДДВДДДДДДДДДДДДДДДДДДДДДґ
і      і         і486  і386  і286  і86    і                     і
ГДДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДДДґ
іF6 /3 іNEG r/m8 і1/3  і2/6  і2/7  і3/16+ іОтрицание  байта  r/mі
і      і         і     і     і     іEA    і(дополнение до двух).і
і      і         і     і     і     і      і                     і
ГДДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДДДґ
іF7 /3 іNEG r/m16і1/3  і2/6  і2/7  і3/16+ іОтрицание слова   r/mі
і      і         і     і     і     іEA    і(дополнение до двух).і
і      і         і     і     і     і      і                     і
ГДДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДДДґ
іF7 /3 іNEG r/m32і1/3  і2/6  і     і      іОтрицание    двойногоі
і      і         і     і     і     і      іслова r/m (дополнениеі
і      і         і     і     і     і      ідо двух).            і
і      і         і     і     і     і      і                     і
АДДДДДДБДДДДДДДДДБДДДДДБДДДДДБДДДДДБДДДДДДБДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция  NEG  заменяет  значение  регистра или операнда в
памяти его дополнением до двух. Операнд вычитается из нуля, а ре-
зультат помещается обратно в операнд.

     Если операнд не равен нулю, то флаг переноса устанавливается
в 1. В противном случае флаг переноса принимает нулевое значение.

NOP     Пустая операция.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод       Инструкция      Такты             Описание           і
іоперации                                                       і
ГДДДДДДДДВДДДДДДДДДВДДДДДВДДДДДВДДДДДВДДДДДДВДДДДДДДДДДДДДДДДДДДґ
і        і         і486  і386  і286  і86    і                   і
ГДДДДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДґ
і90      іNOP      і1    і3    і3    і3     іНет операции.      і
АДДДДДДДДБДДДДДДДДДБДДДДДБДДДДДБДДДДДБДДДДДДБДДДДДДДДДДДДДДДДДДДЩ

     Операция NOP не выполняет никакой операции.  NOP - это одно-
байтовая инструкция,  которая занимает место,  но но не влияет на
содержимое машины (кроме (E)IP).

     NOP - это псевдоним инструкции XCHG (E)AX, (E)AX.

NOT     Отрицание (дополнение до 1).
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод     Инструкция      Такты              Описание            і
іоперации                                                       і
ГДДДДДДВДДДДДДДДДВДДДДДВДДДДДВДДДДДВДДДДДДДВДДДДДДДДДДДДДДДДДДДДґ
і      і         і486  і386  і286  і86     і                    і
ГДДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іF6 /2 іNOP r/m8 і1/3  і2/6  і2/7  і3/16+EAіИзменяет    значениеі
і      і         і     і     і     і       ікаждого  бита  байтаі
і      і         і     і     і     і       іr/m.                і
ГДДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іF7 /2 іNOP r/m16і1/3  і2/6  і2/7  і3/16+EAіИзменяет    значениеі
і      і         і     і     і     і       ікаждого  бита  словаі
і      і         і     і     і     і       іr/m.                і
ГДДДДДДЕДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іF7 /2 іNOP r/m16і1/3  і2/6  і2/7  і3/16+EAіИзменяет    значениеі
і      і         і     і     і     і       ікаждого  бита  двой-і
і      і         і     і     і     і       іного слова r/m.     і
АДДДДДДБДДДДДДДДДБДДДДДБДДДДДБДДДДДБДДДДДДДБДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция NOT инвертирует операнд,  каждое единичное значе-
ние становится нулевым и наоборот.

OR      Логическая операция ИЛИ.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
        0                           *      *      ?      *      0
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод       Инструкция      Такты         Описание               і
іоперации                                                       і
ГДДДДДДДДВДДДДДДДДДДДВДДДДВДДДДДВДДДВДДДВДДДДДДДДДДДДДДДДДДДДДДДґ
і        і           і486 і386  і286і86 і                       і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і0C ib   іOR AL,imm8 і1   і2    і3  і4  іОперация   ИЛИ  над не-і
і        і           і    і     і   і   іпосредственным байтом иі
і        і           і    і     і   і   іAL.                    і
і        і           і    і     і   і   і                       і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і0D iw   іOR AX,imm16і1   і2    і3  і4  іОперация   ИЛИ  над не-і
і        і           і    і     і   і   іпосредственным словом иі
і        і           і    і     і   і   іAX.                    і
і        і           і    і     і   і   і                       і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і0D id   іOR EAX,    і1   і2    і   і   іОперация   ИЛИ  над не-і
і        і   imm32   і    і     і   і   іпосредственным  двойнымі
і        і           і    і     і   і   ісловом и регистром EAX.і
і        і           і    і     і   і   і                       і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і80 /1 ibіOR r/m8,   і1/3 і2/7  і/7 і4/ іОперация   ИЛИ  над не-і
і        і   imm8    і    і     і   і17+іпосредственным   байтомі
і        і           і    і     і   іEA іи байтом r/m.          і
і        і           і    і     і   і   і                       і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і81 /1 iwіOR r/m16,  і1/3 і2/7  і/7 і4/ іОперация   ИЛИ  над не-і
і        і   imm16   і    і     і   і17+іпосредственным   словомі
і        і           і    і     і   іEA іи словом r/m.          і
і        і           і    і     і   і   і                       і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і81 /1 iwіOR r/m32,  і1/3 і2/7  і   і   іОперация   ИЛИ  над не-і
і        і   imm32   і    і     і   і   іпосредственным  двойнымі
і        і           і    і     і   і   ісловом и двойным словомі
і        і           і    і     і   і   іr/m.                   і
і        і           і    і     і   і   і                       і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і83 /1 ibіOR r/m16,  і1/3 і2/7  і   і   іОперация   ИЛИ  над не-і
і        і   imm8    і    і     і   і   іпосредственным  байтом,і
і        і           і    і     і   і   ірасширяемым по знаку, иі
і        і           і    і     і   і   ісловом r/m.            і
і        і           і    і     і   і   і                       і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і08 /r   іOR r/m8,r8 і1/3 і2/6  і/7 і3/ іОперация ИЛИ  над  бай-і
і        і           і    і     і   і16+ітовым регистром и  бай-і
і        і           і    і     і   іEA ітом r/m.               і
і        і           і    і     і   і   і                       і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і09 /r   іOR r/m16,  і1/3 і2/6  і/7 і3/ іОперация  ИЛИ  над  ре-і
і        і   r16     і    і     і   і16+ігистром    размером   ві
і        і           і    і     і   іEA іслово и словом r/m.    і
і        і           і    і     і   і   і                       і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і09 /r   іOR r/m32,  і1/3 і2/6  і   і   іОперация  ИЛИ  над  ре-і
і        і   r32     і    і     і   і   ігистром   размером    ві
і        і           і    і     і   і   ідвойное слово и двойнымі
і        і           і    і     і   і   ісловом r/m.            і
і        і           і    і     і   і   і                       і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і0A /r   іOR r8,r/m8 і1/3 і2/6  і/7 і3/ іОперация ИЛИ  над  бай-і
і        і           і    і     і   і16+ітовым регистром и  бай-і
і        і           і    і     і   іEA ітом r/m.               і
і        і           і    і     і   і   і                       і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і0B /r   іOR r16,    і1/3 і2/6  і/7 і3/ іОперация  ИЛИ  над  ре-і
і        і   r/m16   і    і     і   і16+ігистром размером в сло-і
і        і           і    і     і   іEA іво и словом r/m.       і
і        і           і    і     і   і   і                       і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і0B /r   іOR r32,    і1/3 і2/6  і   і   іОперация  ИЛИ  над  ре-і
і        і   r/m32   і    і     і   і   ігистром    размером   ві
і        і           і    і     і   і   ідвойное слово и  словомі
і        і           і    і     і   і   іr/m.                   і
і        і           і    і     і   і   і                       і
АДДДДДДДДБДДДДДДДДДДДБДДДДБДДДДДБДДДБДДДБДДДДДДДДДДДДДДДДДДДДДДДЩ

     Операция OR выполняет операцию ИЛИ над  двумя  операндами  и
помещает результат в первый операнд. Бит результата равен 0, если
оба соответствующих бита операндов равны 0,  и 1 в противном слу-
чае.

OUT     Вывод данных в порт.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод       Инструкция      Такты           Описание             і
іоперации                                                       і
ГДДДДДДДВДДДДДДДДДДДДВДДДДДДВДДДДДВДДДВДДДВДДДДДДДДДДДДДДДДДДДДДґ
і       і            і486   і386  і286і86 і                     і
ГДДДДДДДЕДДДДДДДДДДДДЕДДДДДДЕДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДґ
іE6 ib  іOUT imm8,AL і16,   і10,  і3  і10 іВыводит  байт  AL   ві
і       і            іpm=   іpm=  і   і   іпорт, номер  которогоі
і       і            і11/31,і4/24 і   і   ізадается  непосредст-і
і       і            іvm=29 і     і   і   івенным операндом.    і
і       і            і      і     і   і   і                     і
ГДДДДДДДЕДДДДДДДДДДДДЕДДДДДДЕДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДґ
іE7 ib  іOUT imm8,AX і16,   і10,  і3  і10 іВыводит  слово AX   ві
і       і            іpm=   іpm=  і   і   іпорт, номер  которогоі
і       і            і11/31,і4/25 і   і   ізадается  непосредст-і
і       і            іvm=29 і     і   і   івенным операндом.    і
і       і            і      і     і   і   і                     і
ГДДДДДДДЕДДДДДДДДДДДДЕДДДДДДЕДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДґ
іE7 ib  іOUT imm8,   і16,   і10,  і   і   іВыводит двойное словоі
і       і    EAX     іpm=   іpm=  і   і   ів EAX в  порт,  номері
і       і            і11/31,і4/25 і   і   ікоторого задается не-і
і       і            іvm=29 і     і   і   іпосредственным   опе-і
і       і            і      і     і   і   ірандом.              і
і       і            і      і     і   і   і                     і
ГДДДДДДДЕДДДДДДДДДДДДЕДДДДДДЕДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДґ
іEE     іOUT DX,AL   і16,   і11,  і   і   іВыводит   байт  AL  ві
і       і            іpm=   іpm=  і   і   ів порт, номер которо-і
і       і            і11/31,і5/25 і   і8  іго задается регистромі
і       і            іvm=29 і     і   і   іDX.                  і
і       і            і      і     і   і   і                     і
ГДДДДДДДЕДДДДДДДДДДДДЕДДДДДДЕДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДґ
іEF     іOUT DX,AX   і16,   і11,  і   і   іВыводит  слово  AX  ві
і       і            іpm=   іpm=  і   і   ів порт, номер которо-і
і       і            і11/31,і5/25 і   і8  іго задается регистромі
і       і            іvm=29 і     і   і   іDX.                  і
і       і            і      і     і   і   і                     і
ГДДДДДДДЕДДДДДДДДДДДДЕДДДДДДЕДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДґ
іEF     іOUT DX,EAX  і16,   і11,  і   і   іВыводит двойное словоі
і       і            іpm=   іpm=  і   і   ів EAX  в  порт, номері
і       і            і11/31,і5/25 і   і8  ікоторого задается ре-і
і       і            іvm=29 і     і   і   ігистром DX.          і
і       і            і      і     і   і   і                     і
ГДДДДДДДБДДДДДДДДДДДДБДДДДДДБДДДДДБДДДБДДДБДДДДДДДДДДДДДДДДДДДДДґ
і   11, 5 - если CPL <= IOPL.                                   і
і   31, 25 - если CLP > IOPL или в  виртуальном режиме процессо-і
і   ра 8086.                                                    і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция OUT  пересылает байт или слово данных из регистра
(AL, AX или EAX) в порт,  номер которого задается первым  операн-
дом. Вывод в порт с номером от 0 до 65535 выполняется путем зане-
сения номера порта в регистр DX и выполнения инструкции OUT  с DX
в качестве  первого операнда.  Если инструкция содержит 8-битовый
идентификатор порта, то значение расширяется (нулем) до 16 бит.

OUTS     Вывод строки в порт (инструкции OUTS/OUTSB/OUTSW  толь-
 OUTSB    ко для процессоров 80186/286/386/486, инструкция  OUTSD
 OUTSW    - только для процессоров 386 и i486).
 OUTSD    ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция       Такты       Описание             і
ГДДДДДДВДДДДДДДДДДДДДДВДДДДДДДДВДДДДДДВДДДВДДДДДДДДДДДДДДДДДДДДДґ
і      і              і486     і386   і286і                     і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДґ
і6E    іOUTS DX,r/m8  і17,pm=  і14,pm=і5  іВыводит  байт [(E)SI]і
і      і              і10/32,  і8/28  і   ів порт,  номер  кото-і
і      і              іvm=30   і      і   ірого задан  в регист-і
і      і              і        і      і   іре DX.               і
і      і              і        і      і   і                     і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДґ
і6F    іOUTS DX,r/m16 і17,pm=  і14,pm=і 5 іВыводит слово [(E)SI]і
і      і              і10/32,  і8/28  і   ів  порт, номер  кото-і
і      і              іvm=30   і      і   ірого  задан в регист-і
і      і              і        і      і   іре DX.               і
і      і              і        і      і   і                     і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДґ
і6F    іOUTS DX,r/m32 і17,pm=  і14,pm=і   іВыводит двойное словоі
і      і              і10/32,  і8/28  і   і[(E)SI] в порт, номері
і      і              іvm=30   і      і   ікоторого задан в  ре-і
і      і              і        і      і   ігистре DX.           і
і      і              і        і      і   і                     і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДґ
і6E    іOUTSB         і17,pm=  і14,pm=і 5 іВыводит    байт   DS:і
і      і              і10/32,  і8/28  і   і[(E)SI] в порт, номері
і      і              іvm=30   і      і   ікоторого задан в  ре-і
і      і              і        і      і   ігистре DX.           і
і      і              і        і      і   і                     і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДґ
і6E    іOUTSW         і17,pm=  і14,pm=і 5 іВыводит   слово   DS:і
і      і              і10/32,  і8/28  і   і[(E)SI] в порт, номері
і      і              іvm=30   і      і   ікоторого задан в  ре-і
і      і              і        і      і   ігистре DX.           і
і      і              і        і      і   і                     і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДґ
і6F    іOUTSD         і17,pm=  і14,pm=і   іВыводит двойное словоі
і      і              і10/32,  і8/28  і   іDS:[(E)SI]   в  порт,і
і      і              іvm=30   і      і   іномер  которого задані
і      і              і        і      і   ів регистре DX.       і
АДДДДДДБДДДДДДДДДДДДДДБДДДДДДДДБДДДДДДБДДДБДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция OUTS пересылает данные из байта,  слова или двой-
ного слова в памяти в соответствии с индексным регистром источни-
ка в порт вывода,  адресуемый через регистр DX. Если атрибут раз-
мера адреса для данной инструкции равен 16 битам,  то в  качестве
индексного регистра источника используется регистр SI.  В против-
ном случае,  если атрибут размера адреса равен 32,  то в качестве
индексного используется регистр ESI.

     Инструкция OUTS  не позволяет задавать номер порта,  как не-
посредственное значение.  К порту нужно адресоваться через значе-
ние в регистре DX.  Перед выполнением инструкции OUTS загрузите в
регистр DX корректное значение.

     Адрес исходных данных определяется содержимым индексного ре-
гистра  источника.  Перед выполнением инструкции OUTS загрузите в
регистр SI или ESI.

     После выполнения передачи данных исходный  индексный регистр
автоматически  продвигается.  Если флаг направления равен 0 (была
выполнена инструкция CLD),  то индексный регистр источника инкре-
ментируется (увеличивается).  Если флаг направления равен 1 (была
выполнена инструкция STD),  то он декрементируется (уменьшается).

     Инструкции OUTSB, OUTSW и OUTSD являются синонимами инструк-
ции OUTS для работы с байтами,  словами и двойными словами.  Инс-
трукции OUTS может предшествовать префикс REP.  Это позволяет вы-
водить блоки из CX байт или слов. Подробности этой операции можно
найти в описании REP.

POP       Извлекает слово из стека.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция     Такты       Описание               і
ГДДДДДДВДДДДДДДДВДДДВДДДДДДВДДДДДДВДДДДДВДДДДДДДДДДДДДДДДДДДДДДДґ
і      і        і486і386   і286   і86   і                       і
ГДДДДДДЕДДДДДДДДЕДДДЕДДДДДДЕДДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і8F /0 іPOP m16 і6  і5     і5     і17+EAіИзвлекает слово из сте-і
і      і        і   і      і      і     іка  и  помещает  его  ві
і      і        і   і      і      і     іслово в памяти.        і
і      і        і   і      і      і     і                       і
ГДДДДДДЕДДДДДДДДЕДДДЕДДДДДДЕДДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і8F /0 іPOP m32 і6  і5     і      і     іИзвлекает верхний  эле-і
і      і        і   і      і      і     імент из стека  и  поме-і
і      і        і   і      і      і     іщает  его   в   двойноеі
і      і        і   і      і      і     іслово в памяти.        і
і      і        і   і      і      і     і                       і
ГДДДДДДЕДДДДДДДДЕДДДЕДДДДДДЕДДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і58+rw іPOP r16 і4  і4     і      і8    іИзвлекает верхний  эле-і
і      і        і   і      і      і     імент из стека  и  поме-і
і      і        і   і      і      і     іщает его в регистр раз-і
і      і        і   і      і      і     імером в слово.         і
і      і        і   і      і      і     і                       і
ГДДДДДДЕДДДДДДДДЕДДДЕДДДДДДЕДДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і58+rd іPOP r32 і4  і4     і      і     іИзвлекает верхний  эле-і
і      і        і   і      і      і     імент из стека  и  поме-і
і      і        і   і      і      і     іщает его в регистр раз-і
і      і        і   і      і      і     імером в двойное слово. і
і      і        і   і      і      і     і                       і
ГДДДДДДЕДДДДДДДДЕДДДЕДДДДДДЕДДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і1F    іPOP DS  і3  і7,pm= і5,pm= і8    іИзвлекает верхний  эле-і
і      і        і   і21    і20    і     імент из стека  и  поме-і
і      і        і   і      і      і     іщает его в регистр DS. і
і      і        і   і      і      і     і                       і
ГДДДДДДЕДДДДДДДДЕДДДЕДДДДДДЕДДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і07    іPOP ES  і3  і7,pm= і5,pm= і8    іИзвлекает верхний  эле-і
і      і        і   і21    і20    і     імент из стека  и  поме-і
і      і        і   і      і      і     іщает его в регистр ES. і
і      і        і   і      і      і     і                       і
ГДДДДДДЕДДДДДДДДЕДДДЕДДДДДДЕДДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і17    іPOP SS  і3  і7,pm= і5,pm= і8    іИзвлекает верхний  эле-і
і      і        і   і21    і20    і     імент из стека  и  поме-і
і      і        і   і      і      і     іщает его в регистр SS. і
і      і        і   і      і      і     і                       і
ГДДДДДДЕДДДДДДДДЕДДДЕДДДДДДЕДДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і0F A1 іPOP FS  і3  і7,pm= і      і     іИзвлекает верхний  эле-і
і      і        і   і21    і      і     імент из стека  и  поме-і
і      і        і   і      і      і     іщает его в регистр FS. і
і      і        і   і      і      і     і                       і
ГДДДДДДЕДДДДДДДДЕДДДЕДДДДДДЕДДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і0F A9 іPOP GS  і3  і7,pm= і      і     іИзвлекает верхний  эле-і
і      і        і   і21    і      і     імент из стека  и  поме-і
і      і        і   і      і      і     іщает его в регистр GS. і
АДДДДДДБДДДДДДДДБДДДБДДДДДДБДДДДДДБДДДДДБДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция POP заменяет предыдущее содержимое операнда в па-
мяти, регистра или сегментного регистра словом, которое находится
в вершине  стека  и  адресуется через SS:SP (если атрибут размера
адреса равен 16) или SS:ESP (если атрибут  размера  адреса  равен
32).  Указатель стека SP увеличивается на 2 для операнда размером
в 16 бит и на 4 для операнда размером в 32 бита.  После этого  он
указывает на новую вершину стека.

     POP CS - это не инструкция. Извлечение из стека в регистр CS
выполняется с помощью инструкции RET.

     Если операндом-приемником является сегментный  регистр  (DS,
ES,  FS, GS или SS), то извлекаемое из стека значение должно быть
селектором. В защищенном режиме загрузка селектора инициализирует
автоматическую загрузку в скрытую часть сегментного регистра свя-
занной с селектором информации о дескрипторе.  Загрузка инициали-
зирует  также  проверку допустимости информации селектора и деск-
риптора.

     Нулевое значение (0000 - 0003) должно  извлекаться  и  зано-
ситься в регистры DS, ES, FS или GS не вызывая исключительной си-
туации по нарушению защиты.  Попытка ссылки на значение сегмента,
соответствующий сегментный регистр которого загружен нулевым зна-
чением, вызывает исключительную ситуацию #GP(0). Ссылки на память
не  происходит.  Сохраненное  значение сегментного регистра равно
нулю.

     Инструкция POP SS запрещает все прерывания, включая NMI (не-
маскируемые),  до выполнения следующей инструкции.  Это позволяет
последовательно  выполнять  инструкции POP SS и POP ESP без опас-
ности получения в процессе прерывания недопустимого стека.  Одна-
ко, предпочтительным методом загрузки регистров SS и ESP является
использование инструкции LSS.

          Примечание: Турбо  Ассемблер  расширяет  синтаксис инс-
     трукции POP,  чтобы можно было извлекать несколько элементов
     последовательности.  Извлекаемые  элементы  могут включать в
     себя любое допустимое значение POP, включая регистры, непос-
     редственные  значения  и ячейки памяти.  На генерируемый код
     данное средство в действительности не влияет.

POPA     Извлекает из стека все общие регистры (инструкция  POPA
 POPAD    только для  процессоров  80186/286/386/486,  инструкция
          POPAD - только для процессоров 386 и i486).
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция Такты  Описание                        і
ГДДДДДДДДВДДДДДДДДВДДДВДДДВДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і        і        і486і386і286  і                               і
ГДДДДДДДДЕДДДДДДДДЕДДДЕДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і61      іPOPA    і9  і24 і19   іИзвлекает из стека регистр DI. і
і        і        і   і   і     і                               і
ГДДДДДДДДЕДДДДДДДДЕДДДЕДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і61      іPOPAD   і9  і24 і19   іИзвлекает из стека EDI.        і
і        і        і   і   і     і                               і
АДДДДДДДДБДДДДДДДДБДДДБДДДБДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция POPA извлекает из стека восемь 16-разрядных общих
регистров.  Однако, вместо загрузки в SP значение SP отбрасывает-
ся. Инструкция POPA изменяет действие предыдущей инструкции PUSHA
на обратное, восстанавливая общие регистры в те значения, которые
у них были до инструкции PUSHA. Первым извлекается регистр DI.

     Инструкция POPAD извлекает из стека восемь 32-разрядных  об-
щих регистров.  Однако, вместо загрузки в ESP значение ESP отбра-
сывается.  Инструкция POPAD изменяет действие предыдущей инструк-
ции  PUSHAD  на  обратное,  восстанавливая  общие  регистры  в те
значения,  которые у них были до инструкции PUSHAD. Первым извле-
кается регистр EDI.

POPF      Извлекает из стека регистр FLAGS (регистр  флагов) или
 POPFD    EFLAGS (инструкция POPFD - только для процессоров 386 и
          i486).
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C
          *     *      *      *      *      *      *      *     *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция   Такты    Описание                    і
ГДДДДДДВДДДДДДДДВДДДДДДДВДДДВДДДВДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і      і        і486    і386і286і86і                            і
ГДДДДДДЕДДДДДДДДЕДДДДДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і9D    іPOPF    і9,pm=6 і5  і5  і8 іИзвлекает из стека FLAGS.   і
і      і        і       і   і   і  і                            і
ГДДДДДДЕДДДДДДДДЕДДДДДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і9D    іPOPFD   і9,pm=6 і5  і   і  іИзвлекает из стека EFLAGS.  і
і      і        і       і   і   і  і                            і
АДДДДДДБДДДДДДДДБДДДДДДДБДДДБДДДБДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкции POPF/POPFD извлекают слово или двойное  слово  из
вершины  стека и записывают это значение в регистре флагов.  Если
атрибут размера операнда в инструкции равен 16, то слово извлека-
ется,  а значение сохраняется в регистре флагов FLAGS. Если атри-
бут размера операнда равен 32,  то извлекается двойное  слово,  а
значение записывается в EFLAGS.

     Заметим, что биты 16 и 17 регистра EFLAGS, которые называют-
ся соответственно VM и RF инструкцией POPF или POPFD не изменяют-
ся.

     Уровень привилегий ввода-вывода изменяется только при выпол-
нении на привилегированном уровне 0.  Флаг прерываний  изменяется
только  при выполнении на уровне,  привилегии которого по крайней
мере не ниже,  чем уровень привилегий ввода-вывода. (Режим реаль-
ной  адресации эквивалентен уровню привилегий 0.) Если инструкция
POPF выполняется с  недостаточными  привилегиями,  исключительная
ситуация не возникает, а биты привилегий не изменяются.

PUSH      Заносит операнд в стек.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция Такты     Описание                     і
ГДДДДДДВДДДДДДДДДДВДДДВДДДВДДДВДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і      і          і486і386і286і86 і                             і
ГДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іFF /6 іPUSH m16  і4  і5  і5  і16 іЗаносит в стек слово из памя-і
і      і          і   і   і   і+EAіти.                          і
і      і          і   і   і   і   і                             і
ГДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іFF /6 іPUSH m32  і4  і5  і   і   іЗаносит в стек двойное  словоі
і      і          і   і   і   і   іиз памяти.                   і
і      і          і   і   і   і   і                             і
ГДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і50+/r іPUSH r16  і1  і2  і3  і11 іЗаносит в стек слово  из  ре-і
і      і          і   і   і   і   ігистра.                      і
і      і          і   і   і   і   і                             і
ГДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і50+/r іPUSH r32  і1  і2  і   і   іЗаносит в стек двойное  словоі
і      і          і   і   і   і   іиз регистра.                 і
і      і          і   і   і   і   і                             і
ГДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і6A    іPUSH imm8 і1  і2  і3  і   іЗаносит в стек непосредствен-і
і      і          і   і   і   і   іный байт.                    і
і      і          і   і   і   і   і                             і
ГДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і68    іPUSH imm16і1  і2  і3  і   іЗаносит в стек непосредствен-і
і      і          і   і   і   і   іное слово.                   і
і      і          і   і   і   і   і                             і
ГДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і68    іPUSH imm32і1  і2  і   і   іЗаносит в стек непосредствен-і
і      і          і   і   і   і   іное двойное слово.           і
і      і          і   і   і   і   і                             і
ГДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0E    іPUSH CS   і3  і2  і3  і 10іЗаносит в стек регистр CS.   і
і      і          і   і   і   і   і                             і
ГДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і16    іPUSH SS   і3  і2  і3  і 10іЗаносит в стек регистр SS.   і
і      і          і   і   і   і   і                             і
ГДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і1E    іPUSH DS   і3  і2  і3  і 10іЗаносит в стек регистр DS.   і
і      і          і   і   і   і   і                             і
ГДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і06    іPUSH ES   і3  і2  і   і 10іЗаносит в стек регистр ES.   і
і      і          і   і   і   і   і                             і
ГДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F A0 іPUSH FS   і3  і2  і   і   іЗаносит в стек регистр FS.   і
і      і          і   і   і   і   і                             і
ГДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F A8 іPUSH GS   і3  і2  і   і   іЗаносит в стек регистр GS.   і
і      і          і   і   і   і   і                             і
АДДДДДДБДДДДДДДДДДБДДДБДДДБДДДБДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция PUSH уменьшает указатель стека на 2, если атрибут
размера  операнда инструкции равен 16,  в противном случае указа-
тель стека уменьшается на 4.  Затем инструкция PUSH помещает опе-
ранд в новую вершину стека, на которую указывает указатель стека.

     Инструкция PUSH  ESP  процессора 386 заносит в стек значение
ESP,  которое существовало до выполнения  инструкции.  Инструкция
PUSH  SP  процессора 80286 также заносит в стек значение регистра
SP, которое существовало до выполнения инструкции. Это отличается
от процессора 8086, который заносит в стек новое значение (умень-
шенное на 2).

           Примечание: Турбо  Ассемблер  расширяет синтаксис инс-
     трукции PUSH,  чтобы можно было заносить  в  стек  несколько
     элементов последовательности.  Заносимые в стек элементы мо-
     гут включать в себя любое  допустимое  для  инструкции  PUSH
     значение,  включая  регистры,  непосредственные  значения  и
     ячейки памяти.  На генерируемый код данное средство в  дейс-
     твительности не влияет. Кроме того, инструкция PUSH допуска-
     ет использование аргумента-константы,  даже  для  процессора
     8086. Такие инструкции заменяются в объектном коде 10-байто-
     вой последовательностью,  которая моделирует инструкцию PUSH
     процессора 80186/286/286 с непосредственным значением.

PUSHA     Заносит в стек  все  общие  регистры (инструкция PUSHA
 PUSHAD   только для  процессоров  80186/286/386/486,  инструкция
          PUSHAD - только для процессоров 386 и i486).
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция Такты Описание                         і
ГДДДДДДВДДДДДДДДВДДДВДДДВДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і      і        і486і386і286 і                                  і
ГДДДДДДЕДДДДДДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і61    іPUSHA   і11 і18 і17  іЗаносит в стек AX, CX, DX, BX, ис-і
і      і        і   і   і    іходные SP, BP, SI.                і
ГДДДДДДЕДДДДДДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і61    іPUSHAD  і11 і18 і    іЗаносит в стек EAX, ECX, EDX, EBX.і
і      і        і   і   і    і                                  і
АДДДДДДБДДДДДДДДБДДДБДДДБДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция PUSHA сохраняет в стеке восемь 16-разрядных общих
регистров. Инструкция PUSHA, чтобы можно было записать 8 значений
размером в слово,  уменьшает указатель стека (SP) на 16. Инструк-
ция PUSHAD уменьшает указатель (ESP) стека на 32, чтобы можно бы-
ло записать  8  значений размером в двойное слово.  Поскольку ре-
гистры заносятся в стек в том порядке,  как они задаются,  извле-
каться  они будут в виде 16 или 32 байт стека в обратном порядке.
Последним заносится регистр DI или EDI.

PUSHF    Заносит в  стек  регистр  флагов (инструкция PUSHFD -
 PUSHFD   только для процессоров 386 и i486).
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция     Такты    Описание                  і
ГДДДДДДДДВДДДДДДДДВДДДДДДДВДДДВДДДВДДВДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і        і        і486    і386і286і86і                          і
ГДДДДДДДДЕДДДДДДДДЕДДДДДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і9C      іPUSHF   і4,pm=3 і4  і5  і10іЗаносит в стек FLAGS.     і
і        і        і       і   і   і  і                          і
ГДДДДДДДДЕДДДДДДДДЕДДДДДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і9C      іPUSHFD  і4,pm=3 і4  і   і  іЗаносит в стек EFLAGS.    і
і        і        і       і   і   і  і                          і
АДДДДДДДДБДДДДДДДДБДДДДДДДБДДДБДДДБДДБДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция PUSHF  уменьшает  указатель стека на 2 и копирует
регистр флагов FLAGS в новую  вершину  стека.  Инструкция  PUSHFD
уменьшает  указатель стека на 4,  а регистр EFLAGS процессора 386
копируется в новую вершину стека, на которую указывает EE:ESP.

RCR       Циклический сдвиг.
 RCR      ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
 ROL      O     D      I      T      S      Z      A      P     C
 ROR      *                                                     *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция    Такты           Описание            і
ГДДДДДДДДВДДДДДДДДДДДВДДДДВДДДДВДДДВДДДДДДДВДДДДДДДДДДДДДДДДДДДДґ
і        і           і486 і386 і286і86     і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD0 /2   іRCL r/m8,1 і3/4 і9/10і2/7і2/15+EAіЦиклическая   перес-і
і        і           і    і    і   і       ітановка 9  бит  (CF,і
і        і           і    і    і   і       ібайта r/m)  влево  1і
і        і           і    і    і   і       іраз.                і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD2 /2   іRCL r/m8,CLі8-30і9/10і5/8і8+4 на іЦиклическая   перес-і
і        і           і/9- і    і   ібит/(20ітановка 9  бит  (CF,і
і        і           і31  і    і   і+ 4 на ібайта r/m) влево  CLі
і        і           і    і    і   ібит)+EAіраз.                і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іC0 /2 ibіRCL r/m8,  і8-30і9/10і   і       іЦиклическая   перес-і
і        і    imm8   і/9- і    і   і       ітановка 9  бит  (CF,і
і        і           і31  і    і   і       ібайта   r/m)   влевоі
і        і           і    і    і   і       іimm8 раз.           і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD1 /2 ibіRCL r/m16,1і3/4 і9/10і2/7і2/15+EAіЦиклическая   перес-і
і        і           і/9- і    і   і       ітановка 17 бит  (CF,і
і        і           і31  і    і   і       іслова   r/m)   влевоі
і        і           і    і    і   і       і1 раз.              і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD3 /2   іRCL r/m16, і8-30і9/10і5/8і8+4 на іЦиклическая   перес-і
і        і    CL     і/9- і    і   ібит/(20ітановка 17 бит  (CF,і
і        і           і31  і    і   і+ 4 на іслова r/m) влево  CLі
і        і           і    і    і   ібит)+EAіраз.                і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іC1 /2 ibіRCL r/m16, і8-30і9/10і5/8і       іЦиклическая   перес-і
і        і    imm8   і/9- і    і   і       ітановка 17 бит  (CF,і
і        і           і31  і    і   і       іслова   r/m)   влевоі
і        і           і    і    і   і       іimm8 раз.           і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD1 /2   іRCL r/m32,1і3/4 і9/10і   і       іЦиклическая   перес-і
і        і           і/9- і    і   і       ітановка 33 бит  (CF,і
і        і           і31  і    і   і       ідвойного  слова r/m)і
і        і           і    і    і   і       івлево 1 раз.        і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD3 /2   іRCL r/m16, і8-30і9/10і   і       іЦиклическая   перес-і
і        і    CL     і/9- і    і   і       ітановка 33 бит  (CF,і
і        і           і31  і    і   і       ідвойного слова  r/m)і
і        і           і    і    і   і       івлево CL раз.       і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іC1 /2 ibіRCL r/m32, і8-30і9/10і5/8і       іЦиклическая   перес-і
і        і    imm8   і/9- і    і   і       ітановка 33 бит  (CF,і
і        і           і31  і    і   і       ідвойного  слова r/m)і
і        і           і    і    і   і       івлево imm8 раз.     і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD0 /3   іRCR r/m8,1 і3/4 і9/10і2/7і2/15+EAіЦиклическая   перес-і
і        і           і    і    і   і       ітановка 9  бит  (CF,і
і        і           і    і    і   і       ібайта r/m) вправо  1і
і        і           і    і    і   і       іраз.                і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD2 /3   іRCR r/m8,CLі8-30і9/10і5/8і8+4 на іЦиклическая   перес-і
і        і           і/9- і    і   ібит/(20ітановка 9  бит  (CF,і
і        і           і31  і    і   і+ 4 на ібайта r/m) вправо CLі
і        і           і    і    і   ібит)+EAіраз.                і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іC0 /3 ibіRCR r/m8,  і8-30і9/10і   і       іЦиклическая   перес-і
і        і    imm8   і/9- і    і   і       ітановка 9  бит  (CF,і
і        і           і31  і    і   і       ібайта   r/m)  вправоі
і        і           і    і    і   і       іimm8 раз.           і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD1 /3 ibіRCR r/m16,1і3/4 і9/10і2/7і2/15+EAіЦиклическая   перес-і
і        і           і/9- і    і   і       ітановка 17 бит  (CF,і
і        і           і31  і    і   і       іслова   r/m)  вправоі
і        і           і    і    і   і       і1 раз.              і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD3 /2   іRCR r/m16, і8-30і9/10і5/8і8+4 на іЦиклическая   перес-і
і        і    CL     і/9- і    і   ібит/(20ітановка 17 бит  (CF,і
і        і           і31  і    і   і+ 4 на іслова r/m) вправо CLі
і        і           і    і    і   ібит)+EAіраз.                і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іC1 /2 ibіRCR r/m16, і8-30і9/10і5/8і       іЦиклическая   перес-і
і        і    imm8   і/9- і    і   і       ітановка 17 бит  (CF,і
і        і           і31  і    і   і       іслова   r/m)  вправоі
і        і           і    і    і   і       іimm8 раз.           і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD1 /2   іRCR r/m32,1і3/4 і9/10і   і       іЦиклическая   перес-і
і        і           і/9- і    і   і       ітановка 33 бит  (CF,і
і        і           і31  і    і   і       ідвойного  слова r/m)і
і        і           і    і    і   і       івправо 1 раз.       і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD3 /2   іRCR r/m16, і8-30і9/10і   і       іЦиклическая   перес-і
і        і    CL     і/9- і    і   і       ітановка 33 бит  (CF,і
і        і           і31  і    і   і       ідвойного слова  r/m)і
і        і           і    і    і   і       івправо CL раз.      і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іC1 /0 ibіRCR r/m32, і8-30і9/10і5/8і       іЦиклическая   перес-і
і        і    imm8   і/9- і    і   і       ітановка 33 бит  (CF,і
і        і           і31  і    і   і       ідвойного  слова r/m)і
і        і           і    і    і   і       івправо imm8 раз.    і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD0 /0   іROL r/m8,1 і3/4 і9/10і2/7і2/15+EAіПерестановка  8  биті
і        і           і    і    і   і       ібайта r/m   влево  1і
і        і           і    і    і   і       іраз.                і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD2 /0   іROL r/m8,CLі8-30і9/10і5/8і8+4 на іПерестановка  8  биті
і        і           і/9- і    і   ібит/(20ібайта r/m  влево  CLі
і        і           і31  і    і   і+ 4 на іраз.                і
і        і           і    і    і   ібит)+EAі                    і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іC0 /0 ibіROL r/m8,  і8-30і9/10і   і       іПерестановка  8  биті
і        і    imm8   і/9- і    і   і       ібайта r/m влево imm8і
і        і           і31  і    і   і       іраз.                і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD1 /0 ibіROL r/m16,1і3/4 і9/10і2/7і2/15+EAіПерестановка 16  биті
і        і           і/9- і    і   і       іслова   r/m  влево 1і
і        і           і31  і    і   і       іраз.                і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD3 /0   іROL r/m16, і8-30і9/10і5/8і8+4 на іПерестановка  16 биті
і        і    CL     і/9- і    і   ібит/(20іслова r/m  влево  CLі
і        і           і31  і    і   і+ 4 на іраз.                і
і        і           і    і    і   ібит)+EAі                    і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іC1 /0 ibіROL r/m16, і8-30і9/10і5/8і       іПерестановка 16  биті
і        і    imm8   і/9- і    і   і       іслова   r/m)   влевоі
і        і           і31  і    і   і       іimm8 раз.           і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD1 /0   іROL r/m32,1і3/4 і9/10і   і       іПерестановка  32 биті
і        і           і/9- і    і   і       ідвойного  слова  r/mі
і        і           і13  і    і   і       івлево 1 раз.        і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD3 /0   іROL r/m16, і8-30і9/10і   і       іПерестановка  32 биті
і        і    CL     і/9- і    і   і       ідвойного  слова  r/mі
і        і           і31  і    і   і       івлево CL раз.       і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іC1 /0 ibіROL r/m32, і8-30і9/10і5/8і       іПерестановка  32 биті
і        і    imm8   і/9- і    і   і       ідвойного  слова  r/mі
і        і           і31  і    і   і       івлево imm8 раз.     і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD0 /1   іROR r/m8,1 і3/4 і9/10і2/7і2/15+EAіПерестановка  9  биті
і        і           і    і    і   і       ібайта r/m  вправо  1і
і        і           і    і    і   і       іраз.                і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD2 /1   іROR r/m8,CLі8-30і9/10і5/8і8+4 на іПерестановка  9  биті
і        і           і/9- і    і   ібит/(20ібайта r/m вправо  CLі
і        і           і31  і    і   і+ 4 на іраз.                і
і        і           і    і    і   ібит)+EAі                    і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іC0 /1 ibіROR r/m8,  і8-30і9/10і   і       іПерестановка  9  биті
і        і    imm8   і/9- і    і   і       ібайта   r/m   вправоі
і        і           і31  і    і   і       іimm8 раз.           і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD1 /1 ibіROR r/m16,1і3/4 і9/10і2/7і2/15+EAіПерестановка 16  биті
і        і           і/9- і    і   і       іслова   r/m   вправоі
і        і           і31  і    і   і       і1 раз.              і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD3 /1   іROR r/m16, і8-30і9/10і5/8і8+4 на іПерестановка  16 биті
і        і    CL     і/9- і    і   ібит/(20іслова r/m  вправо CLі
і        і           і31  і    і   і+ 4 на іраз.                і
і        і           і    і    і   ібит)+EAі                    і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іC1 /1 ibіROR r/m16, і8-30і9/10і5/8і       іПерестановка  16 биті
і        і    imm8   і/9- і    і   і       іслова   r/m   вправоі
і        і           і31  і    і   і       іimm8 раз.           і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD1 /1   іROR r/m32,1і3/4 і9/10і   і       іПерестановка  32 биті
і        і           і/9- і    і   і       ідвойного  слова  r/mі
і        і           і31  і    і   і       івправо 1 раз.       і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іD3 /1   іROR r/m16, і8-30і9/10і   і       іПерестановка 32  биті
і        і    CL     і/9- і    і   і       ідвойного  слова  r/mі
і        і           і31  і    і   і       івправо CL раз.      і
і        і           і    і    і   і       і                    і
ГДДДДДДДДЕДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДЕДДДДДДДДДДДДДДДДДДДДґ
іC1 /1 ibіROR r/m32, і8-30і9/10і5/8і       іПерестановка  32 биті
і        і    imm8   і/9- і    і   і       ідвойного  слова  r/mі
і        і           і31  і    і   і       івправо imm8 раз.    і
і        і           і    і    і   і       і                    і
ГДДДДДДДДБДДДДДДДДДДДБДДДДБДДДДБДДДБДДДДДДДБДДДДДДДДДДДДДДДДДДДДґ
і     Для каждой выполненной перестановки добавьте к указанным  і
івременным значениям 1 (только для процессора 80286).           і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Каждая инструкция перестановки (сдвига)  сдвигает  биты  ре-
гистра  или  операнда в памяти.  Инструкции сдвига влево сдвигают
биты в направлении возрастания адресов,  кроме верхнего бита, ко-
торый возвращается "вниз". Инструкции сдвига вправо делают обрат-
ное:  биты сдвигаются в направлении уменьшения адресов,  а нижний
бит сдвигается "вверх".

     Для инструкций RCL и RCR флаг переноса является частью пере-
мещаемой группы бит.  Инструкция RCL  сдвигает  флаг  переноса  в
младший (нижний) бит и сдвигает старший (верхний) бит во флаг пе-
реноса. Инструкция RCR сдвигает флаг переноса в  старший  бит,  а
младший бит - во флаг переноса. Для инструкций ROL и ROR исходное
значение флага переноса не является частью результата, но во флаг
переноса заносится копия бита, который был сдвинут из конца груп-
пы бит.

     Операция сдвига повторяется столько  раз,  сколько  задается
вторым операндом, который может представлять собой непосредствен-
ное число или содержимое регистра CL.  Чтобы уменьшить максималь-
ное время выполнения инструкции, процессоры 80286/386 не позволя-
ют использовать значения счетчика,  превышающее 31. Если делается
попытка  использовать значение счетчика,  превышающее 31,  то ис-
пользуются только младшие 5 бит счетчика. В процессоре 8086 счет-
чики перестановки не маскируются. В процессорах 386 в виртуальном
режиме 8086 выполняется маскирование счетчиком перестановки.

     Флаг переполнения определен только для тех форм  инструкции,
где второй операнд равен 1.  Во всех других случаях он не опреде-
лен. Для сдвигов/циклических перестановок влево выполняется  опе-
рация XOR  над  битом  CF  и старшим битом результата.  Для сдви-
гов/циклических перестановок вправо операция XOR  выполняется над
старшими двумя битами результата для получения флага OF.

REP      Повторения последующей строковой операции.
 REPE     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
 REPZ     O     D      I      T      S      Z      A      P     C
 REPZ                                        *
 REPNE
 REPNZ

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция   Такты         Описание               і
ГДДДДДДВДДДДДДДДДДВДДДДДДДВДДДДДДВДДДВДДВДДДДДДДДДДДДДДДДДДДДДДДґ
і      і          і 486   і386   і286і86і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF3 6C іREP INS   і16+    і13+   і5+ і  іВвод (E)CX байт из пор-і
і      іr/m8,DX   і8(E)CX,і6(E)CXі4CXі  іта DX в ES:[(E)DI].    і
і      і          іpm=10+ іpm=7+ і   і  і                       і
і      і          і8(E)CX і6(E)CXі   і  і                       і
і      і          і/30+   і/27+  і   і  і                       і
і      і          і8(E)CX,і6(E)CXі   і  і                       і
і      і          іvm=29+ і      і   і  і                       і
і      і          і8(E)CX і      і   і  і                       і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF3 6D іREP INS   і16+    і13+   і5+ і  іВвод (E)CX слов из пор-і
і      іr/m16,DX  і8(E)CX,і6(E)CXі4CXі  іта DX в ES:[(E)DI].    і
і      і          іpm=10+ іpm=7+ і   і  і                       і
і      і          і8(E)CX і6(E)CXі   і  і                       і
і      і          і/30+   і/27+  і   і  і                       і
і      і          і8(E)CX,і6(E)CXі   і  і                       і
і      і          іvm=29+ і      і   і  і                       і
і      і          і8(E)CX і      і   і  і                       і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF3 6D іREP INS   і16+    і13+   і   і  іВвод   (E)CX    двойныхі
і      іr/m32,DX  і8(E)CX,і6(E)CXі   і  іслов из порта DX  в ES:і
і      і          іpm=10+ іpm=7+ і   і  і[(E)DI].               і
і      і          і8(E)CX і6(E)CXі   і  і                       і
і      і          і/30+   і/27+  і   і  і                       і
і      і          і8(E)CX,і6(E)CXі   і  і                       і
і      і          іvm=29+ і      і   і  і                       і
і      і          і8(E)CX і      і   і  і                       і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF3 A4 іREP MOVS  і5,13,  і5+4(E)і5+ і9+іВвод   (E)CX   байт  изі
і      іm8,m8     і12+3(E)іCX    і4CXі17і[(E)SI] в ES:[(Е)DI].  і
і      і          іCX     і      і   іCXі                       і
і      і          і8(E)CX і6(E)CXі   і  і                       і
і      і          і/30+   і/27+  і   і  і                       і
і      і          і8(E)CX,і6(E)CXі   і  і                       і
і      і          іvm=29+ і      і   і  і                       і
і      і          і8(E)CX і      і   і  і                       і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF3 A5 іREP MOVS  і5,13,  і5+4(E)і5+ і9+іПеремещение  (E)CX слові
і      іm16,m16   і12+3(E)іCX    і4CXі17іиз [(E)CX]  в  ES:[(Е) і
і      і          іCX     і      і   іCXіDI].                   і
і      і          і8(E)CX і6(E)CXі   і  і                       і
і      і          і/30+   і/27+  і   і  і                       і
і      і          і8(E)CX,і6(E)CXі   і  і                       і
і      і          іvm=29+ і      і   і  і                       і
і      і          і8(E)CX і      і   і  і                       і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF3 A5 іREP MOVS  і5,13,  і5+4(E)і   і  іПеремещение       (E)CXі
і      іm32,m32   і12+3(E)іCX    і   і  ідвойных слов из [(E)   і
і      і          іCX     і      і   і  іCX] в ES:[(E)DI].      і
і      і          і8(E)CX і6(E)CXі   і  і                       і
і      і          і/30+   і/27+  і   і  і                       і
і      і          і8(E)CX,і6(E)CXі   і  і                       і
і      і          іvm=29+ і      і   і  і                       і
і      і          і8(E)CX і      і   і  і                       і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF3 6E іREP OUTS  і17+5(E)і5+12( і 5+і  іВывод   (E)CX  байт  изі
і      іDX,r/m8   іCX,pm= іCX,pm=і4(Eі  і[E)SI] в порт DX.      і
і      і          і11+5(E)і6+5(E)і)CXі  і                       і
і      і          іCX/31+ іCX/26+і   і  і                       і
і      і          і5(E)CX і5(E)CXі   і  і                       і
і      і          і       і/26+5 і   і  і                       і
і      і          і       і(E)CX і   і  і                       і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF3 6F іREP OUTS  і17+5(E)і5+12( і 5+і  іВывод   (E)CX  слов  изі
і      іDX,r/m16  іCX,pm= іCX,pm=і4(Eі  і[E)SI] в порт DX.      і
і      і          і11+5(E)і6+5(E)і)CXі  і                       і
і      і          іCX/31+ іCX/26+і   і  і                       і
і      і          і5(E)CX і5(E)CXі   і  і                       і
і      і          і       і/26+5 і   і  і                       і
і      і          і       і(E)CX і   і  і                       і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF3 6F іREP OUTS  і17+5(E)і5+12(Eі   і  іВывод   (E)CX   двойныхі
і      іDX,r/m32  іCX,pm= іCX,pm=і   і  іслов из  [E)SI]  в порті
і      і          і11+5(E)і6+5(E)і   і  іDX.                    і
і      і          іCX/31+ іCX/26+і   і  і                       і
і      і          і5(E)CX і5(E)CXі   і  і                       і
і      і          і       і/26+5 і   і  і                       і
і      і          і       і(E)CX і   і  і                       і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF3 AC іREP LODS  і5,7+   і      і   і  іЗагрузка (E)CX  байт изі
і      іm8        і4(E)CX і      і   і  і[(E)SI] в AL.          і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF3 AD іREP LODS  і5,7+   і      і   і  іЗагрузка (E)CX слов  изі
і      іm16       і4(E)CX і      і   і  і[(E)SI] в AX.          і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF3 AD іREP LODS  і5,7+   і      і   і  іЗагрузка (E)CX  двойныхі
і      іm32       і4(E)CX і      і   і  іслов [(E)SI] в EAX.    і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF3 AA іREP STOS  і5,7+   і7+5(E)і9+ і9+іЗаполнение  (E)CX  байті
і      іm8        і4(E)CX іCX    і10 і10іES:[(E)DI] из AL.      і
і      і          і       і      іCX іCXі                       і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF3 AB іREP STOS  і5,7+   і7+5(E)і9+ і9+іЗаполнение  (E)CX  слові
і      іm16       і4(E)CX іCX    і10 і10іES:[(E)DI] из AX.      і
і      і          і       і      іCX іCXі                       і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF3 AB іREP STOS  і5,7+   і7+5(E)і   і  іЗаполнение  (E)CX двой-і
і      іm32       і4(E)CX іCX    і   і  іных ES:[(E)DI] из EAX. і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF3 A6 іREPE CMPS і5,7+   і5+9N  і5+ і5+іПоиск     несовпадающихі
і      іm8,m8     і7(E)CX і      і9N і9Nібайт  в  ES:[(E)DI]   иі
і      і          і       і      і   і  і[(E)SI].               і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF3 A7 іREPE CMPS і5,7+   і5+9N  і5+ і9+іПоиск     несовпадающихі
і      іm16,m16   і7(E)CX і      і9N і22іслов  в  ES:[(E)DI]   иі
і      і          і       і      і   іN і[(E)SI].               і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF3 A7 іREPE CMPS і5,7+   і5+9N  і   і  іПоиск     несовпадающихі
і      іm32,m32   і7(E)CX і      і   і  ідвойных   слов   в  ES:і
і      і          і       і      і   і  і[(E)DI] и [(E)SI].     і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF3 AE іREPE SCAS і5,7+   і5+8N  і5+ і9+іПоиск  отличного от  ALі
і      іm8        і7(E)CX і      і9N і15ібайта,  начиная  с  ES:і
і      і          і       і      і   іN і[(E)DI].               і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF3 AF іREPE SCAS і5,7+   і5+8N  і5+ і9+іПоиск  отличного от  AXі
і      іm16       і7(E)CX і      і9N і15іслова,  начиная  с  ES:і
і      і          і       і      і   іN і[(E)DI].               і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF3 AF іREPE SCAS і5,7+   і5+8N  і   і  іПоиск  отличного от EAXі
і      іm32       і7(E)CX і      і   і  іслова,  начиная  с  ES:і
і      і          і       і      і   і  і[(E)DI].               і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF2 A6 іREPNE CMPSі5,7+   і5+9N  і5+ і9+іПоиск  совпадающих байті
і      іm8,m8     і7(E)CX і      і9N і22ів       ES:[(E)DI]    иі
і      і          і       і      і   іN і[(E)SI].               і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF2 A7 іREPNE CMPSі5,7+   і5+9N  і5+ і9+іПоиск  совпадающих слові
і      іm16,m16   і7(E)CX і      і9N і15ів       ES:[(E)DI]    иі
і      і          і       і      і   іN і[(E)SI].               і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF2 A7 іREPNE CMPSі5,7+   і5+9N  і5+ і9+іПоиск       cовпадающихі
і      іm16,m16   і7(E)CX і      і9N і15ідвойных слов  в ES:[(E)і
і      і          і       і      і   іN іDI] и [(E)SI].         і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF2 AE іREPNE CMPSі5,7+   і5+9N  і5+ і9+іПоиск       совпадающихі
і      іm16,m16   і7(E)CX і      і9N і15ідвойных слов  в ES:[(E)і
і      і          і       і      і   іN іDI] и [(E)SI].         і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF2 AE іREPNE SCASі5,7+   і5+8N  і5+ і9+іПоиск AL.              і
і      іm8        і7(E)CX і      і9N і15і                       і
і      і          і       і      і   іN і                       і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF2 AF іREPNE SCASі5,7+   і5+8N  і5+ і9+іПоиск AX.              і
і      іm8        і7(E)CX і      і9N і15і                       і
і      і          і       і      і   іN і                       і
і      і          і       і      і   і  і                       і
ГДДДДДДЕДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іF2 AF іREPNE SCASі5,7+   і5+8N  і   і  іПоиск EAX.             і
і      іm32       і7(E)CX і      і   і  і                       і
і      і          і       і      і   і  і                       і
ГДДДДДДБДДДДДДДДДДБДДДДДДДБДДДДДДБДДДБДДБДДДДДДДДДДДДДДДДДДДДДДДґ
і     4,3,6,9,10,22 - если CPL <= IOPL                          і
і     5CX,6CX - если CPL > IOPL.                                і
і     5 - если (E)CX = 0.                                       і
і     13 - если (E)CX = 1.                                      і
і     CX - если (E)CX 1.                                        і
і     7(E)CX - если (E)CX 0.                                    і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     REP, REPE (повторять,  пока равно) и REPNE (повторять,  пока
не равно) - это префиксы,  которые применяются к строковым опера-
циям. Каждый префикс вызывает  повторение  выполнения  выполнения
последующей строковой инструкции столько раз,  сколько задается в
регистре-счетчике, или до (не)выполнения определенного условия во
флаге нуля (REPE, REPNE).

     Синонимами инструкции  REPE  и REPNE являются соответственно
инструкции REPZ и REPNZ.

     Префикс REP применяется только к одной строковой инструкции.
Для повторения  блока  инструкций используйте инструкцию LOOP или
другую конструкцию цикла.

     На каждой итерации выполняется следующее действие:

     1. Если  атрибут  размера адреса операнда равен 16 битам,  в
        качестве счетчика используется регистр CX.  Если  атрибут
        размера адреса равен 32, то в качестве счетчика использу-
        ется регистр ECX.

     2. Проверяется значение регистра CX.  Если он равен нулю, то
        выполняется  выход из итерации и переход к следующей инс-
        трукции.

     3. Запрашиваются все отложенные прерывания.

     4. Один раз выполняется строковая операция.

     5. Значение регистра CX или ECX уменьшается на 1.  Флаги при
        этом не модифицируются.

     6. Если строковой операцией является операция SCAC или CMPS,
        то проверяется содержимое флага нуля. Если условие повто-
        рения не удовлетворяется,  то выполняется выход из итера-
        ции и перемещение к следующей инструкции. Выход из итера-
        ции выполняется,  если префиксом является REPE, и флаг ZF
        равен 0 (последнее сравнение не дало равенства), или пре-
        фиксом является  REPNE и флаг ZF равен 1 (последнее срав-
        нение дало равенство).

     7. Возврат на шаг 1 для каждой итерации.

     Выйти из повторяющихся инструкций CMPS и  SCAS  можно,  если
счетчик исчерпан  или условие повторения не удовлетворяется в со-
ответствии с флагом нуля.  Эти два случая можно  разделить,  либо
используя инструкцию  JCXZ,  либо  инструкцию условного перехода,
при которой проверяется флаг нуля (JZ, JNZ и JNE).

RET      Возврат из процедуры.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция   Такты             Описание           і
ГДДДДДДДДДДВДДДДДДДДДВДДДДДДВДДДДДДВДДДДДВДДВДДДДДДДДДДДДДДДДДДДґ
і          і         і486   і386   і286  і86і                   і
ГДДДДДДДДДДЕДДДДДДДДДЕДДДДДДЕДДДДДДЕДДДДДЕДДЕДДДДДДДДДДДДДДДДДДДґ
іC3        іRET      і5     і10+m  і11   і16іБлижний  возврат  ві
і          і         і      і      і     і  івызывающую програм-і
і          і         і      і      і     і  іму.                і
і          і         і      і      і     і  і                   і
ГДДДДДДДДДДЕДДДДДДДДДЕДДДДДДЕДДДДДДЕДДДДДЕДДЕДДДДДДДДДДДДДДДДДДДґ
іCB        іRET      і13,pm=і18+m, і15,  і16іДальний  возврат  ві
і          і         і18    іpm=32+іpm=25і  івызывающую програм-і
і          і         і      іm     і     і  іму с теми же приви-і
і          і         і      і      і     і  ілегиями.           і
і          і         і      і      і     і  і                   і
ГДДДДДДДДДДЕДДДДДДДДДЕДДДДДДЕДДДДДДЕДДДДДЕДДЕДДДДДДДДДДДДДДДДДДДґ
іCB        іRET      і13,pm=іpm=68 і55   і  іДальний возврат.   і
і          і         і33    і      і     і  і                   і
і          і         і      і      і     і  і                   і
ГДДДДДДДДДДЕДДДДДДДДДЕДДДДДДЕДДДДДДЕДДДДДЕДДЕДДДДДДДДДДДДДДДДДДДґ
іC2 iw     іRET imm16і5     і10+m  і11   і20іБлижний возврат.   і
і          і         і      і      і     і  і                   і
ГДДДДДДДДДДЕДДДДДДДДДЕДДДДДДЕДДДДДДЕДДДДДЕДДЕДДДДДДДДДДДДДДДДДДДґ
іCA iw     іRET imm16і14,   і18+m, і15,  і25іДальний  возврат  иі
і          і         іpm=17 іpm=32+іpm=25і  іизвлечение 16 байт.і
і          і         і      іm     і     і  і                   і
і          і         і      і      і     і  і                   і
ГДДДДДДДДДДЕДДДДДДДДДЕДДДДДДЕДДДДДДЕДДДДДЕДДЕДДДДДДДДДДДДДДДДДДДґ
іCA iw     іRET imm16і14,   іpm=68 і55   і  іДальний возврат.   і
і          і         іpm=33 і      і     і  і                   і
і          і         і      і      і     і  і                   і
АДДДДДДДДДДБДДДДДДДДДБДДДДДДБДДДДДДБДДДДДБДДБДДДДДДДДДДДДДДДДДДДЩ

     Инструкция RET передает управление по адресу возврата, кото-
рый находится в стеке. Адрес обычно помещается в стек инструкцией
CALL, а возврат выполняется на инструкцию, следующую за CALL.

     Необязательный числовой параметр инструкции CALL задает чис-
ло байт (атрибут равен 16) или слов (атрибут равен 32)  в  стеке,
которые должны  освобождаться  после  извлечения адреса возврата.
Эти элементы используются обычно,  как входные параметры вызывае-
мой процедуры.

     Для возврата ближнего типа (внутрисегментного) адрес в стеке
представляет собой смещение в сегменте,  которое  извлекается  из
стека в указатель инструкций.  Регистр CS не изменяется. При меж-
сегментном (дальнем) возврате адрес в  стеке  представляет  собой
указатель дальнего типа.  Сначала извлекается смещение,  за ним -
селектор.

     В реальном режиме регистры CS и  IP  загружаются  непосредс-
твенно. В  защищенном  режиме межсегментный возврат вызывает про-
верку процессором дескриптора,  адресуемого селектором  возврата.
Байт AR  дескриптора  должен  указывать на сегмент кода с равными
или меньшими привилегиями (или большим либо равным числовым  зна-
чением), чем текущий уровень привилегий.  Возврат к более низкому
уровню привилегий вызывает перезагрузку стека из значения, сохра-
ненного перед блоком параметров.

     В процессе межуровневой передачи сегментные регистры DS, ES,
FS и GS могут устанавливаться инструкцией RET в нулевое значение.
Если эти регистры ссылаются на сегмент,  который не может исполь-
зоваться на новом уровне привилегий, то, чтобы предотвратить неу-
полномоченный доступ из нового уровня привилегий,  они устанавли-
ваются в значение 0.

SAHF      Запись регистра AH в регистр флагов.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C
                                     *      *      *      *     *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция   Такты             Описание           і
ГДДДДДДДДДДВДДДДДДДДДВДДДДДДВДДДДДДВДДДДДВДДВДДДДДДДДДДДДДДДДДДДґ
і          і         і486   і386   і286  і86і                   і
ГДДДДДДДДДДЕДДДДДДДДДЕДДДДДДЕДДДДДДЕДДДДДЕДДЕДДДДДДДДДДДДДДДДДДДґ
і9E        іSAHF     і2     і3     і2    і4 іЗапись AH во  флагиі
і          і         і      і      і     і  іSF ZF xx AF  xx  PFі
і          і         і      і      і     і  іxx CF.             і
АДДДДДДДДДДБДДДДДДДДДБДДДДДДБДДДДДДБДДДДДБДДБДДДДДДДДДДДДДДДДДДДЩ

     Инструкция SAHF   загружает   в   перечисленные  выше  флаги
значения из регистра AH (биты 7, 6, 4, 2 и 0 соответственно).

SAL      Инструкции сдвига.
 SAR      ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
 SHL      O     D      I      T      S      Z      A      P     C
 SHR      *                          *      *      ?      *     *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция    Такты        Описание               і
ГДДДДДДДВДДДДДДДДДДВДДДВДДДВДДДВДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДґ
і       і          і486і386і286і86      і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD0 /4  іSAL r/m8,1і3/4і3/7і2/7і2/15+EA іУмножает байт r/m на 2.і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD2 /4  іSAL r/m8, і3/4і3/7і5/8і8+4 на  іУмножает байт r/m на  2і
і       і    CL    і   і   і   ібит/(20+іCL раз.                і
і       і          і   і   і   і4 на    і                       і
і       і          і   і   і   ібит)+EA і                       і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іC0 /4  іSAL r/m8, і2/4і3/7і5/8і        іУмножает байт r/m на 2.і
і ib    і    imm8  і   і   і   і        і                       і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD1 /4  іSAL r/m16,і3/4і3/7і2/7і2/15+EA іУмножает  слово r/m  наі
і       і    1     і   і   і   і        і2.                     і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD3 /4  іSAL r/m16,і3/4і3/7і5/8і8+4 на  іУмножает слово r/m на 2і
і       і    CL    і   і   і   ібит/(20+іCL раз.                і
і       і          і   і   і   і4 на    і                       і
і       і          і   і   і   ібит)+EA і                       і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іC1 /4  іSAL r/m16,і2/4і3/7і5/8і        іУмножает  слово r/m  наі
і ib    і    imm8  і   і   і   і        і2.                     і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD1 /4  іSAL r/m32,і3/4і3/7і   і        іУмножает  двойное словоі
і       і    1     і   і   і   і        іr/m на 2.              і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD3 /4  іSAL r/m32,і3/4і3/7і   і        іУмножает  двойное словоі
і       і    CL    і   і   і   і        іr/m на 2 CL раз.       і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іC1 /4  іSAL r/m32,і2/4і3/7і   і        іУмножает  двойное словоі
і ib    і    imm8  і   і   і   і        іr/m на 2.              і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD0 /7  іSAR r/m8,1і3/4і3/7і2/7і2/15+EA іДеление со знаком байтаі
і       і          і   і   і   і        іr/m на 2.              і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD2 /7  іSAR r/m8, і3/4і3/7і2/7і8+4 на  іДеление со знаком байтаі
і       і    CL    і   і   і   ібит/(20+іr/m на 2.              і
і       і          і   і   і   і4 на    і                       і
і       і          і   і   і   ібит)+EA і                       і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іC0 /7  іSAR r/m8, і2/4і3/7і5/8і        іДеление со знаком байтаі
і ib    і    imm8  і   і   і   і        іr/m на 2.              і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD1 /7  іSAR r/m16,і2/4і3/7і5/8і2/15+EA іДеление со знаком словаі
і       і    imm8  і   і   і   і        іr/m на 2.              і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD3 /7  іSAR r/m16,і3/4і3/7і5/8і8+4 на  іДеление со знаком словаі
і       і    CL    і   і   і   ібит/(20+іr/m на 2.              і
і       і          і   і   і   і4 на    і                       і
і       і          і   і   і   ібит)+EA і                       і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іC1 /7  іSAR r/m16,і2/4і3/7і5/8і        іДеление со знаком словаі
і ib    і    imm8  і   і   і   і        іr/m на 2.              і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD1 /7  іSAR r/m32,і3/4і3/7і   і        іДеление со знаком двой-і
і       і    1     і   і   і   і        іного слова r/m на 2.   і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD3 /7  іSAR r/m32,і3/4і3/7і   і        іДеление со знаком двой-і
і       і    CL    і   і   і   і        іного слова r/m на 2  CLі
і       і          і   і   і   і        іраз.                   і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іC1 /7  іSAR r/m32,і2/4і3/7і   і        іДеление со знаком двой-і
і       і    imm8  і   і   і   і        іного слова r/m на 2.   і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD0 /4  іSHL r/m8,1і3/4і3/7і2/7і2/15+EA іУмножение байта r/m  наі
і       і          і   і   і   і        ідва.                   і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD2 /4  іSHL r/m8, і3/4і3/7і5/8і8+4 на  іУмножение байта r/m  наі
і       і    CL    і   і   і   ібит/(20+ідва CL раз.            і
і       і          і   і   і   і4 на    і                       і
і       і          і   і   і   ібит+EA) і                       і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іC0 /4  іSHL r/m8, і2/4і3/7і5/8і        іУмножение байта r/m  наі
і ib    і    imm8  і   і   і   і        ідва.                   і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD1 /4  іSHL r/m16,і2/4і3/7і2/7і2/15+EA іУмножение слова r/m  наі
і       і    1     і   і   і   і        ідва CL раз.            і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD3 /4  іSHL r/m16,і3/4і3/7і5/8і8+4 на  іУмножение слова r/m  наі
і       і    CL    і   і   і   ібит/(20+ідва CL раз.            і
і       і          і   і   і   і4 на    і                       і
і       і          і   і   і   ібит)+EA і                       і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іC1 /4  іSHL r/m16,і2/4і3/7і5/8і        іУмножение слова r/m  наі
і ib    і    imm8  і   і   і   і        ідва.                   і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD1 /4  іSHL r/m32,і2/4і3/7і   і        іУмножение двойного сло-і
і ib    і    1     і   і   і   і        іва r/m на два.         і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іC1 /4  іSHL r/m32,і2/4і3/7і   і        іУмножение двойного сло-і
і ib    і    CL    і   і   і   і        іва r/m на два.         і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іC1 /4  іSHL r/m32,і2/4і3/7і5/8і        іУмножение двойного сло-і
і ib    і    imm8  і   і   і   і        іва r/m на два.         і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD0 /5  іSHR r/m8,1і3/4і3/7і2/7і2/15+EA іБеззнаковое     делениеі
і       і          і   і   і   і        ібайта r/m на 2.        і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD2 /5  іSHR r/m8, і3/4і3/7і2/7і8+4 на  іБеззнаковое     делениеі
і       і    CL    і   і   і   ібит/(20+ібайта r/m на 2.        і
і       і          і   і   і   і4 на    і                       і
і       і          і   і   і   ібит)+EA і                       і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іC0 /5  іSHR r/m8, і2/4і3/7і5/8і        іБеззнаковое     делениеі
і ib    і    imm8  і   і   і   і        ібайта r/m на 2.        і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD1 /5  іSHR r/m16,і2/4і3/7і5/8і2/15+EA іБеззнаковое     делениеі
і       і    imm8  і   і   і   і        іслова r/m на 2.        і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD3 /5  іSHR r/m16,і3/4і3/7і5/8і8+4 на  іБеззнаковое     делениеі
і       і    CL    і   і   і   ібит/(20+іслова r/m на 2.        і
і       і          і   і   і   і4 на    і                       і
і       і          і   і   і   ібит)+EA і                       і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іC1 /5  іSHR r/m16,і2/4і3/7і5/8і        іБеззнаковое     делениеі
і ib    і    imm8  і   і   і   і        іслова r/m на 2.        і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD1 /5  іSHR r/m32,і3/4і3/7і   і        іБеззнаковое     делениеі
і       і    1     і   і   і   і        ідвойного  слова r/m  наі
і       і          і   і   і   і        і2.                     і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іD3 /5  іSHR r/m32,і3/4і3/7і   і        іБеззнаковое     делениеі
і       і    CL    і   і   і   і        ідвойного  слова r/m  наі
і       і          і   і   і   і        і2.                     і
і       і          і   і   і   і        і                       і
ГДДДДДДДЕДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
іC1 /5  іSHR r/m32,і2/4і3/7і   і        іБеззнаковое     делениеі
і       і    imm8  і   і   і   і        ідвойного  слова r/m  наі
і       і          і   і   і   і        і2.                     і
АДДДДДДДБДДДДДДДДДДБДДДБДДДБДДДБДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция SAL (или ее синоним, инструкция SHL) сдвигает би-
ты операнда "вверх".  Старший бит сдвигается во флаг переноса,  а
младший бит устанавливается в нулевое значение.

     Сдвиг повторяется число раз, указанное вторым операндом, ко-
торый представляет собой непосредственное значение или содержимое
регистра CL.  Чтобы уменьшить максимальное время выполнения, про-
цессоры 80286/286  не  позволяют сдвигать операнды более,  чем на
31. При попытке использовать значение счетчика,  превышающее  31,
используются только  младшие пять бит счетчика сдвига. (Процессор
8086 использует все 8 бит счетчика сдвига.)

     Флаг переполнения  устанавливается  только при использовании
форм инструкций с единичным значением счетчика.  При сдвиге влево
OF устанавливается в 0, если старший бит результата тот же, что и
результат флага переноса (то есть старшие два бита исходного опе-
ранда совпадали).  Если они различны,  OF устанавливается в 1.  В
инструкции SAR флаг OF устанавливается в 0 для всех сдвигов на 1.
В инструкции SHR OF устанавливается в значение старшего бита  ис-
ходного операнда.

SBB      Целочисленное вычитание с заемом.
 SAR      ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
 SHL      O     D      I      T      S      Z      A      P     C
 SHR      *                          *      *      *      *     *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция     Такты      Описание                і
ГДДДДДДДДВДДДДДДДДДДДДВДДДВДДДВДДДВДДДДВДДДДДДДДДДДДДДДДДДДДДДДДґ
і        і            і486і386і286і86  і                        і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
і1C ib   іSBB AL,imm8 і1  і2  і3  і4   іВычитание с  заемом  не-і
і        і            і   і   і   і    іпосредственного байта изі
і        і            і   і   і   і    іAL.                     і
і        і            і   і   і   і    і                        і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
і1D iw   іSBB AX,imm16і1  і2  і3  і4   іВычитание с  заемом  не-і
і        і            і   і   і   і    іпосредственного слова изі
і        і            і   і   і   і    іAX.                     і
і        і            і   і   і   і    і                        і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
і1D id   іSBB EAX,    і1  і2  і   і    іВычитание с  заемом  не-і
і        і    imm32   і   і   і   і    іпосредственного двойногоі
і        і            і   і   і   і    іслова из EAX.           і
і        і            і   і   і   і    і                        і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
і80 /3 ibіSBB r/m8,   і1/3і2/7і3/7і4/17іВычитание с  заемом  не-і
і        і    imm8    і   і   і   і+EA іпосредственного байта изі
і        і            і   і   і   і    ібайта r/m.              і
і        і            і   і   і   і    і                        і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
і81 /3 iwіSBB r/m16,  і1/3і2/7і3/7і4/17іВычитание с  заемом  не-і
і        і    imm16   і   і   і   і+EA іпосредственного слова изі
і        і            і   і   і   і    іслова r/m.              і
і        і            і   і   і   і    і                        і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
і81 /3 idіSBB r/m32,  і1/3і2/7і   і    іВычитание с  заемом  не-і
і        і    imm32   і   і   і   і    іпосредственного двойногоі
і        і            і   і   і   і    іслова из двойного  словаі
і        і            і   і   і   і    іr/m.                    і
і        і            і   і   і   і    і                        і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
і83 /3 iwіSBB r/m16,  і1/3і2/7і3/7і4/17іВычитание с  заемом  не-і
і        і    imm8    і   і   і   і+EA іпосредственного расшире-і
і        і            і   і   і   і    інного по  знаку байта изі
і        і            і   і   і   і    іслова r/m.              і
і        і            і   і   і   і    і                        і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
і83 /3 iwіSBB r/m32,  і1/3і2/7і   і    іВычитание с  заемом  не-і
і        і    imm8    і   і   і   і    іпосредственного расшире-і
і        і            і   і   і   і    інного по знаку  байта изі
і        і            і   і   і   і    ідвойного слова r/m.     і
і        і            і   і   і   і    і                        і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
і18 /r   іSBB r/m8,   і1/3і2/6і2/7і3/16іВычитание с заемом  бай-і
і        і    r8      і   і   і   і+EA ітового регистра из  бай-і
і        і            і   і   і   і    іта r/m.                 і
і        і            і   і   і   і    і                        і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
і19 /r   іSBB r/m16,  і1/3і2/6і2/7і3/16іВычитание с  заемом  ре-і
і        і    r16     і   і   і   і+EA ігистра размером в  словоі
і        і            і   і   і   і    іиз слова r/m.           і
і        і            і   і   і   і    і                        і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
і19 /r   іSBB r/m32,  і1/3і2/6і   і    іВычитание с  заемом  ре-і
і        і    r32     і   і   і   і    ігистра размером в  двой-і
і        і            і   і   і   і    іное слова   из  двойногоі
і        і            і   і   і   і    іслова r/m.              і
і        і            і   і   і   і    і                        і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
і1A /r   іSBB r8,r/m8 і1/2і2/7і2/7і3/9 іВычитание с  заемом бай-і
і        і    r32     і   і   і   і+EA ітового регистра  из бай-і
і        і            і   і   і   і    ібайта r/m.              і
і        і            і   і   і   і    і                        і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
і1B /r   іSBB r16,    і1/2і2/7і2/7і3/9 іВычитание  с заемом  ре-і
і        і    r/m16   і   і   і   і+EA ігистра  размером в словоі
і        і            і   і   і   і    іиз слова r/m.           і
і        і            і   і   і   і    і                        і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
і1B /r   іSBB r32,    і1/2і2/7і   і    іВычитание  с заемом  ре-і
і        і    r/m32   і   і   і   і    ігистра  размером в двой-і
і        і            і   і   і   і    іное слово  из   двойногоі
і        і            і   і   і   і    іслова r/m.              і
АДДДДДДДДБДДДДДДДДДДДДБДДДБДДДБДДДБДДДДБДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция SBB прибавляет второй операнд (приемник)  к флагу
переноса CF и вычитает результат из первого операнда (источника).
Результат вычитания присваивается второму  операнду  (приемнику).
Соответствующим образом изменяются флаги.

     Когда из операнда размером в слово вычитается непосредствен-
ное байтовое значение, то оно расширяется по знаку.

SCAS     Сравнение строковых данных (SCASD - только для
 SCASB    процессоров 386 и i486).
 SCASW    ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
 SCASD    O     D      I      T      S      Z      A      P     C
          *                          *      *      *      *     *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция   Такты    Описание                    і
ГДДДДДДВДДДДДДДДДДДДВДДДВДДДВДДДВДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і      і            і486і386і286і86і                            і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іAE    іSCAS m8     і6  і7  і7  і15іСравнение байт AL - ES:[DI].і
і      і            і   і   і   і  і                            і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іAF    іSCAS m16    і6  і7  і7  і15іСравнение слов AX - ES:[DI].і
і      і            і   і   і   і  і                            і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іAF    іSCAS m32    і6  і7  і   і  іСравнение двойных  слов  EAXі
і      і            і   і   і   і  і- ES:[DI].                  і
і      і            і   і   і   і  і                            і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іAE    іSCASB       і6  і7  і7  і15іСравнение байт AL - ES:[DI].і
і      і            і   і   і   і  і                            і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іAF    іSCASW       і6  і7  і7  і15іСравнение слов AX - ES:[DI].і
і      і            і   і   і   і  і                            і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іAF    іSCASD       і6  і7  і   і  іСравнение двойных  слов  EAXі
і      і            і   і   і   і  і- ES:[DI].                  і
АДДДДДДБДДДДДДДДДДДДБДДДБДДДБДДДБДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция SCAS вычитает байт в памяти или слово в регистре-
приемнике из  регистра AL,  AX или EAX.  Результат отбрасывается,
устанавливаются только флаги.  Операнд должен быть адресуемым  из
регистра ES, переопределение сегмента не допускается.

     Если атрибут  размера адреса данной инструкции равен 16,  то
регистр DI используется в качестве регистра-приемника.  В против-
ном случае атрибут размера адреса равен 32 битам,  и используется
регистр EDI.

     Адрес данных в памяти,  предназначенных для сравнения, опре-
деляется исключительно  содержимым регистра-приемника,  а не опе-
рандом SCAS.  Операнд  позволяет  определить  адресуемость  через
сегмент ES и определяет тип данных.  Перед выполнением инструкции
SCAS загрузите в DI или в EDI корректное значение индекса.

     После сравнения регистр-приемник  автоматически  изменяется.
Если флаг направления равен 0 (была выполнена инструкция CLD), то
индексный  регистр  источника  инкрементируется  (увеличивается).
Если флаг направления равен 1 (была выполнена инструкция STD), то
он декрементируется (уменьшается).  Декрементация или инкремента-
ция выполняется на 1 при сравнении байт, на 2 при сравнении слов,
или на 4 при сравнении двойных слов.

     Инструкции SCASB, SCASW и SCASD являются синонимами инструк-
ции SCAS  для работы с байтами,  словами и двойными словами.  Эти
инструкции не требуют операндов.  Писать их проще, но они не поз-
воляют проверять тип или сегмент.

     Инструкции SCAS может предшествовать префикс REP. Это позво-
ляет выполнять поиск в блоке из CX  байт  или  слов.  Подробности
этой операции можно найти в описании префикса REP.

SETcc     Установка байта по условию (только для процессоров
           386 и i486).
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция Такты Описание                         і
ГДДДДДДВДДДДДДДДДДДДВДДДВДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і      і            і486і386і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 97 іSETA r/m8   і4/3і4/5іУстановка байта, если выше (CF=0  иі
і      і            і   і   іZF=0).                             і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 93 іSETAE r/m8  і4/3і4/5іУстановка байта, если выше или рав-і
і      і            і   і   іно CF=0).                          і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 92 іSETB r/m8   і4/3і4/5іУстановка байта, если ниже (CF=0). і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 96 іSETBE r/m8  і4/3і4/5іУстановка байта, если ниже или рав-і
і      і            і   і   іно (CF=1 или ZF=1).                і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 92 іSETC r/m8   і4/3і4/5іУстановка байта,  если перенос (CF=і
і      і            і   і   і1).                                і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 92 іSETC r/m8   і4/3і4/5іУстановка байта,  если перенос (CF=і
і      і            і   і   і1).                                і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 94 іSETE r/m8   і4/3і4/5іУстановка байта, если равно (CF=1).і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 9F іSETG r/m8   і4/3і4/5іУстановка байта, если  больше  (CF=і
і      і            і   і   і0 или SF=OF).                      і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 9D іSETGE r/m8  і4/3і4/5іУстановка байта, если  больше   илиі
і      і            і   і   іравно (SF=OF).                     і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 9C іSETL r/m8   і4/3і4/5іУстановка байта, если меньше   (SF=і
і      і            і   і   іOF).                               і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 9E іSETLE r/m8  і4/3і4/5іУстановка  байта,  если меньше  илиі
і      і            і   і   іравно (ZF=1 и SF<>OF).             і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 96 іSETNA r/m8  і4/3і4/5іУстановка байта, если не выше  (CF=і
і      і            і   і   і1).                                і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 92 іSETNAE r/m8 і4/3і4/5іУстановка  байта, если не выше  илиі
і      і            і   і   іравно (CF=1).                      і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 93 іSETNB r/m8  і4/3і4/5іУстановка байта, если не ниже  (CF=і
і      і            і   і   і0).                                і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 97 іSETNBE r/m8 і4/3і4/5іУстановка  байта, если не ниже  илиі
і      і            і   і   іравно (CF=0 и ZF=0).               і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 93 іSETNC r/m8  і4/3і4/5іУстановка  байта, если нет  перено-і
і      і            і   і   іса (CF=0).                         і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 95 іSETNЕ r/m8  і4/3і4/5іУстановка  байта,  если   не  равноі
і      і            і   і   і(ZF=0).                            і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 9E іSETNG r/m8  і4/3і4/5іУстановка  байта,  если  не  большеі
і      і            і   і   і(ZF=1 или SF<>OF).                 і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 9C іSETNGE r/m8 і4/3і4/5іУстановка  байта,  если  не  большеі
і      і            і   і   іили равно (SF<>OF).                і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 9D іSETNL r/m8  і4/3і4/5іУстановка  байта,  если  не  меньшеі
і      і            і   і   і(SF=OF).                           і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 9F іSETNLE r/m8 і4/3і4/5іУстановка  байта,  если  не  меньшеі
і      і            і   і   іили равно (ZF=1 и SF<>OF).         і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 91 іSETNO r/m8  і4/3і4/5іУстановка  байта,  если  нет  пере-і
і      і            і   і   іполнения (OF=0).                   і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 9B іSETNP r/m8  і4/3і4/5іУстановка  байта,  если   нет  чет-і
і      і            і   і   іности (PF=0).                      і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 99 іSETNS r/m8  і4/3і4/5іУстановка  байта,  если   нет  зна-і
і      і            і   і   іка (SF=0).                         і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 95 іSETNZ r/m8  і4/3і4/5іУстановка байта, если ноль (ZF=0). і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 90 іSETNO r/m8  і4/3і4/5іУстановка  байта,  если  нет  пере-і
і      і            і   і   іполнения (OF=1).                   і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 9A іSETP r/m8   і4/3і4/5іУстановка  байта  при флаге четнос-і
і      і            і   і   іти (PF=1).                         і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 9A іSETPE r/m8  і4/3і4/5іУстановка  байта  при четности (PF=і
і      і            і   і   і1).                                і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 9B іSETPO r/m8  і4/3і4/5іУстановка   байта  при   нечетностиі
і      і            і   і   і(PF=0).                            і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 98 іSETS r/m8   і4/3і4/5іУстановка байта по знаку (SF=0).   і
і      і            і   і   і                                   і
ГДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 94 іSETZ r/m8   і4/3і4/5іУстановка байта по нулю (ZF=0).    і
і      і            і   і   і                                   і
АДДДДДДБДДДДДДДДДДДДБДДДБДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция SETcc записывает в приемник, заданный действующим
адресом, или в регистр байт,  содержащий 1, если условие удовлет-
воряется, и 0, если условие не удовлетворяется.

SGDT     Сохранение таблицы глобальных дескрипторов/таблицы
 SIDT     дескрипторов прерываний (только для защищенного режима
          процессоров 80186/286/386/486).
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция     Такты         Описание             і
ГДДДДДДДДВДДДДДДВДДДДДДДВДДДДДВДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і        і      і486    і386  і286 і                            і
ГДДДДДДДДЕДДДДДДЕДДДДДДДЕДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 01 /0іSGDT mі10     і9    і11  іЗапись  таблицы  GDTR  (гло-і
і        і      і       і     і    ібальных дескрипторов) в m.  і
і        і      і       і     і    і                            і
ГДДДДДДДДЕДДДДДДЕДДДДДДДЕДДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 01 /1іSIDT mі10     і9    і11  іЗапись  таблицы  IDTR  (дес-і
і        і      і       і     і    ікрипторов прерываний) в m.  і
і        і      і       і     і    і                            і
АДДДДДДДДБДДДДДДБДДДДДДДБДДДДДБДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкции SGDT/SIDT копируют  содержимое  регистра  таблицы
дескрипторов в шесть байт памяти, указанных операндом. Поле LIMIT
регистра присваивается первому слову  действующего  адреса.  Если
атрибут размера операнда равен 32 битам, то следующим трем байтам
присваивается поле BASE (база) регистра, а в четвертый байт запи-
сывается ноль.  Последний байт не определен. Если атрибут размера
операнда  равен  16,  то  следующим  четырем байтам присваивается
32-битовое поле BASE регистра.

     Инструкции SGDT и SIDT используются только в системном прог-
раммном обеспечении. В прикладных программах они не применяются.

SHLD      Сдвиг влево с двойной точностью (только для процессоров
          386 и i486).
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C
          ?                          *      *      ?      *     *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция Такты   Описание                       і
ГДДДДДДВДДДДДДДДДДДДДДДВДДДВДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і      і               і486і386 і                               і
ГДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F A4 іSHLD r/m16,r16,і2/3і3/7 іВ r/m16 записывается конкатена-і
і      і     imm8      і   і    іция SHL r/m16 и r16.           і
і      і               і   і    і                               і
ГДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F A4 іSHLD r/m32,r32,і2/3і3/7 іВ r/m32 записывается конкатена-і
і      і     imm8      і   і    іция SHL r/m32 и r32.           і
і      і               і   і    і                               і
ГДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F A5 іSHLD r/m16,r16,і2/3і3/7 іВ r/m16 записывается конкатена-і
і      і     CL        і   і    іция SHL r/m16 и r16.           і
і      і               і   і    і                               і
ГДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F A5 іSHLD r/m32,r32,і2/3і3/7 іВ r/m32 записывается конкатена-і
і      і     CL        і   і    іция SHL r/m32 и r32.           і
і      і               і   і    і                               і
АДДДДДДБДДДДДДДДДДДДДДДБДДДБДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция SHLD выполняет сдвиг первого операнда, задаваемо-
го полем r/m,  влево на число бит,  заданное операндом-счетчиком.
Второй операнд задает биты, сдвигаемые справа (начиная с бита 0).
Результат записывается  обратно  в операнд r/m.  Регистр остается
неизмененным.

     Операнд-счетчик задается либо в виде непосредственного  бай-
та, либо в виде регистра CL. Чтобы получить величину сдвига (чис-
ло от 0 до 31),  эти операнды берутся по модулю 32. Поскольку ве-
личина сдвига задается указанными регистрами, эта операция полез-
на для выполнения сдвигов с повышенной точностью (64 бита или бо-
лее).  Биты  SF,  ZF  и  PF  устанавливаются  в  соответствии  со
значением результата.  Регистр CF устанавливается в значение пос-
леднего сдвигаемого вовне бита.  Флаги OF и AF остаются неопреде-
ленными.

SHRD     Сдвиг  вправо с двойной точностью
          (только для процессоров  386 и i486).
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C
          ?                          *      *      ?      *     *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция Такты   Описание                       і
ГДДДДДДВДДДДДДДДДДДДДДДВДДДВДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і      і               і486і386 і                               і
ГДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F A4 іSHRD r/m16,r16,і2/3і3/7 іВ r/m16 записывается конкатена-і
і      і     imm8      і   і    іция SHR r/m16 и r16.           і
і      і               і   і    і                               і
ГДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F A4 іSHRD r/m32,r32,і2/3і3/7 іВ r/m32 записывается конкатена-і
і      і     imm8      і   і    іция SHR r/m32 и r32.           і
і      і               і   і    і                               і
ГДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F A5 іSHRD r/m16,r16,і2/3і3/7 іВ r/m16 записывается конкатена-і
і      і     CL        і   і    іция SHR r/m16 и r16.           і
і      і               і   і    і                               і
ГДДДДДДЕДДДДДДДДДДДДДДДЕДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F A5 іSHRD r/m32,r32,і2/3і3/7 іВ r/m32 записывается конкатена-і
і      і     CL        і   і    іция SHR r/m32 и r32.           і
і      і               і   і    і                               і
АДДДДДДБДДДДДДДДДДДДДДДБДДДБДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция SHRD выполняет сдвиг первого операнда, задаваемо-
го полем r/m, вправо на число бит,  заданное операндом-счетчиком.
Второй операнд задает биты, сдвигаемые справа (начиная с бита 0).
Результат записывается  обратно  в операнд r/m.  Регистр остается
неизмененным.

     Операнд-счетчик задается либо в виде непосредственного  бай-
та, либо в виде регистра CL. Чтобы получить величину сдвига (чис-
ло от 0 до 31) эти операнды берутся по модулю 32. Поскольку вели-
чина сдвига задается указанными регистрами,  эта операция полезна
для выполнения сдвигов с повышенной точностью (64  бита  или  бо-
лее). Биты SF, ZF и PF устанавливаются в соответствии со значени-
ем результата.  Флаг  CF  устанавливается  в  значение последнего
сдвигаемого вовне бита. Флаги OF и AF остаются неопределенными.

SLDT     Запись таблицы локальных дескрипторов (только для
          защищенного режима процессоров 80186/286/386/486).
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция      Такты  Описание                   і
ГДДДДДДДДВДДДДДДДДДДВДДДВДДДДДДДВДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і        і          і486і386    і286і                           і
ГДДДДДДДДЕДДДДДДДДДДЕДДДЕДДДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 00 /0іSLDT r/m16і2/3іpm-=2/2і2/3іЗапись таблицы  LDTR   (ло-і
і        і          і   і       і   ікальных  дескрипторов)    ві
і        і          і   і       і   іслово EA.                  і
АДДДДДДДДБДДДДДДДДДДБДДДБДДДДДДДБДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция SLDT  записывает  регистр таблицы локальных деск-
рипторов (LDTR) в двухбайтовый регистр или ячейку памяти,  задан-
ную операндом действующего адреса. Регистр представляет собой се-
лектор, который указывает на таблицу глобальных дескрипторов.

     Инструкция SLDT используется только в  системном программном
обеспечении. В прикладных программах она не применяется.

SMSW     Запись  слова состояния машины (только для защищенного
          режима процессоров 80186/286/386/486).
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция     Такты  Описание                    і
ГДДДДДДДДВДДДДДДДДДДВДДДВДДДДДДВДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і        і          і486і386   і286і                            і
ГДДДДДДДДЕДДДДДДДДДДЕДДДЕДДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 00 /0іSMSW r/m16і2/3і2/3,  і2/3іЗапись слова состояния маши-і
і        і          і   іpm=2/2і   іны с слово EA.              і
АДДДДДДДДБДДДДДДДДДДБДДДБДДДДДДБДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция CMSW  записывает  слово  состояния  машины (часть
CR0) в двухбайтовом регистре или ячейке памяти, на которую указы-
вает операнд действующего адреса.

STC       Установка флага переноса.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C
                                                                1

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод      Инструкция  Такты   Описание                          і
іоперации                                                       і
ГДДДДДДДДВДДДВДДДДВДДДВДДДВДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і        і   і486 і386і286і86і                                  і
ГДДДДДДДДЕДДДЕДДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іF9      іSTCі2   і2  і2  і2 іУстановка флага переноса.         і
АДДДДДДДДБДДДБДДДДБДДДБДДДБДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция STC устанавливает флаг переноса в 1.

STD       Установка флага направления.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C
                1

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод      Инструкция  Такты   Описание                          і
іоперации                                                       і
ГДДДДДДВДДДДДВДДДДВДДДВДДДВДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і      і     і486 і386і286і86і                                  і
ГДДДДДДЕДДДДДЕДДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іFD    іSTD  і2   і2  і2  і2 іУстановка флага направления,  пос-і
і      і     і    і   і   і  іле чего будет  выполняться  декре-і
і      і     і    і   і   і  іментация   регистров   (E)SI   илиі
і      і     і    і   і   і  і(E)DI.                            і
АДДДДДДБДДДДДБДДДДБДДДБДДДБДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция STD устанавливает флаг направления в 1, что вызы-
вает во   всех   последующих  строковых  операциях  декрементацию
(уменьшение) индексных регистров (E)SI или (E)DI.

STI       Установка флага разрешения прерывания.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C
                       1

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод      Инструкция  Такты   Описание                          і
іоперации                                                       і
ГДДДДДДВДДДДДВДДДДВДДДВДДДВДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і      і     і486 і386і286і86і                                  і
ГДДДДДДЕДДДДДЕДДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іFB    іSTI  і5   і3  і2  і2 іУстановка флага разрешения  преры-і
і      і     і    і   і   і  івания.                            і
АДДДДДДБДДДДДБДДДДБДДДБДДДБДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция STI  устанавливает  флаг прерывания в значение 1.
После этого ЦП при выполнении следующей  инструкции  отвечает  на
внешние прерывания (если при выполнении следующей инструкции пре-
рывания останутся разрешенными). Если внешние прерывания запреще-
ны, и вы записываете STI, RET (как в конце подпрограммы), то инс-
трукцию RET допускается выполнять  перед  распознаванием  внешних
прерываний. Кроме того,  если внешние прерывания запрещены,  а вы
пишете STI,  CLI,  то внешние прерывания не распознаются, так как
при выполнении инструкции CLI флаг прерываний очищается.

STOS     Запись строковых данных (инструкция STOSD - только для
STOSB     процессоров 386 и i486).
STOSW     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
STOSD     O     D      I      T      S      Z      A      P     C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод    Инструкция  Такты        Описание                       і
іоперации                                                       і
ГДДДДДДВДДДДДДДДДВДДДВДДДВДДДВДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і      і         і486і386і286і86і                               і
ГДДДДДДЕДДДДДДДДДЕДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іAA    іSTOS m8  і5  і4  і3  і11іЗапись AL в байте ES:[(E)DI].  і
і      і         і   і   і   і  і                               і
ГДДДДДДЕДДДДДДДДДЕДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іAB    іSTOS m16 і5  і4  і3  і11іЗапись AX в слове ES:[(E)DI].  і
і      і         і   і   і   і  і                               і
ГДДДДДДЕДДДДДДДДДЕДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іAB    іSTOS m32 і5  і4  і   і  іЗапись EAX в байте ES:[(E)DI]. і
і      і         і   і   і   і  і                               і
ГДДДДДДЕДДДДДДДДДЕДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іAA    іSTOSB    і5  і4  і3  і11іЗапись AL в байте ES:[(E)DI].  і
і      і         і   і   і   і  і                               і
ГДДДДДДЕДДДДДДДДДЕДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іAB    іSTOSW    і5  і4  і3  і11іЗапись AX в слове ES:[(E)DI].  і
ГДДДДДДЕДДДДДДДДДЕДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іAB    іSTOSD    і5  і4  і   і  іЗапись EAX в байте ES:[(E)DI]. і
АДДДДДДБДДДДДДДДДБДДДБДДДБДДДБДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция STOS передает содержимое регистра AL,  AX или EAX
в байт или слово в памяти,  которые задаются регистром-приемником
относительно сегмента ES.

     Для атрибута размера адреса,  равного 16, регистром-приемни-
ком является регистр DI, а для атрибута размера адреса 32 - EDI.

     Операнд-приемник должен быть адресуемым  через  регистр  ES.
Переопределение сегмента не допускается.

     Адрес приемника  определяется содержимым регистра-приемника,
а не явным операндом инструкции STOS. Данный операнд используется
только для  определения возможности адресуемости через регистр ES
и типа данных.  Перед выполнением инструкции STOS загрузите в ре-
гистр-приемник корректное значение адреса.

     После выполнения пересылки регистр DI автоматически обновля-
ется. Если флаг направления равен 0  (была  выполнена  инструкция
CLD), то  регистр DI инкрементируется (увеличивается).  Если флаг
направления равен 1 (была выполнена инструкция STD), то он декре-
ментируется (уменьшается).  DI увеличивается или уменьшается на 1
при записи байта, на 2 при записи слова и на 4 при записи двойно-
го слова.

     Инструкции STOSB, STOSW и STOSD являются синонимами инструк-
ции OUTS для работы с байтами,  словами и двойными словами.  Инс-
трукции STOS может предшествовать префикс REP.  Это позволяет за-
полнять блоки из CX байт или слов. Подробности этой операции мож-
но найти в описании REP.

STR      Запись регистра задачи (только для защищенного режима
          процессоров 80286/386/486).
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод    Инструкция  Такты         Описание                      і
іоперации                                                       і
ГДДДДДДДВДДДДДДДДДВДДДДВДДДДДВДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і       і         і486 і386  і286і                              і
ГДДДДДДДЕДДДДДДДДДЕДДДДЕДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0F 00/1іSTR r/m16і2/3 іpm=  і2/3іЗагрузка в регистр задачи сло-і
і       і         і    і23/27і   іва EA.                        і
АДДДДДДДБДДДДДДДДДБДДДДБДДДДДБДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Содержимое регистра задачи копируется в двухбайтовый регистр
или ячейку памяти, указываемую операндом действующего адреса.

     Инструкция STR  используется  только в системном программном
обеспечении. В прикладных программах она не применяется.

SUB     Целочисленное вычитание.
        ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        O      D      I      T      S      Z      A      P      C
        *                           *      *      *      *      *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод операции Инструкция  Такты                    Oписание     і
ГДДДДДДДДВДДДДДДДДДДДДДДДВДДДДВДДДДВДДДДДВДДДДДДДВДДДДДДДДДДДДДДґ
і        і               і486 і386 і286  і86     і              і
ГДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДЕДДДДЕДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і04 ib   іSUB AL,imm8    і1   і2   і3    і4      іВычитание  не-і
і        і               і    і    і     і       іпосредственно-і
і        і               і    і    і     і       іго   байта  изі
і        і               і    і    і     і       іAL.           і
і        і               і    і    і     і       і              і
ГДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДЕДДДДЕДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і05 iw   іSUB EX,imm16   і1   і2   і3    і4      іВычитание  не-і
і        і               і    і    і     і       іпосредственно-і
і        і               і    і    і     і       іго слова из AXі
і        і               і    і    і     і       і              і
ГДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДЕДДДДЕДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і05 id   іSUB EAX,imm32  і1   і2   і     і       іВычитание  не-і
і        і               і    і    і     і       іпосредственно-і
і        і               і    і    і     і       іго    двойногоі
і        і               і    і    і     і       іслова из EAX. і
і        і               і    і    і     і       і              і
ГДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДЕДДДДЕДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і80 /0 ibіSUB r/m8,imm2  і1/3 і2/7 і3/7  і4/17+EAіВычитание  не-і
і        і               і    і    і     і       іпосредственно-і
і        і               і    і    і     і       іго   байта  изі
і        і               і    і    і     і       ібайта r/m.    і
і        і               і    і    і     і       і              і
ГДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДЕДДДДЕДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і81 /0 iwіSUB r/m16,imm16і1/3 і2/7 і3/7  і4/17+EAіВычитание  не-і
і        і               і    і    і     і       іпосредственно-і
і        і               і    і    і     і       іго   слова  изі
і        і               і    і    і     і       іслова r/m.    і
і        і               і    і    і     і       і              і
ГДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДЕДДДДЕДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і81 /0 idіSUB r/m16,imm8 і1/3 і2/7 і3/7  і4/17+EAіВычитание  не-і
і        і               і    і    і     і       іпосредственно-і
і        і               і    і    і     і       іго   байта   сі
і        і               і    і    і     і       ірасширением поі
і        і               і    і    і     і       ізнаку из  сло-і
і        і               і    і    і     і       іва r/m.       і
і        і               і    і    і     і       і              і
ГДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДЕДДДДЕДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і83 /0 ibіSUB r/m32,imm8 і1/3 і2/7 і     і       іВычитание  не-і
і        і               і    і    і     і       іпосредственно-і
і        і               і    і    і     і       іго   байта   сі
і        і               і    і    і     і       ірасширением поі
і        і               і    і    і     і       ізнаку из двой-і
і        і               і    і    і     і       іного     словаі
і        і               і    і    і     і       іr/m.          і
і        і               і    і    і     і       і              і
ГДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДЕДДДДЕДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і00 /r   іSUB r/m8,r8    і1/3 і2/7 і2/7  і3/16+EAіВычитание бай-і
і        і               і    і    і     і       ітового регист-і
і        і               і    і    і     і       іра   из  байтаі
і        і               і    і    і     і       іr/m.          і
і        і               і    і    і     і       і              і
ГДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДЕДДДДЕДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і01 /r   іSUB r/m16,r16  і1/3 і2/7 і2/7  і3/16+EAіВычитание  ре-і
і        і               і    і    і     і       ігистра  разме-і
і        і               і    і    і     і       іром в слово изі
і        і               і    і    і     і       іслова r/m.    і
і        і               і    і    і     і       і              і
ГДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДЕДДДДЕДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і01 /r   іSUB r/m32,r32  і1/3 і2/7 і     і       іВычитание  ре-і
і        і               і    і    і     і       ігистра  разме-і
і        і               і    і    і     і       іром в  двойноеі
і        і               і    і    і     і       іслово из  сло-і
і        і               і    і    і     і       іва r/m.       і
і        і               і    і    і     і       і              і
ГДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДЕДДДДЕДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і02 /r   іSUB r8,r/m8    і1/2 і2/6 і2/7  і3/9+EA іВычитание бай-і
і        і               і    і    і     і       іта r/m из  ре-і
і        і               і    і    і     і       ігистра  разме-і
і        і               і    і    і     і       іром в байт.   і
і        і               і    і    і     і       і              і
ГДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДЕДДДДЕДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і03 /r   іSUB r16,r/m16  і1/2 і2/6 і2/7  і3/9+EA іВычитание бай-і
і        і               і    і    і     і       іта r/m из  ре-і
і        і               і    і    і     і       ігистра  разме-і
і        і               і    і    і     і       іром в слово.  і
і        і               і    і    і     і       і              і
ГДДДДДДДДЕДДДДДДДДДДДДДДДЕДДДДЕДДДДЕДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
і03 /r   іSUB r32,r/m32  і1/2 і2/6 і     і       іВычитание бай-і
і        і               і    і    і     і       іта r/m из  ре-і
і        і               і    і    і     і       ігистра  разме-і
і        і               і    і    і     і       іром  в двойноеі
і        і               і    і    і     і       іслово.        і
і        і               і    і    і     і       і              і
АДДДДДДДДБДДДДДДДДДДДДДДДБДДДДБДДДДБДДДДДБДДДДДДДБДДДДДДДДДДДДДДЩ

     Операция SUB выполняет целочисленное вычитание двух  операн-
дов (второго операнда, источника, из первого, приемника). Резуль-
тат вычитания присваивается первому операнду. Соответствующим об-
разом устанавливаются флаги.

     Когда непосредственное  байтовое значение вычитается из опе-
ранда размером в слово,  то оно расширяется по знаку  до  размера
операнда-приемника.

TEST      Логическое сравнение.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C
          0                          *      *      ?      *     0

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод      Инструкция  Такты             Описание                і
іоперации                                                       і
ГДДДДДДДДВДДДДДДДДДДДДДВДДДВДДДВДДДВДДДВДДДДДДДДДДДДДДДДДДДДДДДДґ
і        і             і486і386і286і86 і                        і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
іA8 ib   іTEST AL,imm8 і1  і2  і3  і4  іОперация И над непосред-і
і        і             і   і   і   і   іственным байтом и AL.   і
і        і             і   і   і   і   і                        і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
іA9 iw   іTEST AX,imm16і1  і2  і3  і4  іОперация И над непосред-і
і        і             і   і   і   і   іственным байтом и AX.   і
і        і             і   і   і   і   і                        і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
іA9 id   іTEST EAX,    і1  і2  і   і   іОперация И над непосред-і
і        і     imm32   і   і   і   і   іственным двойным  словомі
і        і             і   і   і   і   іи EAX.                  і
і        і             і   і   і   і   і                        і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
іF6 /0 ibіTEST r/m8,   і1/2і2/5і3/6і5/ іОперация И над непосред-і
і        і     imm8    і   і   і   і11+іственным байтом и байтомі
і        і             і   і   і   іEA іr/m.                    і
і        і             і   і   і   і   і                        і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
іF7 /0 iwіTEST r/m16,  і1/2і2/5і3/6і5/ іОперация И над непосред-і
і        і     imm16   і   і   і   і11+іственным словом и словомі
і        і             і   і   і   іEA іr/m.                    і
і        і             і   і   і   і   і                        і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
іF7 /0 idіTEST r/m32,  і1/2і2/5і   і   іОперация И над непосред-і
і        і     imm32   і   і   і   і   іственным двойным  словомі
і        і             і   і   і   і   іи двойным словом r/m.   і
і        і             і   і   і   і   і                        і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
і84 /r   іTEST r/m8,   і1/2і2/5і2/6і3/9іОперация И над регистромі
і        і     r8      і   і   і   і+EAіразмером в байт и байтомі
і        і             і   і   і   і   іr/m.                    і
і        і             і   і   і   і   і                        і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
і85 /r   іTEST r/m16,  і1/2і2/5і2/6і3/9іОперация И над регистромі
і        і     r16     і   і   і   і+EAіразмером в слово и  сло-і
і        і             і   і   і   і   івом r/m.                і
і        і             і   і   і   і   і                        і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
і85 /r   іTEST r/m32,  і1/2і2/5і   і   іОперация И над регистромі
і        і     r32     і   і   і   і   іразмером в двойное словоі
і        і             і   і   і   і   іи двойным словом r/m.   і
і        і             і   і   і   і   і                        і
АДДДДДДДДБДДДДДДДДДДДДДБДДДБДДДБДДДБДДДБДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Операция TEST вычисляет для двух операндом поразрядную логи-
ческую операцию И.  Каждый бит результата будет равен 1, если оба
соответствующих бита  операндом  равны 1.  В противном случае бит
равен 0.  Результат операции отбрасывается. Модифицируются только
флаги.

VERR      Проверка сегмента для чтения или записи (только для
VERW       защищенного режима процессоров 80286/386/486).
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C
                                            *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод      Инструкция  Такты         Описание                    і
іоперации                                                       і
ГДДДДДДДДВДДДДДДДДДДВДДДДДВДДДДДВДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і        і          і486  і386  і286і                           і
ГДДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF 00 /4іVERR r/m16і11/11іpm=  і14/іУстанавливает  ZF = 1, еслиі
і        і          і     і10/11і16 ісегмент доступен для чтенияі
і        і          і     і     і   і                           і
ГДДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF 00 /5іVERW r/m16і11/11іpm=  і14/іУстанавливает  ZF = 1, еслиі
і        і          і     і10/11і16 ісегмент доступен для записиі
і        і          і     і     і   і                           і
АДДДДДДДДБДДДДДДДДДДБДДДДДБДДДДДБДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Двухбайтовый регистр или операнд в  памяти  инструкции  VERR
или VERW  содержит  значение селектора.  Инструкции VERR или VERW
определяют, доступен ли сегмент, описанный селектором, из текуще-
го привилегированного уровня,  и можно ли для него выполнять чте-
ние (VERR) или запись (VERW). Если сегмент доступен, то флаг нуля
устанавливается в 1,  а если сегмент недоступен, то флаг нуля ус-
танавливается в 0.  Чтобы установить флаг ZF,  должны соблюдаться
следующие условия:

     - Cелектор  должен  обозначать дескриптор в границах таблицы
       (GDT или LDT). Селектор должен быть "определен".

     - Селектор должен описывать  дескриптор  сегмента  кода  или
       данных  (а не быть дескриптором сегмента состояния задачи,
       LDT или вентиля).

     - Для инструкции VERR сегмент должен быть доступен  по  чте-
       нию.  Для  инструкции VERW сегмент должен быть доступен по
       записи (сегмент данных).

     - Если сегмент кода доступен по чтению и удовлетворяет усло-
       виям, уровень привилегий дескриптора (DPL) может иметь для
       инструкции VERR любое значение.  В  противном  случае  DPL
       должно  быть  больше  или  равно (иметь меньший или тот же
       уровень привилегий),  чем текущий уровень привилегий и RPL
       селектора.

     Проверка выполняется так же,  как если бы сегмент был загру-
жен в регистры DS,  ES, FS или GS и был выполнен указанный доступ
(чтение или запись).  Результат проверки определяет значение, ко-
торое получает флаг нуля.  Значение селектора не может дать в ре-
зультате исключительную ситуацию по нарушению защиты,  что позво-
ляет программному обеспечению  предвидеть  возможные  проблемы  с
доступом.

WAIT      Ожидание, пока разряд BUSY# будет неактивным.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод      Инструкция  Такты             Описание                і
іоперации                                                       і
ГДДДДДДДДВДДДДДДДДВДДДДДВДДДДВДДДДВДДДДВДДДДДДДДДДДДДДДДДДДДДДДДґ
і        і        і486  і386 і286 і86  і                        і
ГДДДДДДДДЕДДДДДДДДЕДДДДДЕДДДДЕДДДДЕДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
і9B      іWAIT    і1-3  і6   і3   і4+5nіОжидание,   пока  разряді
і        і        і     і    і    і    іBUSY# будет неактивным. і
АДДДДДДДДБДДДДДДДДБДДДДДБДДДДБДДДДБДДДДБДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция WAIT  приостанавливает  выполнение инструкций ЦП,
пока разряд BUSI# не станет неактивным.  Разряд BUSY# управляется
расширением арифметического сопроцессора 80х87.

WBINVD    Запись и запрещение кэш-буфера.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод     Инструкция Такты Описание                              і
іоперации                                                       і
ГДДДДДДДВДДДДДДДДДДВДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і       і          і486  і                                      і
ГДДДДДДДЕДДДДДДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF 09  іWBINVD    і5    іОбратная запись и запрещение всего кэші
і       і          і     і-буфера.                              і
АДДДДДДДБДДДДДДДДДДБДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Внутренний кэш-буфер сбрасывается, и выполняется специальный
функциональный цикл шины,  который указывает, что внешний кэш-бу-
фер должен  вывести свое содержимое обратно в оперативную память.
Затем следует другой специальный функциональный цикл шины, указы-
вающий на необходимость сброса всего кэш-буфера.

           Примечание: Эта  инструкция  зависит от реализации.  В
      будущих процессорах фирмы Intel ее функция может реализовы-
      ваться  по-разному.  Ответственность за обратную запись со-
      держимого внешнего кэш-буфера и индикацию сброса возлагает-
      ся на аппаратные средства.

XADD      Обмен и сложение (только для процессора i486).
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C
          *                          *      *      *      *     *

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод     Инструкция    Такты Описание                           і
іоперации                                                       і
ГДДДДДДДВДДДДДДДДДДДДДДВДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і       і              і486і                                    і
ГДДДДДДДЕДДДДДДДДДДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF C0/rіXADD r/m8,r8  і3/4іВыполняет обмен содержимого регистраі
і       і              і   іразмером в байт и байта  r/m. Загру-і
і       і              і   іжает сумму в  байт r/m.             і
і       і              і   і                                    і
ГДДДДДДДЕДДДДДДДДДДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF C1/rіXADD r/m16,r16і3/4іВыполняет обмен содержимого регистраі
і       і              і   іразмером в слово и  слов r/m. Загру-і
і       і              і   іжает сумму в слово r/m.             і
і       і              і   і                                    і
ГДДДДДДДЕДДДДДДДДДДДДДДЕДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іOF C1/rіXADD r/m32,r32і3/4іВыполняет обмен содержимого регистраі
і       і              і   іразмером в двойное слово и  двойногоі
і       і              і   іслова r/m. Загружает сумму в двойноеі
і       і              і   іслово r/m.                          і
і       і              і   і                                    і
АДДДДДДДБДДДДДДДДДДДДДДБДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

      Инструкция XADD загружает приемник в источник, затем загру-
жает сумму приемника и исходного значения источника в приемник.

     Исключительные ситуации защищенного режима: #GP(0), если ре-
зультат находится в сегменте,  недоступном для записи; #GP(0) при
всех недопустимых операндах действующего адреса в  сегментах  CS,
DS, ES,  FS или GS; #SS(0) при недопустимом адресе в сегменте SS;
#PF (сбой) при страничном сбое;  #NM,  если в CR0 установлены  EM
или TS; #AC при невыровненной ссылке на память, если текущий уро-
вень привилегий равен 3.

     Прерывания режима  реальной адресации:  прерывание 13,  если
любая часть операнда лежит вне действующего пространства  адресов
(от 0 до 0FFFFh).

     Прерывания виртуального режима 8086:  те  же  исключительные
ситуации, что и в режиме реальной адресации; те же исключительные
ситуации #PF и #AC, что и в защищенном режиме.

XCHG      Обмен содержимого памяти/регистра с регистром.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод      Инструкция   Такты Описание                           і
іоперации                                                       і
ГДДДДДДВДДДДДДДДДДДДДДВДДДВДДДВДДДВДДДДДДВДДДДДДДДДДДДДДДДДДДДДДґ
і      і              і486і386і286і86    і                      і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДґ
і86 /r іXCHG r/m8,r8  і3/4і3/5і3/5і4/17+ іВыполняет обмен содер-і
і      і              і   і   і   іEA    іжимого регистра разме-і
і      і              і   і   і   і      іром в байт и байта EA.і
і      і              і   і   і   і      і                      і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДґ
і86 /r іXCHG r8,r/m8  і3/4і3/5і3/5і4/17+ іВыполняет обмен содер-і
і      і              і   і   і   іEA    іжимого байта EA и  ре-і
і      і              і   і   і   і      ігистра   размером    ві
і      і              і   і   і   і      ібайт.                 і
і      і              і   і   і   і      і                      і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДґ
і87 /r іXCHG r/m16,r16і3/4і3/5і3/5і4/17+ іВыполняет обмен содер-і
і      і              і   і   і   іEA    іжимого регистра разме-і
і      і              і   і   і   і      іром  в  слово  и словаі
і      і              і   і   і   і      іEA.                   і
і      і              і   і   і   і      і                      і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДґ
і87 /r іXCHG r/m32,r32і3/4і3/5і   і      іВыполняет обмен содер-і
і      і              і   і   і   і      іимого регистра  разме-і
і      і              і   і   і   і      іром  в  двойное  словоі
і      і              і   і   і   і      іи двойного слова EA.  і
і      і              і   і   і   і      і                      і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДґ
і87 /r іXCHG r32,r/m32і3/4і3/5і   і      іВыполняет обмен содер-і
і      і              і   і   і   і      іимого регистра  разме-і
і      і              і   і   і   і      іром  в  двойное  словоі
і      і              і   і   і   і      іи двойного слова EA.  і
і      і              і   і   і   і      і                      і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДґ
і90+r  іXCHG AX,r16   і3  і3  і3  і3     іВыполняет обмен содер-і
і      і              і   і   і   і      іжимого регистра  AX  иі
і      і              і   і   і   і      іслова.                і
і      і              і   і   і   і      і                      і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДґ
і90+r  іXCHG r16,AX   і3  і3  і3  і3     іВыполняет обмен содер-і
і      і              і   і   і   і      іжимого регистра  AX  иі
і      і              і   і   і   і      іслова.                і
і      і              і   і   і   і      і                      і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДґ
і90+r  іXCHG EAX,r32  і3  і3  і   і      іВыполняет обмен содер-і
і      і              і   і   і   і      іжимого регистра EAX  иі
і      і              і   і   і   і      ідвойного слова.       і
і      і              і   і   і   і      і                      і
ГДДДДДДЕДДДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДґ
і90+r  іXCHG r32,EAX  і3  і3  і   і      іВыполняет обмен содер-і
і      і              і   і   і   і      іжимого регистра EAX  иі
і      і              і   і   і   і      ідвойного слова.       і
і      і              і   і   і   і      і                      і
АДДДДДДБДДДДДДДДДДДДДДБДДДБДДДБДДДБДДДДДДБДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция XCHG выполняет обмен содержимого  двух операндов.
Операнды могут следовать в любом порядке.  Если используется опе-
ранд в памяти,  то на время выполнения операции выдается BUS LOCK
(блокировка шины),  независимо от наличия или отсутствия префикса
LOCK или значения IOPL.

XLAT     Трансляция таблицы.
 XLATB    ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод      Инструкция       Такты      Описание                  і
іоперации                                                       і
ГДДДДДДДДВДДДДДДДДДДДДВДДДВДДДВДДДВДДВДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і        і            і486і386і286і86і                          і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іD7      іXLAT m8     і4  і5  і5  і11іУстанавливает  AL  в  байті
і        і            і   і   і   і  іпамяти DS:[(E)BX+беззнако-і
і        і            і   і   і   і  івое значение AL].         і
і        і            і   і   і   і  і                          і
ГДДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДЕДДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іD7      іXLATB       і4  і5  і5  і11іУстанавливает  AL  в  байті
і        і            і   і   і   і  іпамяти DS:[(E)BX+беззнако-і
і        і            і   і   і   і  івое значение AL].         і
і        і            і   і   і   і  і                          і
АДДДДДДДДБДДДДДДДДДДДДБДДДБДДДБДДДБДДБДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Инструкция XLAT изменяет значение регистра AL в соответствии
со значением индекса и записью таблицы.  AL  должен  представлять
собой беззнаковый  индекс с таблице,  адресуемой через DS:BX (для
атрибута размера адреса 16 бит) или через  DS:EBX  (для  атрибута
размера адреса 32 бита).

     Операнд инструкции  XLAT допускает переопределение сегмента.
Инструкция XLAT использует содержимое регистра BX, если оно отли-
чается от смещения операнда.  Смещение операнда должно помещаться
в BX/EBX предыдущей инструкцией.

     Если таблица BX/EBX всегда будет находиться в  сегменте  DS,
то можно использовать форму инструкции без операнда XLATB.

XOR       Логическая операция "исключающее ИЛИ"
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          O     D      I      T      S      Z      A      P     C
          0                          *      *      ?      *     0

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іКод      Инструкция        Такты     Описание                  і
іоперации                                                       і
ГДДДДДДДДВДДДДДДДДДДДДДВДДДВДДДВДДДВДДВДДДДДДДДДДДДДДДДДДДДДДДДДґ
і        і             і486і386і286і86і                         і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДВБДВБДДДДДДДДДДДДДДДДДДДДДДДДДґ
і34 ib   іXOR AL,imm8  і1  і2  і3 і4 іОперация "исключающее ИЛИ"і
і        і             і   і   і  і  інад непосредственным  бай-і
і        і             і   і   і  і  ітом и AL.                 і
і        і             і   і   і  і  і                          і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і35 iw   іXOR AX,imm16 і1  і2  і3 і4 іОперация "исключающее ИЛИ"і
і        і             і   і   і  і  інад непосредственным  сло-і
і        і             і   і   і  і  івом и AX.                 і
і        і             і   і   і  і  і                          і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і80 iw   іXOR EAX,imm32і1  і2  і  і  іОперация "исключающее ИЛИ"і
і        і             і   і   і  і  інад непосредственным двой-і
і        і             і   і   і  і  іным словом и EAX.         і
і        і             і   і   і  і  і                          і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і80 /6 ibіXOR r/m8,imm8і1/3і2/7і3/і7/іОперация "исключающее ИЛИ"і
і        і             і   і   і7 і17інад непосредственным  бай-і
і        і             і   і   і  іEAітом и байтом r/m.         і
і        і             і   і   і  і  і                          і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і81 /6 iwіXOR r/m16,   і1/3і2/7і3/і7/іОперация "исключающее ИЛИ"і
і        і    imm16    і   і   і7 і17інад непосредственным  сло-і
і        і             і   і   і  іEAівом и словом r/m.         і
і        і             і   і   і  і  і                          і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і81 /6 idіXOR r/m32,   і1/3і2/7і  і  іОперация "исключающее ИЛИ"і
і        і    imm32    і   і   і  і  інад непосредственным двой-і
і        і             і   і   і  і  іным словом  и двойным сло-і
і        і             і   і   і  і  івом r/m.                  і
і        і             і   і   і  і  і                          і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і83 /6 ibіXOR r/m32,   і1/3і2/7і  і  іОперация "исключающее ИЛИ"і
і        і    imm8     і   і   і  і  інад непосредственным  рас-і
і        і             і   і   і  і  іширяемым по знаку словом иі
і        і             і   і   і  і  ідвойным словом r/m.       і
і        і             і   і   і  і  і                          і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і30 /r   іXOR r/m8,r8  і1/3і2/6і2/і3/іОперация "исключающее ИЛИ"і
і        і             і   і   і7 і16інад регистром  размером  ві
і        і             і   і   і  іEAібайт и байтом r/m.        і
і        і             і   і   і  і  і                          і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і31 /r   іXOR r/m16,r16і1/3і2/6і2/і3/іОперация "исключающее ИЛИ"і
і        і             і   і   і7 і16інад регистром  размером  ві
і        і             і   і   і  іEAіслово и словом r/m.       і
і        і             і   і   і  і  і                          і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і31 /r   іXOR r/m32,r32і1/3і2/6і  і  іОперация "исключающее ИЛИ"і
і        і             і   і   і  і  інад регистром  размером  ві
і        і             і   і   і  і  ідвойное  слово  и  двойнымі
і        і             і   і   і  і  ісловом r/m.               і
і        і             і   і   і  і  і                          і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і32 /r   іXOR r8,r/m8  і1/2і2/7і2/і3/іОперация "исключающее ИЛИ"і
і        і             і   і   і7 і9+інад регистром  размером  ві
і        і             і   і   і  іEAібайт и байтом r/m.        і
і        і             і   і   і  і  і                          і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і33 /r   іXOR r16,r/m16і1/2і2/7і2/і3/іОперация "исключающее ИЛИ"і
і        і             і   і   і7 і9+інад регистром  размером  ві
і        і             і   і   і  іEAіслово и словом r/m.       і
і        і             і   і   і  і  і                          і
ГДДДДДДДДЕДДДДДДДДДДДДДЕДДДЕДДДЕДДЕДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і33 /r   іXOR r32,r/m32і1/2і2/7і  і  іОперация "исключающее ИЛИ"і
і        і             і   і   і  і  інад регистром  размером  ві
і        і             і   і   і  і  ідвойное  слово  и  двойнымі
і        і             і   і   і  і  ісловом r/m.               і
і        і             і   і   і  і  і                          і
АДДДДДДДДБДДДДДДДДДДДДДБДДДБДДДБДДБДДБДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Операция XOR вычисляет операцию "исключающее ИЛИ"  над двумя
операндами. Каждый  бит результата равен 1,  если соответствующие
биты операндов различны, и нулю, если соответствующие биты совпа-
дают. Результат замещает первый операнд.

              Часть 5. Инструкции сопроцессора
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

     В этой части в  алфавитном  порядке  описываются  инструкции
сопроцессора 80х87.

     Запись для  каждой  комбинации  типов операндов кодируется с
помощью мнемоники.В приведенной ниже таблице поясняются идентифи-
каторы операндов, используемые в данном руководстве.

ЪДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і Идентификатор         і  Пояснение                            і
ГДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і ST                    і Вершина стека; регистр, находящийся  ві
і                       і данный момент в вершине стека.        і
і                       і                                       і
ГДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і ST(1)                 і Регистр в стеке с номером i (i<=0<=7),і
і                       і считая от вершины (i-й элемент). ST(1)і
і                       і - это следующий элемент в стеке, ST(2)і
і                       і находится ниже ST(2) и т.д.           і
і                       і                                       і
ГДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і Короткое вещественное і Короткое вещественное (32 бита)  числоі
і                       і в памяти.                             і
і                       і                                       і
ГДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і Длинное вещественное  і Длинное вещественное (64 бита) число ві
і                       і памяти.                               і
і                       і                                       і
ГДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і Временное вещественноеі Временное вещественное (80 бит)  числоі
і                       і памяти.                               і
і                       і                                       і
ГДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і Упакованное десятичноеі Упакованное десятичное целое (18 цифр,і
і                       і 10 байт) в памяти.                    і
і                       і                                       і
ГДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і Целое размером в словоі Двоичное целое размером  в  слово  (16і
і                       і бит).                                 і
і                       і                                       і
ГДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і Короткое целое        і Двоичное короткое  целое  (32 бита)  ві
і                       і памяти.                               і
і                       і                                       і
ГДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і Длинное целое         і Двоичное  длинное  целое  (64 бита)  ві
і                       і памяти.                               і
і                       і                                       і
ГДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і  nn байт              і   Область памяти размером nn байт.    і
АДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Приведем перечень возможных исключительных ситуаций, которые
могут возникать в инструкциях:

     - IS = недопустимый операнд из-за переполнения/потери значи-
       мости стека.

     - I = операнд, недопустимый по другой причине.

     - D = ненормализованный операнд.

     - Z = деление на ноль.

     - O = переполнение.

     - U = потеря значимости.

     - P = неточный результат (точность).

F2XM1     Вычисление 2^x - 1.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: P, U, D, I, S.

          F2XM1 (без операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды    Такты выполнения             Байты кода  Пример    і
ГДДДДДДДДДДДДДДВДДДДВДДДДДДДВДДДДДДДВДДДДДДДДДДДДВДДДВДДДДДДДДДДґ
і              і87  і287    і387    і486         і   і          і
ГДДДДДДДДДДДДДДЕДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДДДДДДЕДДДЕДДДДДДДДДДґ
іНет операндов і    і211-476і211-476і242(140-279)і 2 іF2XM1     і
АДДДДДДДДДДДДДДБДДДДБДДДДДДДБДДДДДДДБДДДДДДДДДДДДБДДДБДДДДДДДДДДЩ

FABS      Абсолютное значение.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I.

          FABS (без операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды    Такты выполнения             Байты кода  Пример    і
ГДДДДДДДДДДДДДДВДДДДДВДДДДДВДДДДДДВДДДДДДДДДДДДДДВДДВДДДДДДДДДДДґ
і              і87   і287  і387   і 486          і  і           і
ГДДДДДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДЕДДЕДДДДДДДДДДДґ
ГНет операндов і10-11і10-17і22    і 3            і2 іF2XM1      і
АДДДДДДДДДДДДДДБДДДДДБДДДДДБДДДДДДБДДДДДДДДДДДДДДБДДБДДДДДДДДДДДЩ

FADD      Целочисленное сложение.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D, O, U, P.

          FADD //источник/приемник, источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды    Такты выполнения        Байты кода  Пример         і
ГДДДДДДДДДДДДДДВДДДДДДВДДДДДДВДДДДДВДДДДДДДДВДДДВДДДДДДДДДДДДДДДґ
і              і87    і287   і387  і486     і   і               і
ГДДДДДДДДДДДДДДЕДДДДДДЕДДДДДДЕДДДДДЕДДДДДДДДЕДДДЕДДДДДДДДДДДДДДДґ
і//ST,ST(i)/   і70-100і70-100і23-34і10(8-20)і2  іFADD ST,ST(4)  і
іST(i),ST      і      і      і     і        і   і               і
і              і      і      і     і        і   і               і
ГДДДДДДДДДДДДДДЕДДДДДДЕДДДДДДЕДДДДДЕДДДДДДДДЕДДДЕДДДДДДДДДДДДДДДґ
іКороткое целоеі90-120і90-120і24-32і10(8-20)і2-4іFADD AIR_TP[SI]і
і              і+EA   і      і     і        і   і               і
і              і      і      і     і        і   і               і
ГДДДДДДДДДДДДДДЕДДДДДДЕДДДДДДЕДДДДДЕДДДДДДДДЕДДДЕДДДДДДДДДДДДДДДґ
іДлинное целое і95-125і95-125і29-37і10(8-20)і2-4іFADD [BX],MEAN і
і              і+EA   і      і     і        і   і               і
і              і      і      і     і        і   і               і
АДДДДДДДДДДДДДДБДДДДДДБДДДДДДБДДДДДБДДДДДДДДБДДДБДДДДДДДДДДДДДДДЩ

FADDP     Сложение вещественных чисел и извлечение из стека.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D, O, U, P.

          FADDP приемник, источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды    Такты выполнения        Байты кода  Пример         і
ГДДДДДДДДДДДДДВДДДДДДДВДДДДДДВДДДДДВДДДДДДДДВДДДВДДДДДДДДДДДДДДДґ
і             і 87    і287   і387  і486     і   і               і
ГДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДДДЕДДДДДДДДЕДДДЕДДДДДДДДДДДДДДДґ
іST,ST(i)     і 75-105і75-105і23-34і10(8-20)і2  іFADDP ST(2),ST і
АДДДДДДДДДДДДДБДДДДДДДБДДДДДДБДДДДДБДДДДДДДДБДДДБДДДДДДДДДДДДДДДЩ

FBLD      Упакованная десятичная загрузка (BCD).
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I.

          FADDP источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды   Такты выполнения             Байты кода Пример      і
ГДДДДДДДДДДДДВДДДДДДДДВДДДДДДДВДДДДВДДДДДДДДДДВДДДДВДДДДДДДДДДДДґ
і            і 87     і287    і387 і486       і    і            і
ГДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДДДЕДДДДЕДДДДДДДДДДДДґ
іУпакованный і 290-310і290-310і5   і75(70-103)і2-4 іFBLD YDT_SALі
ідесятичный  і        і       і    і          і    і            і
АДДДДДДДДДДДДБДДДДДДДДБДДДДДДДБДДДДБДДДДДДДДДДБДДДДБДДДДДДДДДДДДЩ

FBSTP     Запись упакованного десятичного значения (BCD) и
           извлечение из стека.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I.

          FBSTP источник
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды     Такты выполнения              Байты кода Пример   і
ГДДДДДДДДДДДВДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДДДДДДВДДДДДДДДДДДДДґ
і           і 87     і287    і387    і486         і             і
ГДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДДДДДДЕДДДДДДДДДДДДДґ
іУпакованныйі 520-540і512-534і512-534і175(172-176)і2-4 FBSTR    і
ідесятичный і +EA    і+EA    і       і            і    [BX],CASTі
АДДДДДДДДДДДБДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДДДДДДБДДДДДДДДДДДДДЩ

FCHS      Изменение знака.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I.

          FCHS (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения        Байты кода  Пример      і
ГДДДДДДДДДДДДДВДДДДДДВДДДДДДВДДДДДДВДДДДДДВДДДДВДДДДДДДДДДДДДДДДґ
і             і 87   і 287  і 387  і486   і    і                і
ГДДДДДДДДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДДДґ
іНет операндові 10-17і 10-17і 24-25і6     і  2 і FCHS           і
АДДДДДДДДДДДДДБДДДДДДБДДДДДДБДДДДДДБДДДДДДБДДДДБДДДДДДДДДДДДДДДДЩ

FCLEX     Очистка исключительных прерываний.
FNCLEX    ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: нет.

          FCLEX/FNCLEX (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения        Байты кода Пример       і
ГДДДДДДДДДДДДДВДДДДДВДДДДДДДВДДДДДВДДДДДДДДДДДДДДВДДДДДДДДДДДДДДґ
і             і 87  і  287  і 387 і 486          і              і
ГДДДДДДДДДДДДДЕДДДДДЕДДДДДДДЕДДДДДЕДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДґ
іНет операндові 2-8 і  2-8  і 11  і 7            і FNCLEX       і
АДДДДДДДДДДДДДБДДДДДБДДДДДДДБДДДДДБДДДДДДДДДДДДДДБДДДДДДДДДДДДДДЩ

FCOM      Сравнение вещественных чисел.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D.

          FCOM//источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения        Байты кода Пример       і
ГДДДДДДДДДДДДДВДДДДДДВДДДДДДВДДДДДВДДДДДВДДДДДДДДВДДДДДДДДДДДДДДґ
і             і 87   і 287  і 387 і 486 і        і              і
ГДДДДДДДДДДДДДЕДДДДДДЕДДДДДДЕДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДґ
і//ST(i)      і 40-50і 40-50і 24  і 4   і        і FCOM ST(1)   і
і             і      і      і     і     і        і              і
ГДДДДДДДДДДДДДЕДДДДДДЕДДДДДДЕДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДґ
іКороткий     і 60-70і 60-70і 26  і 4   і 2-4    і FCOM [BP],   і
івещественный і +EA  і      і     і     і        і UPPER_LIMIT  і
і             і      і      і     і     і        і              і
ГДДДДДДДДДДДДДЕДДДДДДЕДДДДДДЕДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДґ
іДлинный      і 65-75і 65-75і 31  і 4   і 2-4    і FCOM LENGTH1 і
івещественный і +EA  і      і     і     і        і              і
і             і      і      і     і     і        і              і
АДДДДДДДДДДДДДБДДДДДДБДДДДДДБДДДДДБДДДДДБДДДДДДДДБДДДДДДДДДДДДДДЩ

FCOMP     Сравнение вещественных чисел и извлечение из стека.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D.

          FCOMP//источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения        Байты кода Пример       і
ГДДДДДДДДДДДДДВДДДДДДДВДДДДДВДДДДДВДДДДДВДДДДДДДДВДДДДДДДДДДДДДДґ
і             і 87    і287  і 387 і 486 і        і              і
ГДДДДДДДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДґ
і//ST(i)      і 42-52 і45-52і 26  і 4   і 2      і FCOM ST(2)   і
і             і       і     і     і     і        і              і
ГДДДДДДДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДґ
іКороткий     і 63-73 і63-73і 26  і 4   і 2-4    і FCOM [BP+2], і
івещественный і +EA   і     і     і     і        і LIMIT_1      і
і             і       і     і     і     і        і              і
ГДДДДДДДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДґ
іДлинный      і 67-77 і67-77і 31  і 4   і 2-4    і FCOMP DENSITYі
івещественный і +EA   і     і     і     і        і              і
і             і       і     і     і     і        і              і
АДДДДДДДДДДДДДБДДДДДДДБДДДДДБДДДДДБДДДДДБДДДДДДДДБДДДДДДДДДДДДДДЩ

FCOMPP    Сравнение вещественных чисел и извлечение из стека
          дважды.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D.

          FCOMPP (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения        Байты кода  Пример      і
ГДДДДДДДДДДДДДВДДДДДДДВДДДДДДВДДДДВДДДДДДВДДДДДДДДДВДДДДДДДДДДДДґ
і             і 87    і287   і387 і 486  і         і            і
ГДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДЕДДДДЕДДДДДДЕДДДДДДДДДЕДДДДДДДДДДДДґ
іНет операндові 45-55 і45-55 і26  і 5    і 2       іFCOMPP      і
АДДДДДДДДДДДДДБДДДДДДДБДДДДДДБДДДДБДДДДДДБДДДДДДДДДБДДДДДДДДДДДДЩ

FCOS      Косинус ST(0) (только для процессоров 387 и i486).
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: IS, I, D, U, P.

          FCOS

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения        Байты кода  Пример      і
ГДДДДДДДДДДДДДВДДДДДДДВДДДДДДДДВДДДДДДДДДДДДВДДДДДДВДДДДДДДДДДДДґ
і             і 87 287і387     і486         і      і            і
ГДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДЕДДДДДДЕДДДДДДДДДДДДґ
іНет операндові       і123-772*і241(193-279)і2     іFCOS        і
АДДДДДДДДДДДДДБДДДДДДДБДДДДДДДДБДДДДДДДДДДДДБДДДДДДБДДДДДДДДДДДДЩ

     * Эти временные значения соблюдаются в диапазоне /x/ /4. Для
операндов, не лежащих в данном диапазоне,  для уменьшение операн-
дов может потребоваться до 76 дополнительных тактов.

FDECSTP   Уменьшение указателя стека.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: нет.

          FDECSTP (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения        Байты кода  Пример      і
ГДДДДДДДДДДДДДВДДДДДВДДДДВДДДВДДДДДДДДВДДДДДДДДДДДДВДДДДДДДДДДДДґ
і             і 87  і287 і387і486     і            і            і
ГДДДДДДДДДДДДДЕДДДДДЕДДДДЕДДДЕДДДДДДДДЕДДДДДДДДДДДДЕДДДДДДДДДДДДґ
іНет операндові 6-12і6-12і22 і3       і      2     іFDECSTP     і
АДДДДДДДДДДДДДБДДДДДБДДДДБДДДБДДДДДДДДБДДДДДДДДДДДДБДДДДДДДДДДДДЩ

FDISI    Запрещение прерывания (только для сопроцессора 8087).
 FNDISI   ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: нет.

          FDISI (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения:    Слово     Байты  Пример    і
і               Типичное  Диапазон   операнда  кода             і
і               значение                                        і
ГДДДДДДДДДДДДДВДДДДДДДДДВДДДДДДДДДДВДДДДДДДДДВДДДДДДВДДДДДДДДДДДґ
іНет операндові 5       і2-8       і 0       і 2    іFDISI      і
АДДДДДДДДДДДДДБДДДДДДДДДБДДДДДДДДДДБДДДДДДДДДБДДДДДДБДДДДДДДДДДДЩ

FDIV      Деление вещественных чисел.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D, Z, O, U, P.

          FDIV //источник/приемник, источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения        Байты кода Пример       і
ГДДДДДДДДДДДДДВДДДДДДДДВДДДДДДДВДДДДДВДДДДДВДДДДДДВДДДДДДДДДДДДДґ
і             і 87     і287    і387  і486  і      і             і
ГДДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДґ
і//ST(i),ST   і 193-203і193-203і88-91і73   і 2    іFDIV         і
і             і        і       і     і     і      і             і
ГДДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДґ
іКороткое     і 215-225і215-225і89   і73   і 2    іFDIV DISTANCEі
івещественное і        і       і     і     і      і             і
і             і        і       і     і     і      і             і
ГДДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДґ
іДлинное      і 220-230і220-230і94   і73   і 2-4  іFDIV ARC[DI] і
івещественное і        і       і     і     і      і             і
і//ST,ST(i)   і        і       і     і     і      і             і
і             і        і       і     і     і      і             і
АДДДДДДДДДДДДДБДДДДДДДДБДДДДДДДБДДДДДБДДДДДБДДДДДДБДДДДДДДДДДДДДЩ

FDIVP     Деление вещественных чисел и извлечение из стека.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D, Z, O, U, P.

          FDIVP приемник, источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды     Такты выполнения        Байты кода  Пример        і
ГДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДДДВДДДДДДВДДДДДДДДДДДДДДґ
і            і87     і287    і387  і486   і      і              і
ГДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДґ
і//ST(i),ST  і197-207і198-209і88-91і73    і2     іFDIVP ST(4),STі
АДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДДДБДДДДДДБДДДДДДДДДДДДДДЩ

FDIVR     Деление вещественных чисел с обращением.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D, Z, O, U, P.

          FDIVP //источник/приемник, источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения       Байты кода Пример        і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДДВДДДДДВДДДДДДДДДДДДДДґ
і              і87     і287    і387  і486  і     і              і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДДДДДДДґ
і//ST,ST(i)    і194-204і198-207і88-91і73   і 2   іFDIVR ST(2),STі
іST(i),ST      і       і       і     і     і     і              і
і              і       і       і     і     і     і              і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДДДДДДДґ
іКороткое целоеі216-226і215-225і89   і73   і 2-4 іFDIVR [BX],P_Rі
і              і+EA    і       і     і     і     і              і
і              і       і       і     і     і     і              і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДДДДДДДґ
іДлинное целое і221-231і220-230і94   і73   і 2-4 іFDIVR REC,FRECі
і              і+EA    і       і     і     і     і              і
і              і       і       і     і     і     і              і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДДБДДДДДБДДДДДДДДДДДДДДЩ

FDIVRP    Деление вещественных чисел с обращением и извлечение из
          стека.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D, Z, O, U, P.

          FDIVP приемник, источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды     Такты выполнения        Байты кода Пример         і
ГДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДДВДДДДДДВДДДДДДДДДДДДДДДґ
і            і87     і287    і387  і486  і      і               і
ГДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДґ
іST(i),ST    і198-208і198-208і88-91і73   і 2    іFDIVPR ST(1),STі
АДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДДБДДДДДДБДДДДДДДДДДДДДДДЩ

FENI     Разрешение прерываний (только для сопроцессора 8087).
 FNENI    ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: нет.

          FDIVP (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды        Такты выполнения        Байты кода  Пример     і
ГДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДДДДДґ
і               і87                         і       і           і
ГДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДДДДДґ
і(нет операндов)і5(2-8)                     і 2     іFNENI      і
АДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДДДДДЩ

FFREE     Освобождение регистра.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: нет.

          FFREE приемник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды        Такты выполнения       Байты кода  Пример      і
ГДДДДДДДДДДДДДДДВДДДДВДДДДВДДДВДДДДДДДДДДДДВДДДДДДДВДДДДДДДДДДДДґ
і               і87  і287 і387і486         і       і            і
ГДДДДДДДДДДДДДДДЕДДДДЕДДДДЕДДДЕДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДДДДДДґ
іST(i)          і9-16і9-16і18 і3           і 2     іFFREE ST(1) і
АДДДДДДДДДДДДДДДБДДДДБДДДДБДДДБДДДДДДДДДДДДБДДДДДДДБДДДДДДДДДДДДЩ

FIADD     Целочисленное сложение.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D, O, P.

          FFREE источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения         Байты кода  Пример     і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДВДДДДДДДДВДДДДВДДДДДДДДДДДґ
і              і87     і287    і387   і86      і    і           і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДЕДДДДДДДДЕДДДДЕДДДДДДДДДДДґ
іЦелое размеромі102-137і102-137і71-85 і2.5(19- і 2-4іFIADD ST_TRі
ів слово       і+EA    і       і      і2)      і    і           і
і              і       і       і      і        і    і           і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДЕДДДДДДДДЕДДДДЕДДДДДДДДДДДґ
іКороткое целоеі108-143і108-143і57-72 і4(20-35)і 2-4іFIADD N[SI]і
і              і+EA    і       і      і        і    і           і
і              і       і       і      і        і    і           і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДБДДДДДДДДБДДДДБДДДДДДДДДДДЩ

FICOM     Целочисленное сравнение.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D.

          FICOM источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения       Байты кода  Пример       і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДДДДДДВДДДВДДДДДДДДДДДДґ
і              і87     і287    і387  і486      і   і            і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДДДДЕДДДЕДДДДДДДДДДДДґ
іЦелое размеромі72-86  і72-86  і71-75і18(16-20)і2-4іFICOM T.PASSі
ів слово       і+EA    і       і     і         і   і            і
і              і       і       і     і         і   і            і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДДДДЕДДДЕДДДДДДДДДДДДґ
іКороткое целоеі108-143і108-143і57-72і24(20-35)і2-4іFICOM [BP+  і
і              і+EA    і       і     і         і   і 4].PARM_CNTі
і              і       і       і     і         і   і            і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДДДДДДБДДДБДДДДДДДДДДДДЩ

FICOMP    Целочисленное сравнение и извлечение из стека.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D.

          FICOMP источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды      Такты выполнения        Байты кода Пример        і
ГДДДДДДДДДДДДДДВДДДДДВДДДДДДВДДДДДДВДДДДДДДДДВДДДВДДДДДДДДДДДДДДґ
і              і87   і 287  і 387  і 486     і   і              і
ГДДДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДЕДДДЕДДДДДДДДДДДДДДґ
іЦелое размеромі74-88і74-88 і71-75 і18(16-20)і2-4іFICOMP T.PASS і
і слово        і+EA  і      і      і         і   і              і
і              і     і      і      і         і   і              і
ГДДДДДДДДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДЕДДДЕДДДДДДДДДДДДДДґ
іКороткое целоеі80-93і80-93 і56-63 і24(20-35)і2-4іFICOMP N_SAMPLі
і              і+EA  і      і      і         і   і              і
і              і     і      і      і         і   і              і
АДДДДДДДДДДДДДДБДДДДДБДДДДДДБДДДДДДБДДДДДДДДДБДДДБДДДДДДДДДДДДДДЩ

FIDIV     Деление целых чисел.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D, Z, O, U, P.

          FIDIV источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения      Байты кода  Пример        і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДВДДДВДДДДДДДДДДДДДДДДґ
і              і87     і287    і387    і486і   і                і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДґ
іЦелое размеромі224-238і224-238і136-140і73 і2-4іFIDIV SURV.OBS  і
ів слово       і+EA    і       і       і   і   і                і
і              і       і       і       і   і   і                і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДґ
іКороткое      і230-243і230-243і120-127і73 і2-4іFIDIV REL_AN[DI]і
іцелое         і+EA    і       і       і   і   і                і
і              і       і       і       і   і   і                і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДБДДДБДДДДДДДДДДДДДДДДЩ

FIDIVR    Деление целых чисел с обращением.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D, Z, O, U, P.

          FIDIVR источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения      Байты кода  Пример        і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДВДДДВДДДДДДДДДДДДДДДДґ
і              і87     і287    і387    і486і   і                і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДґ
іЦелое размеромі225-239і224-238і135-141і73 і2-4іFIDIV [BP].X_CODі
ів слово       і+EA    і       і       і   і   і                і
і              і       і       і       і   і   і                і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДЕДДДЕДДДДДДДДДДДДДДДДґ
іКороткое      і231-245і230-243і121-128і73 і2-4іFIDIV FREQUENCY і
іцелое         і+EA    і       і       і   і   і                і
і              і       і       і       і   і   і                і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДБДДДБДДДДДДДДДДДДДДДДЩ

FILD      Загрузка целого.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I.

          FILD источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды     Такты выполнения     Байты кода  Пример           і
ГДДДДДДДДДДДДВДДДДДВДДДДДВДДДДДВДДДДДДДДДДДВДДДВДДДДДДДДДДДДДДДДґ
і            і87   і287  і387  і486        і   і                і
ГДДДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДДДДЕДДДЕДДДДДДДДДДДДДДДДґ
іЦелое разме-і42-54і46-54і61-65і11.5(9-12) і2-4іFILD [BX].SEQ   і
іром в слово і+EA  і     і     і           і   і                і
і            і     і     і     і           і   і                і
ГДДДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДДДДЕДДДЕДДДДДДДДДДДДДДДДґ
іКороткое    і52-60і52-60і45-52і14.5(13-16)і2-4іFILD STNDOFF[DI]і
іцелое       і+EA  і     і     і           і   і                і
і            і     і     і     і           і   і                і
ГДДДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДДДДДЕДДДЕДДДДДДДДДДДДДДДДґ
іДлинное     і60-68і60-68і56-67і16.8(10-18)і2-4іFILD RESP.COUNT і
іцелое       і+EA  і     і     і           і   і                і
і            і     і     і     і           і   і                і
АДДДДДДДДДДДДБДДДДДБДДДДДБДДДДДБДДДДДДДДДДДБДДДБДДДДДДДДДДДДДДДДЩ

FIMUL     Целочисленное умножение.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D, O, P.

          FIMUL источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения   Байты кода  Пример           і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДДДДДВДДДВДДДДДДДДДДДДДґ
і              і87     і287    і387  і486     і   і             і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДДДЕДДДЕДДДДДДДДДДДДДґ
іЦелое размеромі124-138і124-138і76-87і8       і2-4іFIMUL BEARINGі
ів слово       і+EA    і       і     і        і   і             і
і              і       і       і     і        і   і             і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДДДЕДДДЕДДДДДДДДДДДДДґ
іКороткое      і130-144і130-144і61-82і8       і2-4іFIMUL POS.Z_Rі
іцелое         і+EA    і       і     і        і   і             і
і              і       і       і     і        і   і             і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДДДДДБДДДБДДДДДДДДДДДДДЩ

FINCSTP   Увеличение указателя стека.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: нет.

          FINCSTP (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения     Байты кода  Пример         і
ГДДДДДДДДДДДДДДВДДДДДВДДДДДВДДДДДВДДДДДДВДДДДДДДДВДДДДДДДДДДДДДДґ
і              і87   і287  і387  і486   і        і              і
ГДДДДДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДґ
іНет операндов і6-12 і6-12 і21   і3     і 2      іFINCSTP       і
АДДДДДДДДДДДДДДБДДДДДБДДДДДБДДДДДБДДДДДДБДДДДДДДДБДДДДДДДДДДДДДДЩ

FINIT    Инициализация процессора.
 FNINIT   ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: нет.

          FINIT/FNNINIT (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения     Байты кода   Пример        і
ГДДДДДДДДДДДДДДВДДДДВДДДДДДВДДДДВДДДДДДДВДДДДДДДДВДДДДДДДДДДДДДДґ
і              і87  і 287  і387 і 486   і        і              і
ГДДДДДДДДДДДДДДЕДДДДЕДДДДДДЕДДДДЕДДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДДДґ
іНет операндов і2-8 і 2-8  і33  і 17    і 2      іFINIT         і
АДДДДДДДДДДДДДДБДДДДБДДДДДДБДДДДБДДДДДДДБДДДДДДДДБДДДДДДДДДДДДДДЩ

FIST      Запись целого значения.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, P.

          FIST приемник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения     Байты кода   Пример        і
ГДДДДДДДДДДДДДДВДДДДДВДДДДДВДДДДДВДДДДДДДВДДДДДДДВДДДДДДДДДДДДДДґ
і              і87   і287  і387  і486    і       і              і
ГДДДДДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
іЦелое значениеі80-90і80-95і82-95і33.4   і2-4    іFIST OBS.COUNTі
іразмером в    і+EA  і     і     і(29-34)і       і              і
іслово         і     і     і     і       і       і              і
і              і     і     і     і       і       і              і
ГДДДДДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДДДДДДДДґ
іКороткое целоеі82-92і82-92і79-93і32.4   і2-4    іFIST [BP].F_PUі
і              і+EA  і     і     і(28-34)і       і              і
і              і     і     і     і       і       і              і
АДДДДДДДДДДДДДДБДДДДДБДДДДДБДДДДДБДДДДДДДБДДДДДДДБДДДДДДДДДДДДДДЩ

FISTP     Запись целого значения и извлечение из стека.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, P.

          FISTP приемник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения     Байты кода Пример          і
ГДДДДДДДДДДДДДДВДДДДДВДДДДДВДДДДДВДДДДДДДВДДДДДВДДДДДДДДДДДДДДДДґ
і              і87   і287  і387  і486    і     і                і
ГДДДДДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДґ
іЦелое значениеі82-92і82-92і82-95і33.4   і2-4  іFISTP [BX].     і
іразмером в    і+EA  і     і     і(29-34)і     і ALPHA_COUNT[SI]і
іслово         і     і     і     і       і     і                і
і              і     і     і     і       і     і                і
ГДДДДДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДґ
іКороткое целоеі84-94і84-94і79-93і32.4   і2-4  іFISTP CORR_TIME і
і              і+EA  і     і     і(29-34)і     і                і
і              і     і     і     і       і     і                і
ГДДДДДДДДДДДДДДЕДДДДДЕДДДДДЕДДДДДЕДДДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДґ
іДлинное целое і94-  і94-  і80-97і32.4   і2-4  іFISTP PANEL.N_R і
і              і105+ і105  і     і(29-34)і     і                і
і              іEA   і     і     і       і     і                і
і              і     і     і     і       і     і                і
АДДДДДДДДДДДДДДБДДДДДБДДДДДБДДДДДБДДДДДДДБДДДДДБДДДДДДДДДДДДДДДДЩ

FISUB     Целочисленное вычитание.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D, O, P.

          FISUB приемник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения     Байты кода  Пример         і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДДДВДДДВДДДДДДДДДДДДДДДґ
і              і87     і287    і387  і486   і   і               і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДЕДДДЕДДДДДДДДДДДДДДДґ
іЦелое значениеі102-137і102-137і71-83і22.5  і2-4іFISUB BASE_FREQі
іразмером в    і+EA    і       і     і(19-32і   і               і
іслово         і       і       і     і      і   і               і
і              і       і       і     і      і   і               і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДЕДДДЕДДДДДДДДДДДДДДДґ
іКороткое целоеі108-143і108-143і57-82і24    і2-4іFISUB TR_SZ[DI]і
і              і+EA    і       і     і20-35)і   і               і
і              і       і       і     і      і   і               і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДДДБДДДБДДДДДДДДДДДДДДДЩ

FISUBR    Целочисленное вычитание с обращением.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D, O, P.

          FISUBR источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения    Байты кода  Пример          і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДДВДДДВДДДДДДДДДДДДДДДДґ
і              і87     і287    і387  і486  і   і                і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДЕДДДЕДДДДДДДДДДДДДДДДґ
іЦелое значениеі103-139і102-137і72-84і22.5 і2-4іFISUBR F[BX][SI]і
іразмером в    і+EA    і       і     і19-32і   і                і
іслово         і       і       і     і     і   і                і
і              і       і       і     і     і   і                і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДЕДДДЕДДДДДДДДДДДДДДДДґ
іКороткое целоеі109-144і108-143і58-83і24   і2-4іFISUBR BALANCE  і
і              і+EA    і       і     і20-35і   і                і
і              і       і       і     і     і   і                і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДДБДДДБДДДДДДДДДДДДДДДДЩ

FLD       Загрузка вещественного значения.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D.

          FLD источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения   Байты кода   Пример          і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДВДДДДДДДВДДДВДДДДДДДДДДДДДДДДґ
і              і87     і287    і387і486    і   і                і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДЕДДДДДДДЕДДДЕДДДДДДДДДДДДДДДДґ
іST(i)         і17-22  і17-22  і14 і4      і2  іFLD ST(0)       і
і              і       і       і   і       і   і                і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДЕДДДДДДДЕДДДЕДДДДДДДДДДДДДДДДґ
іКороткое целоеі38-56  і38-56  і20 і3      і2-4іFLD READ[SI].PRSі
і              і+EA    і       і   і       і   і                і
і              і       і       і   і       і   і                і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДЕДДДДДДДЕДДДЕДДДДДДДДДДДДДДДДґ
іДлинное целое і40-60  і40-60  і25 і3      і2-4іFLD [BP].TEMPR  і
і              і+EA    і       і   і       і   і                і
і              і       і       і   і       і   і                і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДЕДДДДДДДЕДДДЕДДДДДДДДДДДДДДДДґ
іВременное     і53-60  і53-65  і44 і6      і2-4іFLD SAVEREAD    і
іцелое         і+EA    і       і   і       і   і                і
і              і       і       і   і       і   і                і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДБДДДДДДДБДДДБДДДДДДДДДДДДДДДДЩ

FLDCTW    Загрузка слова управления.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: нет.

          FLDCW источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды     Такты выполнения     Байты кода   Пример          і
ГДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДВДДДДДДВДДДДДВДДДДДДДДДДДДДДДДґ
і            і87     і287    і387 і 486  і     і                і
ГДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДґ
і2 байта     і7-14+EAі7-14   і19  і 4    і  2-4іFLDCW CONTROL_W і
АДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДБДДДДДДБДДДДДБДДДДДДДДДДДДДДДДЩ

FLDENV    Загрузка операционной среды.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: нет.

          FLDENV источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды      Такты выполнения     Байты кода   Пример         і
ГДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДДДДДВДДВДДДДДДДДДДДДДДДґ
і             і87     і287    і387  і486     і  і               і
ГДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДДДЕДДЕДДДДДДДДДДДДДДДґ
і14 байт      і35-45+ і35-45  і71   і44      і2-іFLDENV [BP+6]  і
і             іEA     і       і     іреальныйі4 і               і
і             і       і       і     іили вир-і  і               і
і             і       і       і     ітуальныйі  і               і
і             і       і       і     і34 защи-і  і               і
і             і       і       і     іщенный  і  і               і
АДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДДДДДБДДБДДДДДДДДДДДДДДДЩ

FLDLG2    Загрузка log10 2.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I.

          FLDLG2 (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения     Байты кода   Пример        і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДДДВДДДДВДДДДДДДДДДДДДДґ
і              і87     і287    і387  і486   і    і              і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДґ
іНет операндов і18-24  і18-24  і41   і8     і2   іFLDLG2        і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДДДБДДДДБДДДДДДДДДДДДДДЩ

FLDLN2    Загрузка ln 2.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I.

          FLDLN2 (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения     Байты кода   Пример        і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДДДВДДДДВДДДДДДДДДДДДДДґ
і              і87     і287    і387  і486   і    і              і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДґ
іНет операндов і17-23  і17-23  і41   і8     і2   іFLDLN2        і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДДДБДДДДБДДДДДДДДДДДДДДЩ

FLDL2E    Загрузка log2 e.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I.

          FLDL2E (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения     Байты кода   Пример        і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДДДВДДДДВДДДДДДДДДДДДДДґ
і              і87     і287    і387  і486   і    і              і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДґ
іНет операндов і15-21  і15-21  і40   і8     і2   іFLDL2E        і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДДДБДДДДБДДДДДДДДДДДДДДЩ

FLDL2T    Загрузка log2 10.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I.

          FLDL2T (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения     Байты кода   Пример        і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДВДДДДДДВДДДДДДДДДДДДДДґ
і              і87     і287    і387  і486 і      і              і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДЕДДДДДДЕДДДДДДДДДДДДДДґ
іНет операндов і16-22  і16-22  і40   і8   і  2   іFLDL2T        і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДБДДДДДДБДДДДДДДДДДДДДДЩ

FLDPI     Загрузка числа Pi.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I.

          FLDPI (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения      Байты кода  Пример        і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДДДВДДДДВДДДДДДДДДДДДДДґ
і              і87     і287    і387  і486   і    і              і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДґ
іНет операндов і16-22  і16-22  і40   і8     і2   іFLDPI         і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДДДБДДДДБДДДДДДДДДДДДДДЩ

FLDZ      Загрузка +0.0.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I.

          FLDZ (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения      Байты кода  Пример        і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДДДВДДДДВДДДДДДДДДДДДДДґ
і              і87     і287    і387  і486   і    і              і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДґ
іНет операндов і11-27  і11-17  і20   і4     і2   іFLDZ          і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДДДБДДДДБДДДДДДДДДДДДДДЩ

FLD1      Загрузка +1.0.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I.

          FLD1 (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения      Байты кода  Пример        і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДДДВДДДДВДДДДДДДДДДДДДДґ
і              і87     і287    і387  і486   і    і              і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДґ
іНет операндов і15-21  і15-21  і24   і4     і2   іFLD1          і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДДДБДДДДБДДДДДДДДДДДДДДЩ

FMUL      Умножение вещественных чисел.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D, O, U, P.

          FMUL //источник/приемник, источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения      Байты кода Пример         і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДДВДДДДВДДДДДДДДДДДДДДДґ
і              і87     і287    і387  і486  і    і               і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДЕДДДДЕДДДДДДДДДДДДДДДґ
і//ST(i),ST/ST,і90-105 і90-145 і29-57і16   і 2  іFMUL ST,ST(3)  і
і90-105,ST(1)* і       і       і     і     і    і               і
і              і       і       і     і     і    і               і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДЕДДДДЕДДДДДДДДДДДДДДДґ
і//ST(i),ST/ST,і130-145і90-145 і29-57і16   і 2  іFMUL ST,ST(3)  і
іST,ST(1)      і       і       і     і     і    і               і
і              і       і       і     і     і    і               і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДЕДДДДЕДДДДДДДДДДДДДДДґ
іКороткое      і110-125і110-125і27-35і11   і 2-4іFMUL SPEED_FACTі
івещественное  і+EA    і       і     і     і    і               і
і              і       і       і     і     і    і               і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДЕДДДДЕДДДДДДДДДДДДДДДґ
іДлинное       і112-126і112-168і32-57і     і 2-4іFMUL [BP].HEIG і
івещественное* і+EA    і       і     і     і    і               і
і              і       і       і     і     і    і               і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДЕДДДДЕДДДДДДДДДДДДДДДґ
іДлинное       і154-168і112-168і32-57і     і 2-4іFMUL [BP].HEIG і
івещественное* і+EA    і       і     і     і    і               і
і              і       і       і     і     і    і               і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДДБДДДДБДДДДДДДДДДДДДДДЩ

     * -  когда  один из операндов "короткий" (в дробной части он
содержит 40 завершающих нулей,  например,  он был загружен из ко-
роткого вещественного операнда в памяти).

FMULP     Умножение вещественных чисел и извлечение из стека.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D, O, U, P.

          FMULP приемник, источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения      Байты кода  Пример        і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДДДВДДДДВДДДДДДДДДДДДДДґ
і              і87     і287    і387  і486   і    і              і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДґ
іST(i),ST*     і94-108 і198-208і29-57і      і2   іFMULP ST(1),STі
і              і       і       і     і      і    і              і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДґ
іST(i),ST      і134-148і198-208і29-57і16    і2   іFMULP ST(1),STі
і              і       і       і     і      і    і              і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДДДБДДДДБДДДДДДДДДДДДДДЩ

     * -  когда  один из операндов "короткий" (в дробной части он
содержит 40 завершающих нулей,  например,  он был загружен из ко-
роткого вещественного операнда в памяти).

FLNOP     Нет операции.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: нет.

          FNOP  нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения      Байты кода  Пример        і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДДДВДДДДВДДДДДДДДДДДДДДґ
і              і87     і287    і387  і486   і    і              і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДЕДДДДЕДДДДДДДДДДДДДДґ
іНет операндов і10-16  і10-16  і12   і3     і2   іFNOP          і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДДДБДДДДБДДДДДДДДДДДДДДЩ

FPATAN    Дробный арктангенс.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации:  U,  P (операнды не проверяют-
          ся).

          FPATAN (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения      Байты кода  Пример        і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДДДВДДДДДДДДДДДДДДґ
і              і87     і287    і387    і486      і              і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДДДЕДДДДДДДДДДДДДДґ
іНет операндов і250-800і250-800і314-487і5(2-17) 2іFPATAN        і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДДДБДДДДДДДДДДДДДДЩ

FPREM     Дробный остаток.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D, U.

          FPREM (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения      Байты кода  Пример        і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДВДДВДДДДДДДДДДДДДДґ
і              і87     і287    і387    і486   і  і              і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДЕДДЕДДДДДДДДДДДДДДґ
іНет операндов і15-190 і15-190 і74-155 і2(2-8)і 2іFPREM         і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДБДДБДДДДДДДДДДДДДДЩ

FPREM1    Дробный остаток (только для процессоров 387 и i487).
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D, U.

          FPREM1 (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения            Байты кода Пример   і
ГДДДДДДДДДДДДДДВДДДДВДДДДДДДДДВДДДДДДДДВДДДДДДДДДДДДВДВДДДДДДДДДґ
і              і87  і   287   і 387    і486         і і         і
ГДДДДДДДДДДДДДДЕДДДДЕДДДДДДДДДЕДДДДДДДДЕДДДДДДДДДДДДЕДЕДДДДДДДДДґ
іНет операндов і    і         і 95-185 і94.5(72-167)і2іFPREM1   і
АДДДДДДДДДДДДДДБДДДДБДДДДДДДДДБДДДДДДДДБДДДДДДДДДДДДБДБДДДДДДДДДЩ

FPTAN     Дробный тангенс.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации:  U,  P (операнды не проверяют-
          ся).

          FPTAN (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения      Байты кода  Пример        і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДВДДДДДДДДДДДДДДґ
і              і87     і287    і387    і486    і і              і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДЕДДДДДДДДДДДДДДґ
іНет операндов і30-540 і30-540 і191-573і244    і2іFPTAN         і
і              і       і       і       і(200-  і і              і
і              і       і       і       і273)   і і              і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДБДДДДДДДДДДДДДДЩ

FRNDINT   Округление до целого.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, P.

          FRNDINT (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения      Байты кода  Пример        і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДВДДДДДДДДДДДДДДґ
і              і87     і287    і387    і486    і і              і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДЕДДДДДДДДДДДДДДґ
іНет операндов і16-50  і16-50  і66-80  і29.1   і2іFRNDINT       і
і              і       і       і       і(21-30)і і              і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДБДДДДДДДДДДДДДДЩ

FRSTOR    Восстановление сохраненного состояния.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: нет.

          FRSTOR источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения      Байты кода     Пример     і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДДДДДДВДДДДДДДДДДДґ
і              і87     і287    і387    і486         і           і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДДДДДДЕДДДДДДДДДДДґ
і94 байта      і197-207і205-215і308    і131      2-4іFRSTOR[BP] і
і              і+EA    і       і       іреальный илиі           і
і              і       і       і       івиртуальный і           і
і              і       і       і       і240         і           і
і              і       і       і       ізащищенный  і           і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДДДДДДБДДДДДДДДДДДЩ

           Примечание: Значение времени выполнения для данной ин-
      струкции  не  имеет  смысла при определении полного времени
      выполнения. В типичном случае (процессор 80286, сопроцессор
      80287)  выполнение  в  сопроцессоре 80287 происходит парал-
      лельно с передачей операндов.  Общее время выполнения  инс-
      трукции  определяется передачей операндов.  Для процессоров
      80286:80287 соотношение равно 4:8, 1:1 и 8:5, а общее время
      выполнения  данной  инструкции  оценивается значениями 490,
      302 и 227 тактов сопроцессора 80287 соответственно.

FSAVE    Сохранение состояния.
 FNSAVE   ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: нет.

          FSAVE/FNSAVE приемник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения      Байты кода     Пример     і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДДВДДДВДДДДДДДДДДДґ
і              і87     і287    і387    і486     і   і           і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДДЕДДДЕДДДДДДДДДДДґ
і94 байта      і197-207і205-215і375-376і        і2-4іFSAVE [BP] і
і              і+EA    і       і       і        і   і           і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДДБДДДБДДДДДДДДДДДЩ

           Примечание: Значение времени выполнения для данной ин-
      струкции  не  имеет  смысла при определении полного времени
      выполнения. В типичном случае (процессор 80286, сопроцессор
      80287)  выполнение  в  сопроцессоре 80287 происходит парал-
      лельно с передачей операндов.  Общее время выполнения  инс-
      трукции  определяется передачей операндов.  Для процессоров
      80286:80287 соотношение равно 4:8, 1:1 и 8:5, а общее время
      выполнения  данной  инструкции  оценивается значениями 490,
      302 и 227 тактов сопроцессора 80287 соответственно.

FSCALE    Масштабирование.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, O, U.

          FSCALE (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения      Байты кода  Пример        і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДВДДДДДДДДДДДДДДґ
і              і87     і287    і387    і486    і і              і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДЕДДДДДДДДДДДДДДґ
іНет операндов і32-38  і32-38  і67-86  і31     і2іFSCALE        і
і              і       і       і       і(30-32)і і              і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДБДДДДДДДДДДДДДДЩ

FSETPM    Установка защищенного режима.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: нет.

          FSETPM (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения      Байты кода  Пример        і
ГДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДґ
і              і287                              і              і
ГДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДґ
іНет операндов і2-8                              іFSETPM        і
АДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДЩ

FSIN      Синус ST(0) (только для защищенного режима процессоров
          386 и i486).
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: IS, I, D, U, P.

          FSIN

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения      Байты кода  Пример        і
ГДДДДДДДДДДДДДДВДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДґ
і              і387       і   486               і               і
ГДДДДДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДґ
іНет операндов і122-771*  і   241(193-279)      і FSIN          і
АДДДДДДДДДДДДДДБДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДЩ

     * Эти временные значения соблюдаются в диапазоне /x/ /4. Для
операндов, не лежащих в данном диапазоне,  для уменьшение операн-
дов может потребоваться до 76 дополнительных тактов.

FSINCOS  Синус и косинус  ST(0) (только для защищенного режима
          процессоров 386 и i486).
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: IS, I, D, U, P.

          FSINCOS

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения      Байты кода  Пример        і
ГДДДДДДДДДДДДДДВДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДґ
і              і387        і  486               і               і
ГДДДДДДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДґ
іНет операндов і194-809*   і  241(243-329)      і FSINCOS       і
АДДДДДДДДДДДДДДБДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДЩ

     * Эти временные значения соблюдаются в диапазоне /x/ /4. Для
операндов, не лежащих в данном диапазоне,  для уменьшение операн-
дов может потребоваться до 76 дополнительных тактов.

FSQRT     Квадратный корень.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D, P.

          FSQRT (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения          Байты кода  Пример    і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДДДДДВДВДДДДДДДДДДґ
і              і87     і287    і387    і486        і і          і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДДДДДЕДЕДДДДДДДДДДґ
іНет операндов і180-186і180-186і122-129і85.6(83-87)і2іFSQRT     і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДДДДДБДБДДДДДДДДДДЩ

FST       Запись вещественного значения.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, O, D, P.

          FST приемник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды     Такты выполнения          Байты кода  Пример      і
ГДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДВДДДДДДДДВДДДДДДДДДДДДґ
і            і87     і287    і387    і486 і        і            і
ГДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДЕДДДДДДДДДДДДґ
іST(i)       і15-22  і15-22  і11     і3   і 2      іFST ST(3)   і
і            і       і       і       і    і        і            і
ГДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДЕДДДДДДДДДДДДґ
іКороткое    і84-90  і84-90  і44     і7   і 2-4    іFST CORR[DI]і
івещественноеі+EA    і       і       і    і        і            і
і            і       і       і       і    і        і            і
ГДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДЕДДДДДДДДДДДДґ
іДлинное     і96-104 і84-90  і45     і8   і 2-4    іFST MEAN_RD і
івещественноеі+EA    і       і       і    і        і            і
і            і       і       і       і    і        і            і
АДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДБДДДДДДДДБДДДДДДДДДДДДЩ

FSTCW    Запись слова управления.
 FNSTCW   ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: нет.

          FSTCW приемник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды     Такты выполнения          Байты кода  Пример      і
ГДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДДДДВДДДДДДДДДДДДґ
і            і87     і287    і387    і486  і       і            і
ГДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДДЕДДДДДДДДДДДДґ
і2 байта     і12-18  і12-18  і15     і     і2-4    іFSTCW SV_CONі
і            і+EA    і       і       і     і       і            і
АДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДДДДБДДДДДДДДДДДДЩ

FSTENV   Сохранение операционной среды.
 FNSENV   ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: нет.

          FSTENV приемник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды      Такты выполнения          Байты кода  Пример     і
ГДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДДДДВДДДДДДДДДДДґ
і             і87     і287    і387    і486  і       і           і
ГДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДДЕДДДДДДДДДДДґ
і14 байт      і40-50  і40-50  і103-104і     і2-4    іFSTENV[BP] і
і             і+EA    і       і       і     і       і           і
АДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДДДДБДДДДДДДДДДДЩ

FSTP     Сохранение вещественного значения и извлечение из стека
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, O, U, P.

          FSTP приемник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды     Такты выполнения          Байты кода Пример       і
ГДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДДДВДДДДДДДДДДДДДґ
і            і87     і287    і387    і486  і      і             і
ГДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДґ
іST(i)       і17-24  і17-24  і12     і3    і2     іFSTCW ST(2)  і
і            і       і       і       і     і      і             і
ГДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДґ
іКороткое    і86-92  і86-92  і44     і7    і2-4   іFSTCW [BX].ADі
івещественноеі+EA    і       і       і     і      і             і
і            і       і       і       і     і      і             і
ГДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДґ
іДлинное     і98-106 і96-106 і45     і8    і2-4   іFSTCW TOT_DOSі
івещественноеі+EA    і       і       і     і      і             і
і            і       і       і       і     і      і             і
ГДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДЕДДДДДДДДДДДДДґ
іВременное   і52-58  і52-58  і53     і8    і2-4   іFSTCW REG_SAVі
івещественноеі+EA    і       і       і     і      і             і
і            і       і       і       і     і      і             і
АДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДДДБДДДДДДДДДДДДДЩ

FSTSW    Запись слова состояния.
 FNSTSW   ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: нет.

          FSTSW/FNSTW приемник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды     Такты выполнения          Байты кода Пример       і
ГДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДВДДДДДДВДДДДДДДДДДДДДДґ
і            і87     і287    і387    і486 і      і              і
ГДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДЕДДДДДДДДДДДДДДґ
і2 байта     і12-18  і12-18  і15     і    і 2-4  і FSTSW SAVE_STі
і            і+EA    і       і       і    і      і              і
АДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДБДДДДДДБДДДДДДДДДДДДДДЩ

FSTSW AX  Запись слова состояния в регистр AX.
 FNSTSW AX ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
           Исключительные ситуации: нет.

          FSTSW приемник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды     Такты выполнения          Байты кода Пример       і
ГДДДДДДДДДДДДВДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДДДДВДДДДДДДДДДДДДґ
і            і87    і 287   і 387   і 486 і       і             і
ГДДДДДДДДДДДДЕДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДДЕДДДДДДДДДДДДДґ
іAX          і      і 10-16 і 13    і 3   і 2     іFSTSW AX     і
і            і      і       і       і     і       і             і
АДДДДДДДДДДДДБДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДДДДБДДДДДДДДДДДДДЩ

FSUB     Вычитание вещественных значений.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, O, U, P.

          FSUB //источник/приемник, источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды     Такты выполнения          Байты кода Пример       і
ГДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДВДДДДДДДДДДДДДґ
і            і87     і287    і387    і486    і    і             і
ГДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДДДДДДґ
і//ST,ST(i)/ і70-100 і70-100 і26-37  і7(5-17)і2   іFSUB ST,ST(2)і
іST(i),ST    і       і       і       і       і    і             і
і            і       і       і       і       і    і             і
ГДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДДДДДДґ
іКороткое    і90-120 і90-120 і24-32  і7(5-17)і2-4 іFSUB BASE_VALі
івещественноеі+EA    і       і       і       і    і             і
і            і       і       і       і       і    і             і
ГДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДДДДДДґ
іДлинное     і95-125 і95-125 і28-36  і7(5-17)і2-4 іFSUB COORD.X і
івещественноеі+EA    і       і       і       і    і             і
АДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДБДДДДДДДДДДДДДЩ

FSUBP    Вычитание вещественных значений и извлечение из стека.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, O, U, P.

          FSUBP приемник, источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды     Такты выполнения          Байты кода Пример       і
ГДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДВДДДДДДДДДДДДДґ
і            і87     і287    і387    і486    і    і             і
ГДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДЕДДДДДДДДДДДДДґ
іST(i),ST    і75-105 і75-105 і26-37  і7(5-17)і2   іFSUB ST,ST(2)і
АДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДБДДДДДДДДДДДДДЩ

FSUBR    Вычитание вещественных значений с обращением.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, O, U, P.

          FSUB //источник/приемник, источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды     Такты выполнения         Байты кода Пример        і
ГДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДВДДДДДДДДДДДДДДґ
і            і87     і287    і387    і486    і   і              і
ГДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДЕДДДДДДДДДДДДДДґ
і//ST,ST(i)/ і70-100 і70-100 і26-37  і7(5-17)і2  іFSUBR ST,ST(1)і
іST(i),ST    і       і       і       і       і   і              і
і            і       і       і       і       і   і              і
іКороткое    і90-120 і90-120 і24-32  і7(5-17)і2-4іFSUBR VECT[SI]і
івещественноеі+EA    і       і       і       і   і              і
і            і       і       і       і       і   і              і
іДлинное     і95-125 і95-125 і28-36  і7(5-17)і2-4іFSUBR [BX].INDі
івещественноеі+EA    і       і       і       і   і              і
АДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДБДДДДДДДДДДДДДДЩ

FSUBRP    Вычитание вещественных значений с обращением
          и извлечение из стека.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, O, U, P.

          FSUBRP приемник, источник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды     Такты выполнения        Байты кода Пример         і
ГДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДВДДДДДДДДДДДДДДДДґ
і            і87     і287    і387    і486    і і                і
ГДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДЕДДДДДДДДДДДДДДДДґ
іST(i),ST    і75-105 і75-105 і26-37  і7(5-17)і2і FSUBRP ST,ST(2)і
АДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДБДДДДДДДДДДДДДДДДЩ

FTST      Проверка вершины стека на +0.0
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I, D.

          FTST (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения         Байты кода  Пример     і
ГДДДДДДДДДДДДДДВДДДДДДВДДДДДДДВДДДДДДВДДДДДДДДДВДДДВДДДДДДДДДДДДґ
і              і87    і 287   і 387  і 486     і   і            і
ГДДДДДДДДДДДДДДЕДДДДДДЕДДДДДДДЕДДДДДДЕДДДДДДДДДЕДДДЕДДДДДДДДДДДДґ
іНет операндов і38-48 і 38-48 і 28   і 4       і 2 і FTST       і
АДДДДДДДДДДДДДДБДДДДДДБДДДДДДДБДДДДДДБДДДДДДДДДБДДДБДДДДДДДДДДДДЩ

FUCOM     Неупорядоченное сравнение.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: IS, I, D.

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения         Байты кода  Пример     і
ГДДДДДДДДДДДДДДВДДДДДДВДДДДДДВДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДґ
і              і387   і 486  і                     і            і
ГДДДДДДДДДДДДДДЕДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДґ
і//ST(i)       і24    і 4    і                   2 і FUCOM ST(1)і
АДДДДДДДДДДДДДДБДДДДДДБДДДДДДБДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДЩ

FUCOMP    Неупорядоченное  сравнение (только  для   сопроцессоров
          387 и i486).
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: IS, I, D.

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения        Байты кода  Пример      і
ГДДДДДДДДДДДДДДВДДДДДВДДДДДДДДДДДДДДДДДДДДДДВДДДДДДВДДДДДДДДДДДДґ
і              і387  і  486                 і      і            і
ГДДДДДДДДДДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДЕДДДДДДДДДДДДґ
і//ST(i)       і26   і  4                   і   2  іFUCOMP ST(2)і
АДДДДДДДДДДДДДДБДДДДДБДДДДДДДДДДДДДДДДДДДДДДБДДДДДДБДДДДДДДДДДДДЩ

FUCOMPP  Неупорядоченное сравнение (только  для   сопроцессоров
          387 и i486).
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: IS, I, D.

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения         Байты кода  Пример     і
ГДДДДДДДДДДДДДДВДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДВДДДДВДДДДДДДДДДДДґ
і              і387  і  486                   і    і            і
ГДДДДДДДДДДДДДДЕДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДЕДДДДДДДДДДДДґ
іНет операндов і26   і  4                     і  2 і FUCOMPP    і
АДДДДДДДДДДДДДДБДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДБДДДДБДДДДДДДДДДДДЩ

FWAIT     Ожидание.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: нет (инструкция ЦП).

          FWAIT (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения        Байты кода  Пример      і
ГДДДДДДДДДДДДДДВДДДДДДВДДДДДДДДДДДДДДДДДВДДДДДДДДДВДДДДДДДДДДДДДґ
і              і387   і 486             і         і             і
ГДДДДДДДДДДДДДДЕДДДДДДЕДДДДДДДДДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДДДДДґ
іНет операндов і3+5n* і 4               і  1      і FWAIT       і
і              і      і                 і         і             і
ГДДДДДДДДДДДДДДБДДДДДДБДДДДДДДДДДДДДДДДДБДДДДДДДДДБДДДДДДДДДДДДДґ
і   * - n=сколько раз ЦП проверяет линию BUSY  перед завершениемі
івыполнения предыдущей инструкции.                              і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

FXAM      Проверка вершины стека.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: нет.

          FXAM (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения          Байты кода  Пример    і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДДВДДДДДДДДДДґ
і              і87     і287    і387    і486    і     і          і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДЕДДДДДДДДДДґ
іНет операндов і12-23  і12-23  і30-38  і8      і  2  іFXAM      і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДДБДДДДДДДДДДЩ

FXCH      Обмен содержимого регистров.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I.

          FXCH //приемник

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды      Такты выполнения          Байты кода  Пример     і
ГДДДДДДДДДДДДДВДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДДДВДДДДВДДДДДДДДДДДґ
і             і87    і 287   і 387   і 486     і    і           і
ГДДДДДДДДДДДДДЕДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДДДЕДДДДЕДДДДДДДДДДДґ
і//ST(i)      і10-15 і 10-15 і 18    і 4       і 2  іFXCH ST(2) і
АДДДДДДДДДДДДДБДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДДДБДДДДБДДДДДДДДДДДЩ

FXTRACT   Выделение экспоненты и значащей части.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: I.

          FXTRACT (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения          Байты кода  Пример    і
ГДДДДДДДДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДВДДДДДДДДДВДДДВДДДДДДДДДДґ
і              і87     і287    і387    і486      і   і          і
ГДДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДДДЕДДДЕДДДДДДДДДДґ
іНет операндов і27-55  і27-55  і70-76  і19(16-20)і2  іFXTRACT   і
АДДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДДДБДДДБДДДДДДДДДДЩ

FYL2X     Y * log2 X.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: P (операнды не проверяются).

          FYL2X (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения          Байты кода   Пример   і
ГДДДДДДДДДДДДДДВДДДДДДДДВДДДДДДДДВДДДДДДДВДДДДДДДДДДДДВДДДДДДДДДґ
і              і87      і287     і387    і486         і         і
ГДДДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДДЕДДДДДДДЕДДДДДДДДДДДДЕДДДДДДДДДґ
іНет операндов і100-1100і900-1100і120-538і311(196-329)іFYL2X    і
АДДДДДДДДДДДДДДБДДДДДДДДБДДДДДДДДБДДДДДДДБДДДДДДДДДДДДБДДДДДДДДДЩ

FYL2XP1   Y * log2 (X+1).
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: P (операнды не проверяются).

          FYL2XP1 (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды      Такты выполнения              Байты кода Пример  і
ГДДДДДДДДДДДДДВДДДДДДДДВДДДДДДДДВДДДДДДДВДДДДДДДДДДДДВДДВДДДДДДДґ
і             і87      і287     і387    і486         і  і       і
ГДДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДДЕДДДДДДДЕДДДДДДДДДДДДЕДДЕДДДДДДДґ
іНет операндові100-1000і700-1000і257-547і313(171-326)і2 іFYL2XP1і
АДДДДДДДДДДДДДБДДДДДДДДБДДДДДДДДБДДДДДДДБДДДДДДДДДДДДБДДБДДДДДДДЩ

F2XM1     2 с степени X, минус 1.
          ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
          Исключительные ситуации: P (операнды не проверяются).

          F2XM1 (нет операндов)

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іОперанды       Такты выполнения               Байты кода Примері
ГДДДДДДДДДДДДДДВДДДДДДДДВДДДДДДДДВДДДДДДДВДДДДДДДДДДДДВДДВДДДДДДґ
і              і87      і287     і387    і486         і  і      і
ГДДДДДДДДДДДДДДЕДДДДДДДДЕДДДДДДДДЕДДДДДДДЕДДДДДДДДДДДДЕДДЕДДДДДДґ
іНет операндов і310-630 і310-630 і211-476і242(140-279)і 2іF2XM1 і
АДДДДДДДДДДДДДДБДДДДДДДДБДДДДДДДДБДДДДДДДБДДДДДДДДДДДДБДДБДДДДДДЩ



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