Выбирайте
=================================================================
Авторский коллектив "*.*"
под руководством Орлова С.Б.
ПРОГРАММА-СПРАВОЧНИК по системе
программирования ТУРБО АССЕМБЛЕР 2.0
СПРАВОЧНОЕ РУКОВОДСТВО
#4/5 (Главы 1-3)
г.Москва, 1990 г.
=================================================================
Оглавление
TASM2 #4-5/Док = 1 =
Введение........................................................9
Требования к аппаратным и программным средствам.................9
О данном руководстве...........................................10
Национальные соглашения........................................10
Глава 1. Предопределенные идентификаторы.......................12
$............................................................13
@code........................................................13
@CodeSize....................................................14
@Cрu.........................................................14
curseg.......................................................15
@data........................................................16
@DataSize....................................................17
??date.......................................................17
@fardata.....................................................18
@fardata?....................................................18
@FileName....................................................19
??filename...................................................19
@Model.......................................................20
@Startuр.....................................................20
??Time.......................................................21
??Version....................................................21
@WordSize....................................................22
Глава 2. Операторы.............................................23
Арифметическая точность......................................23
Таблица 2.1: Приоритеты операторов для режима MASM.........25
Таблица 2.2: Приоритеты операторов для режима Ideal..........25
()...........................................................26
*............................................................26
+ (бинарный).................................................27
+ (унарный)..................................................27
- (бинарный).................................................28
- (унарный)..................................................29
. ...........................................................29
/............................................................30
:............................................................31
?............................................................31
[ ] оператор.................................................32
AND..........................................................34
BYTE.........................................................34
CODEPTR......................................................35
DATAPTR......................................................36
DUP..........................................................36
DWORD........................................................37
EQ...........................................................38
FAR..........................................................38
FWORD........................................................40
TASM2 #4-5/Док = 2 =
GE...........................................................40
GT...........................................................41
HIGH.........................................................42
LARGE........................................................43
LE...........................................................44
LENGTH.......................................................45
LOW..........................................................45
LT...........................................................46
MASK.........................................................48
MOD..........................................................48
NE...........................................................50
NEAR.........................................................50
NOT..........................................................52
OFFSET.......................................................52
OR...........................................................54
PROC.........................................................54
PTR..........................................................56
PWORD........................................................58
QWORD........................................................58
SEG..........................................................59
SHL..........................................................59
SHORT........................................................60
SHR..........................................................60
SIZE.........................................................61
SMALL........................................................61
SYMTYPE......................................................63
TBYTE........................................................63
THIS.........................................................64
.TYPE........................................................65
TYPE.........................................................66
UNCNOWN......................................................67
WIDTH........................................................69
WORD.........................................................70
XOR..........................................................70
Специальные макро операторы..................................72
&............................................................72
<>...........................................................74
!............................................................75
%............................................................75
;;...........................................................76
Глава 3. Директивы.............................................77
Samрle Directive (Образец директивы)........................79
.186.........................................................79
.286.........................................................80
.286C........................................................80
.286P........................................................81
TASM2 #4-5/Док = 3 =
.287.........................................................81
.386.........................................................83
.386C........................................................83
.386P........................................................84
.387.........................................................84
8086.........................................................85
.8087........................................................85
:............................................................86
=............................................................87
ALIGN........................................................89
.ALPHA.......................................................90
ARG..........................................................91
ASSUME.......................................................94
%BIN.........................................................95
CATSTR.......................................................96
.CODE........................................................96
CODESEG......................................................98
COMM.........................................................98
COMMENT.....................................................101
%CONDS......................................................101
.CONST......................................................102
CONST.......................................................103
.CREF.......................................................103
%CREF.......................................................104
%CREFALL....................................................104
%CREFREF....................................................105
%CREFUREF...................................................106
%CTLS.......................................................106
.DATA.......................................................108
.DATA?......................................................109
DATASEG.....................................................111
DB..........................................................111
DD..........................................................113
%DEPTH......................................................115
DF..........................................................115
DISPLAY.....................................................116
DOSSEG......................................................118
DP..........................................................119
DQ..........................................................120
DT..........................................................121
DW..........................................................122
ELSE........................................................123
ELSEIF......................................................124
EMUL........................................................124
END.........................................................126
ENDIF.......................................................126
TASM2 #4-5/Док = 4 =
ENDM........................................................127
ENDP........................................................128
ENDS........................................................129
EQU.........................................................130
.ERR........................................................131
ERR.........................................................131
.ERR1.......................................................132
.ERR2.......................................................132
.ERRB.......................................................133
.ERRDEF.....................................................134
.ERRDIF.....................................................134
.ERRDIFI....................................................135
.ERRE.......................................................136
.ERRIDN.....................................................136
.ERRIDNI....................................................138
ERRIF.......................................................139
ERRIF1......................................................139
ERRIF2......................................................139
ERRIFB......................................................140
ERRIFDEF....................................................140
ERRIFDIF....................................................140
ERRIFDIFI...................................................140
ERRIFE......................................................140
ERRIFIDN....................................................141
ERRIFIDNI...................................................141
ERRIFNB.....................................................141
ERRIFNDEF...................................................141
.ERRNB......................................................143
.ERRNDEF....................................................143
.ERRNZ......................................................144
EVEN........................................................144
EVENDATA....................................................145
EXITM.......................................................146
EXTRN.......................................................146
.FARDATA....................................................149
.FARDATA?...................................................150
FARDATA.....................................................151
GLOBAL......................................................151
GROUP.......................................................153
IDEAL.......................................................154
IF..........................................................155
IF1.........................................................155
IF2.........................................................156
IFB.........................................................157
IFDEF.......................................................158
IFDIF,IFDIFI................................................158
TASM2 #4-5/Док = 5 =
IFE.........................................................159
IFIDN,IFIDNI................................................160
IFNB........................................................161
IFNDEF......................................................161
%INCL.......................................................163
INCLUDE.....................................................163
INCLUDELIB..................................................164
INSTR.......................................................165
IRP.........................................................165
IRPC........................................................166
JUMPS.......................................................167
LABEL.......................................................167
.LALL.......................................................168
.LFCOND.....................................................170
%LINUM......................................................170
%LIST.......................................................171
.LIST.......................................................171
LOCAL.......................................................172
LOCALS......................................................175
MACRO.......................................................177
%MACS.......................................................178
MASM........................................................179
MASM51......................................................179
.MODEL......................................................181
ТАБЛИЦА 3.1 Модель Tiny.....................................184
ТАБЛИЦА 3.2 Модель Small....................................184
ТАБЛИЦА 3.3 Модель Medium...................................184
ТАБЛИЦА 3.4 Модель Compact..................................185
ТАБЛИЦА 3.5 Модель Huge и Large.............................185
ТАБЛИЦА 3.6 Модель TPASCAL..................................185
MODEL.......................................................186
MULTERRS....................................................186
NAME........................................................187
%NEWPAGE....................................................188
%NOCONDS....................................................188
%NOCREF.....................................................189
%NOCTLS.....................................................189
NOEMUL......................................................191
%NOINCL.....................................................191
NOJUMPS.....................................................193
%NOLIST.....................................................193
NOLOCALS....................................................194
%NOMACS.....................................................194
NOMASM51....................................................195
NOMULTERRS..................................................195
%NOSYMS.....................................................197
TASM2 #4-5/Док = 6 =
%NOTRUNC....................................................197
%NOWARN.....................................................198
ORG.........................................................198
%OUT........................................................200
P186........................................................200
P286........................................................201
P286N.......................................................201
P286P.......................................................201
P287........................................................202
P386........................................................202
P386N.......................................................202
P386P.......................................................203
P387........................................................203
P8086.......................................................203
P8087.......................................................204
PAGE........................................................204
%PAGESIZE...................................................205
%PCNT.......................................................206
PNO87.......................................................206
%POPLCTL....................................................207
PROC........................................................207
PUBLIC......................................................212
PUBLICDLL...................................................213
PURGE.......................................................214
%PUSHLCTL...................................................215
QUIRKS......................................................216
.RADIX......................................................216
RADIX.......................................................217
RECORD......................................................217
REPT........................................................219
.SALL.......................................................220
SEGMENT.....................................................220
.SEQ........................................................224
.SFCOND.....................................................225
SIZESTR.....................................................225
.STACK......................................................226
STACK.......................................................226
.STARTUP....................................................227
STARTUPCODE.................................................227
STRUC.......................................................228
SUBSTR......................................................230
SUBTTL......................................................230
%SUBTTL.....................................................232
%SYMS.......................................................232
%TABSIZE....................................................233
%TEXT.......................................................233
TASM2 #4-5/Док = 7 =
.TFCOND.....................................................234
TITLE.......................................................234
%TITLE......................................................235
%TRUNC......................................................235
UDATASEG....................................................236
UFARDATA....................................................236
UNION.......................................................237
USES........................................................239
WARN........................................................240
.XALL.......................................................241
.XCREF......................................................241
.XLIST......................................................241
TASM2 #4-5/Док = 8 =
=================================================================
Авторский коллектив "*.*"
под руководством Орлова С.Б.
ПРОГРАММА-СПРАВОЧНИК по системе
программирования ТУРБО АССЕМБЛЕР 2.0
СПРАВОЧНОЕ РУКОВОДСТВО
#4/5 (Главы 1-3)
г.Москва, 1990 г.
=================================================================
TASM2 #4-5/Док = 9 =
Введение
-----------------------------------------------------------------
Эта книга является второй из двух книг, сопровождающих пакет
Турбо ассемблера. Сейчас, когда вы наверняка прочитали вниматель-
но первое руководство (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,
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 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 (Образец директивы)
-----------------------------------------------------------------
Назначение: Приводится описание того, что данная директива
выполняет
Режим: Режим, в котором выполняется данная директива
Синтаксис: Описывается, как использовать директиву
Замечания: Основная информация о директиве
См.также: Другие директивы, имеющие отношение к данной
Пример: Образец кода, использующего данную директиву
.186
-----------------------------------------------------------------
Назначение: Позволяет генерировать инструкции процессора
80186
Режим: MASM
Синтаксис: .186
Замечания: Директива .186 позволяет генерировать дополни-
тельные инструкции, поддерживаемые процессором
80186 (Похожа на P186)
См.также: .8086, .286, .286C, .286P, .386, .386C,
.386P, P8086, P286, P286P, P286N, P386, P386P,
P386N.
Пример: .186
PUSH 1 ;инструкция выполнима на 186
TASM2 #4-5/Док = 80 =
.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
.386C
-----------------------------------------------------------------
Назначение: Позволяет генерировать инструкции процессора
80386
См.также: .8086, .186, .286, .286C, .286P, .386,
.386P, P8086, P286, P286P, P286N, P386, P386P,
P386N.
TASM2 #4-5/Док = 84 =
.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 строка[,строка]...
Замечания: Имя - данное значение, состоящее из идентификато-
ров каждой строки, объединенных в одну строку.
Каждая строка может быть одной из следующих:
- строковый аргумент, заключенный в угловые скоб-
ки, подобно
- заранее определенный текстовый макро
- числовое строковое замещение, начинающееся с
процента (%)
См.также: SUBSTR, INSTR, SIZESTR
Пример: LETTER CATSTR ,;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,
р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
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 , ;разрешает только
;регистр ES
mov al,val
mov reg,ax
ENDM
.ERRDIFI
-----------------------------------------------------------------
Назначение: Вызывает ошибку, если аргументы различны, регистр
(разница между строчными и заглавными буквами)
игнорируется
Режим: MASM
Синтаксис: .ERRDIFI <аргумент1>,<аргумент2>
Замечания: Вы всегда используете .ERRDIFI внутри макро.
Директива проверяет, являются ли аргументы иден-
тичными символьными строками. Если две строки не
являются идентичными, выдается сообщение об ошиб-
ке в исходной строке, в которой макро вызывается.
Две строки сравниваются символ за символом, при
этом не учитывается регистр. Если вы хотите, что-
бы регистр учитывался, используйте директиву
.ERRDIF.
Вы должны всегда заключать аргументы в угловые
скобки (<>), аргументы разделяются запятой
См.также: .ERRIDN, .ERRDIF, .ERRIDNI
Пример: SegLoad MACRO reg,val
.ERRDIFI , ;разрешает только
;регистр 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 , ;загрузка 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 , ;загрузка 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 ;нужен только один аргумент
...
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
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