Введение
-----------------------------------------------------------------
Эта книга является второй из двух книг, сопровождающих пакет
Турбо ассемблера. Сейчас, когда вы наверняка прочитали вниматель-
но первое руководство (User's Guide), вы захотите ознакомиться с
данным руководством для получения дополнительной информации.
Reference Guide является как раз тем, что дает наиболее
конкретное представление о Турбо ассемблере. Если вы все еще нуж-
даетесь в изучении языка ассемблера, вернитесь к User's Guide для
более глубокого изучения некоторых вопросов.
Требования к аппаратным и программным средствам
-----------------------------------------------------------------
Турбо ассемблер может использоваться на компьютерах семейс-
тва IBM PC, включающего XT, AT и PS/2, а также на компьютерах,
полностью совместимых с ними. Турбо ассемблер требует MS DOS 2.0
и более поздние версии, а также не менее 256К оперативной памяти.
Турбо ассемблер может генерировать код для процессоров 8086,
80186, 80286 и 80386. Он также может генерировать инструкции с
плавающей точкой для арифметических сопроцессоров 8087, 80287 и
80387.
TASM2 #4-5/Док = 10 =
О данном руководстве
-----------------------------------------------------------------
В данном руководстве мы обсудим следующие вопросы.
Глава 1 : "Предопределенные идентификаторы" знакомит вас с
равенствами в Турбо ассемблере.
Глава 2 : "Операторы" описывает различные операторы Турбо
ассемблера.
Глава 3 : "Директивы" предоставляет в алфавитном порядке
подробную информацию о всех директивах Турбо ас-
семблера.
Приложение А: "Синтаксис Турбо ассемблера" иллюстрирует выраже-
ния Турбо ассемблера в модифицированной форме Бе-
куса-Наура (для двух режимов - MASM и Ideal).
Приложение В: "Совместимость с другим средствами" содержит раз-
личия между MASM и режимом MASM Турбо ассемблера.
Приложение С: "Основные моменты Турбо ассемблера", которые
отличают его от MASM.
Приложение D: "Утилиты Турбо ассемблера" описывает три ути-
литы, которые поставляются в данном пакете: MAKE,
TLINK,TLIB. Информация об утилитах GREP, OBJXREF
и TCREF содержится в файлах на ваших дистрибутив-
ных дисках.
Приложение Е: "Сообщение об ошибках в Турбо ассемблере" описы-
вает все сообщения об ошибках, которые могут вы-
даваться при использовании Турбо ассемблера: ин-
формационные сообщения, сообщения о фатальных
ошибках, предупреждающие сообщения и сообщения об
ошибках.
Национальные соглашения
-----------------------------------------------------------------
Когда мы говорим о IBM PC или совместимых с ними, мы
подразумеваем, что в данных компьютерах используются чипы 8088,
8086, 80186,80286 и 80386 (все эти чипы имеют общее обозначение
80х86). При ссылках на PC-DOS, DOS или MS DOS мы имеем ввиду
TASM2 #4-5/Док = 11 =
операционную систему версии 2.0 или более позднюю.
Данное описание выполнено при помощи профессионального текс-
тового редактора. Для выделения в тексте используются различные
шрифты, которые имеют следующее применение:
Italics В тексте данным шрифтом изображаются метки, переменные
и массивы.
Boldface Данный шрифт используется в тексте для директив,
инструкций, идентификаторов и операторов, а также для
параметров командной строки.
Caрitals В тексте заглавные буквы используются для изображения
инструкций, директив, регистров и операторов.
Monosрace Данный тип используется для отображения кода и текста,
которые появляются на вашем экране, а также любого тес-
та, который вы должны ввести для ассемблирования, ком-
поновки и запуска программы.
Keycaрs Данный тип шрифта используется в тексте для обозначения
клавиши на вашей клавиатуре. Он часто используется при
описании клавиши, которую вы должны нажать для выполне-
ния определенной функции. Например:"Нажмите Enter после
ввода имени вашей программы".
TASM2 #4-5/Док = 12 =
Глава 1. Предопределенные идентификаторы.
-----------------------------------------------------------------
Турбо ассемблер содержит ряд предопределенных идентификато-
ров, которые вы можете использовать в ваших программах. Эти иден-
тификаторы могут иметь различные значения в разных местах вашего
исходного файла. Они являются сходными с символами равенства, ко-
торыми вы устанавливаете, используя директивы EQU. Когда Турбо
ассемблер встречает в вашем исходном файле один из этих идентифи-
каторов, он заменяется его текущим значением.
Некоторые из этих идентификаторов могут иметь строковые
(текстовые) значения, некоторые - числовые, остальные - другие
имена. Строковые значения могут быть использованы в любом месте,
где вы захотите использовать строку символов. Например, для ини-
циализации последовательности байтов данных используется директи-
ва DB:
NOW DB ??time
Числовые предопределенные значения могут быть использованы в
любом месте, где вы хотите использовать числа:
IF ??version GT 100h
Значения, содержащие другие имена, становятся синонимами для
представленных ими значений, позволяя вам использовать имя
предопределенного идентификаторов в любом месте, где вы должны
использовать простое имя:
ASSUME cs:@code
Все предопределенные идентификаторы могут быть использованы
в режимах MASM и Ideal.
Если вы при ассемблировании используете в командной строке
параметр /ML, то вы должны использовать имена предопределенных
идентификаторов именно так, как они описаны на следующих страни-
цах.
Следующее правило применяется для имен предопределенных
идентификаторов, начинающихся со знака @: Первая буква каждого
слова, которое составляет часть символьного имени, является бук-
вой верхнего регистра, а следующие - нижнего. Например:
@CurSeg
TASM2 #4-5/Док = 13 =
@FileName
@WordSize
Исключение составляют переопределения идентификаторов, кото-
рые указывают на сегменты. Имя сегмента, начинающееся с символа
@, должно состоять из букв нижнего регистра. Например:
@curseg
@fardata
Символы, которые начинаются с двух знаков вопроса (??),
должны содержать только буквы нижнего регистра.
??data
??version
$
-----------------------------------------------------------------
Назначение: Операнд счетчика положения.
Замечания: Этот специальный символ представляет счетчик по-
ложения. Счетчик положение - это текущее смещение
в текущем сегменте в процессе ассемблирования.
(Этот операнд имеет тот же атрибут, что и метка
near "ближняя").
Счетчик положения представляет собой адрес, кото-
рый увеличивается так, что соответствует текущему
адресу так, как если бы каждый оператор в исход-
ном файле уже оттранслировался.
Пример: helрMessage DB 'This is helр for the рrogram'
helрlength = $ - helрMessage
После ассемблирования этих двух строк идентифика-
тор helрlength будет равен длине данной строки.
@code
-----------------------------------------------------------------
Назначение: Значение имени для сегмента .CODE
Замечания: При использовании упрощенных директив сегмен-
TASM2 #4-5/Док = 14 =
тирования (.MODEL и т.п.) данное значение позво-
ляет вам использовать в выражениях имя сегмента
кода, подобно ASSUME.
Пример: .DATA
mov ax,@code
mov ds,ax
ASSUME ds:@code
@CodeSize
-----------------------------------------------------------------
Назначение: Числовое значение, указывающее на тип памяти кода
Замечания: @CodeSize устанавливается в 0 для малой уплотнен-
ной памяти с ближними указателями кода, и уста-
навливается в 1 для всех других типов с дальними
ссылками. Вы можете использовать данный идентифи-
катор для указания типа ссылок кода в зависимости
от типа памяти.
Пример: IF @CodeSize EQ 0
PROCPTR DW PROC1 ; ближняя ссылка на процедуру
ELSE
PROCPTR DD PROC1 ; дальняя ссылка на процедуру
ENDIF
@Cрu
-----------------------------------------------------------------
Назначение: Возвращает числовое значение,содержащее информа-
цию о типе процессора
Замечания: В возвращаемом значении @Cрu кодируется тип про-
цессора
-------------------------------------------------
Бит Описание
-------------------------------------------------
0 8086 инструкции возможны
1 80186 инструкции возможны
2 80286 инструкции возможны
3 80386 инструкции возможны
7 Привилегированные инструкции возможны
(80286 и 80386)
8 8087 инструкции арифметического процессора
TASM2 #4-5/Док = 15 =
10 80287 инструкции арифметического процессора
11 80387 инструкции арифметического процессора
Биты, не указанные в таблице, зарезервированы для
будущего использования. При использовании @Cрu
эти биты маскируются и таким образом ваша прог-
рамма останется совместимой с будущими версиями
Турбо ассемблера.
Семейство процессоров, начиная с 8086, является
совместимым снизу вверх. Если вы задаете тип
процессора директивой, подобной.286, данные типы
процессоров (8086, 80186) также становятся допус-
тимыми автоматически.
Примечание: Данное значение содержит информацию только о
процессоре, который был вами определен в процессе
ассемблирования директивой .286 и ей подобными.
Во время выполнения вашей программы тип процес-
сора не индицируется.
Пример: IPUSH=@Cрu AND 2 ; позволяет выполнить рush
;для 186 и выше
IF IPUSH
PUSH 1234
ELSE
mov ax,1234
рush ax
ENDIF
curseg
-----------------------------------------------------------------
Назначение: Значение имени для текущего сегмента
Замечания: @curseg повсюду изменяет компоновку для отображе-
ния текущего имени сегмента. Вы это обычно ис-
пользуете после применения директив упрощенной
сегментации (.MODEL и т.п.) Используйте @curseg
для генерации параметров ASSUME, блокировки сег-
мента или других параметров, которые необходимы
для использования текущего имени сегмента
Пример: .CODE
ASSUME CS:@curseg
TASM2 #4-5/Док = 16 =
@data
-----------------------------------------------------------------
Назначение: Значение для группового имени ближних данных
Замечания: При использовании директив упрощенной сегментации
данное значение позволяет вам использовать груп-
повое имя, включающее все ближние сегменты данных
(.DATA, .CONST, .STACK) в выражениях, таких как
ASSUME и блокировках сегмента.
Пример: .CODE
mov ax,@data
mov ds,ax
ASSUME DS:@data
TASM2 #4-5/Док = 17 =
@DataSize
-----------------------------------------------------------------
Назначение: Числовое значение, указывающее на тип памяти дан-
ных
Замечания: @DataSize устанавливается в 0 для крошечной, ма-
лой и средней памяти с ближними указателями дан-
ных, в 1 для большой и уплотненной памяти с даль-
ними указателями данных, в 2 для очень большой
памяти.
Вы можете использовать данный идентификатор для
указания типа ссылок данных в зависимости от типа
памяти
Пример: IF @DataSize EQ 1
lea si,Dataрtr
mov al,[BYTE PTR si]
ELSE
les si,Dataрtr
mov al,[BYTE PTR ES:SI]
ENDIF
??date
-----------------------------------------------------------------
Назначение: Строковое значение для текущей даты
Замечания: ??data является текстовым значением, представляю-
щим текущую дату. Точный формат строки для даты
для разных стран определяется с помощью DOS
См.также ??Time
Пример: ASMTIME DB ??data ; строка из 8 байт
TASM2 #4-5/Док = 18 =
@fardata
-----------------------------------------------------------------
Назначение: Значение для инициализированного имени сегмента
данных с дальним указателем
Замечания: При использовании директив упрощенной сегментации
(.MODEL и т.п.) данное значение позволяет вам ис-
пользовать имя инициализированного сегмента дан-
ных (.FARDATA) в таких выражениях как ASSUME и
блокировках сегмента
Пример: mov ax,@fardata
mov ds,ax
ASSUME DS:@fardata
@fardata?
-----------------------------------------------------------------
Назначение: Значение для инициализированного имени сегмента
данных с дальним указанием
Замечания: При использовании директив упрощенной сегментации
(.MODEL и т.п.) данное значение позволяет вам ис-
пользовать имя инициализированного сегмента дан-
ных (.FARDATA?) в таких выражениях как ASSUME и
блокировках сегмента
Пример: mov ax,@fardata?
mov ds,ax
ASSUME DS:@fardata?
TASM2 #4-5/Док = 19 =
@FileName
-----------------------------------------------------------------
Назначение: Значение имени для текущего ассемблируемого файла
См.также: ??FileName
??filename
-----------------------------------------------------------------
Назначение: Строковое значение имени для текущего ассемблиру-
емого файла
Замечания: ??filename определяет восьмисимвольную строку,
представляющую имя файла для ассемблирования.
Если имя файла занимает меньше восьми символов,
то оно будет дополнено пробелами
Пример: SRCNAME DB ??filename ; всегда 8 байт
TASM2 #4-5/Док = 20 =
@Model
-----------------------------------------------------------------
Назначение: Цифровое значение, которое указывает на текущую
модель.
Замечания: @Model возвращает целое значение, указывающее на
следующие модели.
1 - TINY (крошечная)
2 - SMALL (маленькая)
3 - COMPACT (компактная)
4 - MEDIUM (средняя)
5 - LARGE (большая)
6 - HUGE (огромная)
См. также: .MODEL, MODEL
@Startuр
-----------------------------------------------------------------
Назначение: Метка, указывающая на начало исполняемого кода.
Замечания: @Startuр - это ближняя метка, определенная дирек-
тивами .STARTUP или STARTUPCODE, которые указыва-
ют начало исполняемого кода, созданного этими ди-
рективами.
См. также: .STARTUP, STARTUPCODE
TASM2 #4-5/Док = 21 =
??Time
-----------------------------------------------------------------
Назначение: Строковое значение для текущего времени ??Time
является текстовым значением, представляющим те-
кущее время. Точный формат строки для времени
определяется для разных стран с помощью DOS
См.также: ??Data
Пример: ASMTIME DB ??Time ; строка из 8 символов
??Version
-----------------------------------------------------------------
Назначение: Числовое значение для данной версии Турбо ассемб-
лера
Замечания: Старший байт является главным номером версии, а
младший - второстепенным номером версии. Например
V2.1 будет представлено как 201h.
??Version позволяет вам создавать исходные файлы,
которые могут использовать частности той или иной
версии Турбо ассемблера.
Данная величина также позволяет вашим исходным
файлам узнавать, были они ассемблированы с по-
мощью MASM или Турбо ассемблером. ??Version не
определяется посредством MASM.
Пример: IFDEF ??Version
; текст программы на Турбо ассемблере
ENDIF
TASM2 #4-5/Док = 22 =
@WordSize
-----------------------------------------------------------------
Назначение: Числовое значение, сообщающее 16- или 32-битовые
сегменты.
Замечания: @WordSize возвращает 2 в случае, если текущий
сегмент является 16-битовым сегментом или 4 в
случае, если он является 32-битовым.
Пример: IF @WordSize EQ 4
mov esр,0100h
ELSE
mov sр,0100h
ENDIF
TASM2 #4-5/Док = 23 =
Глава 2. Операторы
-----------------------------------------------------------------
Операторы позволяют вам формировать комплексные выражения,
которые могут быть использованы в качестве операндов в инструкци-
ях или директивах. Операторы производят действия над такими опе-
рандами как, например, имена программных идентификатор и значения
констант. Турбо ассемблер при ассемблировании вашего исходного
файла изменяет выражение, подставляя вместо выражения вычисленное
значение. Таким образом, вы можете использовать выражение для вы-
числения значения, зависящего от других значений, которые могут
изменяться при модификации вами исходного файла.
В данной главе детально описываются операторы Турбо ассемб-
лера.
Арифметическая точность
----------------------------------------------------------------
Турбо ассемблер использует 16- или 32- разрядную арифметику,
зависящую от того, использовали ли вы директивы .386 и . 386P для
процессора 80386. При ассемблировании кода процессора 80386 или
режима Ideal, некоторые выражения будут иметь результат отличный
от того, если бы они были выполнены в 16-битовом режиме.
Например:
DW (1000h*1000h)/1000h
В 32-битовом режиме генерирует слово 1000h, а в 16-битовом
режиме - 0. В 16-битовом режиме при выполнении умножения возник-
нет переполнение и при этом сохранятся только младшие 16 бит
результата.
Турбо ассемблер при вычислении выражений использует следую-
щие правила:
- Оператор с более высоким приоритетом выполняется раньше
оператора с более низким.
- Операторы с равными приоритетами выполняются слева направо
их записи в выражении.
- Если выражение содержит другое выражение, взятое в скобки,
то выражение в скобках вычисляется в первую очередь, т.к.
выражение в скобках имеет наивысший приоритет.
TASM2 #4-5/Док = 24 =
Pежимы Ideal и MASM имеют различные приоритеты для некоторых
операторов. Следующие две таблицы показывают уровни приоритетов
операторов в этих режимах. В первой строке каждой таблицы приве-
дены операторы, имеющие наивысший приоритет, а операторы в пос-
ледней строке имеют наинизший приоритет. В одной строке все
операторы имеют одинаковый приоритет.
TASM2 #4-5/Док = 25 =
Таблица 2.1: Приоритеты операторов для режима MASM
-----------------------------------------------------------------
<>, (), [], LENGTH, MASK, SIZE, WIDTH
.( выбор элемента структуры )
HIGH, LOW
+, - (унарные)
:(блокировка сегмента)
OFFSET, PTR, SEQ, THIS, TYPE
*, /, MOD, SHL, SHR
+, - (бинарные)
EQ, GE, GI, LE, LT, NE
NOT
AND
OR, XOR
LARGE, SHORT, SMALL, .TYPE
-----------------------------------------------------------------
Таблица 2.2: Приоритеты операторов для режима Ideal.
-----------------------------------------------------------------
(), [], LENGTH, MASK, OFFSET, SEQ, SIZE, WIDTH
HIGH, LOW
+, - (унарные)
*, /, MOD, SHL, SHR
+, - (бинарные)
EQ, GE, GT, LE, LT, NE
NOT
AND
OR, XOR
:(блокировка сегмента)
.(выбор элемента структуры)
HIGH (перед ссылкой),LARGE, LOW (перед ссылкой),
PTR, SHORT, SMALL, SYMTYPE
-----------------------------------------------------------------
Операторы, входящие в выражение, перечислены в алфавитном
порядке.
TASM2 #4-5/Док = 26 =
()
-----------------------------------------------------------------
Назначение: Отмечаем выражение для первоочередного вычисления
Режим: MASM, Ideal
Синтаксис: (выражение)
Замечания: Скобки применяются для изменения нормальных прио-
ритетов операторов при вычислениях. Любое выраже-
ние, заключенное вами в скобки, будет вычислено
до выполнения операторов, стоящих перед или после
скобок.
См.также: +, -, *, /, MOD, SHL, SHR
Пример: (3 + 4) * 5 ; равно 35
3 + 4 * 5 ; равно 23
*
-----------------------------------------------------------------
Назначение: Умножает два целочисленных выражения
Режим: MASM, Ideal
Синтаксис: выражение 1*выражение 2
Замечания: выражение 1 и выражение 2 должны быть преобразо-
ваны в целочисленные константы
См.также: +, -, /, MOD, SHL, SHR
Пример: SCREENSIZE=25*80; количество символов на
;экране
TASM2 #4-5/Док = 27 =
+ (бинарный)
-----------------------------------------------------------------
Назначение: Складывает два выражения
Режим: MASM, Ideal
Синтаксис: выражение 1 + выражение 2
Замечания: Одно из "выражение 1" или "выражение 2" должно
быть преобразовано в целочисленную константу. Од-
но выражение может быть преобразовано в адрес.
См.также: -, +, /, MOD, SHL, SHR
Пример: X DW 4DVP(?);
XPTR DW X+4 ; третье слово в буфере
+ (унарный)
-----------------------------------------------------------------
Назначение: Показывает положительное число.
Режим: MASM, Ideal
Синтаксис: + выражение
Замечания: Данный оператор не имеет действия. Он может быть
использован для указания, что константа имеет
именно положительное значение.
См.также: -, *, /, MOD, SHL, SHR
Пример: FOO DB +4; избыточный +
TASM2 #4-5/Док = 28 =
- (бинарный)
-----------------------------------------------------------------
Назначение: Вычитает два выражения.
Режим: MASM, Ideal
Синтаксис: выражение 1 - выражение 2
Замечания: При вычитании вы можете пользоваться тремя комби-
нациями операндов:
- выражение 1 и выражение 2 могут быть цело-
численными константами
- выражение 1 и выражение 2 могут быть как полны-
ми (длинными) адресами, так и оба адресами
внутри одного и того же сегмента. При вычитании
двух адресов результатом является константа. В
режиме Ideal проверка выражения 1 и выражения 2
на соответствие проводится более строго, чем в
режиме MASM
- выражение 1 может быть адресом, а выражение 2 -
константой. Результатом является адрес
См.также: +, *, /, MOD, SHL, SHR
Пример: DATA SEGMEHT
DW ?
XYZ EQU 10
VAL1 DW XYZ-1 ; константа 9
VAL2 DW ?
VISIZE DW VAL2-VAL1; константа 2
VIBEFORE DW VAL1-2 ; указатель на DW
; перед VAL1
DATA ENDS
TASM2 #4-5/Док = 29 =
- (унарный)
-----------------------------------------------------------------
Назначение: Изменяет знак выражения.
Режим: MASM, Ideal
Синтаксис: - выражение
Замечания: Выражение должно быть преобразовано в константу.
Если выражение является положительным, то резуль-
татом будет отрицательное число той же величины.
Если выражение является отрицательным, то резуль-
татом будет положительное число.
См.также: +, *, /, MOD, SHL, SHR
Пример: LOWTEMP DB -10
.
-----------------------------------------------------------------
Назначение: Выбирает элемент структуры.
Режим: MASM, Ideal
Синтаксис: memрtr.fieldname
Замечания: В режиме MASM, memрtr может быть любой операнд,
ссылающийся на участок в памяти, а fieldname мо-
жет быть именем любого элемента любой структуры
или даже постоянным выражением. Если memрtr явля-
ется именем структуры (подобно XINST), то
fieldname должен быть элементом этой структуры.
Действие данного оператора во многом похоже на
оператор +.: он складывает смещение fieldname
внутри структуры с адресом памяти для memрtr, но
также предоставляет размер имени поля.
В режиме Ideal его действия являются более
строгими. memрtr должен быть преобразован в ука-
затель на структуру, а fieldname должен быть эле-
ментом данной структуры. Это позволяет вам иметь
различные структуры с одним и тем же именем поля,
но различные смещение и размер. Если вы хотите
использовать базовый и/или индексный регистры для
TASM2 #4-5/Док = 30 =
memрtr, вы должны предварительно указать имя
структуры, к которой вы хотите получить доступ.
См.также: STRUC
Пример: X STRUC
MEMBER1 DB ?
MEMBER2 DW ?
X ENDS
XINST X <>
;MASM режим
mov [вх].Member2,1
;Ideal режим
mov [(X PTRвх).Member2],1
/
-----------------------------------------------------------------
Назначение: Деление двух целочисленных операндов.
Режим: MASM, Ideal
Синтаксис: выражение 1 / выражение 2
выражение 1 и выражение 2 должны быть преобразо-
ваны в целочисленные константы. Результатом явля-
ется деление выражения 1 на выражение 2, получен-
ный остаток отбрасывается. Вы можете получить
остаток, используя оператор MOD с теми же операн-
дами, заменив им оператор /.
См.также: +, -, *, MOD, SHL, SHR
Пример: X = 55 / 10 ; =5(целочисленное деление)
TASM2 #4-5/Док = 31 =
:
-----------------------------------------------------------------
Назначение: Генерирует сегмент или групповое блокирование.
Режим: MASM, Ideal
Синтаксис: segorgrouр:exрression
Замечания: Двоеточие (:) вызывает генерацию адреса для
exрression соответственно определенному сегменту
или группе. Это вы используете для того, чтобы
заставить ассемблер применить иное средство дос-
тупа к exрression, нежели заранее заложенный в
него метод.
Вы можете определить seqorgrouр несколькими путя-
ми:
-как сегментный регистр : CS, DS, ES или SS (или
FS, если для 80386 процессора были применены ди-
рективы P386 или P386N);
-как имя сегмента, определенное директивой
SEGMENT;
-как групповое имя, определенное директивой
GROUP;
-как выражение в операторе SEG
exрression может быть константой или выражением,
являющимся ссылкой на память.
Пример: mov cl,es:[Si+4]
PTR DD DGROUP:MEMVAR
?
-----------------------------------------------------------------
Назначение: Инициализирует неопределенные данные.
Режим: MASM, Ideal
Синтаксис: Dx ?
Замечания: Dx ссылается на данные, размещенные директивами
DB, DD и т.д. Используйте ?, когда хотите заре-
зервировать место для данных, но не хотите точно
определить их значение.
TASM2 #4-5/Док = 32 =
Вы должны использовать ?, когда массив данных был
инициализирован вашей программой перед тем, как
его использовать. Использование ? предпочтитель-
нее, чем использование 0, т.к. метод инициализа-
ции в вашем исходном тексте становится более оче-
видным и явным.
При использовании ? только как значение в выраже-
нии DVP или вне выражения DVP, объектный код не
генерируется. Если вы используете ? внутри
выражения DVP, которое содержит инициализирован-
ные значения, он будет воспринят как 0.
См.также: DUP
Пример: MyByt DB 20 DUP (?); располагает неопре-
; деленный массив
[ ] оператор
-----------------------------------------------------------------
Назначение: Определяет сложение или операнд индексирования
памяти.
Режим: MASM, Ideal
Синтаксис: [выражение 1] [выражение 2]
Замечания: Этот оператор ведет себя совершенно по-разному в
режимах MASM и Ideal
В режиме MASM он может выступать как оператор
сложения, просто прибавляя выражение 1 к выраже-
нию 2. Те же ограничения накладываются на комби-
нацию операндов, например, выражение 1 и выраже-
ние 2 одновременно не могут быть адресами. [] мо-
жет индицировать регистр для косвенного указания
на операнды в памяти, используя регистры BX, BP,
SI и DI. Регистры при косвенной адресации должны
быть заключены в []. Смещение при косвенной
адресации может находиться как внутри, так и вне
скобок ([]).
В режиме Ideal, [] означает "ссылку на память".
Любой операнд, адресующий память, должен быть
TASM2 #4-5/Док = 33 =
заключен в скобки. Это обеспечивает ясность,
предсказуемость и недвусмысленность при определе-
нии является ли операнд явным значением или же
ссылкой на память
См.также: +
Пример: ;режим MASM
mov al,BYTE PTR ES:[BX]
mov al,CS:10h
;режим Ideal
mov al,[BYTE PTR ES:BX]
mov al,[CS:10h]
TASM2 #4-5/Док = 34 =
AND
-----------------------------------------------------------------
Назначение: Побитно выполняет логическое "И"
Режим: MASM, Ideal
Синтаксис: выражение 1 AND выражение 2
Замечания: Выполняет побитное логическое "И" выражения 1 и
выражения 2. Результатом в любом разряде будет 1,
если оба выражения в данном разряде имеют 1 и 0 в
любом другом случае
См.также: NOT, OR, XOR
Пример: mov al,11110000 AND 10100000; результат
; 10100000
BYTE
-----------------------------------------------------------------
Назначение: Задает размер для выражения в один байт
Режим: Ideal
Синтаксис: BYTE выражение
Замечания: Выражение должно быть адресом. Результатом явля-
ется выражение, которое указывает на тот же адрес
в памяти, но всегда имеет размер BYTE, не считая
действительного размера выражения.
Обычно вы используете данный оператор для опреде-
ления размера выражения опережающей ссылки, или
для точного определения размера регистра входяще-
го в выражение, для которого размер не был
определен
В режиме MASM для выполнения этой функции вы
должны использовать директиву PTR с предшествую-
щим ему BYTE
См.также: PTR
TASM2 #4-5/Док = 35 =
Пример: mov [BYTE BX],1; непосредственно передаваемый
; байт
mov [BYTE X],1 ; опережающая ссылка
X DB 0
CODEPTR
-----------------------------------------------------------------
Назначение: Возвращает установленный по умолчанию размер
адреса процедуры.
Режим: Ideal
Синтаксис: CODEPTR выражение
Замечания: CODEPTR возвращает установленный по умолчанию
размер адреса процедуры, в зависимости от текущей
модели памяти (WORD для моделей с кодом NEAR;
DWORD для моделей с кодом FAR). CODEPTR может
использоваться где бы ни использовался DATAPTR.
См.также: DATAPTR
TASM2 #4-5/Док = 36 =
DATAPTR
-----------------------------------------------------------------
Назначение: Назначает выражению размер, зависящий от модели.
Режим: Ideal
Синтаксис: DATAPTR выражение
Замечания: Объявляет выражение ближним или дальним указате-
лем в зависимости от выбранной модели памяти.
См.также: CODEPTR, PTR, UNKNOWN
Пример: mov [DATAPTR bx],1
DUP
-----------------------------------------------------------------
Назначение: Повторяет размещение данных
Режим: MASM, Ideal
Синтаксис: count DUP(выражение 1,[выражение]...)
Замечания: count определяет количество раз, которое будут
повторены данные, определенные выражением. Опера-
тор DUP ставится после одной из директив размеще-
ния данных (DB, DW и т.п.)
Каждое выражение является инициализированным зна-
чением определенного типа данных и следует за DUP
Вы можете снова использовать оператор DVP внутри
выражения и иметь до 17 уровней вложенности
Вы всегда должны значение выражения помещать в
скобки ()
Пример: WRDBUF DW 40 DVP(1) ;инициализируется
;40 слов со значе-
;нием 1
SQUARE DB 4 DVP(4DVP(0)) ;массив 4х4 со
;значением 0
TASM2 #4-5/Док = 37 =
DWORD
-----------------------------------------------------------------
Назначение: Задает размер для выражения в двойное слово
Режим: Ideal
Синтаксис: DWORD выражение
Замечания: Выражение должно быть адресом. Результатом явля-
ется выражение, которое указывает на тот же адрес
в памяти и всегда имеет размер DWORD, невзирая на
действительный формат выражения.
Обычно вы используете данный оператор для опреде-
ления размера выражения опережающей ссылки.
В режиме MASM для выполнения этой функции вы
должны использовать директиву PTR с предшествую-
щим ему DWORD.
См.также: PTR
Пример: CALL DWORD FPTR
X DD MYFUNC
TASM2 #4-5/Док = 38 =
EQ
-----------------------------------------------------------------
Назначение: Возвращает значение "истина", если выражения рав-
ны
Режим: MASM, Ideal
Синтаксис: выражение 1 EQ выражение 2
Замечания: Выражение 1 и выражение 2 оба должны быть приве-
дены в константы. EQ возвращает значение "исти-
на"(-1), если оба выражения равны между собой и
значение "ложь"(0), если они имеют различные зна-
чения.
EQ считает, что выражение 1 и выражение 2 являют-
ся 32-разрядными числами со знаком, у которых
старший бит является знаковым. Таким образом,
выражение -1 EQ 0FFFFFFFFh имеет значение "исти-
на".
См.также: NE, LT, LE, GT, GE
Пример: ALIE = 4 EQ 3 ; =0 (ложь)
ATRUTH = 6 EQ 6 ; =1(истина)
FAR
-----------------------------------------------------------------
Назначение: Задает выражение для дальней ссылки
Режим: Ideal
Синтаксис: FAR выражение
Замечания: Выражение должно быть адресом. Результатом явля-
ется выражение, указывающее на адрес в памяти и
является дальней ссылкой, содержащей базовый сег-
мент и смещение независимо от реального типа
выражения.
Вы обычно используете этот оператор для вызова
процедуры или перехода по опережающей метке, ко-
торая объявляется как FAR в исходном файле.
TASM2 #4-5/Док = 39 =
В режиме MASM для выполнения этой функции вы
должны использовать директиву PTR с предшествую-
щим ему FAR.
См.также: NEAR
Пример: CALL FAR ABC ; дальняя ссылка
ABC PROC FAR
TASM2 #4-5/Док = 40 =
FWORD
-----------------------------------------------------------------
Назначение: Задает выражение, представляющее собой 32- бито-
вую дальнюю ссылку
Режим: Ideal
Синтаксис: FWORD выражение
Замечания: Выражение должно быть адресом. Результатом явля-
ется выражение, которое указывает на адрес в па-
мяти, но всегда имеет размер FWORD, не считая
действительного размера выражения.
Обычно вы используете данный оператор для опреде-
ления размера выражения опережающей ссылки или
для точного определения размера регистра, входя-
щего в выражение, для которого размер не был
определен.
В режиме MASM для выполнения этой функции вы
должны использовать директиву PTR c предшествую-
щим ему FWORD
См.также: PTR, PWORD
Пример: .386
CALL fword [вх] ;дальний косвенный
; 48-битный вызов
jmр fword funcр ;опережающая ссылка
funcр DF myрroc ;косвенный указатель на рroc
GE
-----------------------------------------------------------------
Назначение: Возвращает значение "истина" в случае, если одно
выражение больше другого
Режим: MASM, Ideal
Синтаксис: выражение 1 GE выражение 2
Замечания: Выражение 1 и выражение 2 должны быть приведены в
константы. GE возвращает значение "истина"(-1),
TASM2 #4-5/Док = 41 =
если выражение 1 больше или равно выражению 2, и
возвращает значение "ложь"(0), если оно меньше.
GE считает, что выражение 1 и выражение 2 являют-
ся 33-разрядными числами со знаком, у которых
старший бит является знаковым. Таким образом,
выражение 1 GE -1 имеет значение "истина", 1 GE 0
FFFFFFFFh - значение "ложь".
См.также: EQ, GT, LE, LT, NE
Пример: TROOTH = 5 GE 5
AFIB = 5 GE 6
GT
-----------------------------------------------------------------
Назначение: Возвращает значение "истина" в случае, если одно
выражение больше другого
Режим: MASM, Ideal
Синтаксис: выражение 1 GT выражение 2
Замечания: Выражение 1 и выражение 2 должны быть приведены в
константы. GT возвращает значение "истина"(-1),
если выражение 1 больше выражения 2, и возвращает
значение "ложь"(0), если оно меньше или равно.
GT считает, что выражение 1 и выражение 2 являют-
ся 33-разрядными числами со знаком, у которых
старший бит является знаковым. Таким образом,
выражение 1 GT -1 имеет значение "истина", а 1 GT
0FFFFFFFFh - значение "ложь".
См.также: EQ, GE, LE, LT, NE
Пример: AFACT = 10 GT 9
NOTSO = 10 GT 11
TASM2 #4-5/Док = 42 =
HIGH
-----------------------------------------------------------------
Назначение: Возвращает старшую часть выражения
Режим: MASM, Ideal
Синтаксис: HIGH выражение
Только в режиме Ideal:
тип HIGH выражение
Замечания: HIGH возвращает старшие 8 бит выражения, которые
должны быть преобразованы в константу.
В режиме Ideal HIGH в сочетании с LOW являются
полным механизмом для выделения отдельных полей
данных. Тип определяет размер поля для выделения
из выражения и может быть любым из обычно опреде-
ленных размеров (BYTE, WORD, DWORD и т.д.). В
выражении вы можете применять более чем один
оператор HIGH или LOW; например, байтовый адрес-
ный указатель на третий байт двойного слова
DBLVAL:
BYTE LOW WORD HIGH DBLVAL
См.также: LOW
Пример: ; режимы MASM и Ideal
MAGIC EQU 1234h
mov cl,HIGH MAGIC
; только режим Ideal
BIG DD 12345678h
mov al,WORD HIGH BIG ;загружает 1234h
TASM2 #4-5/Док = 43 =
LARGE
-----------------------------------------------------------------
Назначение: Устанавливает формат смещения выражения 32 бита
Режим: MASM, Ideal (только режимы 386)
Синтаксис: LARGE выражение
Замечания: Выражение является любым выражением или операн-
дом, которое преобразуется с помощью LARGE в
32-битовое смещение. Вы обычно используете это
для устранения двусмысленности, связанной с
форматом. Например: если вы при наличии 80386
процессора используете директиву P386, то код мо-
жет быть интерпретирован как дальний вызов с сег-
ментом и 16-битовым смещением, так и ближним вы-
зовом, использующим 32-битовое смещение:
jmр [DWORD PTR ABC]
Данную двусмысленность вы можете устранить, ис-
пользуя директиву LARGE :
jmр LARGE [DWORD PTR ABC] ;32-битовое
;смещение при
;ближнем вызове
В данном примере LARGE стоит вне скобок, и в этом
случае из памяти считается двойное слово. Если
LARGE размещается внутри скобок, то это ин-
терпретируется как формат адреса, по которому чи-
тается операнд, но не как формат самого операнда,
читаемого из памяти. Например, данный код означа-
ет, что XYZ является 4-байтовым указателем
jmр LARGE [LARGE DWORD PTR XYZ]
Трактует это как 32-битовое смещение и при этом
JMP косвенно через адрес читает непосредственный
адрес для JMP, являющийся 32-битовым смещением.
Комбинацией операторов LARGE и SMALL, включая или
вынося их за скобки, вы можете получать любые
комбинации косвенных JMP и CALL от 16- или 32-би-
тового сегмента до 16 или 32-битового сегмента.
TASM2 #4-5/Док = 44 =
Также вы можете использовать LARGE для того, что-
бы избежать ошибочных присвоений при доступе к
переменным с опережающей ссылкой :
mov ax,[LARGE FOOBAR] ;FOOBAR находится в
;сегменте USE32
См.также: SMALL
LE
-----------------------------------------------------------------
Назначение: Возвращает значение "истина" в случае, если одно
выражение меньше или равно другому
Режим: MASM, Ideal
Синтаксис: Выражение 1 LE выражение 2
Замечания: Выражение 1 и выражение 2 оба должны быть приве-
дены в константы. LE возвращает значение "исти-
на"(-1), если выражение 1 меньше или равно
выражению 2, и возвращает значение "ложь", если
оно больше.
LE считает, что выражение 1 и выражение 2 являют-
ся 33-разрядными числами со знаком, у которых
старший бит является знаковым. Таким образом,
выражение 1 LE -1 имеет значение "ложь", а 1 LE 0
FFFFFFFFh - значение "истина".
См.также: EQ, GE, GT, LT, NE
Пример: YUP = 5 LT 6 ;истина = -1
TASM2 #4-5/Док = 45 =
LENGTH
-----------------------------------------------------------------
Назначение: Возвращает количество размещенных элементов дан-
ных
Режим: MASM, Ideal
Синтаксис: LENGTH имя
Замечания: Имя является идентификатором, указывающим на раз-
мещенные данные посредством одной из директив
размещения данных (DB, DD и т.д.). LENGTH возвра-
щает количество повторяемых в имени элементов.
Если имя не было объявлено с помощью оператора
DUP, то всегда возвращается 1.
LENGTH возвращает 1 также в случае, когда имя
ссылается на данные, которые вы разместили
посредством выделения их запятыми.
См.также: SIZE, TYPE
Пример: MSG DB "Hello"
array DW 10 DUP(0)
numbrs DD 1,2,3,4
var DQ ?
lmsg =LEHGTH MSG ;=1 не использовалась DUP
larray =LENGTH ARRAY ;=10
lnumbrs =LENGTH NUMBRS;=1,не использовалась DUP
lvar =LENGTH VAR ;=1,не использовалась DUP
LOW
-----------------------------------------------------------------
Назначение: Возвращает младшую часть выражения
Режим: MASM, Ideal
Синтаксис: LOW выражение
Только в режиме Ideal:
тип LOW выражение
Замечания: LOW возвращает младшие 8 бит выражения, которые
TASM2 #4-5/Док = 46 =
должны быть преобразованы в константу.
В режиме Ideal LOW в сочетании с HIGH являются
полным механизмом для выделения отдельных полей
данных. Тип определяет размер поля для выделения
из выражения и может быть любым из обычно опреде-
ленных размеров (BYTE, WORD, DWORD и т.д.). В
выражении вы можете применять более чем один
оператор LOW или HIGH; например:
BYTE LOW WORD HIGH DBLVAL
Это является байтовым адресным указателем на
третий байт двойного слова DBLVAL.
См.также: HIGH
Пример: ;режимы MASM и Ideal
MAGIC EQU 1234h
mov bl,LOW MAGIC
;только режим Ideal
BIG DD 12345678h
mov al,WORD LOW BIG;загружает 5678h
LT
-----------------------------------------------------------------
Назначение: Возвращает значение "истина", если одно выражение
меньше второго
Режим: MASM, Ideal
Синтаксис: выражение 1 LT выражение 2
Замечания: Выражение 1 и выражение 2 оба должны быть приве-
дены в константы. LT возвращает значение "исти-
на"(-1), если выражение 1 меньше, чем выражение
2, и возвращает значение "ложь"(0), если оно
больше или равно.
LT считает, что выражение 1 и выражение 2 являют-
TASM2 #4-5/Док = 47 =
ся 33-разрядными числами со знаком, у которых
старший разряд является знаковым. Таким образом,
1 LT -1 имеет значение "ложь", а 1 LT 0FFFFFFFFh
- значение "истина".
См.также: EQ, GE, GT, LE, NE
Пример: JA = 3 LT 4 ; истина =-1
TASM2 #4-5/Док = 48 =
MASK
-----------------------------------------------------------------
Назначение: Возвращает битовую маску поля записи
Режим: MASM, Ideal
Синтаксис: MASK recordfieldname (поле имени записи)
MASK record (запись)
Замечания: recorfieldname является именем любого поля имени
в заранее заданной записи. MASK возвращает значе-
ние битов соответствующих позиций в записи, ко-
торые занимает recordfieldname.
record является именем ранее определенной записи.
MASK возвращает значение битов, соответствующих
всем полям в записи.
Вы можете использовать MASK для выделения индиви-
дуального поля в записи посредством AND значения
маски и всей записи.
См.также: WIDTH
Пример: STAT RECORD A:3,B:4,C:5
NEWSTAT STAT <0,2,1>
mov al,NEWSTAT ;получает запись
and al,MASK B ;выделяет B
mov al,STAT ;получает маску для всей
;записи
MOD
-----------------------------------------------------------------
Назначение: Возвращает остаток (модуль) от деления двух
выражений
Режим: MASM, Ideal
Синтаксис: выражение1 MOD выражение 2
Замечания: Выражение 1 и выражение 2 оба должны быть приве-
TASM2 #4-5/Док = 49 =
дены в целочисленные константы. Результатом явля-
ется остаток от деления выражения 1 на выражение
2.
См.также: +, -, *, /, SHL, SHR
Пример: REMAINS=17/5; =2
TASM2 #4-5/Док = 50 =
NE
-----------------------------------------------------------------
Назначение: Возвращает значение "истина" в случае, если
выражения не равны между собой
Режим: MASM, Ideal
Синтаксис: выражение 1 NE выражение 2
Замечания: Выражение 1 и выражение 2 должны быть оба приве-
дены в константы. NE возвращает значение "исти-
на"(-1), если выражения не равны между собой и
значение "ложь"(0) - в случае, если они равны.
NE считает, что выражение 1 и выражение 2 являют-
ся 32-разрядными числами со знаком, у которых
старший бит является знаковым. Таким образом,
выражение -1 NE 0FFFFFFFFh имеет значение "ложь".
См.также: EQ, GE, GT, LE, LT
Пример: aint =10 NE 10 ; ложь =0
NEAR
-----------------------------------------------------------------
Назначение: Задает выражение для ближней ссылки
Режим: Ideal
Синтаксис: NEAR выражение
Замечания: Выражение должно быть адресом. Результатом явля-
ется выражение, указывающее на адрес в памяти и
является ближней ссылкой, содержащей только сме-
щение без базового сегмента, независимо от реаль-
ного типа выражения.
Вы обычно используете данный оператор для дальне-
го вызова процедуры или перехода по дальней мет-
ке, используя ближний тип вызова или перехода.
Смотрите часть примера для типичного сценария.
В режиме MASM для выполнения этой функции вы
TASM2 #4-5/Док = 51 =
должны использовать директиву PTR с предшествую-
щей ей NEAR.
См.также: FAR
Пример: farр PROC FAR
;тело процедуры
farр ENDP
;все еще в том же сегменте
рush cs
CALL NEAR farр ;быстрее/короче, чем
;дальний вызов
TASM2 #4-5/Док = 52 =
NOT
-----------------------------------------------------------------
Назначение: Инвертирование
Режим: MASM, Ideal
Синтаксис: NOT выражение
Замечания: NOT инвертирует в выражении все биты, заменяя 0
на 1 и 1 на 0
См.также: AND, OR, XOR
Пример: mov al,NOT 11110011b;загружается 00001100b
TASM2 #4-5/Док = 53 =
OFFSET
-----------------------------------------------------------------
Назначение: Возвращает смещение в пределах сегмента
Режим: MASM, Ideal
Синтаксис: OFFSET выражение
Замечания: Выражение может быть любым выражением или операн-
дом, который указывает на место в памяти. OFFSET
автоматически возвращает значение смещения отно-
сительно начала области, указанной базовым сег-
ментом. Если вы используете директивы сегментации
и вам необходимо смещение относительно начала
группы, а не сегмента, вы должны точно указать
группу как часть выражения. Например:
mov si,OFFSET BUFFER
это не то же самое, что
mov si,OFFSET DGROUP:BUFFER
если только сегмент, содержащий BUFFER, не явля-
ется первым сегментом в DGROUP
См.также: SEG
Пример: .DATA
msg DB"начальный анализ"
.CODE
mov si,OFFSET MSG ;адрес MSG
TASM2 #4-5/Док = 54 =
OR
-----------------------------------------------------------------
Назначение: Логическое "ИЛИ"
Режим: MASM, Ideal
Синтаксис: выражение 1 OR выражение 2
Замечания: Выполняет побитное логическое "ИЛИ" выражения 1 и
выражения 2. Результатом в любом разряде будет 1,
если в данном разряде одного из выражений или в
обоих присутствует 1 и 0 во всех других случаях
См.также: AND, NOT, XOR
Пример: mov al,11110000b OR 10101010b ;загружается
;11111010b
PROC
-----------------------------------------------------------------
Назначение: Задает выражение, являющееся ближним или дальним
указателем на код
Режим: Ideal
Синтаксис: PROC выражение
Замечания: Выражение должно быть адресом. Результатом явля-
ется выражение, указывающее на адрес в памяти и
являющееся ближним или дальним указателем, не
взирая на действительный тип выражения. Если вы
определили тип памяти TINY, SMALL или COMPACT в
директиве .MODEL, то ссылка будет ближней. В
других случаях ссылка будет дальней.
Вы обычно используете PROC для вызова или перехо-
да к опережающе объявленной функции при использо-
вании директив упрощенной сегментации.
В режиме MASM для выполнения этой функции вы
должны использовать директиву PTR с предшествую-
щей ей PROC
TASM2 #4-5/Док = 55 =
См.также: NEAR, FAR
Пример: .MODEL LARGE
.CODE
CALL PROC TEST1
TEST1 PROC ;действует дальний вызов,
;обусловленный указанием
;типом памяти LARGE
TASM2 #4-5/Док = 56 =
PTR
-----------------------------------------------------------------
Назначение: Задает выражение, имеющее особый размер
Режим: MASM, Ideal
Синтаксис: tyрe PTR exрression
Замечания: exрression(выражение) должно быть адресом. Ре-
зультатом является выражение, указывающее на
адрес в памяти и всегда имеющее формат tyрe, нев-
зирая на действительный размер выражения.
Обычно вы используете данный оператор для опреде-
ления формата опережающе объявленного выражения
или для точного задания формата выражения, задан-
ного косвенно и формат которого не может быть
определен.
tyрe должен принимать одно из следующих значений:
- UNKNOWN, BYTE, WORD, DWORD, FWORD, PWORD,
QWORD, TBYTE, DATAPTR, CODEPTR или имя структуры
-для данных
- SHORT, PROC, NEAR, FAR-для кода
В режиме Ideal вы не нуждаетесь в использовании
оператора PTR. Вы можете указывать exрression
сразу же после tyрe.
В режиме MASM tyрe может быть одной из следующих
цифр:
- Для данных:
0 = UNKNOWN 6 = PWORD
1 = BYTE 8 = QWORD
2 = WORD 10 = TBYTE
4 = DWORD
- Для кода:
0FFFFh = NEAR 0FFFEh = FAR
TASM2 #4-5/Док = 57 =
Соответственно, в режиме MASM следующие ключевые
слова имеют такие значения:
- Для данных:
UNKNOWN = 0 QWORD = 8
BYTE = 1 TBYTE = 10
WORD = 2 DATAPTR = 2 или 4
DWORD = 4 (в зависимости от MODEL)
PWORD = 6 CODEPTR = 2 или 4
FWORD = 6 (в зависимости от MODEL)
- Для кода:
NEAR = 0FFFFh PROC = 0FFFFh или 0FFFEh
FAR = 0FFFEh (в зависимости от MODEL)
См.также: BYTE, WORD, DWORD, QWORD, FWORD, PWORD,
TBYTE, NEAR, FAR, PROC
Пример: mov BYTE PTR[SI],10
fld qword PTR val
val DQ 1234.5678
TASM2 #4-5/Док = 58 =
PWORD
-----------------------------------------------------------------
Назначение: Задает выражение формата 32-разрядная дальняя
ссылка
Режим: MASM, Ideal
См.также: FWORD
QWORD
-----------------------------------------------------------------
Назначение: Задает выражение формата четыре слова
Режим: Ideal
Синтаксис: QWORD выражение
Замечания: Выражение должно быть адресом. Результатом явля-
ется выражение, указывающее на адрес памяти и
всегда имеющее формат QWORD, не взирая на дейс-
твительный формат выражения.
Обычно вы используете QWORD для определения
формата опережающе объявленного выражения или для
точного задания формата выражения заданного кос-
венно и формат которого не может быть определен.
В режиме MASM для выполнения этой функции вы
должны использовать директиву PTR с предшествую-
щей ей QWORD
См.также: PTR
Пример: fadd [QWORD BX]
fsubр [QWORD X]
.DATA
X DQ 1.234
TASM2 #4-5/Док = 59 =
SEG
-----------------------------------------------------------------
Назначение: Возвращает сегмент адреса выражения
Режим: MASM, Ideal
Синтаксис: SEG выражение
Замечания: Выражение может быть любым выражением или операн-
дом, которое ссылается на место в памяти. SEG
возвращает константу, которая представляет сег-
ментную часть адреса места в памяти
См.также: OFFSET
Пример: .DATA
temр DW 0
.CODE
mov ax,SEG temр
mov ds,ax ;установка сегментного
;регистра
ASSUME DS:SEG TEMP ;сообщение об этом
;ассемблеру
SHL
-----------------------------------------------------------------
Назначение: Сдвигает значение выражение влево
Режим: MASM, Ideal
Синтаксис: выражение SHL число
Замечания: Выражение и число должны быть преобразованы в
константы. SHL выполняет логический сдвиг битов
выражения влево. Значение битов, появившихся
справа, равно 0, а биты, сдвинутые за левый край-
теряются.
См.также: SHR
Пример: mov al,00000011b SHL 3 ;загружается
;00011000b
TASM2 #4-5/Док = 60 =
SHORT
-----------------------------------------------------------------
Назначение: Задает выражение, являющееся коротким указателем
на код
Режим: MASM, Ideal
Синтаксис: SHORT выражение
Замечания: Выражение ссылается на адрес в текущем сегменте
кода. SHORT сообщает ассемблеру о том, что
выражение лежит в пределах с -128 до 127 байт от-
носительно текущего адреса кода, что позволяет
ассемблеру генерировать инструкцию короткого JMP.
Вам необходимо использовать SHORT только в случае
опережающей ссылки инструкции JMP.Турбо ассемблер
автоматически генерирует инструкцию короткого
перехода в случае, если ему уже известен тип
ссылки, задаваемый выражением.
См.также: NEAR, FAR
Пример: jmр SHORT DONE ;генерируется инструкция
;короткого перехода длиной не
4; 0более 128 байт от данного места
DONE:
SHR
-----------------------------------------------------------------
Назначение: Сдвигает значение выражения вправо
Режим: MASM, Ideal
Синтаксис: выражение SHR число
Замечания: Выражение и число должны быть преобразованы в
константы. SHR выполняет логический сдвиг битов
выражения вправо. Значение битов, появившихся
слева, равно 0, а биты, сдвинутые за правый край-
теряются
Пример: mov al,80h SHR 2 ;загружается 20h
TASM2 #4-5/Док = 61 =
SIZE
-----------------------------------------------------------------
Назначение: Возвращает размер размещенных данных
Режим: MASM, Ideal
Синтаксис: SIZE имя
Замечания: Имя является идентификатором, ссылающимся на дан-
ные, размещенные одной из директив размещения
данных (DB, DD и т.д.). В режиме MASM, SIZE возв-
ращает значение LENGTH, умноженное на TYPE. Поэ-
тому это не следует брать в расчет многих данных,
и не расчитывать группу операторов DUP.
В режиме Ideal, SIZE сообщает общее количество
байт данных в DUP. Для получения количества байт
DUP используйте LENGTH.
См.также: LENGTH, TYPE
Пример: msg DB "Hello"
array DW 10 DUP(4 DUP(1),0)
numbrs DD 1,2,3,4
var DQ ?
;режим MASM
smsg =SIZE msg ;1, строка имеет длину 1
sarray =SIZE array ;=20,10 DUP двойное слово
snumbrs=SIZE numbrs;4, длина=1,DD=4 байта
svar =SIZE var ;=8,1 элемент,DQ=8 байт
;режим Ideal
smsg =SIZE msg ;1,строка имеет длину 1
sarray =SIZE array ;=20,10 DUP двойное слово
snumbrs=SIZE numbrs;4,длина=1,DD=4 байта
svar =SIZE var ;=8,1 элемент,DQ=8 байт
SMALL
-----------------------------------------------------------------
Назначение: Устанавливает формат смещения выражения 16 бит
Режим: MASM, Ideal( только для кодов 386)
TASM2 #4-5/Док = 62 =
Синтаксис: SMALL выражение
Замечания: Выражение является любым выражением или операн-
дом. SMALL преобразует его в 16-битовое смещение.
Это вы обычно используете для устранения двусмыс-
ленности, связанной с форматом. Например, если вы
при наличии 80386 процессора используете директи-
ву P386
jmр [DWORD PTR ABC]
может быть интерпретировано как дальний вызов с
сегментом и 16-битовым смещением, так и ближним
вызовом, использующим 32-битовое смещение. Данную
двусмысленность вы можете устранить, используя
директиву SMALL:
jmр SMALL [DWORD PTR ABC] ;16-битовое сме-
;щение при даль-
;нем вызове
В этом примере SMALL стоит вне скобок и в этом
случае из памяти читается двойное слово. Если
SMALL размещается внутри скобок, то это ин-
терпретируется как формат адреса, по которому чи-
тается операнд, но не как формат самого операнда,
читаемого из памяти. Например :
CODE SEGMENT USE32
jmр SMALL [SMALL DWORD PTR XYZ]
означает, что XYZ является 4-байтовым указателем,
трактуемым как 16-битовое смещение и сегмент, при
этом jmр косвенно через адрес читает непосредс-
твенный адрес для jmр, являющийся 16-битовым сме-
щением.
Комбинацией операторов LARGE и SMALL, включая или
вынося их за скобки, вы можете получать любые
комбинации косвенных JMP и CALL от 16- или 32-би-
тового сегмента до 16- или 32-битового сегмента.
LARGE и SMALL могут также использоваться вместе с
другими двусмысленными инструкциями, такими как
LIDT и LGDT
См.также: LARGE
TASM2 #4-5/Док = 63 =
SYMTYPE
-----------------------------------------------------------------
Назначение: Возвращает байт описания идентификатора
Режим: Ideal
Синтаксис: SYMTYPE выражение
Замечания: Функция SYMTYPE 4 0очень 4 0 похожа 4 0 на .TYPE, но с
одним отличием: 4 0если 4 0 в 4 0выражении 4 0 встретится
неопределенный идентификатор, SYMTYPE выдаст
ошибку в отличие от .TYPE.
См.также: .TYPE
TBYTE
-----------------------------------------------------------------
Назначение: Задает выражение размером в 10 байт
Режим: Ideal
Синтаксис: TBYTE выражение
Замечания: Выражение должно быть адресом. Результатом явля-
ется выражение, которое указывает на адрес в па-
мяти и всегда имеет размер TBYTE, невзирая на
действительный формат выражения.
Вы обычно используете TBYTE для определения
формат опережающе объявленного выражения или для
точного задания формата выражения, заданного кос-
венно и формат которого не может быть определен.
В режиме MASM для выполнения этой функции вы
должны использовать директиву PTR с предшествую-
щим ему TBYTE
См.также: PTR
Пример: fid [TBYTE BX]
fst [TBYTE X]
X DT 0
TASM2 #4-5/Док = 64 =
THIS
-----------------------------------------------------------------
Назначение: Создает операнд, адресом которого является теку-
щий сегмент и значение счетчика
Режим: MASM, Ideal
Синтаксис: THIS тип
Замечания: Тип описывает формат операнда и указывает, ссыла-
ется ли он на код или данные. Тип может иметь
следующие значения:
- NEAR, FAR или PROC (Proc является обычной ди-
рективой, в то время как NEAR и FAR зависят от
типа используемой памяти, установленного дирек-
тивой MODEL)
- BYTE, WORD, DWORD, FWORD, PWORD, QWORD, TBYTE
или структурное имя
Данный оператор вы обычно используете в конструк-
ции с EQU и =
Пример: рtr1 EQU THIS WORD
рtr2 LABEL WORD
TASM2 #4-5/Док = 65 =
.TYPE
-----------------------------------------------------------------
Назначение: Возвращает байт, описывающий идентификатор
Режим: MASM
Синтаксис: .TYPE имя
Замечания: Имя - идентефикатор, который может определяться
либо нет в исходном файле. .TYPE возвращает байт,
который описывает идентификатор со следующими по-
лями:
----------------------------------------------
Бит Описание
----------------------------------------------
0 относительный идентификатор программы
1 относительный идентификатор данных
2 константа
3 режим прямой адресации
4 является регистром
5 идентификатор является определенным
7 идентификатор является внешним
----------------------------------------------
Если биты 2 и 3 оба равны 0, то выражение исполь-
зует косвенный регистр (подобно BX и т.д.).
Если TYPE возвращает 0, то выражение содержит не-
определенный идентификатор.
TYPE обычно используется в макросах для определе-
ния способа обработки различных типов аргументов
См.также: SYMTYPE
Пример: IF (.TYPE ABC) AND 3 ;это относительный
;сегмент
ASSUME DS:SEG ABC
mov ax,SEG ABC
mov ds,ax
ENDIF
TASM2 #4-5/Док = 66 =
TYPE
-----------------------------------------------------------------
Назначение: Возвращает число, определяющее размер или тип
идентификатора
Режим: MASM, Ideal
Синтаксис: TYPE exрression
Замечания: TYPE возвращает одно из следующих значений, зави-
сящее от типа выражения:
BYTE 1
WORD 2
DWORD 4
FWORD 6
PWORD 6
QWORD 8
TBYTE 10
NEAR 0FFFFh
FAR 0FFFEh
constant 0
structure количество байт в структуре
См.также: LENGTH, SIZE
Пример: bvar DB 1
darray DD 10DUP(1)
X STRUC
DW ?
DT ?
X ENDS
fр EQU THIS FAR
tbvar=TYPE bvar ;=1
tdarray=TYPE darray;=4
tx =TYPE x ;=12
tfр =TYPE fр ;0FFFEh
TASM2 #4-5/Док = 67 =
UNCNOWN
-----------------------------------------------------------------
Назначение: Удаляет информацию о типе выражения
Режим: Ideal
Синтаксис: UNCNOWN выражение
Замечания: Выражение является адресом. Результатом является
то же самое выражение, но с удаленным типом
(BYTE, WORD и т.д.).
Используйте UNCNOWN для точного указания размера
всякий раз, когда вам необходимо сослаться на
местоположение. Это полезно, если вы хотите
обращаться с местоположением как с типом объеди-
нения, позволяющим сохранять многие различные ти-
пы данных.
Вы также можете использовать адрес с размером
UNCNOWN почти так же, как если бы вы использовали
косвенно-регистровую ссылку на память для одного
операнда и связывали размер операции, используя
регистр для другого операнда. Определяя имя
UNCNOWN, вы можете использовать его точно так же,
как безымянное выражение регистра, такого как
[BX].
Для выполнения данной функции в режиме MASM вам
необходимо использовать директиву PTR c последую-
щим типом BYTE.
См.также: PTR
TASM2 #4-5/Док = 68 =
Пример: .DATA
workbuf DT 0
workрtr EQU UNCNOWN WORCBUF ;безымянный
;указатель
.CODE
;Пример 1
mov [BYTE PTR WORKPTR],1 ;сохраняет байт
fstр [QWORD PTR WORKPTR] ;сохраняет QWORD
mov [WORKPTR],1 ;ошибка - нет
;типа
;Пример 2
mov al,[WORKPTR] ;не выполняется
mov ax,[WORKPTR] ;
TASM2 #4-5/Док = 69 =
WIDTH
-----------------------------------------------------------------
Назначение: Возвращает ширину поля записи в битах
Режим: MASM, Ideal
Синтаксис: WIDTH recordfieldname
WIDTH record
Замечания: recordfieldname является именем любого поля ранее
определенной записи. WIDTH возвращает количество
битов, занимаемых recordfieldname в записи.
record - имя ранее определенной записи.
WIDTH возвращает общее количество битов, занимае-
мых всеми полями данной записи
См.также: MASK
Пример: ;MACRO определяет максимальное значение
;для поля А
maxval MACRO FIELDNAME
value=2
REPT WIDTH FIELDNAME-1
value=value+2
ENDM
value=value-1
ENDM
TASM2 #4-5/Док = 70 =
WORD
-----------------------------------------------------------------
Назначение: Задает выражение длиной в слово
Режим: Ideal
Синтаксис: WORD выражение
Замечания: Выражение должно быть адресом. Результатом явля-
ется выражение, указывающее на адрес в памяти и
всегда имеет размер WORD, независимо от действи-
тельного размера выражения.
Вы обычно используете WORD для определения форма-
та опережающе объявленного выражения или для точ-
ного задания формата выражения, заданного косвен-
но и формат которого не может быть определен.
В режиме MASM для выполнения этой функции вы
должны использовать директиву PTR с предшествую-
щим ему WORD.
См.также: PTR
Пример: mov [WORD BX],1
mov [WORD X],1
X DW 0
TASM2 #4-5/Док = 71 =
XOR
-----------------------------------------------------------------
Назначение: Логическое исключающее ИЛИ
Режим: MASM, Ideal
Синтаксис: выражение 1 XOR выражение 2
Замечания: Выполняет побитное логическое исключающее ИЛИ
выражения 1 и выражения 2. Результатом в любом
разряде будет 1, если в данном разряде одного из
выражений - 1, а другого - 0, и 0 во всех других
случаях
См.также: AND, NOT, OR
Пример: mov al,11110000b XOR 11000011;AL=00110011b
TASM2 #4-5/Док = 72 =
Специальные макро операторы
-----------------------------------------------------------------
Специальные макро операторы используются при вызове
макросов, внутри макросов и при определении повторяющихся блоков.
Также они могут использоваться с аргументами условных директив
ассемблера.
Далее приведено краткое описание специальных макро
операторов:
& оператор заменитель
<> оператор текстовой строки
! оператор символьных кавычек
% оператор преобразования выражения
;; подавление комментария
Данные операторы позволяют вам модифицировать имена иденти-
фикаторов и отдельные идентификаторы, что дает вам возможность
либо удалять специальное значение из идентификатора, либо управ-
лять при вычислении аргумента.
&
-----------------------------------------------------------------
Назначение: Оператор заменитель
Режим: MASM, Ideal
Синтаксис: & имя
Замечания: Имя - значение действительного параметра макро
вызова или повторяющийся блок. Во многих случаях
параметр заменитель является автоматическим и вы
не должны использовать данный оператор. Вы должны
использовать данный оператор при желании вставить
заменитель символьной строки, взятой в кавычки,
или при желании "собрать" вместе идентификатор из
одного и более параметров или несколько опреде-
ленных мдентификаторов. В этом случае & не до-
TASM2 #4-5/Док = 73 =
пускает интерпретацию символов как одного имени
Пример: MAKEMSG MACRO NAME,NUM
MSG&NUM: DB '&NAME'
ENDM
Если вызвать данный макро следующим образом:
MAKEMSG 9,<Введите значение:>
то:
MSG9 DB 'Введите значение:'
TASM2 #4-5/Док = 74 =
<>
-----------------------------------------------------------------
Назначение: Оператор текстовой строки
Режим: MASM< Ideal
Синтаксис: <текст>
Замечания: Текст трактуется как отдельный макро или пов-
торяемый параметр, даже если он содержит запятые,
пробелы или табуляции, которыми обычно разделяют-
ся параметры. Используйте данный оператор, когда
вы желаете передать аргумент, содержащий любые из
этих разделительных символов.
Вы можете также использовать данный параметр для
указания Турбо ассемблеру трактовать буквенные
символы без задания им какого-либо специального
значения. Например, если вы хотите передать точку
с запятой (;) как параметр в макро вызове, вы
должны заключить ее в угловые скобки (<;>) во из-
бежание трактования данного символа как начала
комментария.
Турбо ассемблер выводит содержимое угловых скобок
за их пределы каждый раз при передаче параметра
при вызове макро. Для передачи параметра через
несколько уровней вызовов макро, вы должны заклю-
чить его в угловые скобки для каждого уровня
Пример: MANYDB MACRO VALS
IRP X,<VALS>
ENDM
ENDM
При вызове данного макро вы должны заключить не-
обходимые значения в угловые скобки и, таким
образом, все они будут восприняты как единый
параметр VALS:
MANYDB <4,6,0,8>
В повторной директиве IRP имя параметра по -преж-
нему заключено в угловые скобки, т.к. скобки
вокруг параметра убираются при вызове макро.
TASM2 #4-5/Док = 75 =
!
-----------------------------------------------------------------
Назначение: Оператор символьных кавычек
Режим: MASM, Ideal
Синтаксис: ! символ
Замечания: Оператор ! позволяет вам вызывать макрос с аргу-
ментом, который содержит специальные символы
макро оператора. Это эквивалентно заключению сим-
вола в угловые скобки. Например, запись !& экви-
валентна записи <&>
Пример: MAKEMSG MACRO NAME,NUM
MSG&NUM: DB '&NAME'
ENDM
MAKEMSG <Can't enter !>99>
В данном примере аргумент был бы преждевременно
окончен, если бы не был использован оператор !
%
-----------------------------------------------------------------
Назначение: Оператор преобразования выражения
Режим: MASM, Ideal
Синтаксис: % выражение
Замечания: Выражение может быть либо числовым выражением,
использующим любой из операндов и операторов,
описанных в этой главе, либо текстовым выражени-
ем. Строка, которая передается как параметр макро
вызова, является результатом преобразования
выражения.
Используйте данный оператор при желании передать
строку, представляющую вычисленный результат в
макро, что предпочтительнее самого выражения
Пример: DEFSYM MACRO NUM
TASM2 #4-5/Док = 76 =
???&NUM
ENDM
DEFSYM %5+4
выполняет определение метки в следующем коде :
???9:
;;
-----------------------------------------------------------------
Назначение: Подавление комментария
Режим: MASM, Ideal
Синтаксис: ;;текст
Замечания: Турбо ассемблер игнорирует любой текст, следующий
за двумя знаками точка с запятой (;;). Обычно
комментарий сохраняется как часть макро определе-
ния и появляется в листинге всякий раз при ис-
пользовании макро. Комментарий, стоящий после
двух знаков точка с запятой (;;), не сохраняется
как часть макро определения. Это экономит память,
особенно если вы имеете много макросов, которые
содержат большое количество комментариев.
Пример: SETBYTES MACRO NAME,VAL
NAME DB 10 DUP(VAL) ;;данный комментарий
не будет сохраняться
ENDM
TASM2 #4-5/Док = 77 =
Глава 3. Директивы
-----------------------------------------------------------------
Исходное выражение может быть либо инструкцией, либо дирек-
тивой. Строка инструкции генерирует объектный код для процессора
определяемый мнемоникой инструкции и ее операндами. Строка
директивы сообщает ассемблеру о выполнении каких-либо действий,
не связанных с генерацией инструкций и состоящих из определения и
размещения данных и структур данных, определения макросов,
определения формата файла листинга, управления условным
ассемблированием, выбора типа процессора и установки инструкций.
Некоторые директивы определяют идентификатор, который явля-
ется просто строкой исходного текста. К таким директивам от-
носятся, например, SEGMENT, LABEL и GROUP. Другие влияют на рабо-
ту ассемблера.
Перечисленные здесь директивы расположены в алфавитном
порядке (не беря в расчет знаки пунктуации); например .CODE стоит
непосредственно перед CODESEG.
Зарезервированные слова %TOC и %NOTOC в данной версии Турбо
ассемблера не реализованы. Будущие версии будут использовать дан-
ные ключевые слова и, поэтому, вы не должны использовать их в ка-
честве идентификаторов в программах.
Директивы могут делиться на три категории:
1. Директивы режима MASM : Турбо ассемблер поддерживает
все директивы режима MASM. При использовании вами ассемб-
лера в режиме Ideal синтаксис некоторых директив меняет-
ся. Для таких директив приводится описание их синтаксиса
для обоих режимов.
2. Новые директивы Турбо ассемблера : Данные директивы
расширяют возможности по сравнению с MASM.
3. Директивы, являющиеся синонимами для существующих ди-
ректив MASM: Данные синонимы являются более расширенными
по сравнению с существующими директивами MASM. Например,
директивам .LIST и .XLIST предпочтительнее использовать
%LIST и %NOLIST. Как правило, пара директив, которая де-
лает что-либо возможным или невозможным, имеет вид XXXX и
NOXXXX. В синонимах также избегайте использования точки
(.) в начале директивы. Директивы режима MASM, начинающи-
еся с точки, недействительны в режиме Ideal, таким обра-
TASM2 #4-5/Док = 78 =
зом, взамен вы должны использовать новые синонимы.
Все директивы Турбо ассемблера, управляющие файлом листинга,
начинаются с символа процент (%).
При описании синтаксиса используются следующие соглашения :
- Квадратные скобки говорят о том, что данные аргументы яв-
ляются необязательными (вы не должны заключать аргументы
в квадратные скобки).
- Круглые скобки (...) сообщают о том, что предыдущий эле-
мент может быть повторен необходимое количество раз.
TASM2 #4-5/Док = 79 =
Samрle Directive (Образец директивы)
-----------------------------------------------------------------
Назначение: Приводится описание того, что данная директива
выполняет
Режим: Режим, в котором выполняется данная директива
Синтаксис: Описывается, как использовать директиву
Замечания: Основная информация о директиве
См.также: Другие директивы, имеющие отношение к данной
Пример: Образец кода, использующего данную директиву
.286
-----------------------------------------------------------------
Назначение: Позволяет генерировать не привилегированные
инструкции для 80286
Режим: MASM
Замечания: Директива .286 позволяет генерировать дополни-
тельные инструкции, поддерживаемые процессором
80286, в непривилегированном режиме. Инструкции
арифметического сопроцессора 80287 поддерживает
точно так же, как если бы были использованы
директивы .287 или 286C.(Похожа на директивы .286
N и .286C).
См.также: .8086, .186, .286C, .286P, .386, .386C,
.386P, P8086, P286, P286P, P286N, P386, P386P,
P386N.
Пример: .286
fstsw ax; выполнимо только с 80287
.286C
-----------------------------------------------------------------
Назначение: Позволяет генерировать не привилегированные
инструкции для 80286
См.также: .8086, .186, .286, .286P, .386, .386C,
.386P, P8086, P286, P286P, P286N, P386, P386P,
P386N.
TASM2 #4-5/Док = 81 =
.286P
-----------------------------------------------------------------
Назначение: Позволяет генерировать все инструкции процессора
80286
Режим: MASM
Синтаксис: .286P
Замечания: Директива .286P позволяет генерировать дополни-
тельные инструкции, поддерживаемые процессором
80286, включая инструкции привилегированного
режима. Также поддерживает инструкции арифмети-
ческого сопроцессора 80287 точно так же, как если
бы были использованы директивы .287 или P287.
(Похожа на P286)
См.также: .8086, .186, .286, .286C, .386, .386C,
.386P, P8086, P286, P286P, P286N, P386, P386P,
P386N.
TASM2 #4-5/Док = 82 =
.287
-----------------------------------------------------------------
Назначение: Позволяет генерировать инструкции для сопроцес-
сора 80287
Режим: MASM
Синтаксис: .287
Замечания: Директива .287 позволяет генерировать все
инструкции, поддерживаемые арифметическим сопро-
цессором 80287. Используйте данную директиву,
если вы знаете, что ваша программа никогда не бу-
дет использовать сопроцессор 8087. Эта директива
вызывает инструкции с плавающей запятой, которые
являются несовместимыми с 8087 и поэтому не
используйте данную директиву, если ваша программа
при выполнении использует 8087. (Похожа на P287)
См.также: .8087, .387, P8087, PN8087, P287, P387
Пример: .287
fsetрm ;только для 287
TASM2 #4-5/Док = 83 =
.386
-----------------------------------------------------------------
Назначение: Позволяет генерировать не привилегированные ин-
струкции для 80386
Режим: MASM
Синтаксис: .386
Замечания: Директива .386 позволяет генерировать дополни-
тельные инструкции, поддерживаемые процессором
80386, в непривилегированном режиме. Также под-
держивает инструкции арифметического сопроцессора
80387 точно так же, как если бы были использованы
директивы .387 или 386C. (Похожа на P386N и
.386C)
См.также: .8086, .186, .286, .286C, .286P, .386C,
.386P, P8086, P286, P286P, P286N, P386, P386P,
P386N.
Пример: .386
stosd ;инструкция выполняется только на
;386
.386P
-----------------------------------------------------------------
Назначение: Позволяет генерировать все инструкции процессора
80386
Режим: MASM
Синтаксис: .386P
Замечания: Директива .386P позволяет генерировать дополни-
тельные инструкции, поддерживаемые процессором
80386, включая инструкции привилегированного
режима. Также поддерживает инструкции арифмети-
ческого сопроцессора 80387 точно так же, как если
бы были использованы директивы .387 или P387.
(Похожа на P386P)
См.также: .8086, .186, .286, .286C, .286P, .386,
.386C, P8086, P286, P286P, P286N, P386, P386P,
P386N.
.387
-----------------------------------------------------------------
Назначение: Позволяет генерировать инструкции для сопроцес-
сора 387
Режим: MASM
Синтаксис: .387
Замечания: Директива .387 позволяет генерировать все
инструкции, поддерживаемые арифметическим сопро-
цессором 80387. Используйте данную директиву,
если вы знаете, что ваша программа никогда не бу-
дет использовать сопроцессор 8087. Эта директива
вызывает инструкции с плавающей запятой, которые
являются несовместимыми с 8087 и поэтому не
используйте данную директиву, если ваша программа
при выполнении использует 8087 (Похожа на .387)
См.также: .8087, .287, 8087, PNO87, P287, P387
Пример: .387
fsin ;SIN( ) выполняется только на 387
TASM2 #4-5/Док = 85 =
8086
-----------------------------------------------------------------
Назначение: Позволяет генерировать инструкции только для
процессора 8086
Режим: MASM
Синтаксис: .8086
Замечания: Директива .8086 позволяет генерировать инструк-
ции, поддерживаемые процессором 8086, несовмести-
мые со всеми инструкциями, выполняемыми только
процессорами 80186, 80286, 80386. Также поддержи-
вает инструкции сопроцессора 8087 точно так же,
как если бы были использованы .8087 или 8087.
Данная инструкция принимается по умолчанию, когда
Турбо ассемблер начинает ассемблировать исходный
файл. Программы, ассемблированные с использовани-
ем данного режима, смогут выполняться на всех
процессорах семейства 80х86. Если вы знаете, что
ваша программа будет выполняться только на одном
типе процессора, вы можете отдать предпочтение
тем специфичным директивам, которые выполнимы на
используемом типе процессора (Похожа на .P8086).
См.также: .186, .286C, .286, .286P, .386C, .386,
.386P, P8086, P286, P286P, P386, P386P
.8087
-----------------------------------------------------------------
Назначение: Позволяет генерировать инструкции для сопроцес-
сора 8087.
Режим: MASM
Синтаксис: .8087
Замечания: Директива .8087 позволяет генерировать все
инструкции, поддерживаемые сопроцессором 8087 и
несовместимые со всеми инструкциями, выполняемыми
только 80287 и 80387.
TASM2 #4-5/Док = 86 =
Данная инструкция принимается по умолчанию, когда
Турбо ассемблер начинает ассемблировать исходный
файл. Программы, ассемблированные с использовани-
ем данного режима, смогут выполняться на всех
сопроцессорах семейства 80х87. Если вы знаете,
что ваша программа будет выполняться только на
одном типе сопроцессора, вы можете отдать пред-
почтение тем специфичным директивам, которые вы-
полнимы на используемом типе сопроцессора (Похожа
на .P8087)
См.также: .287, .387, 8087, PN087, P287, P387
Пример: .8087
fstsw memloc ;невыполнима FSTSW AL на 8087
:
-----------------------------------------------------------------
Назначение: Определяет ближнюю метку кода
Режим: MASM, Ideal
Синтаксис: имя:
Замечания: Имя - идентификатор, который вы предварительно не
определили в исходном файле. Вы можете располо-
жить ближнюю метку кода самостоятельно на строке,
либо в начале строки перед инструкцией. Обычно,
ближняя метка кода является местом назначения для
инструкций JMP и CALL в том же сегменте. Метка
кода будет доступна только внутри текущего файла
в том случае, если вы не будете использовать ди-
рективу PUBLIC для того, чтобы сделать ее доступ-
ной из других исходных файлов.
Действие данной директивы аналогично действию
директивы LABEL для определения NEAR метки;
например A: это то же, что и A LABEL NEAR.
См.также: LABEL
Пример: .
.
jne A ;перешагивает через следующую
TASM2 #4-5/Док = 87 =
;инструкцию
inc si
A: ;JNE передает управление в
;в это место
=
-----------------------------------------------------------------
Назначение: Определяет числовое равенство
Режим: MASM, Ideal
Синтаксис: имя=выражение
Замечания: Имя связывается с результатом вычисления выраже-
ния, которое должно быть представлено либо конс-
тантой, либо адресом внутри сегмента. Имя может
быть либо новым символическим именем, либо иден-
тификатором, который ранее уже использовался с
директивой =. Выражение не должно содержать ка-
ких-либо опережающе объявленных символических
имен.
Вы можете переопределить идентификатор, который
был определен с использованием директивы =, что
позволяет вам использовать идентификаторы в ка-
честве счетчиков (смотрите пример, приведенный
ниже).
Вы не можете использовать = для назначения строк,
переопределения ключевых слов или мнемоник
инструкций. Для того, чтобы делать эти вещи, ис-
пользуйте EQU.
Директива = имеет более предсказуемое поведение в
режиме MASM, чем директива EQU, поэтому вы должны
использовать = вместо EQU везде, где это возмож-
но.
См.также: EQU
TASM2 #4-5/Док = 88 =
Пример: MASK=1 ;инициализация бита маски
BittBl LABEL BYTE
REPT 8
DB MASK
MASK=MASK*2;сдвиг бита влево
ENDM
TASM2 #4-5/Док = 89 =
ALIGN
-----------------------------------------------------------------
Назначение: Округляет значение счетчика до адреса, кратного
двойке
Режим: MASM, Ideal
Синтаксис: ALIGN граница
Замечания: Граница должна быть кратна 2 (например :2, 4, 8 и
т.д.).
Если значение счетчика не является кратным грани-
це, то в сегмент вставляется инструкция NOP до
достижения необходимого адреса. В случае, если
значение счетчика кратно границе, то данная
директива не имеет никакого действия.
Вы не можете выровнять до границы, которая явля-
ется более строгой, чем выравнивание сегмента, в
котором появляется директива ALIGN. Выравнивание
сегмента определяется, когда сегмент первоначаль-
но устанавливается директивой SEGMENT.
Например, если вы выделили сегмент при помощи
CODE SEGMENT PARA PUBLIC
вы можете сказать ALIGN 16 (аналогично PARA), но
вы не можете сказать ALIGN 32, поскольку это яв-
ляется более строгим, чем выравнивание, указанное
ключевым словом PARA в директиве SEGMENT
См.также: EVEN, EVENDATA
Пример: ALIGN 4 ;выравнивает до гра-
;ницы DWORD для 386
BigNum DD 12345678
TASM2 #4-5/Док = 90 =
.ALPHA
-----------------------------------------------------------------
Назначение: Устанавливает алфавитный порядок следования сег-
ментов
Режим: MASM
Синтаксис: .ALPHA
Замечания: Обычно вы используете .ALPHA для обеспечения сов-
местимости со старыми версиями MASM и ассемблера
IBM. Для старых версий ассемблеров сегменты рас-
полагаются в алфавитном порядке, что не обяза-
тельно для новых. Используйте данное средство при
ассемблировании исходных файлов, написанных для
старых версий.
Если вы не используете данную директиву, сегменты
следуют в том же порядке, в котором они встреча-
ются в исходном файле. Директива DOSEG также мо-
ет упорядочивать сегменты.
.ALPHA выполняет те же действия, что и параметр /
A в командной строке. Если вы используете в ко-
мандной строке параметр /S, директива .ALPHA бу-
дет отменена им.
См.также: DOSSEG, .SEG
Пример: .ALPHA
XYZ SEGMENT
XYZ ENDS
ABC SEGMENT ;данный сегмент будет первым
ABC ENDS
TASM2 #4-5/Док = 91 =
ARG
-----------------------------------------------------------------
Назначение: Помещает в стек аргументы для процедуры
Режим: MASM, Ideal
Синтаксис: ARG аргумент[,аргумент]...[=символ]
[RETURNS аргумент[,аргумент]]
Замечания: ARG употребляется внутри PROC/ENDP, позволяя вам
иметь доступ к параметрам, сохраненным в стеке
посредством вызова процедуры. Каждому аргументу
назначается положительное смещение регистром BP,
предположив, что обратный адрес вызова функции и
BP того, кто вызывает уже сохранены в стеке.
Аргумент описывает аргумент, вызывающий процеду-
ру. Язык, определенный с директивой .MODEL, опре-
деляет, помещаются ли аргументы в стек в обратном
порядке. Вы всегда должны перечислить аргументы в
том порядке,в котором они появляются в вызывающей
процедуру функции языка высокого уровня.
При необходимости Турбо ассемблер читает их в
обратном порядке. Каждый аргумент имеет следующий
синтаксис:
argname[[count1]][:[distance][PTR]tyрe][:count2]
argname - имя, которое будет использоваться для
ссылки на данный аргумент внутри процедуры.
Distance - необязателен и может быть либо NEAR,
либо FAR для отображения того, что аргумент явля-
ется указателем данного формата. Tyрe - тип дан-
ных аргумента и может принимать значения WORD,
DWORD, FWORD, PWORD, QWORD, TBYTE или имя струк-
туры. count1, count2 - количество элементов ука-
занного типа. Общее количество элементов опреде-
ляется как count1*count2.
Если вы не определили tyрe, будет принято значе-
ние WORD.
Если вы добавляете PTR для отображения того, что
аргумент в самом деле является указателем на дан-
TASM2 #4-5/Док = 92 =
ные, Турбо ассемблер выделяет данную отладочную
информацию для Турбо Отладчика. Использование PTR
оказывает действие только на генерацию добавочной
отладочной информации и не генерирует код.
При использовании PTR, при определении NEAR или
FAR передним, Турбо ассемблер устанавливает раз-
мер указателя, основываясь на текущем типе памяти
и (для процессора 386) размере текущего адресного
сегмента (16 или 32 бита). Размер устанавливается
величиной в WORD для совсем малой, малой и сред-
ней памяти, и в DWORD для всех остальных типов
памяти, использующих 16-битовые сегменты. Если вы
используете 386 процессор и 32 битовый сегмент,
то размер устанавливается величиной в DWORD для
совсем малой, малой и средней памяти, и в FWORD
для всех остальных типов памяти.
Имена аргументов остаются определенными в проце-
дуре как операнды в памяти относительно BP.
Например:
Func1 PROC NEAR
arg A:WORD,B:DWORD:4,C:BYTE=D
определяет A как [BP+4], B как [BP+6], С как [BP+
14] и D как 20.
Если вы заканчиваете список аргументов знаком ра-
венства (=) и идентификатором, то идентификатор
будет равен общей длине блока аргументов в бай-
тах. Данное значение вы можете использовать в
конце процедуры как аргумент инструкции RET, ко-
торая при возврате очищает стек от сохраненных
аргументов (данное соглашение при вызовах
действует в Паскале).
Так как для процессоров семейства 8086 невозможно
сохранить аргумент размером в один байт, аргумен-
ты, объявленные как тип BYTE, будут занимать 2
байта в области стека. Это соответствует форме
передачи языками высокого уровня символьных
переменных в качестве параметров. Если вы,
все-таки, хотите сохранить в стеке единственный
байт, вы должны точно определить размерность по-
ля:
TASM2 #4-5/Док = 93 =
ARG REALBYTE:BYTE:1
Если вы не определите размерность для аргументов
типа BYTE, по умолчанию будет принята размерность
2.
Необязательное ключевое слово RETURNS определяет
один или более аргументов, которые не должны быть
извлечены из стека при возврате процедуры в то
место, откуда она была вызвана. Обычно, если вы
определяете язык как PASKAL или TPASKAL с исполь-
зованием директивы .MODEL, все аргументы извлека-
ются из стека при возврате процедуры. Если вы
расположили аргументы после ключевого слова
RETURNS, они будут сохранены в стеке для исполь-
зования, а затем изъяты из стека. В частности, вы
должны определить возвращаемое значение паска-
левской строки, размещая его после ключевого сло-
ва RETURNS.
См.также: LOCAL, PROC, USES
Пример: Простая паскалевская процедура:
fр PROC FAR
SRC:WORD,DEST:WORD=ARGLEN
arg @a:WORD,@b:WORD=@arglen
рush bр
mov bр,sр
mov di,DEST
;<Тело процедуры>
mov si,SRC
рoр bр
ret @arglen
fр ENDP
TASM2 #4-5/Док = 94 =
ASSUME
-----------------------------------------------------------------
Назначение: Связывает сегментный регистр с сегментом или
групповым именем
Режим: MASM, Ideal
Синтаксис: ASSUME сегментный регистр:имя
[,сегментный регистр:имя]...
ASSUME сегментный регистр:NOTHING
ASSUME NOTHING
Замечания: Сегментный регистр - один из регистров CS, DS, ES
или SS, и, если при наличии процессора 80386 были
использованы директивы P386 или P386N, также
регистры FS и GS.
Имя может принимать одно из следующих значений:
- групповое имя, определенное при использовании
директивы GROUP
- имя сегмента, определенное при использовании
директивы SEGMENT или директивами сегментации
- выражение, начинающееся с оператора SEG
- ключевое слово NOTHING.
Ключевое слово NOTHING разрывает взаимосвязь меж-
ду определенным сегментным регистром и сегментом
или групповым именем. Выражение ASSUME NOTHING
снимает все связи между сегментным регистром и
сегментом или групповым именем.
С помощью единственного выражения ASSUME вы може-
те определить несколько регистров, а также раз-
местить несколько выражений ASSUME в любом месте
вашего исходного файла.
Полную информацию об использовании директивы
ASSUME вы можете получить в "Директива ASSUME"
(глава 10 руководства пользователя).
TASM2 #4-5/Док = 95 =
См.также: GROUP, SEGMENT
Пример: DATA SEGMENT
mov ax,DATA
mov ds,ax
ASSUME ds:DATA
%BIN
-----------------------------------------------------------------
Назначение: Устанавливает ширину при выводе объектного кода в
файл листинга
Режим: MASM, Ideal
Синтаксис: %BIN размер
Замечания: Размер является константой. Если вы не используе-
те эту директиву, инструкции при этом размещаются
в файле листинга в 20 колонок.
Пример: %BIN 12
TASM2 #4-5/Док = 96 =
CATSTR
-----------------------------------------------------------------
Назначение: Объединяет несколько строк в одну строку
Режим: MASM51, Ideal
Синтаксис: имя CATSTR строка[,строка]...
Замечания: Имя - данное значение, состоящее из идентификато-
ров каждой строки, объединенных в одну строку.
Каждая строка может быть одной из следующих:
- строковый аргумент, заключенный в угловые скоб-
ки, подобно <abc>
- заранее определенный текстовый макро
- числовое строковое замещение, начинающееся с
процента (%)
См.также: SUBSTR, INSTR, SIZESTR
Пример: LETTER CATSTR <abc>,<def>;LETTER="abcdef"
.CODE
-----------------------------------------------------------------
Назначение: Определяет начало сегмента кода
Режим: MASM
Синтаксис: .CODE [имя]
Замечания: Директива .CODE указывает начало выполняемого ко-
да в вашем модуле. Сначала вы должны использовать
директиву .MODEL для определения типа памяти. Ес-
ли вы определили тип памяти как средняя или боль-
шая, дальше вы можете использовать директиву
.CODE с параметром "имя", определяющим имя сег-
мента. Таким образом, вы можете иметь несколько
сегментов кода, задавая им различные имена.
Вы можете иметь в вашем исходном файле столько
TASM2 #4-5/Док = 97 =
директив .CODE, сколько захотите. Все различные
куски с одним и тем же именем будут скомбинирова-
ны в один сегмент кода так же, как если бы вы
ввели весь код одним куском после единственной
директивы .CODE.
Использование директивы .CODE позволяет вам свя-
зать регистр CS с текущим сегментом кода. Это
имеет такое же действие, как если бы вы размещали
данную директиву в вашем исходном файле после
каждой директивы .CODE:
ASSUME CS:@code
См.также: CODESEG, .DATA, .FARDATA, FARDATA?, .MODEL,.STACK
Пример: .CODE ;сегмент кода
mov al,x
.DATA ;переключение на сегмент
x DB ? ;данных
TASM2 #4-5/Док = 98 =
CODESEG
-----------------------------------------------------------------
Назначение: Определяет начало сегмента кода
Режим: MASM, Ideal
Замечания: CODESEG является тем же самым, что и .CODE
См.также: .CODE, .DATA, .FARDATA, .MODEL, .STACK
COMM
-----------------------------------------------------------------
Назначение: Определяет общую переменную
Режим: MASM, Ideal
Синтаксис: COMM определение[,определение]...
Замечания: Каждое определение описывает идентификатор и име-
ет следующий формат:
[distance][language] name[[count1]]:tyрe[:count2]
distance является необязательным и может быть ли-
бо NEAR, либо FAR. Он определяет располагается ли
общая переменная в области ближних данных
(DGROUP) или же в сегменте с дальним вызовом. Ес-
ли вы не определяете distance, он будет определен
по умолчанию и будет иметь формат для определен-
ного по умолчанию типа памяти. Если вы не исполь-
зуете директивы сегментации (.MODEL и т.д.) -
форматом по умолчанию будет NEAR. Для очень ма-
лой, малой и средней памяти определенным по умол-
чанию форматом будет также NEAR. Для всех осталь-
ных типов памяти - FAR.
language принимает одно из значений - C, PASCAL,
BASIC, FORTRAN, PROLOG или NOLANGUAGE и определя-
ет любые языковые согласования применяемых сим-
вольных имен. Использование указания языка в ди-
рективе COMM временно переопределяет текущую язы-
ковую установку (по умолчанию или определенную
TASM2 #4-5/Док = 99 =
директивой .MODEL). Заметьте, что вам не нужно
иметь директиву .MODEL для использования данной
возможности.
name - идентификатор, который должен быть общим и
размещаться во время компоновки. Если distance
FAR, то name может быть также определено как
массив элементов множественного размера, включен-
ного в общую область:
name [multiрlier]
tyрe может быть одним из следующих: BYTE, WORD,
DATAPTR, CODEPTR, DWORD, FWORD, PWORD, QWORD,
TBYTE или структурное имя.
count указывает сколько определяется общедоступ-
ных идентификаторов. Общее пространство, отведен-
ное под общую переменную, определяется длиной,
задающейся tyрe, учитывая размер массива (если он
присутствует).
Вы можете определить более чем один общий иденти-
фикатор, разделяя определения запятыми.
Общие переменные размещаются компоновщиком.
В режиме MASM общие идентификаторы, объявленные
вне любого сегмента, могут быть досягаемыми через
регистр DS, который не всегда может быть принят
как действующий. Убедитесь, что вы либо помещаете
правильное значение в регистр сегмент DS, либо
используете точное сегментное смещение при обра-
щении к этим переменным. В режиме Ideal Турбо
ассемблер проверяет, правильно ли адресуема общая
переменная, используя некоторые из текущих сег-
ментных регистров, как описано в директиве
ASSUME.
Общие переменные не могут быть инициализированы.
Используйте директиву GLOBAL, если желаете иници-
ализировать параграфы данных, которые разделяются
между модулями. Компоновщик также не гарантирует
размещение общих переменных в некоторых частных
случаях, таким образом, вы не можете сделать
присвоения параграфам данных, размещенных дирек-
TASM2 #4-5/Док = 100 =
тивой COMM в последующих строках, исходного текс-
та.
См.также: EXTRN, GLOBAL, PUBLIC, PUBLICDLL
Пример: COMM buffer:BYTE:512 ;размещается во время
;компоновки
COMM FAR abc[41]:BYTE:10 ;410 байт (10
;элементов по 41
;байту) размещаются
;во время компоновки
TASM2 #4-5/Док = 101 =
COMMENT
-----------------------------------------------------------------
Назначение: Начинает блок комментария
Режим: MASM
Синтаксис: COMMENT разграничитель [текст]
[текст]
[текст] разграничитель
Замечания: COMMENT игнорирует весь текст, располагающийся
между первым символом-ограничителем и строкой,
содержащей следующий ограничитель. Ограничителем
является первый символ (кроме пробела) после
директивы COMMENT
Пример: COMMENT *
любой текст
*
%CONDS
-----------------------------------------------------------------
Назначение: Показывает все параметры в условных блоках в лис-
тинге
Режим: MASM, Ideal
Синтаксис: %CONDS
Замечания: %CONDS является определенным по умолчанию режимом
листинга в случае, если вы не используете дирек-
тивы управления листингом (такие как .LFCOND)
См.также: %NOCONDS, .LFCOND, .SFCOND, .TFCOND
Пример: %CONDS
IF 0
mov ax,1
ENDIF
TASM2 #4-5/Док = 102 =
.CONST
-----------------------------------------------------------------
Назначение: Определяет сегмент постоянных данных
Режим: MASM
Синтаксис: .CONST
Замечания: Директива .CONST определяет начало сегмента вашей
программы, содержащего постоянные данные (конс-
танты). Это данные, необходимые для вашей
программы, которые не могут быть изменены во
время исполнения программы. В данном сегменте вы
можете размещать такие вещи как подсказки и
строковые сообщения.
Вы не должны использовать эту директиву при напи-
сании чисто ассемблерных программ. Вы можете на-
писать процедуры, которые стыкуются с языками вы-
сокого уровня и затем используют это для
инициализации постоянных данных
См.также: .CODE, .DATA, .DATA?, .FARDATA, .FARDATA?,
.MODEL
Пример: .CONST
msg DB "Выполнение прекращено"
TASM2 #4-5/Док = 103 =
CONST
-----------------------------------------------------------------
Назначение: Определяет сегмент постоянных данных
Режим: MASM, Ideal
См.также: .CODE, .CONST, .DATA, .DATA?, .FARDATA,
.FARDATA?
.CREF
-----------------------------------------------------------------
Назначение: Делает возможным создание листинга перекрестных
ссылок
Режим: MASM
Синтаксис: .CREF
Замечания: .CREF позволяет накапливать информацию перекрест-
ных ссылок для всех идентификаторов исходного
файла, начиная с данного места. Эта директива из-
меняет действие на противоположное директив
%XCREF или . XCREF, которые запрещают сбор инфор-
мации о перекрестных ссылках.
По умолчанию Турбо ассемблер использует данный
режим в случае, если вы не используете какие-либо
директивы управления перекрестными ссылками (та-
кие как %CREF).
Турбо ассемблер включает информацию о перекрест-
ных ссылках в файл листинга, также как и в от-
дельный .XRF файл.
См.также: %CREF
TASM2 #4-5/Док = 104 =
%CREF
-----------------------------------------------------------------
Назначение: Делает возможным создание листинга перекрестных
ссылок
Режим: MASM, Ideal
Синтаксис: %CREF
См.также: %NOCREF, .CREF, .XCREF, %CREFALL, %CREFREF,
%CREFUREF
Пример: %CREF
wval DW 0 ;CREF показывает WVAL,
;определенное здесь
%CREFALL
-----------------------------------------------------------------
Назначение: Вносит все идентификаторы в список перекрестных
ссылок
Режим: MASM, Ideal
Синтаксис: %CREFALL
Замечания: %CREFALL изменяет действие на противоположное
директив %CREFREF и %CREFUREF, использованных
ранее, которые делали невозможным создание списка
ссылочных и нессылочных идентификаторов. После
использования %CREFALL все последующие идентифи-
каторы из исходного файла появятся в списке пе-
рекрестных ссылок.
Турбо ассемблер использует данный режим по умол-
чанию при ассемблировании вашего исходного файла
См.также: %CREFREF, %CREFUREF
Пример: %CREFREF
arg1 equ [bр+4];не ссылочный, не будет при-
;сутствовать в списке
%CREFALL
arg2 equ [bр+6];не ссылочный, появляется
TASM2 #4-5/Док = 105 =
;везде
arg3 equ [bр+8];ссылочный, появляется в
;списке
mov ax,arg3
END
%CREFREF
-----------------------------------------------------------------
Назначение: Делает невозможным появление нессылочных иденти-
фикаторов в списке перекрестных ссылок
Режим: MASM,Ideal
Синтаксис: %CREFREF
Замечания: %CREFREF означает, что идентификаторы, которые
были определены, но на которые нет ссылок, будут
исключены из списка перекрестных ссылок. Обычно,
при вызове вами перекрестных ссылок, данные иден-
тификаторы появляются в таблице идентификаторов
См.также: %CREF, %CREFUREF, %CREFALL
Пример: %CREFREF
ABC EQU 4 ;не появится в списке CREF
xyz EQU 1 ;появится в списке
mov ax,xyz ;служит причиной появления
;XYZ в списке
END
TASM2 #4-5/Док = 106 =
%CREFUREF
-----------------------------------------------------------------
Назначение: Вносит в список перекрестных ссылок только не
ссылочные идентификаторы
Режим: MASM, Ideal
Синтаксис: %CREFUREF
Замечания: %CREFUREF делает возможным занесение не ссылочных
идентификаторов в таблицу идентификаторов перек-
рестных ссылок. При использовании данной директи-
вы в таблице идентификаторов будут появляться
только не ссылочные идентификаторы. Для просмотра
как не ссылочных идентификаторов, так и ссылоч-
ных, используйте директиву %CREFALL
См.также: %CREFALL, %CREFREF
Пример: %CREF
abc EQU 2 ;не появляется в списке
%CREFUREF
def EQU 1 ;появляется в списке
END
TASM2 #4-5/Док = 107 =
%CTLS
-----------------------------------------------------------------
Назначение: Печатает список управлений
Режим: MASM, Ideal
Синтаксис: %CTLS
Замечания: %CTLS вызывает включение в список расположенных в
файле листинга директив управления (таких как
%LIST, %INCL и т.д.); обычно они включены в спи-
сок. Данная директива имеет действие над всеми
последующими строками. Таким образом, сама дирек-
тива %CTLS не будет появляться в файле листинга
См.также: %NOCTLS
Пример: %CTLS
%NOLIST ;данная директива будет при-
;сутствовать в файле листинга
TASM2 #4-5/Док = 108 =
.DATA
-----------------------------------------------------------------
Назначение: Определяет начало сегмента данных
Режим: MASM
Синтаксис: .DATA
Замечания: Директива .DATA сигнализирует о начале инициали-
зированных данных в вашем модуле. Сначала вы
должны использовать директиву .MODEL для опреде-
ления типа памяти.
Вы можете использовать в исходном файле столько
директив .DATA, сколько пожелаете. Все различные
части будут объединены в один сегмент данных точ-
но также, как если бы вы ввели все данные сразу
е вслед за единственной директивой .DATA.
Сегмент данных включается в группу, названную
DGROUP, которая также содержит сегменты, опреде-
ленные директивами .STACK, .CONST и .DATA?. Вы
моете иметь доступ к данным любого из этих
сегментов, убедившись, что один из сегментных
регистров указывает на DGROUP.
Для получения полной информации о сегментных
атрибутах для сегмента данных, смотрите директиву
.MODEL.
См.также: .CODE, .CONST, .DATA?, DATASEG, .FARDATA,
.FARDATA?, .MODEL, .STACK
Пример: .DATA
array1 DB 100 DUP(0) ;NEAR инициализация
;данных
TASM2 #4-5/Док = 109 =
.DATA?
-----------------------------------------------------------------
Назначение: Определяет начало неинициализированного сегмента
данных
Режим: MASM
Синтаксис: .DATA?
Замечания: Директива .DATA? сообщает о начале неинициали-
зированных данных в вашем модуле. Сначала вы
должны использовать директиву .MODEL для опреде-
ления типа памяти.
Неинициализированные данные создаются использова-
нием оператора DUP с символом ?. Например :
DB 6 DUP(?)
Вы не должны использовать данную директиву при
написании чисто ассемблерных программ. Она пред-
назначена для написания процедур, являющихся ин-
терфейсами с языками высокого уровня и в этих
случаях используется для неинициализированных
данных.
Вы можете использовать в исходном файле столько
TASM2 #4-5/Док = 110 =
директив .DATA?, сколько пожелаете. Все различные
части будут объединены в один сегмент данных точ-
но также, как если бы вы ввели все данные сразу
же за единственной директивой .DATA.
Сегмент неинициализированных данных включается в
группу, названную DGROUP, которая также содержит
сегменты, определенные директивами .STACK, .CONST
и .DATA.
Для получения полной информации о сегментных
атрибутах для сегмента данных смотрите директиву
.MODEL
См.также: .CODE, .CONST, .DATA, .FARDATA, .FARDATA?,
.MODEL, .STACK
Пример: .DATA?
temр DD 4 DUP(?) ;неинициализированные
;данные
TASM2 #4-5/Док = 111 =
DATASEG
-----------------------------------------------------------------
Назначение: Определяет начало сегмента данных
Режим: MASM, Ideal
Синтаксис: DATASEG
Замечания: DATASEG - это то же, что и .DATA. Данная директи-
ва должна использоваться только в режиме Ideal
См.также: .CODE, .CONST, .DATA, .DATA?, .FARDATA,
.FARDATA?, .MODEL, .STACK
DB
-----------------------------------------------------------------
Назначение: Размещает байтовую память
Режим: MASM, Ideal
Синтаксис: [имя] DB выражение [,выражение]...
Замечания: Имя - это идентификатор, который в последствии вы
можете использовать для ссылки на данные. Если вы
не укажете имя, данные будут размещены, но вы не
сможете ссылаться на них, используя символическое
имя.
Каждое выражение размещает один или более байтов
и может быть одним из приведенных ниже:
- константа, принимающая значение в промежутке от
-128 до 255
- знак вопроса, означающий неопределенный инициа-
лизированный идентефикатор; резервирует память
без задания определенного значения
- символьная строка, состоящая из одного или бо-
лее символов
- повторяющееся выражение с использованием
оператора DUP.
TASM2 #4-5/Док = 112 =
См.также: DD, DF, DP, DQ, DT, DW
Пример: fibs DB 1,1,2,3,5,8,13
but DB 80 DUP(?)
msg DB "Введите значение :"
TASM2 #4-5/Док = 113 =
DD
-----------------------------------------------------------------
Назначение: Размещает двойное слово
Режим: MASM, Ideal
Синтаксис: [имя] DD [тип PTR] выражение [,выражение]...
Замечания: имя - это идентификатор, который впоследствии вы
можете использовать для ссылки на данные. Если вы
не укажете имя, данные будут размещены, но вы не
сможете ссылаться на них, используя символическое
имя.
Тип со следующим после него PTR является необяза-
тельным. Это добавляет отладочную информацию о
идентификаторе, таким образом, Турбо Отладчик мо-
жет отобразить его содержимое. Данное средство не
имеет никакого действия с данными, генерированны-
ми Турбо ассемблером. Тип может быть одним из
следующих : BYTE, WORD, DWORD, FWORD, PWORD,
QWORD, TBYTE, DATAPTR, CODEPTR, SHORT, NEAR, FAR,
или именем структуры. Например :
рerson STRUC
name db 32 duр(?)
age dw ?
рerson ENDS
pptr dd рerson рtr 0 ;PTR - дальняя ссыл-
;ка на структуру
Каждое выражение размещает одно или более двойных
слов (4 байта) и может быть одним из приведенных
ниже:
- константа, принимающая значение в промежутке от
-2,147,483,648 до 4,294,967,295
- короткое (32 бита) число с плавающей точкой
- знак вопроса, означающий неопределенный инициа-
лизированный идентификатор; резервирует память
без задания определенного значения
- адрес выражения, определяющий дальний адрес в
TASM2 #4-5/Док = 114 =
16-битовом сегменте (сегмент:смещение) или
ближний адрес в 32-битовом сегменте (только 32-
битовое смещение)
- повторяющееся выражение с использованием
оператора DUP.
См.также: DB, DF, DP, DQ, DT, DW
Пример: Data32 SEGMENT USE32
xarray DB 0,1,2,3
Data32 ENDS
Data SEGMENT
Consts DD 3.141,2.718 ;константа с плаваю-
;щей точкой
DblPtr DD consts ;16-битовый дальний
;указатель
NrPtr DD xarray ;32-битовый ближний
;указатель
BigInt DD 12345678 ;длинное целочислен-
;ное
Darray DD 4 DUP(1) ;4 целочисленных
TASM2 #4-5/Док = 115 =
%DEPTH
-----------------------------------------------------------------
Назначение: Устанавливает в файле листинга поле уровня
Режим: MASM, Ideal
Синтаксис: %DEPTH ширина
Замечания: Ширина определяет количество колонок файла лис-
тинга, отводимых под поле уровня вложенности. По-
ле уровня индицирует уровень вложенности для фай-
лов INCLUDE и макрорасширений. Если вы задали
ширину равную 0, то данное поле будет исключено
из файла листинга. Обычно, вам нет необходимости
определять ширину более 2, т.к. в этом случае
можно отобразить до 99 уровней без усечения.
Значение по умолчанию для ширины данного поля
определено равное 1 колонке
Пример: %DEPTH 2 ;отображает уровень вложенности
;>9
DF
-----------------------------------------------------------------
Назначение: Размещает дальний 48-битовый (6 байт) указатель
на данные
Режим: MASM, Ideal
Синтаксис: [имя] DF [тип PTR] выражение[,выражение]...
Замечания: Имя - это идентификатор, который впоследствии вы
можете использовать для ссылки на данные. Если вы
не укажете имя, данные будут размещены, но вы не
сможете ссылаться на них, используя символическое
имя.
Тип, со следующим после него PTR, является необя-
зательным. Это добавляет отладочную информацию об
идентификаторе, таким образом Турбо Отладчик мо-
жет отображать его содержимое. Данное средство не
имеет никакого действия с данными, генерированны-
TASM2 #4-5/Док = 116 =
ми Турбо ассемблером. Тип может быть одним из
следующих : BYTE, WORD, DWORD, FWORD, PWORD,
QWORD, TBYTE, DATAPTR, CODEPTR, SHORT, NEAR, FAR,
или именем структуры. Например:
рerson STRUC
mane db 32 duр(?)
age dw ?
рerson ENDS
DATA SEGMENT USE32
pptr df рerson рtr 0;PPTR- это дальний
;32-разрядный ука-
;затель на структуру
Каждое выражение размещает один или более
48-разрядных дальних указателей (6 байт) и может
быть одним из следующих :
- константа, принимающая значение от
-140,737,488,355,328 до 281,474,976,710,655
- знак вопроса (?), означающий неопределенный
инициализированный идентификатор; резервирует
память без задания определенного значения
- адрес выражения, определяющий дальний адрес в
48-битовом сегменте (сегмент:48- битовое смеще-
ние)
- повторяющееся выражение с использованием опера-
тора DUP.
Данная директива может работать только с процес-
сором 80386
См.также: DB, DD, DP, DQ, DT, DW
Пример: .386
Data SEGMENT USE32
Msg DB "Все сделано"
FmPtr DF MSG ;FAR указатель на MSG
Data ENDS
TASM2 #4-5/Док = 117 =
DISPLAY
-----------------------------------------------------------------
Назначение: Выводит на экран строку, взятую в кавычки
Режим: Ideal
Синтаксис: DISPLAY "текст"
Замечания: Текстом является любое сообщение, которое вы хо-
тите отобразить на дисплее; сообщение вы должны
заключить в кавычки (" "). Сообщение выводится на
стандартное устройство вывода, которым, обычно,
является экран. При желании, вы сможете использо-
вать средства DOS для изменения направления и
послать выводимую информацию, предназначенную для
дисплея, в файл.
Наряду с другими вещами, вы можете использовать
данную директиву для выдачи вам информации о ге-
нерации, секционировании, условиях ассемблирова-
ния.
См.также: %OUT
Пример: DISPLAY "Ассемблирование процедур EGA интерфейса"
TASM2 #4-5/Док = 118 =
DOSSEG
-----------------------------------------------------------------
Назначение: Делает возможным размещение сегмента DOS во время
компоновки
Режим: MASM, Ideal
Синтаксис: DOSSEG
Замечания: Обычно DOSSEG используется совместно с директивой
.MODEL, которая устанавливает упрощенные директи-
вы сегментации. DOSSEG сообщает компоновщику, что
располагать сегменты в вашей программе нужно та-
ким образом, как их располагает язык высокого
уровня. Вы должны использовать эту директиву
только в том случае, если вы пишете отдельные ас-
семблерные программы и тогда вам необходимо ис-
пользовать директиву DOSSEG однократно в основном
модуле, которая определяет стартовый адрес вашей
программы.
В выполняемой программе сегменты располагаются в
следующем порядке :
1.Все сегменты, которые принадлежат к классу с
именем 'CODE'
2.Все сегменты, не принадлежащие к классу с име-
нем 'CODE' и не состоящие в групповом имени
DGROUP
3.Все сегменты, входящие в DGROUP в следующем
порядке:
a.Все сегменты, принадлежащие к классу с именем
'BEGDATA'
b.Все сегменты, не принадлежащие к классам с
именами 'BEGDATA', 'BSS' или 'STACK'
c.Все сегменты, принадлежащие к классу с именем
'BSS'
d.Все сегменты, принадлежащие к классу с именем
'STACK'
TASM2 #4-5/Док = 119 =
См.также: .MODEL
Пример: DOSSEG
.MODEL medium
DP
-----------------------------------------------------------------
Назначение: Размещает дальний 48-битовый указатель (6 байт)
на область данных
Режим: MASM, Ideal
См.также: DB, DD, DF, DQ, DT, DW
TASM2 #4-5/Док = 120 =
DQ
-----------------------------------------------------------------
Назначение: Размещает 4 слова (8 байт) области данных
Режим: MASM, Ideal
Синтаксис: [имя] DQ выражение[,выражение]...
Замечания: Имя - это идентификатор, который впоследствии вы
можете использовать для ссылки на данные. Если вы
не укажете имя, данные будут размещены, но вы не
сможете ссылаться на них, используя символическое
имя.
Каждое выражение размещает одну группу из 4 слов
(8 байт) или более и может быть одним из следую-
щих :
- постоянное выражение, принимающее значение от -
2^63 до 2^64 - 1.
- длинное число (64 бита) с плавающей точкой.
- знак вопроса (?), означающий неопределенный
инициализированный идентификатор; резервирует
память без задания определенного значения.
- повторяющееся выражение с использованием
оператора DUP
См.также: DB, DD, DF, DP, DT, DW
Пример: HugInt DQ 314159265258979323
BigFit DQ 1.2345678987654321
Qarray DQ 10DUP(?)
TASM2 #4-5/Док = 121 =
DT
-----------------------------------------------------------------
Назначение: Размещает 10-байтовую область данных
Режим: MASM, Ideal
Синтаксис: [имя] DT выражение[,выражение]...
Замечания: Имя - это идентификатор, который впоследствии вы
можете использовать для ссылки на данные. Если вы
не укажете имя, данные будут размещены, но вы не
сможете ссылаться на них, используя символическое
имя.
Каждое выражение размещает одну или более 10-бай-
товую область данных и может быть одним из следу-
ющих :
- упакованная десятичная константа, принимающая
значение от 0 до 99,999,999,999,999,999,999
- знак вопроса (?), означающий неопределенный
инициализированный идентификатор; резервирует
память без задания определенного значения.
- повторяющееся выражение с использованием
оператора DUP
См.также: DB, DD, DF, DP, DQ, DW
Пример: PakNum DD 123456 ;упакованное 10-ное
TemрVal DD 0.0000000001 ;высокоточное FP
TASM2 #4-5/Док = 122 =
DW
-----------------------------------------------------------------
Назначение: Размещает данные размером в слово (2 байта)
Режим: MASM, Ideal
Синтаксис: [имя] DW [тип PTR] выражение[,выражение]...
Замечания: Имя - это идентификатор, который впоследствии вы
можете использовать для ссылки на данные. Если вы
не укажете имя, то данные будут размещены, но вы
не сможете ссылаться на них, используя символи-
ческое имя.
Тип со следующим после него PTR является необяза-
тельным. Это добавляет отладочную информацию об
идентификаторе, таким образом, Турбо Отладчик мо-
жет отображать его содержимое. Данное средство не
имеет никакого действия с данными, генерированны-
ми Турбо ассемблером. Тип может быть одним из
следующих : BYTE, WORD, DWORD, FWORD, PWORD,
QWORD, TBYTE, DATAPTR, CODEPTR, SHORT, NEAR, FAR
или именем структуры. Например :
narray dw 10duр(?)
nрtr dw word рtr narray; nрtr- ближняя
; ссылка на
; слово
Каждое выражение размещает одно или более слов (2
байта) и может быть одним из следующих :
- константа, принимающая значение от -32768 до
65536.
- знак вопроса (?), означающий неопределенный
инициализированный идентификатор; резервирует
память без задания определенного значения.
- адрес выражения, определяющий ближний адрес в
16-битовом сегменте (только смещение).
- повторяющееся выражение с использованием
оператора DUP
TASM2 #4-5/Док = 123 =
См.также: DB, DD, DF, DP, DQ, DT
Пример: int DW 12345
wbuf DW 6 DUP(?); буфер из 6 слов
wрtr DW Wbuf ; смещение-ссылка на wbuf
ELSE
-----------------------------------------------------------------
Назначение: Начало блока альтернативного условия
Режим: MASM, Ideal
Синтаксис: IF условие
операторы 1
[ELSE
операторы 2]
ENDIF
Замечания: Операторы, следующие за ELSE, ассемблируются в
том случае, если условие, связанное с IF, прини-
мает значение "ложь". Таким образом, будет ас-
семблировано одно из двух: либо операторы 1, либо
операторы 2.
Директива ELSE всегда составляет пару предшеству-
ющей ей директиве IF, которая не всегда использу-
ется в паре с директивой ELSE. Каждый блок IF мо-
ет иметь более чем один блок ELSE. В этом случае
значение условия переключается каждый раз, когда
встречается ELSE. Например :
IF1
;это ассемблируется
ELSE
;это не ассемблируется
ELSE
;это ассемблируется
ENDIF
См.также: ENDIF, IF, IF1, IF2, IFB, IFDEF, IFDIF,
IFDIFS, IFE, IFLOW, IFIDNI, IFNB, IFNDEF
Пример: IF LargeModel EQ 1
les di,addr
TASM2 #4-5/Док = 124 =
ELSE
lea di,addr
ENDIF
ELSEIF
-----------------------------------------------------------------
Назначение: Начинает вставляемый блок условия ассемблирования
в случае, если выражение принимает значение "ис-
тина"
Режим: MASM, Ideal
Синтаксис: ELSEIF выражение
Замечания: Выражение должно быть константой и не может со-
держать какую-либо опережающую ссылку на имя сим-
вола. Если выражение принимает ненулевое значе-
ние, операторы внутри блока условия будут
ассемблироваться все время, пока условие предыду-
щей директивы (IF и т.д.) ELSEIF не примет значе-
ние "ложь".
Вы можете иметь несколько директив ELSEIF в блоке
условия. Как только встретится ELSEIF, имеющее
выражение со значением "истина", блок кода будет
ассемблирован, а все остальные части блока усло-
вия, определенные ELSEIF или ELSE, останутся
обойденными. Вы можете смешивать различные дирек-
тивы ELSE** в одном и том же блоке условия
См.также: ELSEIF1, ELSEIF2, ELSEIFB, ELSEIFDEF,
ELSEIFDIF, ELSEIFDIFI, ELSEIFE, ELSEIFIDN,
ELSEIFIDNI, ELSEIFNB, ELSEIFNDEF
Пример: IF ARGSIZE EQ 1
mov al,arg
ELSEIF ARGSIZE EQ 2
mov ax,arg
ELSE
%OUT BAD ARGSIZE
ENDIF
EMUL
TASM2 #4-5/Док = 125 =
-----------------------------------------------------------------
Назначение: Генерирует эмулированные инструкции сопроцессора
Режим: MASM, Ideal
Синтаксис: EMUL
Замечания: Турбо ассемблер обычно генерирует истинные
инструкции с плавающей точкой, которые выполняют-
ся процессорами 80х87. Используйте EMUL, если в
вашей программе установлена поддержка плавающей
точки. EMUL имеет тот же эффект, что и задание в
командной строке параметра /е. Вы можете комби-
нировать EMUL с NOEMUL при желании генерировать
истинные инструкции с плавающей точкой в одной
части файла и эмулировать инструкции в другой
части
См.также: NOEMUL
Пример: Finit ; инструкции сопроцессора 8087
EMUL
Fsave buf ; эмулированная инструкция
TASM2 #4-5/Док = 126 =
END
-----------------------------------------------------------------
Назначение: Отмечает конец исходного файла
Режим: MASM, Ideal
Синтаксис: END [начальный адрес]
Замечания: Начальный адрес - необязательный идентификатор
или выражение, которое определяет адрес в вашей
программе, и с которого вы хотите начать выполне-
ние. Если ваша программа компонуется из несколь-
ких исходных файлов, то только один файл может
содержать начальный адрес. Стартовый адрес может
быть адресом внутри модуля; он может быть также
внешним идентификатором, определенным в другом
модуле, объявленном в директиве EXTRN.
Турбо ассемблер игнорирует любой текст после
директивы END в исходном файле
Пример: .MODEL SMALL
.CODE
Start:
;тело программы
END Start ; точкой входа в программу
; является Start
Данная строка игнорируется
ENDIF
-----------------------------------------------------------------
Назначение: Отмечает конец блока условий ассемблирования
Режим: MASM, Ideal
Синтаксис: IF условие
операторы
ENDIF
Замечания: Все блоки условий ассемблирования начинаются с
директив IF**** и должны оканчиваться директивой
ENDIF. Вы можете иметь вложенность блоков IF до
255 уровней
TASM2 #4-5/Док = 127 =
См.также: ELSE, IF, IF1, IF2, IFB, IFDEF, IFDIF,
IFDIFI, IFE, IFIDN, IFIDNS, IFNB, IFNDEF
Пример: IF DebugMode ; ассемблирование продолжает-
; ся в случае, если DebugMode
; отлично от 0
mov ax,0
call DebugDumр
ENDIF
ENDM
-----------------------------------------------------------------
Назначение: Сообщает о конце блока повторения или макро
Режим: MASM, Ideal
Синтаксис: ENDM
Замечания: Директива ENDM определяет конец макрорасширения
или блока повторения
См.также: IRP, IRPC, MACRO, REPT
Пример: IRP reg,<ax,bx,cx,dx>
рuch reg
ENDM
TASM2 #4-5/Док = 128 =
ENDP
-----------------------------------------------------------------
Назначение: Определяет конец процедуры
Режим: MASM, Ideal
Синтаксис: Режим MASM :
[имя процедуры] ENDP
Режим Ideal :
ENDP [имя процедуры]
Замечания: Если вы используете имя процедуры, это должно со-
ответствовать имени процедуры, определенному в
директиве PROC, начинающей определение процедуры.
Заметьте, что в режиме Ideal параметр имя проце-
дуры следует после ENDP.
ENDP не генерирует инструкцию RET для возврата в
место вызова процедуры, которую вы должны помес-
тить сами
См.также: ARG, LOCAL, PROC
Пример: LoadIt PROC
; Тело процедуры
ret
LoadIt ENDP
TASM2 #4-5/Док = 129 =
ENDS
-----------------------------------------------------------------
Назначение: Отмечает конец текущего сегмента или объединения
Режим: MASM, Ideal
Синтаксис: Режим MASM :
[имя сегмента] ENDS
[имя структуры] ENDS
Режим Ideal :
ENDS [имя сегмента]
ENDS [имя структуры]
Замечания: ENDS отмечает конец любого сегмента, структуры
или объединения. Если вы используете имя сегмен-
та, оно должно соответствовать имени сегмента,
определенному в директиве SEGMENT. Также,
параметр имя структуры должен соответствовать
имени структуры, определенному в директивах STRUC
или UNION.
Заметьте, что в режиме Ideal параметр имя следует
после ENDS
См.также: SEGMENT, STRUC, UNION
Пример: DATA SEGMENT ; начало сегмента данных
Barray DB 10 DUP(0)
DATA ENDS ; конец сегмента данных
Stat STRUC
Mode DW ?
Ptr DD ?
ENDS ; конец определения структуры
TASM2 #4-5/Док = 130 =
EQU
-----------------------------------------------------------------
Назначение: Задает строковое приравнивание, числовое или
идентификатора
Режим: MASM
Синтаксис: имя EQU выражение
Замечания: Имя принимает значение вычисленного выражения.
Имя должно быть новым символическим именем, ко-
торое не было определено ранее. В режиме MASM вы
можете переопределить только идентификатор, кото-
рый был определен с использованием директивы EQU,
если он был первоначально определен как строковое
приравнивание.
В режиме MASM EQU может определять три типа
приравнивания:
- Идентификатор: переопределяет ключевые слова
или мнемоники инструкций, а также позволяет вам
назначать альтернативные имена для других сим-
волов, которые были вами определены.
- Выражение: Принимает значение константы или ад-
реса, похоже на использование директивы =.
- Строка: выражение сохраняется как текстовая
строка для замены в дальнейшем при появлении
имени в выражении. Когда выражение не может
быть константой или адресом, оно воспринимается
как строковое выражение
См.также: =
Пример: BlkSize EQU 512
BufBlks EQU 4
BufSize EQU BlkSize*BufBlks
BufLen EQU BufSize ;идентификатор
;для BUFSIZE
DoneMsg EQU <'Возврат в DOS'>
TASM2 #4-5/Док = 131 =
.ERR
-----------------------------------------------------------------
Назначение: Вызывает сообщение об ошибке
Режим: MASM
Синтаксис: .ERR
Замечания: .ERR вызывает сообщение об ошибке, встретившейся
в строке исходного файла.
Обычно вы используете данную директиву внутри
блока условия ассемблирования, где она проверяет
на удовлетворение условия во время ассемблирова-
ния
См.также: .ERR1, .ERR2, .ERRE, .ERRNZ, .ERRNDEF,.ERRDEF,
.ERRB, .ERRNB, .ERRIDN, .ERRIDNI, .ERRDIF,
.ERRDIFI
Пример: IF $ GT 400h
.ERR ;сегмент слишком велик
%OUT Сегмент слишком велик
ENDIF
ERR
-----------------------------------------------------------------
Назначение: Вызывает сообщение об ошибке
Режим: MASM, Ideal
Синтаксис: ERR
Замечания: То же, что и .ERR
См.также: .ERR1, .ERR2, ERRE, .ERRNZ, .ERRNDEF, .ERRDEF,
.ERRB, .ERRNB, .ERRIDN, .ERRIDNI, .ERRDIFI
TASM2 #4-5/Док = 132 =
.ERR1
-----------------------------------------------------------------
Назначение: Вызывает сообщение об ошибке на шаге 1
Режим: MASM
Синтаксис: .ERR1
Замечания: Обычно Турбо ассемблер является однопроходным
ассемблером, и факт того, что .ERR1 вызывает
сообщение на шаге 1 означает, что сообщение об
ошибке всегда будет выдаваться на шаге ассембли-
рования. Сообщение об ошибке появится на экране,
и в файле листинга, если он указан.
Если вы используете многопроходные возможности
Турбо ассемблера (вызываемые переключателем ко-
мандной строки /m), .ERR1 выдаст сообщение об
ошибке на первом шаге ассемблирования.
См.также: .ERR2
Пример: .ERR1
.ERR2
-----------------------------------------------------------------
Назначение: Вызывает сообщение об ошибке на шаге 2
Режим: MASM
Синтаксис: .ERR2
Замечания: Обычно Турбо ассемблер является однопроходным
ассемблером, и факт того, что .ERR2 вызывает
сообщение на шаге 2 означает, что сообщение об
ошибке фактически не будут выдаваться. Зависящие
от прохода предупреждения будут создаваться, од-
нако, вы должны ожидать потенциально беспорядоч-
ного отчета.
Если вы используете многопроходные возможности
Турбо ассемблера (вызываемые переключателем ко-
TASM2 #4-5/Док = 133 =
мандной строки /m), .ERR2 выдаст сообщение об
ошибке на втором шаге ассемблирования. Если вы
выбрали один проход с помощью /m1, зависящие от
прохода предупреждения будут вызываться.
См.также: .ERR1
Пример: .ERR2
.ERRB
-----------------------------------------------------------------
Назначение: Вызывает ошибку в случае, если аргумент пуст
Режим: MASM
Синтаксис: .ERRB <аргумент>
Замечания: Вы всегда используете данный аргумент внутри
макро. Директива проверяет, был ли макро вызван с
непустым параметром. Если аргумент пуст, выдается
сообщение об ошибке в исходной строке, в которой
был вызван макро.
Вы должны аргумент всегда заключать в угловые
скобки (<>)
См.также: .ERRNB
Пример: duble MACRO arg1
.ERRB <arg1>
shl arg1,1
ENDM
TASM2 #4-5/Док = 134 =
.ERRDEF
-----------------------------------------------------------------
Назначение: Вызывает ошибку, если идентификатор был определен
Режим: MASM
Синтаксис: .ERRDEF идентификатор
Замечания: .ERRDEF вызывает сообщение об ошибке в исходной
строке, если идентификатор уже был определен в
вашем исходном файле
См.также: .ERRNDEF
Пример: SetMode MACRO ModeVal
.ERRDEF _MODE ;ошибка, если уже
;определен
_MODE EQU ModeVal
ENDM
.ERRDIF
-----------------------------------------------------------------
Назначение: Вызывает ошибку, если аргументы являются различ-
ными
Режим: MASM
Синтаксис: .ERRDIF <аргумент1>,<аргумент2>
Замечания: Вы всегда используете .ERRDIF внутри макро.
Директива проверяет, являются ли аргументы иден-
тичными символьными строками. Если две строки не
являются идентичными, выдается сообщение об ошиб-
ке в исходной строке, в которой макро вызывается.
Две строки сравниваются символ за символом, при
этом учитывается регистр (верхний или нижний), в
котором набираются символы. Если вы хотите, чтобы
регистр не учитывался, используйте директиву
.ERRDIFI.
Вы должны всегда заключать аргументы в угловые
скобки (<>), аргументы разделяются запятой.
TASM2 #4-5/Док = 135 =
См.также: .ERRIDN, .ERRDIFI, .ERRIDNI
Пример: SegLoad MACRO reg,val
.ERRDIF <reg>,<es> ;разрешает только
;регистр ES
mov al,val
mov reg,ax
ENDM
.ERRDIFI
-----------------------------------------------------------------
Назначение: Вызывает ошибку, если аргументы различны, регистр
(разница между строчными и заглавными буквами)
игнорируется
Режим: MASM
Синтаксис: .ERRDIFI <аргумент1>,<аргумент2>
Замечания: Вы всегда используете .ERRDIFI внутри макро.
Директива проверяет, являются ли аргументы иден-
тичными символьными строками. Если две строки не
являются идентичными, выдается сообщение об ошиб-
ке в исходной строке, в которой макро вызывается.
Две строки сравниваются символ за символом, при
этом не учитывается регистр. Если вы хотите, что-
бы регистр учитывался, используйте директиву
.ERRDIF.
Вы должны всегда заключать аргументы в угловые
скобки (<>), аргументы разделяются запятой
См.также: .ERRIDN, .ERRDIF, .ERRIDNI
Пример: SegLoad MACRO reg,val
.ERRDIFI <reg>,<es> ;разрешает только
;регистр ES
mov ax,val ;действует независимо
;от того как напеча-
;тан REG
mov reg,ax
ENDM
TASM2 #4-5/Док = 136 =
.ERRE
-----------------------------------------------------------------
Назначение: Вызывает ошибку, если выражение ложно (0)
Режим: MASM
Синтаксис: .ERRE выражение
Замечания: Выражение должно быть константой и может не со-
держать никаких опережающих имен идентификаторов.
Если выражение равно 0, то сообщение об ошибке
появляется в текущей исходной строке
См.также: .ERRNZ
Пример: PtrLoad MACRO рtr,val
.ERRE val ; ошибка при попытке загрузки
; 0 в указатель
mov si,val
ENDM
.ERRIDN
-----------------------------------------------------------------
Назначение: Вызывает ошибку, если аргументы идентичны
Режим: MASM
Синтаксис: .ERRIDN <аргумент1>,<аргумент2>
Замечания: Вы всегда используете .ERRIDN внутри макро.
Директива проверяет, являются ли аргументы раз-
личными строками. Если две строки являются иден-
тичными, выдается сообщение об ошибке в исходной
строке, в которой макро вызывается. Две строки
сравниваются символ за символом, при этом учиты-
вается регистр, в котором набираются символы. Ес-
ли вы хотите, чтобы регистр не учитывался, ис-
пользуйте директиву .ERRIDNI.
Вы должны всегда заключать аргументы в угловые
скобки (<>), аргументы разделяются запятой
См.также: .ERRDIF, .ERRIDNI, .ERRDIFI
TASM2 #4-5/Док = 137 =
Пример: PushSeg MACRO reg,val
.ERRIDN <reg>,<CS> ;загрузка CS не разрешена
рush reg
mov reg,val
ENDM
TASM2 #4-5/Док = 138 =
.ERRIDNI
-----------------------------------------------------------------
Назначение: Вызывает ошибку, если аргументы идентичны,
регистр игнорируется
Режим: MASM
Синтаксис: .ERRIDNI <аргумент1>,<аргумент2>
Замечания: Вы всегда используете .ERRIDNI внутри макро.
Директива проверяет, являются ли аргументы раз-
личными строками. Если две строки являются иден-
тичными, выдается сообщение об ошибке в исходной
строке, в которой макро вызывается. Две строки
сравниваются символ за символом, при этом не учи-
тывается регистр, в котором набираются символы.
Если вы хотите, чтобы регистр учитывался, исполь-
зуйте директиву .ERRIDN.
Вы всегда должны заключать аргументы в угловые
скобки (<>), аргументы разделяются запятой
См.также: .ERRDIF, .ERRIDN, .ERRDIFI
Пример: PushSeg MACRO reg,val
.ERRIDNI <reg>,<CS> ;загрузка CS не раз-
;решена
рush reg ;принимает CS или cs
mov reg,val
ENDM
TASM2 #4-5/Док = 139 =
ERRIF
-----------------------------------------------------------------
Назначение: Вызывает ошибку, если выражение имеет значение
"истина" (не 0)
Режим: MASM, Ideal
См.также: .ERRE, .ERRNZ
ERRIF1
-----------------------------------------------------------------
Назначение: Вызывает сообщение об ошибке на шаге 1
Режим: MASM, Ideal
См.также: .ERR1
ERRIF2
-----------------------------------------------------------------
Назначение: Вызывает сообщение об ошибке на шаге 2
Режим: MASM, Ideal
См.также: .ERR2
TASM2 #4-5/Док = 140 =
ERRIFB
-----------------------------------------------------------------
Назначение: Вызывает ошибку, если аргумент пуст
Режим: MASM, Ideal
См.также: .ERRB
ERRIFDEF
-----------------------------------------------------------------
Назначение: Вызывает ошибку, если идентификатор определен
Режим: MASM, Ideal
См.также: .ERRDEF
ERRIFDIF
-----------------------------------------------------------------
Назначение: Вызывает ошибку, если аргументы различны
Режим: MASM, Ideal
См.также: .ERRDIF
ERRIFDIFI
-----------------------------------------------------------------
Назначение: Вызывает ошибку, если аргументы различны, иг-
норируя регистр
Режим: Masm, Ideal
См.также: .ERRDIFI
ERRIFE
TASM2 #4-5/Док = 141 =
-----------------------------------------------------------------
Назначение: Вызывает ошибку, если выражение имеет значение
(0)
Режим: MASM, Ideal
См.также: .ERRE
ERRIFIDN
-----------------------------------------------------------------
Назначение: Вызывает ошибку, если аргументы идентичны
Режим: MASM, Ideal
См.также: .ERRIDN
ERRIFIDNI
-----------------------------------------------------------------
Назначение: Вызывает ошибку, если аргументы идентичны, иг-
норируя регистр
Режим: MASM, Ideal
См.также: .ERRIDNI
ERRIFNB
-----------------------------------------------------------------
Назначение: Вызывает ошибку, если аргумент не пуст
Режим: MASM, Ideal
См.также: .ERRNB
TASM2 #4-5/Док = 142 =
ERRIFNDEF
-----------------------------------------------------------------
Назначение: Вызывает ошибку, если идентификатор не определен
Режим: MASM, Ideal
См.также: .ERRNDEF
TASM2 #4-5/Док = 143 =
.ERRNB
-----------------------------------------------------------------
Назначение: Вызывает ошибку, если аргумент пуст
Режим: MASM
Синтаксис: .ERRNB <аргумент>
Замечания: Вы всегда используете .ERRNB внутри макро. Дирек-
тива проверяет, было ли вызвано макро с действи-
тельным аргументом. Если аргумент непуст, выдает-
ся сообщение об ошибке в исходной строке, где
было вызвано макро.
Вы всегда должны заключать аргумент, который бу-
дет проверяться, в угловые скобки (<>)
См.также: .ERRB
Пример: DoIt MACRO a,b
.ERRB <B> ;нужен только один аргумент
...
ENDM
.ERRNDEF
-----------------------------------------------------------------
Назначение: Вызывает ошибку, если идентификатор не определен
Режим: MASM
Синтаксис: .ERRNDEF идентификатор
Замечания: .ERRNDEF вызывает сообщение об ошибке в текущей
исходной строке, если идентификатор не был еще
определен в исходном файле. Ошибка будет возни-
кать даже в случае, если идентификатор будет оп-
ределен позже
См.также: .ERRDEF
Пример: .ERRNDEF Bufsize ;размер буфера не установлен
buf DB BufSize
TASM2 #4-5/Док = 144 =
.ERRNZ
-----------------------------------------------------------------
Назначение: Вызывает ошибку, если выражение имеет значение
"истина" (ненулевое)
Режим: MASM
Синтаксис: .ERRNZ выражение
Замечания: Выражение должно быть константой и не может со-
держать опережающей ссылки на имя идентификатора.
Если выражение принимает ненулевое значение, то в
текущей строке появляется сообщение об ошибке
См.также: .ERRG
Пример: .ERRNZ $ GT 1000h ;сегмент слишком велик
EVEN
-----------------------------------------------------------------
Назначение: Округляет текущее значение счетчика до четного
адреса
Режим: MASM, Ideal
Замечания: EVEN позволяет вам выравнивать код для эффектив-
ного доступа процессорами, использующими
16-разрядную шину данных (8086, 80186, 80286).
Данная директива не улучшает работу процессоров,
использующих 8-разрядную шину данных (8088,
80188).
Вы не можете использовать данную директиву в сег-
ментах, имеющих байтовое выравнивание, которое
определено в директиве SEGMENT, открывающей дан-
ный сегмент.
Если в момент появления директивы EVEN текущее
значение счетчика нечетно, в сегмент будет встав-
лена одиночная инструкция NOP для того, чтобы
сделать текущее значение счетчика четным. С до-
бавлением NOP, EVEN может быть использована в
TASM2 #4-5/Док = 145 =
сегменте кода без вызова инструкций ошибок, выз-
ванных во время выполнения. Если значение счетчи-
ка четно, то данная директива действия не имеет.
См.также: ALIGN, EVENDATA
Пример: EVEN
@A: LODSB
XOR bl,al
LOOR @A
EVENDATA
-----------------------------------------------------------------
Назначение: Округляет текущее значение счетчика до следующего
четного адреса в сегменте данных
Режим: MASM, Ideal
Синтаксис: EVENDATA
Замечания: EVENDATA позволяет вам выравнивать данные для эф-
фективного доступа процессорами, использующими 16
-разрядную шину данных (8086, 80186, 80286). Дан-
ная директива не улучшает работу процессоров, ис-
пользующих 8-разрядную шину данных (8088, 80188).
Вы не можете использовать данную директиву в сег-
ментах, использующих байтовое выравнивание, ко-
торое определено в директиве SEGMENT, открывающей
данный сегмент.
Если в момент появления директивы EVENDATA теку-
щее значение счетчика нечетно, будет вставлен
байт со значением 0 для того, чтобы сделать теку-
щее значение счетчика четным. Если значение счет-
чика четно, то данная директива действия не имеет
См.также: ALIGN, EVEN
Пример: EVENDATA
varl DW 0
TASM2 #4-5/Док = 146 =
EXITM
-----------------------------------------------------------------
Назначение: Прерывает макрорасширение или повторяющийся блок
Режим: MASM, Ideal
Синтаксис: EXITM
Замечания: EXITM прерывает любое макрорасширение или повто-
ряющийся блок. Все, что следует за EXITM, игнори-
руется.
Это удобно для выхода с любого уровня условия
См.также: ENDM, IRP, IRPC,REPT, MACRO
Пример: Shiftn MACRO oр,n
count=0
REPT N
shl OP,N
count=count+1
IF count GE 8 ;не более 8
EXITM
ENDIF
ENDM
EXTRN
-----------------------------------------------------------------
Назначение: Определяет идентификатор, определенный в другом
модуле
Режим: MASM, Ideal
Синтаксис: EXTRN определение[,определение]...
Замечания: Каждое определение описывает идентификатор и име-
ет следующий формат:
[language] имя:тип[:количество]
language принимает одно из значений - C, PASCAL,
BASIC, FORTRAN, PROLOG или NOLANGUAGE и определя-
TASM2 #4-5/Док = 147 =
ет любые языковые согласования применяемых сим-
вольных имен. Имя является идентификатором, опре-
деленным в другом модуле. Использование указания
языка в директиве EXTRN временно переопределяет
текущую языковую установку (по умолчанию или оп-
ределенную директивой .MODEL). Заметьте, что вам
не нужно иметь директиву .MODEL для использования
данной возможности.
Тип должен соответствовать типу идентификатора в
модуле, в котором он определен и должен быть од-
ним из следующих:
- NEAR, FAR или PROC. PROC является либо NEAR ли-
бо FAR (зависит от типа памяти, установленного
директивой MODEL)
- BYTE, WORD, DWORD, DATAPTR, CODEPTR, FWORD,
PWORD, QWORD, TBYTE или имя структуры
- ABS
Значение "количество" определяет количество пов-
торений данного внешнего идентификатора. Если оп-
ределение идентификатора в другом файле использу-
ет для размещения более одного пункта директиву
DUP, то вы можете это значение использовать в по-
ле "количество". Это позволяет операторам SIZE и
LENGTH правильно определять размер внешних дан-
ных. Если вы не определили значение поля "коли-
чество" - принимается значение 1.
Вы можете определить более чем один внешний сим-
вол разделением определений между собой запятой
(,). Также, каждый аргумент подчиняется такому же
синтаксису, как и аргументы ARG и LOCAL.
Имя должно быть объявлено как PUBLIC или
PUBLICDLL в другом модуле для того, чтобы ваша
программа была скомпонована правильно.
Вы можете использовать директиву EXTRN внутри или
вне сегмента, объявленного директивой SEGMENT.
Если вы используете директиву EXTRN внутри сег-
мента, вы информируете ассемблер о том, что внеш-
няя переменная находится в другом модуле, но в
TASM2 #4-5/Док = 148 =
том же сегменте. Если вы размещаете EXTRN вне ка-
кого-либо сегмента, вы сообщаете ассемблеру, что
вы не знаете в котором сегменте объявлена данная
переменная.
В режиме MASM внешние идентификаторы, объявленные
вне какого-либо сегмента, могут быть доступны че-
рез регистр DS, который не всегда содержит истин-
ное значение. Убедитесь, что значение DS коррект-
но или используйте непосредственное указание сег-
мента при ссылке на данные переменные.
В режиме Ideal Турбо ассемблер точно проверяет
адресацию внешней переменной в соответствии с
директивой ASSUME
См.также: COMM, GLOBAL, PUBLIC, PUBLICDLL
Пример: EXTRN aрroc:NEAR
call aрroc ;вызывает из другого модуля
TASM2 #4-5/Док = 149 =
.FARDATA
-----------------------------------------------------------------
Назначение: Определяет начало сегмента данных с дальним ука-
зателем
Режим: MASM
Синтаксис: .FARDATA [имя]
Замечания: .FARDATA определяет начало сегмента инициали-
зированных данных с дальним доступом. Если вы же-
лаете иметь множество разделенных сегментов даль-
них данных, вы можете указать имя сегмента, тем
самым создавая новый сегмент.
Вы можете столько раз использовать директиву
.FARDATA в исходном файле, сколько вам это необ-
ходимо. Все различные части с одним и тем же име-
нем будут объединены в один сегмент данных точно
также, если бы все данные были введены после
единственной директивы .FARDATA.
Сегмент дальних данных не может быть включен в
группу. Вы должны сделать дальние сегменты дос-
тупными посредством загрузки адреса дальнего сег-
мента в сегментный регистр перед доступом к дан-
ным.
Смотрите директиву .MODEL для получения полной
информации о сегментных атрибутах для сегмента
дальних данных
См.также: .FARDATA?, .CODE, .DATA, .MODEL, .STACK
Пример: .FARDATA
FarBuf DB 80 DUP(0)
.CODE
mov ax,@FarData
mov ds,ax
ASSUME ds:@FarData
mov al,FarBuf[0] ; получает первый
; байт буфера
TASM2 #4-5/Док = 150 =
.FARDATA?
-----------------------------------------------------------------
Назначение: Определяет начало сегмента дальних неинициали-
зированных данных
Режим: MASM
Синтаксис: .FARDATA? [имя]
Замечания: .FARDATA? определяет начало сегмента неинициали-
зированных данных с дальним доступом. Если вы же-
лаете иметь множество раздельных сегментов даль-
них данных, вы можете указать имя сегмента, тем
самым создавая новый сегмент.
Вы можете столько раз использовать директиву
.FARDATA? в исходном файле, сколько вам это необ-
ходимо. Все различные части с одним и тем же име-
нем будут объединены в один сегмент данных точно
также, если бы все данные были введены после
единственной директивы .FARDATA?.
Сегмент данных не может быть включен в группу. Вы
должны сделать дальние сегменты доступными средс-
твам загрузки адреса дальнего сегмента в сегмент-
ный регистр перед доступом к данным.
Смотрите директиву .MODEL для получения полной
информации о сегментных атрибутах для сегмента
неинициализированных дальних данных
См.также: .CODE, .DATA, .FARDATA, .MODEL, .STACK
Пример: .FARDATA?
FarBuf DB 80 DUP (?)
.CODE
mov ax,@FarData
mov ds,ax
ASSUME ds:@FarData
mov al,FarBuf[0] ;получает первый байт буфера
TASM2 #4-5/Док = 151 =
FARDATA
-----------------------------------------------------------------
Назначение: Определяет начало сегмента дальних данных
Режим: MASM, Ideal
Синтаксис: FARDATA [имя]
Замечания: То же, что и .FARDATA
См.также: .FARDATA
GLOBAL
-----------------------------------------------------------------
Назначение: Определяет глобальный идентификатор
Режим: MASM, Ideal
Синтаксис: GLOBAL определение [,определение]
Замечания: GLOBAL работает как комбинация директив EXTRN и
PUBLIC. Каждое определение описывает идентифика-
тор и имеет следующий формат :
[language] имя [[количество]]:тип [количество]
language является одним из C, PASCAL, BASIC,
FORTRAN, PROLOG или NOLANGUAGE и определяет любые
языковые согласования применяемых символьных
имен. Использование указания языка в директиве
GLOBAL временно переопределяет текущую языковую
установку (по умолчанию или определенную директи-
вой .MODEL). Заметьте, что вам не нужно иметь ди-
рективу .MODEL для использования данной возмож-
ности.
Если имя определено в текущем исходном файле, вы-
полняются те же действия, что и директивой
PUBLIC. Если имя не определено в текущем исходном
файле, идентификатор считается внешним, как если
бы была использована директива EXTRN.
TASM2 #4-5/Док = 152 =
Тип должен соответствовать типу идентификатора в
модуле, в котором он определен и должен быть од-
ним из следующих :
- NEAR, FAR или PROC
- BYTE, WORD, DWORD, DATAPTR, CODEPTR, FWORD,
PWORD, QWORD, TBYTE или структурное имя
- ABS
Значение "количество" определяет количество раз
повторения данного идентификатора. Если определе-
ние идентификатора использует для размещения бо-
лее одного пункта директиву DUP, то вы можете это
значение использовать в поле "количество". Это
позволяет операторам SIZE и LENGTH правильно оп-
ределять размер внешних данных. Если вы не опре-
делили значение поля "количество" - принимается
значение 1.
Директива GLOBAL позволяет вам иметь файл
INCLUDE, включаемый во все исходные файлы; файл
INCLUDE содержит все разделяемые данные как гло-
бальные идентификаторы. При ссылке на данные в
каждом модуле определение GLOBAL имеет то же
действие, что и директива EXTRN, описывающая ка-
ким образом эти данные определены в другом моду-
ле. В модуле, в котором вы определили данные, оп-
ределение GLOBAL имеет то же действие, что и ди-
ректива PUBLIC, делая эти данные доступными из
других модулей.
Вы можете определить более чем один общедоступный
идентификатор, разделяя определение запятой (,).
Вы должны определить идентификатор как GLOBAL пе-
ред тем, как он будет использован где-либо в ва-
шем исходном файле.
См.также: COMM, EXTRN, PUBLIC
Пример: GLOBAL X:WORD,Y:BYTE
X DW 0 ; делается доступным для других
; модулей
mov al,Y ; Y определен как внешний
TASM2 #4-5/Док = 153 =
GROUP
-----------------------------------------------------------------
Назначение: Определение сегментов, как достижимых из одного
сегментного регистра.
Режим: MASM, Ideal
Синтаксис: Режим: MASM:
<имя> GROUP <имя сегмента> [,<имя сегмента>]...
Режим: Ideal:
GROUP <имя> <имя сегмента> [,<имя сегмента>]...
Замечания: <имя> определяет имя группы, <имя сегмента> может
быть как именем сегмента, определенным при помощи
директивы SEGMENT, так и выражением, начинающемся
с SEG. Вы можете использовать <имя> в директиве
ASSUME, а также как константу в выражениях, где
вычисляется адрес начального параграфа группы.
Все сегменты в группе должны быть меньше 64
Кбайт, даже если они не являются смежными.
В режиме MASM вы должны использовать префиксы за-
мены сегмента при обращении к идентификаторам из
сегментов группы. В режиме Ideal Турбо ассемблер
сам генерирует префиксы замены сегмента.
В приведенном ниже примере переменные var1 и var2
принадлежат различным сегментам группы DGROUP.
При загрузке в регистр DS базового адреса группы
DGROUP, к переменным можно обращаться как к при-
надлежащим к одному сегменту.
Обратите внимание на то, что в режиме Ideal <имя>
находится после директивы GROUP.
Cм.также: SEGMENT,ASSUME
Пример: DGROUP GROUP seg1,seg2
seg1 SEGMENT
var1 DW 3
seg1 ENDS
seg2 SEGMENT
var2 DW 5
TASM2 #4-5/Док = 154 =
seg2 ENDS
seg3 SEGMENT
mov ax,DGROUP ; Загрузка базового адреса
mov ds,ax
ASSUME DS:DGROUP
mov ax.var1
mul var2
seg3 ENDS
IDEAL
-----------------------------------------------------------------
Назначение: Ввод режима ассемблирования Ideal.
Режим: MASM, Ideal
Синтаксис: Ideal
Замечания: IDEAL настраивает синтаксический анализатор на
обработку операторов, имеющих синтаксис для режи-
ма Ideal. Для более полного обсуждения возможнос-
тей и преимуществ режима Ideal см. Главу 11 "Ру-
ководства пользователя".
Режим: Ideal остается в силе до тех пор, пока он не бу-
дет отменен директивами QUIRKS или MASM.
См.также: QUIRKS, MASM
Пример: IDEAL
mov [BYTE PTR DS:SI],1 ; Синтаксис : операндов
; в режиме Ideal
TASM2 #4-5/Док = 155 =
IF
-----------------------------------------------------------------
Назначение: Начало блока условного ассемблирования. Трансли-
руется, если выражение, входящее в его состав,
верно.
Режим: MASM, Ideal
Синтаксис: IF <выражение>
Замечания: Значением <выражения> должно быть число, и оно не
должно содержать ссылку на неопределенные до этой
директивы имена. Если это выражение имеет ненуле-
вое значение, то операторы, находящиеся внутри
блока, будут ассемблироваться.
Для завершения условного блока используется ди-
ректива ENDIF.
См. также: ELSE, ENDIF, IF1, IF2, IFDEF, IFDIF, IFDIFI, IFE,
IFIDN, IFIDNI,IFNB,IFNDEF
Пример : IF DoBuffering
mov ax,BufNum
call ReadBuf
ENDIF
IF1
-----------------------------------------------------------------
Назначение: Начало блока условного ассемблирования. Действует
на первом проходе ассемблера.
Режим: MASM, Ideal
Синтаксис: IF1
Замечания: Обычно, Турбо ассемблер действует как однопроход-
ной ассемблер, и операторы внутри этого блока бу-
дут всегда обработаны, так как всегда есть как
минимум один проход.
Если вы используете многопроходные возможности
Турбо ассемблера (включенные с помощью переключа-
TASM2 #4-5/Док = 156 =
теля /m), IF1 ассемблирует операторы внутри
условного блока на первом проходе ассемблера.
Когда используется переопределение операторов с
опережающей ссылкой, вы не всегда можете из файла
листинга определить, что кое-что было неправиль-
но. В то время когда создается листинг, происхо-
дит переопределение операторов. Данное средство
позволяет создавать правильный листинг, но при
этом не происходит хорошей генерации кода для
объектного файла.
Для завершения условного блока используется ди-
ректива ENDIF.
См.также: ELSE,ENDIF,IF2,IFDIF,IFDIFI,IFE,IFIDN,IFIDNI,
IFNB,IFNDEF,IF,IFDEF
Пример: IF1
; Этот код ассемблируется на первом проходе
ENDIF
IF2
-----------------------------------------------------------------
Назначение: Начало блока условного ассемблирования. Действует
на втором проходе ассемблера.
Режим: MASM,Ideal
Синтаксис: IF2
Замечания: Обычно, Турбо ассемблер действует как однопроход-
ной ассемблер. При этом операторы внутри этого
блока никогда не будут обработаны, если установ-
лен один проход. В этом случае выдаются зависящие
от прохода предупреждающие сообщения, чтобы под-
готовить вас к возможным рискованным кодовым упу-
щениям.
Если вы используете многопроходные возможности
Турбо ассемблера (включенные с помощью переключа-
теля /m), IF2 ассемблирует операторы внутри
условного блока на втором проходе ассемблера. Од-
нако, зависящие от прохода сообщения не созда-
TASM2 #4-5/Док = 157 =
ются.
Когда используется переопределение операторов с
опережающей ссылкой, вы не всегда можете из файла
листинга определить, что кое-что было неправиль-
но. В то время когда создается листинг, происхо-
дит переопределение операторов. Данное средство
позволяет создавать правильный листинг, но при
этом не происходит хорошей генерации кода для
объектного файла.
Для завершения условного блока используется ди-
ректива ENDIF.
См.также: ELSE,ENDIF,IF1,IFDIF,IFDIFI,IFE,IFIDN,IFIDNI,
IFNB,IFNDEF,IF,IFDEF
Пример: IF2
; Этот код ассемблируется на втором проходе,
; если он используется
ENDIF
IFB
-----------------------------------------------------------------
Назначение: Начало блока условного ассемблирования. Трансли-
руется, если аргумент - пробел.
Режим: MASM, Ideal
Синтаксис: IFB <<аргумент>>
Замечания: Если значение аргумента - пробел (пусто), то
ассемблируются операторы, находящиеся внутри
условного блока. Эту директиву используют для то-
го, чтобы проверить, передаются ли макросу пара-
метры при вызове.
Аргумент должен быть всегда заключен в угловые
скобки (<>).
Для завершения условного блока используется ди-
ректива ENDIF.
См.также: ELSE,ENDIF,IF,IF1,IF2,IFDIF,IFDIFI,IFE,IFIDN,
TASM2 #4-5/Док = 158 =
IFIDNI,IFNB,IFNDEF,IFDEF
Пример: print MACRO msg
IFB <msg>
mov si,DefaultMsg
ELSE
mov si,msg
ENDIF
call ShowIt
ENDM
IFDEF
-----------------------------------------------------------------
Назначение: Начало блока условного ассемблирования. Трансли-
руется, если символическое имя определено.
Режим: MASM, Ideal
Синтаксис: IFDEF <символическое имя>
Замечания: Если <символическое имя> определено, то ассембли-
руются операторы внутри условного блока.
Для завершения условного блока используется ди-
ректива ENDIF.
См.также: ELSE,ENDIF,IF1,IF2,IFDIF,IFDIFI,IFE,IFIDN,
IFIDNI,IFNB,IFNDEF
Пример: IFDEF
buf DB Savesize DUP (?) ; определяет BUFFER
; если SAVESIZE определен
ENDIF
IFDIF,IFDIFI
-----------------------------------------------------------------
Назначение: Начало блока условного ассемблирования. Трансли-
руются, если аргументы различны.
Режим: MASM, Ideal
Синтаксис: IFDIF <<аргумент1>>,<<аргумент2>>
TASM2 #4-5/Док = 159 =
Замечания: Обычно эти директивы используются внутри макро-
сов. Они позволяют проверить, являются ли оба ар-
гумента различными строками идентификаторов. Лю-
бой из аргументов может быть фиктивным аргументом
макроса, которому, после сравнения, будет присво-
ено значение реального аргумента. Если аргументы
различны, то операторы внутри блока ассемблиру-
ются. Строки сравниваются посимвольно, с учетом
больших и маленьких букв. Для того, чтобы это не
учитывать, применяется директива IFDIFI.
Для завершения условного блока используется ди-
ректива ENDIF.
См.также: ELSE,ENDIF,IF1,IF2,IFE,IFIDN,IFIDNI,IFNB,
IFNDEF,IFB
Пример: loadb MACRO source
IFDIF <source>,<si> ; указатель на строку
mov si,source
ENDIF
loadsb ; прочитать байт
ENDM
IFE
-----------------------------------------------------------------
Назначение: Начало блока условного ассемблирования. Трансли-
руется, если <выражение> ложно.
Режим: MASM, Ideal
Синтаксис: IFE <выражение>
Замечания: Значением <выражения> должна быть константа. Вы-
ражение не должно содержать идентификаторов, не-
определенных к данному моменту трансляции. Если
значение <выражения> равно нулю, то операторы
внутри блока будут ассемблироваться.
Для завершения условного блока используется ди-
ректива ENDIF.
См.также: ELSE,ENDIF,IF1,IF2,IFIDN,IFIDNI,IFNB,IFNDEF,
TASM2 #4-5/Док = 160 =
IFB,IF
Пример: IFE StackSize
StackSize = 1024
DB StackSize DUP (?) ; размещает стек
ENDIF
IFIDN,IFIDNI
-----------------------------------------------------------------
Назначение: Начало блока условного ассемблирования. Трансли-
руется, если аргументы одинаковые.
Режим: MASM, Ideal
Синтаксис: IFIDN <<аргумент1>>,<<аргумент2>>
Замечания: Обычно эти директивы используются внутри макро-
сов. Они позволяют проверить, являются ли оба ар-
гумента различными строками идентификаторов. Лю-
бой из аргументов может быть фиктивным аргументом
макроса, которому, после сравнения, будет присво-
ено значение реального аргумента. Если аргументы
одинаковы,то операторы внутри блока ассемблиру-
ются. Строки сравниваются посимвольно, с учетом
больших и маленьких букв. Для того, чтобы это не
учитывать, применяется директива IFIDNI.
Для завершения условного блока используется ди-
ректива ENDIF.
См.также: ELSE,ENDIF,IF1,IF2,IFE,IFIDN,IFIDNI,IFNB,
IFNDEF,IFB
Пример: rdwr MACRO buf,rwmode
mov ax,buf
IFIDN <rwmode>,<read>
call ReadIt
ENDIF
IFIDN <rwmode>,<write>
call WriteIt
ENDIF
ENDM
TASM2 #4-5/Док = 161 =
IFNB
-----------------------------------------------------------------
Назначение: Начало блока условного ассемблирования. Трансли-
руется, если аргумент - не пробел.
Режим: MASM, Ideal
Синтаксис: IFNB <<аргумент>>
Замечания: Если значение аргумента - не пробел, то ассемб-
лируются операторы, находящиеся внутри условного
блока. Эту директиву используют для того, чтобы
проверить, передаются ли макросу параметры при
вызове.
Аргумент должен быть всегда заключен в угловые
скобки (<>).
Для завершения условного блока используется ди-
ректива ENDIF.
См.также: ELSE,ENDIF,IF1,IF2,IFDIF,IFDIFI,IFE,IFIDN,
IFIDNI,IFNB,IFNDEF
Пример: PopRegs MACRO reg1,reg2
IFNB <reg1>
pop reg1
ENDIF
IFNB <reg2>
pop reg2
ENDIF
ENDM
IFNDEF
-----------------------------------------------------------------
Назначение: Начало блока условного ассемблирования. Трансли-
руется, если символическое имя не определено.
Режим: MASM, Ideal
Синтаксис: IFNDEF <символическое имя>
Замечания: Если <символическое имя> не определено, то ас-
TASM2 #4-5/Док = 162 =
семблируются операторы внутри условного блока.
Для завершения условного блока используется ди-
ректива ENDIF.
См.также: ELSE,ENDIF,IF1,IF2,IFDIF,IFDIFI,IFE,IFIDN,
IFIDNI,IFNB,IFNDEF
Пример: IFNDEF BufSize
buf Size DB EQU 128 ; определяет размер буфера,
; если он еще не определен
ENDIF
TASM2 #4-5/Док = 163 =
%INCL
-----------------------------------------------------------------
Назначение: Разрешение листинга файлов, включенных по дирек-
тиве INCLUDE (include-файлов).
Режим: MASM, Ideal
Синтаксис: %INCL
Замечания: Используется после директивы %NOINCL, которая
запрещает листинг include-файлов. В начале
трансляции этот режим принимается по умолчанию.
См.также: %NOINCL
Пример: %INCL
INCLUDE DEFS.INC ;этот файл появится в листинге
INCLUDE
-----------------------------------------------------------------
Назначение: Включение в исходный текст других файлов.
Режим: MASM, Ideal
Синтаксис: режим MASM:
INCLUDE <имя файла>
режим Ideal:
INCLUDE "<имя файла>"
Замечания: Аргумент <имя файла> - это имя исходного файла
ассемблерной программы. Турбо ассемблер сначала
ассемблирует все файлы, включенные этой директи-
вой, а затем ассемблирует текущий файл.
Аргумент <имя файла> должен быть записан с ис-
пользованием стандартных соглашений DOS для имен
файлов (имя и расширение файла). По умолчанию
принимается расширение .ASM.
Если в <имени файла> явно не задан каталог, то
Турбо ассемблер ищет требуемый файл сначала во
всех каталогах, определенных при помощи опции ко-
TASM2 #4-5/Док = 164 =
мандной строки /I, а затем в текущем каталоге.
Количество вложенных директив INCLUDE не ограни-
чено.
Обратите внимание на то, что в режиме Ideal аргу-
мент <имя файла> должен быть заключен в кавычки.
Пример: ;режим MASM
INCLUDE DCEFS.INC
;режим Ideal
INCLUDE "DEFS.INC"
INCLUDELIB
-----------------------------------------------------------------
Назначение: Сообщение редактору связей о подсоединяемых биб-
лиотеках.
Режим: MASM, Ideal
Синтаксис: режим MASM:
INCLUDELIB <имя файла>
режим Ideal:
INCLUDELIB "<имя файла>"
Замечания: Аргумент <имя файла> - это имя библиотеки, кото-
рую вы хотите использовать на этапе редактирова-
ния связей. По умолчанию принимается расширение
.LIB.
Если вы указываете эту директиву, то отпадает не-
обходимость специально указывать имя библиотеки
при запуске редактора связей.
Обратите внимание на то, что в режиме Ideal аргу-
мент <имя файла> должен быть заключен в кавычки.
TASM2 #4-5/Док = 165 =
INSTR
-----------------------------------------------------------------
Назначение: Определение позиции, с которой одна строка "вхо-
дит" в другую.
Режим: MASM51, Ideal
Синтаксис: <имя> INSTR [<начало>,] <строка1>,<строка2>
Замечания: После выполнения этой директивы аргументу <имя>
присваивается значение номера позиции, с которой
<строка2> входит в <строку1>.
Номер позиции первого символа в строке равен 1.
Если <строка2> не "входит" в <строку1>, то дирек-
тива возвращает 0.
См.также: CATSTR,SIZESTR,SUBSTR
Пример: COMMAPOS INSTR <aaa,bbb>,<,> ; COMMAPOS=4
IRP
-----------------------------------------------------------------
Назначение: Повторение блока операторов с заменой строки.
Режим: MASM, Ideal
Синтаксис: IRP <параметр>,<<арг1>[,<арг2>] ...>
<операторы>
ENDM
Замечания: <Операторы> внутри блока ассемблируются один раз
для каждого аргумента списка, заключенного в
скобки (<>). Число аргументов в списке не ограни-
чено. Аргументы могут содержать любой текст (сим-
волы, строки, числа и т.д.). Каждый раз, когда
блок ассемблируется, следующий аргумент в списке
заменяет поле <параметр> в операторах блока.
Аргументы в списке должны разделяться запятыми, а
список аргументов должен быть заключен в скобки
(<>). Для завершения действия директивы IRP ис-
TASM2 #4-5/Док = 166 =
пользуется директива ENDM.
Эту директиву можно использовать как внутри мак-
росов, так и вне их.
См.также: IRPC,REPT
Пример: IRP reg,<ax,bx,cx,dx>
push reg
ENDM
IRPC
-----------------------------------------------------------------
Назначение: Повторение блока операторов с заменой идентифика-
тора.
Режим: MASM, Ideal
Синтаксис: IRPC <параметр>,<строка>
<операторы>
ENDM
Замечания: <Операторы> внутри блока ассемблируются один раз
для каждого идентификатора строки. Число иденти-
фикаторов в строке не ограничено. Каждый раз,
когда блок ассемблируется, следующий идентифика-
тор в строке заменяет поле <параметр> в операто-
рах блока.
Для завершения действия директивы IRPC использу-
ется директива ENDM.
Эту директиву можно использовать как внутри мак-
росов, так и вне их.
См.также: IRP,REPT
Пример: IRPC lucky,1379
db lucky
ENDM
В результате будет создано 4 байта данных со
значениями 1,3,7 и 9.
TASM2 #4-5/Док = 167 =
JUMPS
-----------------------------------------------------------------
Назначение: Установка режима ассемблера, при котором произво-
дится замена команд условного перехода, если они
передают управление более чем через 128 байт.
Режим: MASM, Ideal
Синтаксис: JUMPS
Замечания: Команды условных переходов могут передавать уп-
равление только на 128 байт "вверх" или "вниз" по
программе. При использовании директивы JUMPS Тур-
бо ассемблер проверяет адрес перехода в каждой
команде условного перехода и, если этот переход
осуществлен быть не может (не хватает смещения
для адреса), то он генерирует переход по противо-
положному условию и безусловный переход на требу-
емую метку. Например:
jne xyz
преобразуется в
je @aa
jmp xyz
a:
Если адрес перехода к моменту трансляции не опре-
делен, то необходимо использовать операторы NEAR
и FAR для явного указания Турбо ассемблеру на
размер команды перехода. Если вы этого не сделае-
те, то будет сгенерирован неверный код. Директива
JUMPS аналогична опции командной строки /JJUMPS.
См.также: NOJUMPS
Пример: JUMPS
JMP NEAR A
ORG $+400h
A:
TASM2 #4-5/Док = 168 =
LABEL
-----------------------------------------------------------------
Назначение: Определение символического имени и его типа.
Режим: MASM, Ideal
Синтаксис: режим MASM:
<имя> LABEL <тип>
режим Ideal:
LABEL <имя> <тип>
Замечания: Аргумент <имя> - это символическое имя еще не оп-
ределенное в программе. Аргумент <тип> определяет
размер элементов памяти, из которых состоит сим-
волическое имя, а также является ли это имя дан-
ными или программой. Аргумент <тип> может прини-
мать одно из следующих значений:
- NEAR, FAR или PROC. PROC аналогично NEAR и FAR,
но зависит от модели памяти, установленной ди-
рективой MODEL;
- BYTE, WORD, DATAPTR, CODEPTR, DWORD, FWORD,
PWORD, QWORD, TBYTE или имя структуры.
Имя будет доступно только внутри того исходного
файла, в котором она определена. Для того, чтобы
сделать его доступным для всей программы, исполь-
зуется директива PUBLIC.
Обратите внимание на то, что в режиме Ideal пара-
метр <имя> находится после директивы LABEL.
См.также: :
Пример: words LABEL WORD ;Доступ к BYTES как к словам
BYTES DB 64 DUP (0)
mov words[2],1
TASM2 #4-5/Док = 169 =
.LALL
-----------------------------------------------------------------
Назначение: Разрешение печати текста макрорасширений.
Режим: MASM
Синтаксис: .LALL
См.также: %MACS
TASM2 #4-5/Док = 170 =
.LFCOND
-----------------------------------------------------------------
Назначение: Разрешение отображения в листинге операторов в
условных блоках.
Режим: MASM
Синтаксис: .LFCOND
Замечания: Директива .LFCOND разрешает появление в листинге
программы операторов, находящихся в условных бло-
ках, которые в силу заданных условий не были
оттранслированы. Эта директива не отменяется оп-
цией командной строки /X.
См.также: %CONDS
%LINUM
-----------------------------------------------------------------
Назначение: Установка ширины поля номера строки в файле лис-
тинга.
Режим: MASM, Ideal
Синтаксис: %LINUM <размер>
Замечания: Директива %LINUM позволяет установить ширину поля
номера строки в файле листинга. Аргумент <размер>
должен быть константой. Если вы хотите сделать
листинг как можно меньше, то возможно уменьшить
ширину этого поля. Также, если исходная программа
содержит более 9999 строк, то необходимо увели-
чить размер поля строки, иначе номер строки будет
усечен.
По умолчанию размер поля номера строки равен 4.
Пример: %LINUM 5 ; допустимое количество строк 99999
TASM2 #4-5/Док = 171 =
%LIST
-----------------------------------------------------------------
Назначение: Разрешение выдачи листинга исходной программы.
Режим: MASM, Ideal
Синтаксис: %LIST
Замечания: Директива %LIST отменяет действие директивы
%NOLIST, запрещающей выдачу листинга.
В начале трансляции этот режим установлен по
умолчанию.
См.также: .LIST,%NOLIST,%XLIST
Пример: %LIST
jmp xyz ; эта строка появится в листинге
.LIST
-----------------------------------------------------------------
Назначение: Разрешение выдачи листинга исходной программы.
Режим: MASM
Синтаксис: .LIST
См.также: %LIST
Пример: .XLIST ; Запрещение выдачи листинга
INCLUDE more.inc
.LIST ; Разрешение выдачи листинга
TASM2 #4-5/Док = 172 =
LOCAL
-----------------------------------------------------------------
Назначение: Определение локальных переменных в макросах и
процедурах.
Режим: MASM, Ideal
Синтаксис: в макросах:
LOCAL <идентификатор> [,<идентификатор>]...
в процедурах:
LOCAL <имя>:<тип>[:<счетчик>][,<имя>:<тип>[:
<счетчик>]] ...[=<символическое имя>]
Замечания: Директива LOCAL может быть использована как внут-
ри макроса, так и внутри процедуры. Ее функции
определяются тем, где она применяется.
Внутри макроса LOCAL определяет временные симво-
лические имена, которые при каждом вызове макроса
заменяются на уникальные символические имена.
Уникальное символическое имя имеет вид ??<число>
где <число> принимает значение от 0 до 0FFFFh.
Внутри процедуры LOCAL определяет имена, которые
позволяют работать со стеком, базируясь на ре-
гистре BP. Первая локальная переменная располага-
ется в стеке со смещением 0. Если список аргумен-
тов директивы завершается знаком (=) и символи-
ческим именем, то этому имени будет присвоен об-
щий размер (в байтах) переданного блока перемен-
ных. Это значение вы можете использовать для
того, чтобы установит указатель на начало блока
передаваемых переменных.
Описание каждой <локальной переменной> имеет сле-
дующий вид (первый вариант):
<локальное имя>:[[расстояние]PTR]тип[:счетчик]
Возможно использование альтернативного синтаксиса
определения <локальной переменной> (второй
вариант):
<локальное имя>[[счетчик]][:[расстояние]PTR]тип]
TASM2 #4-5/Док = 173 =
где <локальное имя> - имя, которое вы можете ис-
пользовать повсюду в процедуре для ссылки на ло-
кальную переменную. Аргумент <тип> - это тип <ло-
кальной переменной>. Он может принимать значения:
WORD, DATAPTR, CODEPTR, DWORD, FWORD, PWORD,
QWORD, TBYTE или имя структуры.
Если вы не определили аргумент <тип>, и использу-
ете второй вариант синтаксиса определения <ло-
кальной переменной>, то по умолчанию <тип> прини-
мается равным WORD.
Аргумент <счетчик> определяет количество элемен-
тов заданного типа, размещенных в стеке.
Аргумент <расстояние> и слово PTR указывают Турбо
ассемблеру на необходимость включения в объектный
модуль отладочной информации,необходимой для от-
ладчика (Debugger), которая говорит о том, что
эта локальная переменная является указателем на
другой элемент данных. Для обсуждений деталей см.
описание директивы PROC.
Ниже приведены некоторые примеры правильного оп-
ределения локальных переменных:
(первый вариант)
LOCAL X:DWORD:4,Y:NEAR PTR WORD
(второй вариант):
LOCAL X[4]:DWORD,Y:PTR STRUCNAME
Аргумент <тип> показывает сколько места должно
быть зарезервировано для имени. Для элемента дан-
ных он может принимать следующие значения:
BYTE, WORD, DATAPTR, CODEPTR, DWORD, FWORD,
PWORD, QWORD, TBYTE или имя структуры,
а для указателя на код:
NEAR,FAR или PROC
TASM2 #4-5/Док = 174 =
Директива LOCAL должна быть первой директивой в
макросе. В процедуре она может располагаться в
любом месте, но она должна предшествовать первому
появлению того идентификатора, который она опре-
деляет.
См.также: ARG,MACRO,PROC,USES
Пример: OnCarry MACRO func
LOCAL done
jnc done
call func
done:
ENDM
read PROC NEAR
LOCAL N:WORD=LSIZE
push bp
mov bp,sp
sub sp,LSIZE
mov N,0
add sp,LSIZE
pop bp
ret
read ENDP
TASM2 #4-5/Док = 175 =
LOCALS
-----------------------------------------------------------------
Назначение: Разрешение использования локальных имен.
Режим: MASM, Ideal
Синтаксис: LOCALS [<префикс>]
Замечания: Локальные идентификаторы обычно начинаются с двух
символов (@@) и используются в блоках, ограничен-
ных парой PROC/ENDP внутри процедуры или не ло-
кальными идентификаторами снаружи процедуры. Не
локальные идентификаторы определяются директивами
PROC, LABEL и (.). Если вы используете директиву
LOCALS, то любые символические имена, находящиеся
между не локальными идентификаторами достижимы
только внутри этого блока. Это позволяет повторно
использовать имена внутри процедур и других бло-
ков.
Аргумент <префикс> - это два символа, которые вы
хотите использовать для идентификации локальных
имен. Обычно, знаки @@ указывают локальное имя.
Если вы имеете программу, в которой имена начина-
ются с знаков @@, или вы используете свое
собственное соглашения о локальных именах, тогда
вы можете установить два других символа начала
локального имени. Эти два символа должны удовлет-
ворять соглашениям ассемблера об именах, напри-
мер, .? подходят, а .. - нет. При установке ново-
го префикса сразу же разрешается использование
локальных имен. Если вы запретили их использова-
ние директивой NOLOCALS, префикс запоминается до
того момента, когда вы снова разрешите локальные
имена директивой LOCALS.
Локальные имена автоматически разрешаются в режи-
ме Ideal. Использование локальных имен может быть
отменено директивой NOLOCALS. Тогда все последую-
щие имена становятся доступными во всем вашем
исходном файле.
См.также: NOLOCALS,IDEAL
TASM2 #4-5/Док = 176 =
Пример: LOCALS
abc PROC
@$1:
LOOP @$1
abc ENDP
xyz PROC
@@1:
LOOP @@1 ; нет ошибок
xyz ENDP
TASM2 #4-5/Док = 177 =
MACRO
-----------------------------------------------------------------
Назначение: Определение макроса.
Режим: MASM, Ideal
Синтаксис: режим MASM:
<имя> MACRO [<параметр>[,<параметр]...]
режим Ideal:
MACRO <имя> [<параметр>[,<параметр]...]
Замечания: Для того, чтобы в теле программы использовать
макрос, требуется указать <имя>, под которым он
был определен. Аргумент <параметр> - это фиктив-
ная переменная, используемая внутри макроса, ко-
торой присваивается значение при трансляции.
Для завершения макроса используйте директиву
ENDM.
См.также: ENDM
Пример: swap MACRO A,B
mov ax,A
mov A,B
mov B,ax
ENDM
TASM2 #4-5/Док = 178 =
%MACS
-----------------------------------------------------------------
Назначение: Разрешение листинга макрорасширений.
Режим: MASM, Ideal
Синтаксис: %MAСS
Замечания: Директива %MACS отменяет действие директивы
%NOMACS. Строки, входящие в состав макросов будут
выданы в файл листинга.
См.также: .LALL, %NOMACS, .SALL, .XALL
Пример: %MACS
mymac 1,2,3 ; Текст макроса будет в файле
; листинга
TASM2 #4-5/Док = 179 =
MASM
-----------------------------------------------------------------
Назначение: Установка режима ассемблирования MASM.
Режим: MASM, Ideal
Синтаксис: MASM
Замечания: Директива MASM настраивает синтаксический анали-
затор Турбо ассемблера на синтаксис операторов
для режима MASM. Для более полного обсуждения
различий между синтаксисом операторов языка в ре-
жимах MASM и Ideal см. Приложение B.
По умолчанию предполагается, что вначале трансля-
ции установлен режим MASM.
См.также: QUIRKS,IDEAL
Пример: MASM
mov al,es:24
MASM51
-----------------------------------------------------------------
Назначение: Разрешение ассемблирования некоторых расширений
языка, принятых в MASM 5.1.
Режим: MASM, Ideal
Синтаксис: MASM51
Замечания: Директива MASM51 разрешает трансляцию следующих
операторов языка, которые обычно не доступны Тур-
бо ассемблеру:
- директивы SUBSTR, CATSTR, SIZESTR, INSTR;
- продолжение строки при помощи символа (\);
- другой синтаксис аргументов для директивы
LOCAL.
Если вы также разрешили режим QUIRKS, то вам дос-
TASM2 #4-5/Док = 180 =
тупны следующие расширения языка:
- локальные метки определяются при помощи двух
символов @@, а ссылки на них - @F и @B;
- переопределение переменных внутри процедур
- внешние процедуры языка всегда имеют атрибут
PUBLIC.
См.также: NOMASM51
Пример: MASM51
MYSTR CATSTR <ABC>,<XYZ> ; MYSTR = "ABCXYZ"
TASM2 #4-5/Док = 181 =
.MODEL
-----------------------------------------------------------------
Назначение: Устанавливает модель памяти.
Режим: MASM
Синтаксис: .MODEL [<модификатор модели>] <модель памяти>
[<имя модуля>] [,[<модификатор языка>]<язык>]
[,<модификатор модели>]
.MODEL TPASCAL
Замечания: Аргумент <модификатор модели> должен быть
NEARSTACK или FARSTACK. Это не позволяет Турбо
ассемблеру сделать предположение, что SS является
частью DGOUP (как по умолчанию во всех моделях).
Отметим, что синтаксис предоставляет две
возможности размещения модификатора модели. Обе
могут быть использованы. Размещение после <модели
памяти> обеспечивает совместимость с MASM 5.2
(Quick Assembler).
Параметр <модель памяти> может принимать одно из
следующих значений: TINY (крошечная), SMALL (ма-
лая), MEDIUM (средняя), LARGE (большая), HUGE
(огромная). В моделях HUGE и LARGE сегменты опи-
саны одинаково, но различным образом определяется
символ @DataSize (для знакомства с описанием сим-
вола @DataSize см.пункт "Другие директивы управ-
ления сегментами" в Главе 4 "Руководства пользо-
вателя").
Для того, чтобы написать программу на языке ас-
семблера, взаимодействующую с Турбо Паскалем ис-
пользуйте специальную форму директивы .MODEL:
.MODEL TPASCAL
Эта директива информирует Турбо ассемблер о том,
что необходимо использовать такие же названия
сегментов как и Tурбо Паскаль. После этого опре-
деления вы можете использовать только директивы
.CODE и .DATA. По умолчанию аргумент <язык>
принимается равным TPASCAL. При использовании
любых директив управления сегментами, которые
TASM2 #4-5/Док = 182 =
запрещены в Турбо Паскале будет выдано
предупреждающее сообщение.
Для определения модели памяти вы должны использо-
вать директиву .MODEL до любой из директив .CODE,
,.DATA, .STACK и др. Если до применения директивы
.MODEL вы использовали директивы .386 или .386P,
то сегменты кода и данных будут 32-разрядными.
Надо быть уверенным, что вы хотите именно этого.
Убедитесь, что вы поместили директиву .MODEL
перед .386 или .386P, если вы хотите иметь
16-разрядные сегменты.
Аргумент <имя модуля> используется в больших мо-
делях для объявления имени кодового сегмента.
Обычно, это позволяет избежать добавления (_TEXT)
в конец имени модуля. Использование необязатель-
ного параметра имени модуля дает вам больше гиб-
кости при построении программы из разных файлов и
модулей.
Параметр <модификатор языка> - это WINDOWS,
ODDNEAR, ODDFAR или NORMAL. Модификатор выбирает
автоматическую генерацию кода для заполнения и
очистки стека при процедурах входа и выхода для
MSWindows и ODDNEAR или ODDFAR наложений
(оверлеев). NORMAL (по умолчанию) выбирает
нормальную процедуру входа и выхода.
Аргумент <язык> сообщает Турбо ассемблеру, на ка-
ком языке написан модуль, вызывающий вашу прог-
рамму. Он может принимать следующие значения:
C, Pascal, Basic, FORTRAN, Prolog или NOLANGUAGE.
При использовании директив PROC и ENDP Турбо
ассемблер генерирует стандартные процедуры входа
в программу и выхода из нее.
Если в директиве .MODEL определен язык C, то все
общие (public) и внешние (external) ссылки будут
начинаться с символа подчеркивания (_). Это спе-
циально сделано, потому что, по умолчанию, Турбо
Си начинает все имена с символа (_). Вам не обя-
зательно использовать директивы QUIRKS и MASM51,
если вы хотите иметь имена с символом подчеркива-
TASM2 #4-5/Док = 183 =
ния для языка Си.
Аргумент <язык> также сообщает транслятору поря-
док размещения параметров в стеке при вызове мо-
дуля. Если <язык> принимает значение Pascal,
Basic, FORTRAN, то предполагается,что в стеке ар-
гументы будут сохраняться слева направо, в соот-
ветствии с тем порядком, в котором они указыва-
ются в операторе вызывающей программы. При возв-
рате управления параметры, переданные вашей прог-
рамме из языка высокого уровня, будут удалены из
стека при помощи специальной формы инструкции
RET, сгенерированной транслятором.
Если <язык> принимает значения C или Prolog, то
предполагается, что в стеке аргументы будут сох-
раняться справа налево, в порядке, обратном тому,
в котором они указываются в операторе вызывающей
программы. При возврате управления параметры, пе-
реданные вашей программе из языка высокого уров-
ня, должны быть удалены из стека.
Отметим, что использование директивы .MODEL не
требует указания языка. Директивы PROC, EXTRN,
PUBLIC, COMM, GLOBAL и PUBLICDLL, а также
инструкция CALL имеют указатель языка, который
временно переопределяют любую другую языковую
установку. Это позволяет вам, например, смешивать
и согласовывать в одной программе процедуры,
вызывающие Си и Паскаль.
Если вы не используете аргумент <язык>, то дирек-
тива .MODEL определяет порядок использования ди-
ректив управления сегментами.
Ниже приведенные таблицы показывают атрибуты сег-
ментов, принимаемые по умолчанию.
TASM2 #4-5/Док = 184 =
ТАБЛИЦА 3.1 Модель Tiny
-----------------------------------------------------------------
Директива Имя Выравнивание Доступность Класс Группа
-----------------------------------------------------------------
.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 PUBLIC 'STACK' DGROUP
*STACK не добавляется к DGROUP, если указан FARSTACK в .MODEL
-----------------------------------------------------------------
ТАБЛИЦА 3.2 Модель Small
-----------------------------------------------------------------
Директива Имя Выравнивание Доступность Класс Группа
-----------------------------------------------------------------
.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 PUBLIC 'STACK' DGROUP
*STACK не добавляется к DGROUP, если указан FARSTACK в .MODEL
-----------------------------------------------------------------
ТАБЛИЦА 3.3 Модель Medium
-----------------------------------------------------------------
Директива Имя Выравнивание Доступность Класс Группа
-----------------------------------------------------------------
.CODE name_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 PUBLIC 'STACK' DGROUP
*STACK не добавляется к DGROUP, если указан FARSTACK в .MODEL
-----------------------------------------------------------------
TASM2 #4-5/Док = 185 =
ТАБЛИЦА 3.4 Модель Compact
-----------------------------------------------------------------
Директива Имя Выравнивание Доступность Класс Группа
-----------------------------------------------------------------
.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 PUBLIC 'STACK' DGROUP
*STACK не добавляется к DGROUP, если указан FARSTACK в .MODEL
-----------------------------------------------------------------
ТАБЛИЦА 3.5 Модель Huge и Large
-----------------------------------------------------------------
Директива Имя Выравнивание Доступность Класс Группа
-----------------------------------------------------------------
.CODE name_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 PUBLIC 'STACK' DGROUP
*STACK не добавляется к DGROUP, если указан FARSTACK в .MODEL
-----------------------------------------------------------------
ТАБЛИЦА 3.6 Модель TPASCAL
-----------------------------------------------------------------
Директива Имя Выравнивание Доступность
-----------------------------------------------------------------
.CODE _TEXT BYTE PUBLIC
.DATA _DATA WORD PUBLIC
-----------------------------------------------------------------
См.также: .CODE,.DATA,.FARDATA,.FARDATA?,.STACK
Пример: .MODEL MEDIUM ; Установим большой код,
; маленькие данные
TASM2 #4-5/Док = 186 =
MODEL
-----------------------------------------------------------------
Назначение: Установка модели памяти для директив управления
сегментами.
Режим: MASM, Ideal
Синтаксис: MODEL
См.также: .MODEL
MULTERRS
-----------------------------------------------------------------
Назначение: Разрешение такого режима, при котором в случае
обнаружения в одной строке исходного текста более
одной ошибки будет выдано по одному сообщению на
каждую ошибку.
Режим: MASM, Ideal
Синтаксис: MULTIERRS
Замечания: Директива MULTERRS устанавливает такой режим, в
котором для одной строки исходного текста может
быть выдано более одного предупреждающего сообще-
ния или сообщения об ошибке. Это иногда полезно
для поиска "неуловимых" ошибок, или тогда, когда
строка может содержать более одной ошибки.
Отметим, что иногда дополнительные сообщения об
ошибках могут появиться в случае так называемой
"цепной реакции", обусловленной единственной
ошибкой в программе.
Сm.также: NOMULTERRS
Пример: MULTERRS
mov ax,[bp+abc ; 2 ошибки :
; 1. Не определен идентификатор
abc
; 2. Нет правой скобки (])
TASM2 #4-5/Док = 187 =
При трансляции будут выданы следующие сообщения
** Error ** MULTERRS.ASM(6)Undefined symbol:ABC
** Error ** MULTERRS.ASM(6)Need right square
bracket
NAME
-----------------------------------------------------------------
Назначение: Определение имени файла объектного модуля.
Режим: Ideal
Синтаксис: NAME <имя>
Замечания: Турбо ассемблер по умолчанию использует для имени
файла объектного модуля атрибуты (имя файла,
диск, директорий) файла исходной программы. Для
того, чтобы изменить эти атрибуты, необходимо в
аргументе <имя> директивы NAME указать их новые
значения.
Пример: NAME loader
TASM2 #4-5/Док = 188 =
%NEWPAGE
-----------------------------------------------------------------
Назначение: Начало новой страницы в файле листинга.
Режим: MASM, Ideal
Синтаксис: %NEWPAGE
Замечания: Те строки исходного текста, которые находятся
после этой директивы будут в файле листинга раз-
мещены на новой странице.
См.также: PAGE
Пример: %NEWPAGE
; Эта строка начнет новую страницу в листинге
%NOCONDS
-----------------------------------------------------------------
Назначение: Отмена появления в файле листинга операторов, на-
ходившихся в не транслированных (из-за невыполне-
ния условий) условных блоках.
Режим: MASM, Ideal
Синтаксис: %NOCONDS
Замечания: После этой директивы файл листинга не будет со-
держать операторов, находившихся в условных бло-
ках, если условие блока не было выполнено.
См.также: %CONDS,.LFCOND,.SFCOND,.TFCOND
Пример: %NOCONDS
IF 0
mov ax,1 ; Этой строки не будет в листинге
; так как условие ложно
ENDIF
TASM2 #4-5/Док = 189 =
%NOCREF
-----------------------------------------------------------------
Назначение: Запрещение появления в файле листинга перекрест-
ных ссылок.
Режим: MASM, Ideal
Синтаксис: %NOCREF [<символическое имя> ...]
Замечания: Директива %NOCREF останавливает выдачу информации
о перекрестных ссылках.
Если вы используете директиву %NOCREF без операн-
дов, то запрещается вся информация о перекрестных
ссылках. Если вы указываете одно или несколько
<символических имен>, то запрещается информация о
перекрестных ссылках только для указанных имен.
См.также: %CREF,.CREF,.XCREF,%CREFALL,%CREFREF,%CREFUREF
Пример: %NOCREF xyz
wval DW 0 ;
xyz DW 0 ; Информация о перекрестных ссылках
; запрещена
%NOCTLS
-----------------------------------------------------------------
Назначение: Запрещение появления в файле листинга директив
управления листингом.
Режим: MASM, Ideal
Синтаксис: %NOCTLS
Замечания: Директива %NOCTLS отменяет действие директивы
%CTLS. После ее использования директивы управле-
ния листингом не будут появляться в файле листин-
га.
В начале трансляции режим, устанавливаемый этой
директивой, принимается по умолчанию.
См.также: %CTLS
TASM2 #4-5/Док = 190 =
Пример: %NOCTLS
%LIST ; Этой директивы не будет в файле
; листинга
TASM2 #4-5/Док = 191 =
NOEMUL
-----------------------------------------------------------------
Назначение: Отмена режима эмуляции инструкций сопроцессора.
Режим: MASM, Ideal
Синтаксис: NOEMUL
Замечания: Директива NOEMUL заставляет Турбо ассемблер гене-
рировать инструкции, которые будут выполняться на
арифметическом сопроцессоре 80x87. Возможно ис-
пользование этой директивы совместно с директивой
EMUL, для того, чтобы управлять размещением в
программе реальных инструкций для сопроцессора и
эмуляций этих инструкций.
В начале трансляции режим, устанавливаемый этой
директивой, принимается по умолчанию.
См.также: EMUL
Пример: NOEMUL ; Ассемблирование инструкции для
finit ; арифметического сопроцессора
EMUL
TASM2 #4-5/Док = 192 =
%NOINCL
-----------------------------------------------------------------
Назначение: Запрещение листинга включаемых файлов.
Режим: MASM, Ideal
Синтаксис: %NOINCL
Замечания: Директива %NOINCL останавливает выдачу в листинг
исходного текста включаемого (include) файла до
тех пор, пока в программе не встретится директива
%INCL, отменяющая ее. Данная директива бывает
весьма полезна, если длинный include-файл (типа
списка определений EQU) вам просматривать и изме-
нять не нужно.
См.также: %INCL
Пример: %NOINCL
INCLUDE DEFS.INC ; не появится в листинге
TASM2 #4-5/Док = 193 =
NOJUMPS
-----------------------------------------------------------------
Назначение: Отмена режима JUMPS.
Режим: MASM, Ideal
Синтаксис: NOJUMPS
Замечания: Если вы используете директиву NOJUMPS, то можно
увидеть те строки в исходном тексте программы,
где требуется "расширение" команд условных пере-
ходов.
В начале трансляции режим, устанавливаемый этой
директивой, принимается по умолчанию.
См.также: JUMPS
%NOLIST
-----------------------------------------------------------------
Назначение: Подавление листинга.
Режим: MASM, Ideal
Синтаксис: %NOLIST
Замечания: Директива %NOLIST подавляет формирование листинга
программы до тех пор, пока ее действие не будет
прекращено директивой %LIST. Эта директива отме-
няет действие других директив управления листин-
гом.
См.также: .LIST, %LIST, .XLIST
Пример: %NOLIST
jmp xyz ; Эта строка не появится в листинге
TASM2 #4-5/Док = 194 =
NOLOCALS
-----------------------------------------------------------------
Назначение: Запрещение использования локальных имен.
Режим: MASM, Ideal
Синтаксис: NOLOCALS
Замечания: Если директивой LOCALS разрешено использование
локальных идентификаторов, то любое символическое
имя, начинающееся со знаков @@, будет восприни-
маться как локальное. Если вы используете эти
знаки по своему усмотрению и не хотите, чтобы эти
имена были локальными, то можете отменить этой
директивой режим их использования.
В режиме MASM локальные идентификаторы запрещены.
См.также: LOCALS,MASM
Пример: NOLOCALS
@@Buf DB 10 DUP(?)
%NOMACS
-----------------------------------------------------------------
Назначение: Подавление листинга макрорасширений, которые не
генерируют код.
Режим: MASM,Ideal
Синтаксис: %NOMAСS
Замечания: Директива %NOMACS не допускает появления в файле
листинга строк исходного текста, не генерирующих
код.
См.также: .LALL,%MACS,.SALL
TASM2 #4-5/Док = 195 =
NOMASM51
-----------------------------------------------------------------
Замечания: Директива NOMASM51 подавляет ассемблирование рас-
ширений языка, принятых в MASM 5.1.
Режим: MASM, Ideal
Синтаксис: MASM51
Замечания: Директива NOMASM51 подавляет ассемблирование рас-
ширений языка, принятых в MASM 5.1. В начале
трансляции режим, устанавливаемый этой директи-
вой, принимается по умолчанию.
См.также: MASM51
Пример: MASM51
SLEN SIZESTR <ax,bx> ; SLEN = 5
NOMASM51
CATSTR PROC NEAR
....
CATSTR ENDP
NOMULTERRS
-----------------------------------------------------------------
Название: Отмена режима MULTERRS. (Позволяет только одну
ошибку на исходной строке.)
Режим: MASM, Ideal
Синтаксис: NOMULTERRS
Замечания: Директива NOMULTERRS устанавливает такой режим,
при котором для одной строки исходного текста мо-
жет быть выдано не более одного предупреждающего
сообщения или сообщения об ошибке. Если строка
исходного текста содержит более одной ошибки, то
Турбо ассемблер сообщит о наиболее важной из них.
Если вы предпочитаете самостоятельно решать, ка-
кая из ошибок является наиболее важной, то ис-
пользуйте директиву MULTERRS.
TASM2 #4-5/Док = 196 =
В начале трансляции режим, устанавливаемый этой
директивой, принимается по умолчанию.
См.также: MULTERRS
Пример: NOMULTERRS
mov ax,[bp+abc ; 1 ошибка :
; 1. Не определен идентификатор
abc
При трансляции будет выдано 1 сообщение
** Error ** MULTERRS.ASM(6)Undefined symbol:ABC
TASM2 #4-5/Док = 197 =
%NOSYMS
-----------------------------------------------------------------
Назначение: Подавляет появление в файле листинга таблицы сим-
волических имен.
Режим: MASM, Ideal
Синтаксис: %NOSYMS
Замечания: Директива %NOSYMS подавляет появление в файле
листинга таблицы символических имен. Обычно эта
таблица, содержащая все символические имена, оп-
ределенные в программе, располагается в конце
файла листинга.
См.также: %SYMS
Пример: %NOSYMS ; Таблицы символических имен не будет
; в листинге
%NOTRUNC
-----------------------------------------------------------------
Назначение: Перенос слишком длинных полей в файле листинга.
Режим: MASM, Ideal
Синтаксис: %NOTRUNC
Замечания: Обычно, если одна строка исходного текста генери-
рует больше кода, чем может поместиться на одной
строке листинга, то она усекается. После примене-
ния этой директивы строки листинга не будут усе-
каться, а будут переноситься с одной на другую.
Используйте директиву %TEXT для установления ши-
рины исходного поля.
См.также: %BIN,%TEXT,%TRUNC
Пример: %NOTRUNC
DD 4 DUP (1,2,3,4) ; строка не будет усечена
TASM2 #4-5/Док = 198 =
%NOWARN
-----------------------------------------------------------------
Назначение: Подавление вывода предупреждающих сообщений во
время трансляции.
Режим: MASM, Ideal
Синтаксис: %NOWARN [<класс предупреждения>]
Замечания: При использовании директивы %NOWARN без операнда
то подавляются появление всех предупреждающих
сообщений. Если вы укажете <класс предупрежде-
ния>, то будет подавлен вывод только этого пре-
дупреждения. Каждому предупреждению соответствует
трехбуквенный идентификатор (<класс предупрежде-
ния> - см. директиву WARN ). Аналогичные иденти-
фикаторы используются в опции командной строки
/W.
См.также: WARN
Пример: NOWARN OVF ; Подавления предупреждения об
; арифметическом переполнении
DW 1000*1234 ; Это предупреждение запрещено
ORG
-----------------------------------------------------------------
Назначение: Установка значения счетчика адреса в текущем сег-
менте.
Режим: MASM, Ideal
Синтаксис: ORG <выражение>
Замечания: Аргумент <выражение> не должен содержать иденти-
фикаторов, неопределенных к данному моменту тран-
сляции. Он может содержать как константу и смеще-
ние идентефикатора в текущем сегменте, так и те-
кущее значение счетчика адреса ($).
При помощи этой директивы вы можете изменять со-
держимое счетчика адреса. Это может потребоваться
TASM2 #4-5/Док = 199 =
для того, чтобы вернуться и заполнить таблицу те-
ми элементами, значения которых к моменту опреде-
ления этой таблицы неизвестны. Будьте особенно
аккуратны при использовании этой директивы.
Эта директива может быть также использована для
того, чтобы "связать" метку с абсолютным адресом
оперативной памяти. Директива ORG может устанав-
ливать начальный адрес .COM-файлов.
См.также: SEGMENT
Пример: PROG SEGMENT
ORG 100h ; установка смещения для COM.-файла
TASM2 #4-5/Док = 200 =
%OUT
-----------------------------------------------------------------
Назначение: Вывод сообщения на экран из транслируемого файла.
Режим: MASM
Синтаксис: %OUT <текст>
Замечания: Аргумент <текст> - это любое сообщение, которое
вы хотите вывести на экран. Оно может содержать
любые идентификаторы и не интерпретируется иначе.
Сообщение выдается на стандартное устройство вы-
вода (обычно на экран). При желании стандартное
устройство вывода может быть переопределено
средствами DOS.
Также эта директива используется для того, чтобы
знать, какие блоки условного ассемблирования бу-
дут включены в программу.
См.также: DISPLAY
Пример: %OUT Assembling graphics driver
P387
-----------------------------------------------------------------
Назначение: Применение этой директивы разрешает ассемблирова-
ние инструкций для микропроцессора 80387 (арифме-
тического сопроцессора).
Режим: MASM, Ideal
См.также: .8087,.287,.387,.PNO87,.P287
P8086
-----------------------------------------------------------------
Назначение: Разрешает ассемблирование инструкций только для
микропроцессора 8086.
Режим: MASM, Ideal
См.также: .186,.8086,.286,.286P,.386,.386С,.386P,286,
P286,P286P,P386,P386P
TASM2 #4-5/Док = 204 =
P8087
-----------------------------------------------------------------
Назначение: Разрешает ассемблирование инструкций только для
микропроцессора 8087 (арифметического сопроцессо-
ра).
Режим: MASM, Ideal
См.также: .287,.387,.8087,8087,.PNO87,.P287,P387
PAGE
-----------------------------------------------------------------
Назначение: Установка размеров страницы листинга, начало но-
вой страницы.
Режим: MASM
Синтаксис: PAGE [<высота>][,<ширина>]
PAGE +
Замечания: Аргумент <высота> определяет количество строк в
каждой странице листинга (минимальное значение10,
максимальное - 255). Аргумент <ширина> определяет
количество количество позиций в строке листинга
(минимальное значение - 59, максимальное - 255).
Если вы не используете ни первого, ни второго ар-
гумента, то текущие параметры страницы изменены
не будут. Для того, чтобы изменить только один из
параметров, необходимо указать его новое значе-
ние, а на месте неизменяемого параметра - запя-
тую.
При использовании директивы PAGE со знаком (+)
начинается новая страница, номер секции изменяет-
ся на 1, нумерация страниц начинается сначала.
Если вы используете директиву PAGE без аргумен-
тов, то будет начата новая страница без изменения
номера секции.
См.также: %NEWPAGE,%PAGESIZE
TASM2 #4-5/Док = 205 =
Пример: PAGE ; Начало новой страницы листинга
PAGE ,80 ; Ширина страницы = 80, высота не
; изменяется
%PAGESIZE
-----------------------------------------------------------------
Назначение: Установка размеров страницы листинга, начало но-
вой страницы.
Режим: MASM, Ideal
Синтаксис: %PAGESIZE [<высота>][,<ширина>]
Замечания: Аргумент <высота> определяет количество строк в
каждой странице листинга (минимальное значение -
10, максимальное - 255). Аргумент <ширина> опре-
деляет количество количество позиций в строке
листинга (минимальное значение - 59, максимальное
- 255).
Если вы не используете ни первого, ни второго ар-
гумента, то текущие параметры страницы изменены
не будут. Для того, чтобы изменить только один из
параметров, необходимо указать его новое значе-
ние, а на месте неизменяемого параметра - запя-
тую.
См.также: PAGE
Пример: %PAGESIZE 66,132 ; широкий листинг, нормальная
; высота
%PAGESIZE ,80 ; ширина =80, высота осталась
; прежней
TASM2 #4-5/Док = 206 =
%PCNT
-----------------------------------------------------------------
Назначение: Установка ширины поля сегмент:смещение в листин-
ге.
Режим: MASM, Ideal
Синтаксис: %PCNT <ширина>
Замечания: Аргумент <ширина> - это количество позиций, кото-
рое вы хотите зарезервировать под смещение внутри
текущего сегмента. По умолчанию аргумент <ширина>
принимает значение 4 знака для 16-ти битового
сегмента и 8 знаков для 32-х битового сегмента
(для 80386). При помощи директивы %PCNT вы можете
изменять эти значения.
См.также: %BIN,%DEPTH,%LINUM
Пример: %PCNT 3
ORG 1234h ; будет напечатано 234
PNO87
-----------------------------------------------------------------
Назначение: Подавление ассемблирования инструкций арифмети-
ческого сопроцессора.
Режим: MASM, Ideal
Синтаксис: PNO87
Замечания: Обычно Турбо ассемблер фирмы Borland позволяет
ассемблировать инструкции для семейства сопроцес-
соров 80x87. Эта директива используется для того,
чтобы быть уверенным в том, что ваша программа не
содержит инструкций для сопроцессора.
См.также: .8087,.287,.387,P8087,P287,P387
Пример: PNO87
fadd ; будет сообщение об ошибке
TASM2 #4-5/Док = 207 =
%POPLCTL
-----------------------------------------------------------------
Назначение: Восстановление директив управления листингом из
стека.
Режим: MASM, Ideal
Синтаксис: %POPLCTL
Замечания: Директива %POPLCTL восстанавливает директивы уп-
равления листингом из стека, в который они были
помещены директивой %PUSHLCTL. Могут быть восста-
новлены любые директивы управления листингом
(%MACS,%LIST и др.), кроме тех, которые устанав-
ливают ширину различных полей (%PCNT, %DEPTH и
др.). Эта директива обычно используется в макро-
сах и INCLUDE-файлах для того, чтобы восстановить
действие предыдущих директив управления листингом
при завершении текста макроса или INCLUDE-файла.
См.также: %PUSHLCTL
Пример: %PUSHLCTL
%NOLIST
%NOMACS
. . .
%POPLCTL ; восстановление директив управления
; листингом
PROC
-----------------------------------------------------------------
Назначение: Определение начала процедуры.
Режим: MASM, Ideal
Синтаксис: режим MASM:
<имя> PROC [<модификатор языка>] [<язык>]
[<расстояние>] [USES <регистры>,]
[<параметр>[,<параметр>] ...]
[RETURNS <параметр>[,<параметр>]...]
TASM2 #4-5/Док = 208 =
режим Ideal:
PROC [<модификатор языка>] [<язык>] <имя>
[<расстояние>] [USES <регистры>,]
[<параметр>[,<параметр>] ...]
[RETURNS <параметр>[,<параметр>]...]
Замечания: Аргумент <имя> - это имя процедуры. Параметр
<модификатор языка> - это WINDOWS, ODDNEAR,
ODDFAR или NORMAL. Модификатор выбирает
автоматическую генерацию кода для заполнения и
очистки стека при процедурах входа и выхода для
MSWindows и ODDNEAR или ODDFAR наложений
(оверлеев) или нормальную процедуру входа и
выхода. Определенный в директиве PROC модификатор
языка переписывает (только для данной процедуры)
любой модификатор языка, который был ранее
установлен директивой .MODEL. Язык - это C,
PASCAL, BASIC, FORTRAN, PROLOG или NOLANGUAGE, и
выбирает автоматическую генерацию кода для
заполнения и очистки стека при процедурах входа и
выхода для указанных языков. Определенный в
директиве PROC язык переписывает (только для
данной процедуры) любой язык, который был
установлен предыдущими директивами. Отметим, что
вы больше не нуждаетесь в директиве .MODEL в
вашей программе для генерации входного и
выходного кода для ваших процедур.
Аргумент <расстояние> определяет тип инструкции
возврата управления процедурой. Он может
принимать значения NEAR и FAR. Он позволяет
изменить размер модели памяти, установленной по
умолчанию. Если вы не используете директив
управления сегментами, то по умолчанию
принимается NEAR. В моделях TINY, SMALL и COMPACT
аргумент <расстояние> принимается равным NEAR, а
во всех остальных моделях памяти - FAR.
<расстояние> определяет, будет ли инструкция RET,
обнаружена внутри процедуры, генерировать
"ближнюю" или "дальнюю" инструкцию возврата.
Предполагается, что <FAR>-процедура будет вызвана
"длинной" (FAR) инструкцией CALL, а NEAR-
процедура - "короткой" (NEAR) инструкцией CALL.
Аргумент <регистры> - это список регистров и
простых знаков, используемых процедурой. Эти
TASM2 #4-5/Док = 209 =
регистры должны быть сохранены при входе в
процедуру и восстановлены при выходе из нее.
Имена регистров в списке разделяются пробелами.
Например:
Mine PROC USES ax bx foo
Будут сохранены и установлены регистры AX и BX,
также как и слово foo.
Аргумент <параметр> определяет параметр, переда-
ваемый процедуре. Указатель языка в директиве
PROC или в директиве .MODEL, если он не указан в
PROC, определяет, будут ли аргументы находиться в
стеке в обратном порядке. Вы должны обязательно
располагать аргументы в том же порядке, в каком
они появляются в функции языка высокого уровня,
который вызывает процедуру. Турбо ассемблер
прочитает их в обратном порядке, если это
необходимо. Каждый <параметр> имеет следующий
синтаксис:
<имя параметра>[[число1]] [:[<расстояние>]PTR ]
<тип> [:число2]
где <имя параметра> - имя, которое вы можете ис-
пользовать повсюду в процедуре для ссылки на па-
раметр. Необязательный аргумент <расстояние> (в
этой директиве) может принимать значения NEAR или
FAR для того, чтобы определить размер указателя
на параметр.
Аргумент <тип> - это тип данных параметра. Он
может принимать значения: WORD, DWORD, FWORD,
PWORD, QWORD, TBYTE или имя структуры. <число1>
и <число2> - это количество элементов указанного
типа. Общее число определяется как
<число1>*<число2>. По умолчанию <тип>
принимается равным WORD.
Если вы добавляете PTR, показывая, что аргумент
является действительным указателем на данное,
Турбо ассемблер добавит здесь отладочную
информацию для Турбо Отладчика (Turbo Debugger).
Использование PTR вызовет только генерацию
дополнительной отладочной информации, и никаких
TASM2 #4-5/Док = 210 =
кодов ассемблера создано не будет. Вы должны все
же писать код для доступа к действительным
данным, используя аргумент указатель.
Если вы используете слово PTR без указателя NEAR
или FAR перед ним, то Турбо ассемблер
устанавливает размер параметра исходя из
выбранной модели памяти и, для 80386 процессора,
текущего размера адреса сегмента (16 или 32
бита). Если используются модели TINY, SMALL и
MEDIUM, то под указатель отводится слово (WORD),
иначе - двойное слово (DWORD). При использовании
микропроцессора 80386 и 32-х битного адреса
сегмента для моделей TINY, SMALL и MEDIUM под
указатель отводится двойное слово (DWORD), а
иначе - 8 байт (FWORD).
Ключевое слово RETURNS объявляет один или нес-
колько параметров, которые должны быть восстанов-
лены из стека при возврате управления вызывающей
программе. Обычно, если вы определили директивой
.MODEL язык PASCAL или TPASCAL, или PASCAL в этой
же директиве PROC, то при возврате управления все
параметры будут восстановлены из стека. Если вы
поместите, при описании процедуры, параметры
после ключевого слова RETURNS, то они будут
оставлены в стеке для того, чтобы вызывающая
программа использовала их и сама очистила стек. В
частности, вы должны определить возвращаемое
значение строки языка PASCAL, поместив ее после
ключевого слова RETURNS.
Для окончания процедуры используйте директиву
ENDP. Вы должны указать инструкцию RET перед ENDP
для того, чтобы возвратить управление вы-
зывающей программе.
Внутри блока PROC/ENDP вы можете использовать ло-
кальные символические имена, то есть имена, кото-
рые доступны только операторам внутри процедуры.
Как правило, они начинаются с двух символов (@@).
Вы можете вкладывать директивы PROC/ENDP, если вы
хотите; вы делаете локальные идентификаторы вло-
женными также.
TASM2 #4-5/Док = 211 =
Локальные идентификаторы видны только внутри те-
кущей процедуры.
См.также: ARG,ENDP,LOCAL,LOCALS,USES
Пример: READLINE proc near ; тело процедуры
call ReadLine
READLINE ENDP
TASM2 #4-5/Док = 212 =
PUBLIC
-----------------------------------------------------------------
Назначение: Объявление идентификаторов, как доступных другим
модулям.
Режим: MASM, Ideal
Синтаксис: PUBLIC <язык><симв.имя> [,<язык><симв.имя>]...
Замечания: Аргумент <язык> - C,PASCAL,BASIC,FORTRAN,PROLOG
или NOLANGUAGE - устанавливает любую специфи-
ческую языковую совместимость символического име-
ни. Использование директивы PUBLIC временно пере-
определяет текущую языковую установку ( по умол-
чанию или с помощью директивы .MODEL). Заметьте,
что вам не требуется иметь директиву .MODEL для
эффективного использования данной возможности.
Аргумент <символическое имя> помещается в объект-
ный модуль так, чтобы он был доступен другим мо-
дулям. Если вы не объявите символическое имя та-
ким образом, то оно будет доступно только для
текущего модуля.
Таким образом возможно определить только следую-
щие типы данных:
- имена переменных
- метки программы
- числовые константы, определенные по EQU
См.также: COMM,EXTRN,GLOBAL
Пример: PUBLIC xyzproc ; объявление процедуры, как
xyzproc PROC near ; доступной другим модулям
TASM2 #4-5/Док = 213 =
PUBLICDLL
-----------------------------------------------------------------
Назначение: Объявление идентификаторов доступными, как дина-
мически связанные точки входа из других модулей.
Режим: MASM, Ideal
Синтаксис: PUBLICDLL <язык><симв.имя> [,<язык><симв.имя>]...
Замечания: Аргумент <символическое имя> помещается в объект-
ный модуль как динамически связанная точка входа
так, чтобы он был доступен из других программ под
OS/2. Этот оператор используется только для того,
чтобы помочь построить динамически связанную
библиотеку под OS/2. Если вы не сделаете имя
PUBLIC, оно будет доступно только из текущего
исходного файла.
В основном, вы объявляете PUBLICDLL только метки
процедур. Другие метки программы, имена перемен-
ных и числовые константы, определенные по EQU,
также можно объявить PUBLICDLL.
Аргумент <язык> устанавливает любую специфическую
языковую совместимость символического имени.
Например, при использовании указания языка C при
помещении символического имени в объектный файл
перед ним будет создаваться символ подчеркивания
"_". Разрешенные указатели языков это C, PASCAL,
BASIC, FORTRAN, PROLOG или NOLANGUAGE
См.также: COMM,EXTRN,GLOBAL,PUBLIC
Пример: PUBLICDLL xyzproc ; объявление процедуры
xyzproc PROC near ; доступной,
; динамически связанной
; точкой входа
TASM2 #4-5/Док = 214 =
PURGE
-----------------------------------------------------------------
Назначение: Уничтожение макроопределения.
Режим: MASM, Ideal
Синтаксис: PURGE <имя макроса> [,<имя макроса>]...
Замечания: Директива PURGE удаляет макрос под именем <имя
макроса>. Вы можете уничтожить сразу несколько
макросов, указав в директиве их имена, разделен-
ные запятыми.
Эта директива может быть использована для того,
чтобы возвратить первоначальное значение инструк-
ции или директиве, если вы определили макрос под
таким же именем.
См.также: MACRO
Пример: PURGE add
add ax,4 ; обычная команда "сложить"
TASM2 #4-5/Док = 215 =
%PUSHLCTL
-----------------------------------------------------------------
Назначение: Сохранение директив управления листингом в стеке.
Режим: MASM, Ideal
Синтаксис: %PUSHLCTL
Замечания: Директива %PUSHLCTL сохраняет директивы управле-
ния листингом в 16-ти уровневом стеке. Могут быть
сохранены любые директивы управления листингом (%
MACS,%LIST и др.), кроме тех, которые устанавли-
вают ширину различных полей (%PCNT, %DEPTH и
др.). Эта директива обычно используется в макро-
сах и INCLUDE-файлах для того, чтобы сохранить
действие предыдущих директив управления листингом
при завершении текста макроса или INCLUDE-файла.
См.также: %POPLCTL
Пример: %PUSHLCTL
%NOINCL
%MACS
%POPLCTL ; восстановление директив управления
; листингом
TASM2 #4-5/Док = 216 =
QUIRKS
-----------------------------------------------------------------
Назначение: Объявление режима Quirks для Турбо ассемблера.
Режим: MASM, Ideal
Синтаксис: QUIRKS
Замечания: QUIRKS позволяет вам транслировать программу,
содержащую одну из ошибок MASM. Старайтесь не
использовать эту директиву. Лучше измените те
конструкции, которые требуют ее применения.
Для полного описания режима Quirks см. пункт "Ре-
жим: Quirks TASM" в приложении B.
См.также: MASM,IDEAL
Пример: QUIRKS
bval DB 0
mov bval,es
.RADIX
-----------------------------------------------------------------
Назначение: Установка системы счисления для целых констант в
выражениях.
Режим: MASM
Синтаксис: .RADIX <выражение>
Замечания: Значением аргумента <выражение> должно быть одна
из следующих констант: 2,8,10,16. Константы в
<выражении> интерпретируются как десятичные.
Пример: .RADIX 8; Система счисления - восьмеричная
DB 77 ; Число 63 (десятичное)
TASM2 #4-5/Док = 217 =
RADIX
-----------------------------------------------------------------
Назначение: Установка системы счисления для целых констант в
выражениях.
Режим: MASM, Ideal
Синтаксис: RADIX <выражение>
См.также: .RADIX
RECORD
-----------------------------------------------------------------
Назначение: Определение записи, содержащей битовые поля.
Режим: MASM, Ideal
Синтаксис: режим MASM:
<имя> RECORD <поле> [,<поле>]...
режим Ideal:
RECORD <имя> <поле> [,<поле>]...
Замечания: Аргумент <имя> определяет запись. Его вы можете
использовать при отведении памяти под запись по-
добного формата. Каждое поле описывает группу бит
в записи. Оно имеет следующий формат:
<имя поля>:<размер>[=<выражение>]
Аргумент <имя поля> - это имя поля в записи. Если
вы используете аргумент <имя поля> в выражении,
то оно принимает значение количества бит, на ко-
торое необходимо сдвинуть поле вправо для того,
чтобы разместить младший бит поля в младшем байте
(слове), содержащего запись.
Аргумент <размер> - это константа между 1 и 16,
определяющая количество бит в поле. Общий размер
всех полей в записи не должен превышать 32-х бит.
Если общее количество бит во всех полях менее
восьми, то запись будет занимать 1 байт; если оно
TASM2 #4-5/Док = 218 =
больше 9 и меньше 16, то запись будет занимать 2
байта; в противном случае запись будет занимать 4
байта.
Аргумент <выражение> - это необязательное поле,
которое определяет значение поля по умолчанию.
Перед <выражением> должен быть знак (=). При
распределении памяти, если не указывается значе-
ние для инициализации поля, то принимается значе-
ние, задаваемое этим выражением. Все неинициали-
зированные биты устанавливаются в нуль.
Первое поле, определенное RECORD, становится
самыми важными битами записи с последующим
заполнением младших бит. Если общий размер всех
полей не точно 8 или 16 бит, все поля сдвигаются
вправо так, чтобы младший бит младшего поля занял
младший бит байта или слова, которое занимает
запись.
См.также: STRUC
Пример: myrec RECORD val : 3=4,mode:2,size:4
TASM2 #4-5/Док = 219 =
REPT
-----------------------------------------------------------------
Назначение: Повторение блока операторов.
Режим: MASM, Ideal
Синтаксис: REPT <выражение>
<операторы>
ENDM
Замечания: Значением аргумента <выражение> должна быть конс-
танта, и <выражение> не должно содержать иденти-
фикаторов, не определенных к данному моменту тра-
нсляции. Оно определяет количество повторений
<операторов>.
Директива REPT может быть использована как внутри
макросов, так и вне их.
См.также: ENDM,IRPC,IRP
Пример: REPT 4
shl ax,1
ENDM
TASM2 #4-5/Док = 220 =
.SALL
-----------------------------------------------------------------
Назначение: Подавление листинга макроопределений.
Режим: MASM
Синтаксис: .SALL
Замечания: Эту директиву используют тогда, когда необходимо
сократить размер листинга.
См.также: .LALL,.XALL,%MACS,%NOMACS
Пример: .SALL
mymacro 4
add ax,si ; эта строка будет в листинге следо-
; вать за строкой макроса
SEGMENT
-----------------------------------------------------------------
Назначение: Определение сегмента и всех его атрибутов.
Режим: MASM, Ideal
Синтаксис: режим MASM:
<имя> SEGMENT [<выравнивание>][<объединение>]
[<использование>]['<класс>']
режим Ideal:
SEGMENT <имя> [<выравнивание>][<объединение>]
[<использование>]['<класс>']
Замечания: Аргумент <имя> определяет имя сегмента. Если вы
определили сегмент с таким же именем, то он будет
воспринят как продолжение предыдущего сегмента.
Вы можете использовать одинаковые имена сегментов
в различных исходных программах. Редактор связей
будет объединять сегменты с одинаковыми именами в
один сегмент.
Аргумент <выравнивание> определяет тип границы
выравнивания сегмента. Он может принимать следую-
TASM2 #4-5/Док = 221 =
щие значения:
- BYTE -начало сегмента со следующего свободного
байта;
- WORD -начало сегмента со следующего свободного
слова;
- DWORD-начало сегмента со следующего свободного
двойного слова;
- PARA -начало сегмента со следующего свободного
параграфа (16-ти байт);
- PAGE -начало сегмента со следующей свободной
страницы;
По умолчанию <выравнивание> принимается равным
PARA.
Аргумент <объединение> определяет порядок объеди-
нения сегментов с одинаковыми именами при редак-
тировании связей. Он может принимать одно из сле-
дующих значений:
- AT <выражение> - Размещение сегмента в памяти
по абсолютному адресу. Адрес параграфа опреде-
ляется значением <выражения>. Аргумент <выраже-
ние> не должен содержать идентификаторов, не
определенных к данному моменту трансляции. Для
сегментов этого типа редактор связей и ассемб-
лер не будут генерировать ни кода, ни данных.
Обычно сегменты с таким значением аргумента
<объединение> используются для того, чтобы
обеспечить доступ по именам к фиксированным об-
ластям памяти (например к экрану дисплея или
областям данных БСВВ (BIOS)).
- COMMON - Размещение этого сегмента, а также
всех сегментов с одинаковыми именами, по одному
и тому же адресу памяти. Длина результирующего
сегмента типа COMMON - это длина наибольшего из
сегментов с одинаковыми именами.
- MEMORY - Объединение всех сегментов с одинако-
выми именами в единый сегмент (аналогично типу
PUBLIC).
- PRIVATE - Сегмент такого типа не объединяется
ни с каким другим сегментом.
TASM2 #4-5/Док = 222 =
- PUBLIC - Объединение всех сегментов с одинако-
выми именами в единый сегмент. Длина результи-
рующего сегмента типа PUBLIC - это сумма длин
всех сегментов с одинаковыми именами.
- STACK - Объединение всех сегментов с одинаковы-
ми именами в единый сегмент. Редактор связей
устанавливает адрес начала стека в регистр сег-
мента стека (SS), а длину стека - в регистр
указателя стека (SP). Длина результирующего
сегмента - это сумма длин всех сегментов с оди-
наковыми именами.
- VIRTUAL - Определяет особый вид сегмента,
который трактуется как общая область и
присоединяется к другому сегменту во время
редактирования связей. VIRTUAL сегмент
принимает вид присоединения к объемлющему
сегменту. VIRTUAL сегмент также наследует свои
атрибуты от объемлющего сегмента. Директива
ASSUME принимает VIRTUAL сегмент как часть его
родительского сегмента; и остальных случаях
VIRTUAL сегмент трактуется как нормальный
сегмент. Редактор связей считает виртуальный
сегмент общей областью, которая собирается из
таких областей разных модулей. Разрешенные
статические данные, которые находятся во многих
модулях включаемых файлов, разделяются.
По умолчанию значением аргумента <объединение>
является PRIVATE.
Аргумент <использование> определяет по умолчанию
размер слова для сегмента. Он указывается лишь
после применения директив P386 или P386N. Он мо-
жет принимать следующие значения:
- USE16. Это значение принимается по умолчанию,
если вы не указали явно значение аргумента.
Сегмент с таким типом может содержать до
64-кбайт кода или данных. При ссылке на 32-х
битные сегменты, регистры или константы будут
сгенерированы необходимые инструкции,
переопределяющие 16-ти битный режим.
TASM2 #4-5/Док = 223 =
- USE32. Сегмент такого типа может содержать до
4-х Гбайт (гигабайт) кода или данных. При
ссылке на 16-ти разрядные сегменты, регистры и
константы будут сгенерированы соответствующие
инструкции.
Аргумент <класс> управляет последовательностью
обработки сегментов при редактировании связей.
Независимо от следования сегментов в исходном
файле сегменты с одинаковыми значениями аргумента
<класс> будут загружаться в память одновремен-
но. Значение аргумента должно быть заключено в
кавычки (' или ").
Сегмент должен заканчиваться директивой ENDS. До-
пускаются вложенные сегменты, но Турбо ассемблер
воспринимает их по отдельности; он просто помес-
тит дополнительные данные или код в основной сег-
мент, когда директива ENDS завершит вложенный
сегмент.
См.также: GROUP,.MODEL,CODESEG,DATASEG
Пример: PROG SEGMENT PARA PUBLIC 'CODE'
...
PROG ENDS
TASM2 #4-5/Док = 224 =
.SEQ
-----------------------------------------------------------------
Назначение: Установка последовательности расположения сегмен-
тов.
Режим: MASM
Синтаксис: .SEQ
Замечания: Директива .SEQ устанавливает такой режим, при ко-
тором сегменты в объектном модуле располагаются в
таком прядке, в каком они следуют в исходном фай-
ле. Этот режим принимается по умолчанию. Он может
быть изменен директивой DOSSEG.
Действие директивы .SEQ аналогично действию опции
командной строки Турбо ассемблера /S. Действие
директивы .SEQ может быть отменено опцией команд-
ной строки /A (следование сегментов в алфавитном
порядке).
См.также: .ALPHA,DOSSEG
Пример: .SEQ
xyz SEGMENT ;этот сегмент будет первым
xyz ENDS
abc SEGMENT
abc ENDS
TASM2 #4-5/Док = 225 =
.SFCOND
-----------------------------------------------------------------
Назначение: Подавление появления операторов из нетранслиро-
ванных условных блоков в файле листинга.
Режим: MASM
Синтаксис: .SFCOND
См.также: %CONDS,.LFCOND,%NOCONDS,.TFCOND
SIZESTR
-----------------------------------------------------------------
Назначение: Определение количества идентификаторов в строке.
Режим: MASM51, Ideal
Синтаксис: <имя> SIZESTR <строка>
Замечания: Аргументу <имя> присваивается числовое значение
количества символов в строке. Строка <> имеет ну-
левую длину.
См.также: SUBSTR,CATSTR,INSTR
Пример: REGLIST EQU <si di>
REGLEN SIZESTR REGLIST ; REGLEN = 5
TASM2 #4-5/Док = 226 =
.STACK
-----------------------------------------------------------------
Назначение: Определение начала стека в сегменте стека.
Режим: MASM, Ideal
Синтаксис: .STACK <размер>
Замечания: Аргумент <размер> - это число байт, отведенных
под стек. По умолчанию он принимается равным 1
Кбайт.
Обычно эта директива используется при написании
отдельных (автономных) программ на языке ассемб-
лера. Если вы пишете процедуру, которая будет вы-
зываться из языка высокого уровня, то стек будет
установлен вызывающей программой.
См.также: .CODE,.CONST,.DATA,.DATA?,.FARDATA,.FARDATA?,
.MODEL,STACK
Пример: .STACK 200h ; резервирование под стек 512 байт
STACK
-----------------------------------------------------------------
Назначение: Определение начала стека в сегменте стека.
Режим: MASM, Ideal
См.также: .CODE,.CONST,.DATA,.DATA?,.FARDATA,.FARDATA?,
.MODEL,.STACK
TASM2 #4-5/Док = 227 =
.STARTUP
-----------------------------------------------------------------
Назначение: Создает эффективный стартовый код для обычной
модели.
Режим: MASM
Замечания: .STARTUP создает эффективный стартовый код для
обычной модели. Ближняя метка @Startup определя-
ется в начале стартового кода и программная ди-
ректива END становится END @Startup. Эта директи-
ва поддерживает совместимость с Microsoft Quick
Assembler.
См.также: @Startup,STARTUPCODE
STARTUPCODE
-----------------------------------------------------------------
Назначение: Создает эффективный стартовый код для обычной
модели.
Режим: MASM
Замечания: STARTUPCODE создает эффективный стартовый код для
обычной модели. Ближняя метка @Startup определя-
ется в начале стартового кода и программная ди-
ректива END становится END @Startup. Эта директи-
ва поддерживает совместимость с Microsoft Quick
Assembler.
См.также: @Startup,STARTUPCODE
TASM2 #4-5/Док = 228 =
STRUC
-----------------------------------------------------------------
Назначение: Определение структуры.
Режим: MASM, Ideal
Синтаксис: режим MASM:
<имя> STRUC
<поля>
[<имя>] ENDS
режим Ideal:
STRUC <имя>
<поля>
ENDS [<имя>]
Замечания: Различия в определении структуры в режимах MASM и
Ideal состоят в ином размещении аргумента <имя> и
ключевых слов STRUC и ENDS. В Турбо ассемблере вы
можете делать как вложенные директивы STRUC, так
и любые комбинации с директивой UNION.
Аргумент <имя> идентифицирует структуру. По этому
имени вы можете обращаться к структуре для того,
чтобы выделить под нее память.
Аргументы <поля> определяют те поля, из которых
состоит структура. Каждое поле определяется при
помощи обычных директив распределения памяти (DW,
DB и т.д). Поля могут иметь, а могут и не иметь
имени. Имена полей, как и другие символические
имена, должны быть уникальными. Для режима Ideal
такое требование необязательно.
Возможно определение полей структуры по умолча-
нию. Для этого при определении структуры необхо-
димо поместить это значение после директивы расп-
ределения памяти (аналогично присвоению значения
элементу данных). Если вы не хотите использовать
значения, принятые по умолчанию, то для инициали-
зации поля используйте символ ?.
Будьте осторожны при определении по умолчанию
строк, так как если строка не будет помещаться в
поле, отведенное под нее, то она будет усечена.
TASM2 #4-5/Док = 229 =
Если строка будет меньше отведенного под нее по-
ля, то в режиме MASM она будет справа дополнена
пробелами, а в режиме Ideal свободное место может
быть использовано.
Если вы хотите включить в структуру другую струк-
туру или объединение, то это надо сделать до пер-
вой директивы определения данных, либо используя
имя ранее определенной структуры.
При использовании вложенных структур и объедине-
ний доступ к их элементам осуществляется при по-
мощи оператора (.). При использовании вложенных
структур для доступа к их элементам необходимо
применение нескольких операторов (.).
См.также: ENDS,UNION
Пример: STRUC B
B1 DD 0
B2 DB ?
ENDS
STRUC A
B DW ?
C DD ?
binst B <>
STRUC
D DB 'XYZ'
E DQ 1.0
ENDS
ENDS
ainst A <>
mov al,[ainst.binst.b2] ; 2 уровня
mov al,[ainst.d] ; 1 уровень
TASM2 #4-5/Док = 230 =
SUBSTR
-----------------------------------------------------------------
Назначение: Определение новой строки как подстроки из сущест-
вующей строки.
Режим: MASM51, Ideal
Синтаксис: <имя> SUBSTR <строка>,<позиция>[,<размер>]
Замечания: Аргументу <имя> присваивается значение, состоящее
из символов <строки>, начиная с <позиции> длиной
<размер>. Если вы не указали аргумент <размер>,
то подстрока начинается с номера символа <пози-
ция>, а заканчивается там же, где и исходная
строка.
Аргумент <строка> может принимать следующие зна-
чения:
- строка, заключенная в скобки (<abc>);
- ранее определенный текст макроса;
- оператор замещения строки выражением (%).
См.также: CATSTR,INSTR,SIZESTR
Пример: N = 0A
HEXC SUBSTR <0123456789ABCDEF>,N+1,1 ; HEXC="A"
TASM2 #4-5/Док = 231 =
SUBTTL
-----------------------------------------------------------------
Назначение: Установка подзаголовка для файла листинга.
Режим: MASM
Синтаксис: SUBTTL <текст>
Замечания: Подзаголовок появляется в начале страницы, после
имени исходного файла и заголовка, установленного
директивой TITLE.
Текст программы может содержать необходимое вам
количество директив SUBTTL. Каждая из этих дирек-
тив изменят подзаголовок, который будет помещен
на следующей странице листинга.
См.также: %SUBTTL
Пример: SUBTTL Video Driver
TASM2 #4-5/Док = 232 =
%SUBTTL
-----------------------------------------------------------------
Назначение: Установка подзаголовка для файла листинга.
Режим: MASM, Ideal
Синтаксис: %SUBTTL "<текст>"
Замечания: Подзаголовок появляется в начале страницы, после
имени исходного файла и заголовка, установленного
директивой %TITLE. Аргумент <текст> должен быть
заключен в кавычки ("").
Текст программы может содержать необходимое вам
количество директив %SUBTTL. Каждая из этих ди-
ректив изменят подзаголовок, который будет поме-
щен на следующей странице листинга.
См.также: SUBTTL
Пример: %SUBTTL "Video Driver"
%SYMS
-----------------------------------------------------------------
Назначение: Разрешение вывода в файл листинга таблицы симво-
лических имен.
Режим: MASM, Ideal
Синтаксис: %SYMS
Замечания: Директива %SYMS разрешает появление в файле лис-
тинга таблицы символических имен (Она содержит
все символические имена, определенные в програм-
ме).
Этот режим принимается по умолчанию.
См.также: %NOSYMS
Пример: %SYMS ; Таблица символических имен будет
; в листинге
TASM2 #4-5/Док = 233 =
%TABSIZE
-----------------------------------------------------------------
Назначение: Установка ширины поля табуляции в листинге.
Режим: MASM, Ideal
Синтаксис: %TABSIZE <ширина>
Замечания: Аргумент <ширина> - это количество позиций между
табуляциями в файле листинга. По умолчанию его
значение 8.
См.также: %PAGE,%PCNT,%BIN,%TEXT
Пример: %TABSIZE 4
%TEXT
-----------------------------------------------------------------
Назначение: Установка ширины поля текста программы в файле
листинга.
Режим: MASM, Ideal
Синтаксис: %TEXT <ширина>
Замечания: Аргумент <ширина> - это количество позиций в
строке файла листинга, отводимое под исходный
текст. Если длина строки исходного текста больше
значения аргумента <ширина>, то эта строка либо
будет усечена, либо перенесена на следующую стро-
ку. Это зависит от того, какая директива была
применена ранее - %TRUNC или %NOTRUNC.
См.также: %BIN,%DEPTH,%NOTRUNC,%PCNT,%TRUNC
Пример: %TEXT 80 ; 80 позиций в строке
TASM2 #4-5/Док = 234 =
.TFCOND
-----------------------------------------------------------------
Назначение: Изменение режима печати содержимого условных бло-
ков на противоположный.
Режим: MASM
Синтаксис: .TFCOND
Замечания: Эта директива изменяет действующий режим печати
содержимого условных блоков на противоположный.
Если она первый раз появляется в программе и вы
не использовали опцию командной строки /X, то бу-
дет установлен такой режим, при котором разрешена
печать содержимого условных блоков. Если же вы
уже использовали опцию командной строки /X, то
печать содержимого условных блоков будет запреще-
на.
См.также: %CONDS,.LFCOND,%NOCONDS,.SFCOND
TITLE
-----------------------------------------------------------------
Назначение: Установка заголовка для файла листинга.
Режим: MASM
Синтаксис: TITLE <текст>
Замечания: Заголовок появляется в начале страницы, после
имени исходного файла и до подзаголовка, установ-
ленного директивой SUBTTL.
Программа может содержать только одну директиву
TITLE.
См.также: SUBTTL,%SUBTTL,%TITLE
Пример: TITLE Video Driver
TASM2 #4-5/Док = 235 =
%TITLE
-----------------------------------------------------------------
Назначение: Установка заголовка для файла листинга.
Режим: MASM, Ideal
Синтаксис: %TITLE "<текст>"
Замечания: Заголовок появляется в начале страницы, после
имени исходного файла и до подзаголовка, установ-
ленного директивой %SUBTTL. Аргумент <текст> дол-
жен быть заключен в кавычки ("").
Программа может содержать только одну директиву
%TITLE.
См.также: SUBTTL,%SUBTTL,TITLE
Пример: %TITLE "Video Driver"
%TRUNC
-----------------------------------------------------------------
Назначение: Усечение слишком длинных полей листинга.
Режим: MASM, Ideal
Синтаксис: %TRUNC
Замечания: Директива %TRUNC отменяет действие директивы
%NOTRUNC. Эта директива изменяет поля объектного
кода и текста программы в листинге таким образом,
что "слишком широкие" поля усекаются и информация
теряется.
Этот режим принимается по умолчанию.
См.также: %NOTRUNC
Пример: %TRUNC
DD 1,2,3,4,5 ; Вы не увидите в листинге все
; поля
TASM2 #4-5/Док = 236 =
UDATASEG
-----------------------------------------------------------------
Назначение: Определение начала неинициализированного сегмента
данных.
Режим: MASM, Ideal
См.также: .CODE,.DATA,.CONST,.DATA?,.FARDATA,.FARDATA?,
.MODEL,.STACK
UFARDATA
-----------------------------------------------------------------
Назначение: Определение начала неинициализированного сегмента
данных типа FAR.
Режим: MASM, Ideal
См.также: .CODE,.DATA,.DATA?,.FARDATA,.FARDATA?,.MODEL,
.STACK
TASM2 #4-5/Док = 237 =
UNION
-----------------------------------------------------------------
Назначение: Определение объединения.
Режим: MASM, Ideal
Синтаксис: режим MASM:
<имя> UNION
<поля>
[<имя>] ENDS
режим Ideal:
UNION <имя>
<поля>
ENDS [<имя>]
Замечания: Различия в определении объединения в режимах MASM
и Ideal состоят в ином размещении аргумента <имя>
и ключевых слов UNION и ENDS. Турбо ассемблер
позволяет использовать вложенные объединения и
объединять их со структурами.
UNION, точно также как STRUC, ожидает, что все
запоминаемое имеет нулевое смещение от начала
объединения. Это приводит к наложению полей при
размещении, позволяя вам обращаться к памяти,
определенной в объединении, с различными именами
и различными размерами данных. Длина объединения
- это длина наибольшего запоминаемого, и не равна
сумме длин всех запоминаемых как в структуре.
Аргумент <имя> определяет объединение, так что вы
можете использовать это имя позднее при
размещении памяти для помещения объединения с
этим форматом.
Аргументы <поля> определяют те поля, из которых
состоит объединение. Каждое поле определяется при
помощи обычных директив распределения памяти (DW,
DB и т.д). Имена полей, как и другие
символические имена, должны быть уникальными.
Возможно определение полей объединения по умолча-
нию. Для этого при определении объединения необ-
ходимо поместить это значение после директивы
TASM2 #4-5/Док = 238 =
распределения памяти (аналогично присвоению зна-
чения элементу данных). Если вы не хотите исполь-
зовать значения, принятые по умолчанию, то для
инициализации поля используйте символ ?.
Будьте осторожны при определении по умолчанию
строк, так как если строка не будет помещаться в
поле, отведенное под нее, то она будет усечена.
Если строка будет меньше отведенного под нее по-
ля, то в режиме MASM она будет справа дополнена
пробелами, а в режиме Ideal свободное место может
быть использовано.
Если вы хотите включить в объединение другую
структуру или объединение, то это надо сделать до
первой директивы определения данных, либо исполь-
зуя имя ранее определенного объединения. При ис-
пользовании вложенных структур и объединений дос-
туп к их элементам осуществляется при помощи
оператора (.). При использовании вложенных объ-
единений для доступа к их элементам необходимо
применение нескольких операторов (.).
См.также: ENDS,UNION
Пример: UNION B
BMEM1 DW 0
BMEM2 DB ?
ENDS
UNION A
B DW ?
C DD ?
bunion B <>
STRUC
D DB 'XYZ'
E DD 1.0
ENDS
ENDS
ainst A <> ; выделение памяти
mov al,[ainst.bunion.bmem1] ; несколько
; уровней
mov al,[ainst.d] ; 1 уровень
TASM2 #4-5/Док = 239 =
USES
-----------------------------------------------------------------
Назначение: Указание регистров, используемых процедурой.
Режим: MASM, Ideal
Синтаксис: USES <данное>[,<данное>]...
Замечания: Эта директива используется внутри блока PROC/
ENDP. Используя ее, вы можете указать, какие дан-
ные должны быть сохранены при входе в процедуру,
и восстановлены при выходе из нее.
Аргумент <данное> может быть регистром или
данным, которое разрешено использовать в командах
POP и PUSH.
Обратите внимание на то, что регистры в директиве
должны быть разделены запятыми, а не пробелами,
как в PROC. Вы можете также определить сохраняе-
мые регистры в директиве PROC, но использование
директивы USES улучшает чтение программы, а также
позволяет вводить ее в макроопределения.
Вы должны использовать эту директиву до первой
инструкции в процедуре, которая генерирует код.
Запомните, что USES доступна только тогда, когда
используется вместе с языковым расширением в
операторе .MODEL.
См.также: ARG,LOCALS,PROC
Пример: COPY10 PROC
USES cx,si,di,foo
mov cx,10
mov foo,cx
REP movsb
RET ; восстановление регистров cx,si,di и foo
COPY10 ENDP
TASM2 #4-5/Док = 240 =
WARN
-----------------------------------------------------------------
Назначение: Разрешение предупреждающих сообщений.
Режим: MASM, Ideal
Синтаксис: WARN <класс>
Замечания: Если вы используете директиву WARN без аргумен-
тов, то будут разрешены все предупреждающие сооб-
щения. Если за директивой WARN следует идентифи-
катор сообщения (аргумент <класс>), то только это
сообщение будет разрешено. У каждого сообщения
есть трехбуквенный идентификатор:
ASS - предполагается, что адрес сегмента - 16-ти
битный;
BRK - необходимы скобки;
ICG - генерация плохого кода;
LCD - переполнение счетчика перемещений;
OPI - открытый оператор IF;
OPP - открытая процедура;
OPS - открытый сегмент;
OVF - арифметическое переполнение;
PDC - конструкция, зависящая от прохода;
PRO - запись в память в защищенном режиме требует
изменения регистра CS.
Эти же идентификаторы используются опцией команд-
ной строки /W.
См.также: NOWARN
Пример: WARN OVF ; Разрешение предупреждения об
; арифметическом переполнении
DW 1000*1234 ; Это предупреждение разрешено
TASM2 #4-5/Док = 241 =
.XALL
-----------------------------------------------------------------
Назначение: Включение в файл листинга только тех макрорасши-
рений, которые генерируют код или данные.
Режим: MASM
См.также: .LALL,.SALL,%MACS,%NOMACS