|
Часть 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> ;ошибка: можно указать ,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 і
АДДДДДДДДДДДДДДБДДДДДДДДБДДДДДДДДБДДДДДДДБДДДДДДДДДДДДБДДБДДДДДДЩ
|
|