Приложение B. Обзор синтаксических правил Турбо Ассемблера
В этом приложении для описания синтаксиса выражений Турбо
Ассемблера, используется модифицированная форма Бекуса-Наура
(BNF). Символ ::= описывает синтаксический результат. Далее во
всех разделах многоточие (.) означает, что предшествующий эле-
мент может быть повторен любое число раз. В данном приложении
описываются также ключевые слова и их старшинство.
Лексическая грамматика
допустимая_строка ::=
пропуск допустимая_строка
знак_пунктуации допустимая_строка
числовая_строка допустимая_строка
идентификатор_строки допустимая_строка
нуль
пропуск ::=
символ_пробела пропуск
символ_пробела
символ_пробела ::=
все управляющие символы, символы > 128, ' '
идентификатор_строки ::=
идентификатор_символа идентификатор_строки_2
идентификатор_строки_2 ::=
идентификатор_символа_2 идентификатор_строки_2
нуль
идентификатор_символа ::=
$,%,_,?,символы алфавита
идентификатор_символа_2 ::=
идентификатор_символов плюс цифры
числовая_строка ::=
числ_строка
стр_строка
числ_строка ::=
цифры буквенно_цифровые_символы
цифры'.'цифры показатель_степени
цифры показатель_степени ; Только в режиме MASM в директи-
; вах DD, DQ и DT
цифры ::=
цифра цифры
цифра
цифра ::=
от 0 до 9
алфавитно-цифровые_символы ::=
цифра буквенно_цифровые_символы
буква буквенно_цифровые_символы
нуль
буква ::=
буквы алфавита
показатель_степени ::=
Е+цифры
Е-цифры
Ецифры
нуль
стр_строка ::=
строка в двойных кавычках; кавычка, вводимая двумя кавычками
знак_пунктуации ::=
любой символ, отличный от следующих:
символ_пробела,идентификатор_символ,'"',"'" или цифры
Символ точки (.) трактуется различным образом в режиме MASM
и в режиме Ideal. Этот символ не требуется указывать в числах с
плавающей запятой в режиме MASM. Точка не может входить в состав
символического имени в режиме Ideal. В режиме MASM с этого симво-
ла иногда начинаются символические имена, кроме того, знак пунк-
туации используется иногда в качестве селектора поля структуры.
Правила интерпретации точки (.):
1. В режиме Ideal точка всегда интерпретируется как знак
пунктуации.
2. В режиме MASM точка трактуется как первый символ иденти-
фикатора в следующих случаях:
а). Когда она является первым символом в строке и в ряде
некоторых других специальных случаев, например, в
составе внешних (EXTRN) и общих (PUBLIC) символичес-
ких имен, она присоединяется к следующему за ней сим-
волическому имени, если следующий за ней символ
представляет собой идентификатор_символа_2, как он
определен выше.
б). Если она не является первым символом в строке, или
если результирующее имя идентификатора будет предс-
тавлять собой определенное имя идентификатора, тогда
точка присоединяется к началу следующего за ней иден-
тификатора.
Грамматика выражений в режиме MASM
Синтаксис выражений начинается как MASM_выражение.
MASM_выражение ::=
выражение_1
м_выражение_1 ::=
SHORT м_выражение_1
.TYPE м_выражение_1
SMALL м_выражение_1 (преобразование в 16-битовое смещение
[только для процессора 386])
LARGE м_выражение_1 (преобразование в 32-битовое смещение
[только для процессора 386])
м_выражение_2
м_выражение_2 ::=
м_выражение_3 OR м_выражение_3.
м_выражение_3 ХOR м_выражение_3.
м_выражение_3
м_выражение_3 ::=
м_выражение_4 AND м_выражение_4.
м_выражение_4
м_выражение_4 ::=
NOT м_выражение_4
м_выражение_5
м_выражение_5 ::=
м_выражение_6 'EQ' м_выражение_6.
м_выражение_6 'NE' м_выражение_6.
м_выражение_6 'LT' м_выражение_6.
м_выражение_6 'LE' м_выражение_6.
м_выражение_6 'GT' м_выражение_6.
м_выражение_6 'GE' м_выражение_6.
м_выражение_6
м_выражение_6 ::=
м_выражение_7 '+' м_выражение_7.
м_выражение_7 '-' м_выражение_7.
м_выражение_7
м_выражение_7 ::=
м_выражение_8 '*' м_выражение_8.
м_выражение_8 '/' м_выражение_8.
м_выражение_8 'MOD' м_выражение_8.
м_выражение_8 'SHR' м_выражение_8.
м_выражение_8 'SHL' м_выражение_8.
м_выражение_8
м_выражение_8 ::=
+ выражение_8
- выражение_8
выражение_12
м_выражение_10 ::=
OFFSET указатель
SEG указатель
SIZE идентификатор
LENGTH идентификатор
WIDTH идентификатор
MASK идентификатор
THIS цел_тип
идентификатор
( указатель )
[ указатель ]
м_выражение_10 ::=
м_выражение_11 PTR м_выражение_10
м_выражение_11
OFFSET м_выражение_10
SEG м_выражение_10
LOW м_выражение_10
HIGH м_выражение_10
TYPE м_выражение_10
THIS м_выражение_10
м_выражение_11 ::=
м_выражение_8 : м_выражение_8.
м_выражение_12 ::=
м_выражение_13 [м_выражение_13.(подразумеваемое сложение,
только если есть '[' или '(')
м_выражение_13 (м_выражение_13.(подразумеваемое сложение,
только если есть '[' или '(')
м_выражение_13'.'м_выражение_10
м_выражение_13 ::=
LENGTH идентификатор
SIZE идентификатор
WIDTH идентификатор
MASK идентификатор
( м_выражение_1 )
[ м_выражение_1 ]
м_выражение_10
Грамматика выражений в режиме Ideal
Синтаксис начинается, как id_выражение.
id_выражение ::=
указатель
i_тип ::=
UNKNOWN
BYTE
WORD
DWORD
FWORD
QWORD
PWORD
TBYTE
SHORT
NEAR
FAR
PROC
DATAPTR
CODEPTR
имя_структуры
имя_таблицы
имя_перечисления
имя_записи
TYPE указатель
указатель ::=
SMALL указатель ; если 386
LARGE указатель ; если 386
i_тип PTR указатель
i_тип LOW указатель
i_тип HIGH указатель
i_тип указатель
указатель_2
указатель_2 ::=
указатель_3.идентификатор (Операция выбора элемента
структуры)
указатель_3
указатель_3 ::=
выражение:указатель_3
выражение
выражение ::=
SYMTYPE выражение (Операция определения типа символическо-
го имени)
выражение_2
выражение_2 ::=
выражение_3 OR выражение_3.
выражение_3 ХOR выражение_3.
выражение_3
выражение_3 ::=
выражение_4 AND выражение_4.
выражение_4
выражение_4 ::=
NOT выражение_4
выражение_5
выражение_5 ::=
выражение_6 ЕQ выражение_6.
выражение_6 NE выражение_6.
выражение_6 LT выражение_6.
выражение_6 LE выражение_6.
выражение_6 GT выражение_6.
выражение_6 GE выражение_6.
выражение_6
выражение_6 ::=
выражение_7 + выражение_7.
выражение_7 - выражение_7.
выражение_7
выражение_7 ::=
выражение_8 * выражение_8.
выражение_8 / выражение_8.
выражение_8 MOD выражение_8.
выражение_8 SHR выражение_8.
выражение_8 SHL выражение_8.
выражение_8
выражение_8
+выражение_8
-выражение_8
выражение_9
выражение_9
HIGH выражение_9
LOW выражение_9
выражение_10
выражение_10
OFFSET указатель
SEG указатель
SIZE идентификатор
LENGTH идентификатор
WIDTH идентификатор
MASK идентификатор
THIS идентификатор
идентификатор
константа
( указатель )
[ указатель ] (Всегда означает "содержимое")
Старшинство ключевых слов
Важно понимать, как Турбо Ассемблер распознает строки исход-
ного текста. Это позволит вам избежать записи кода, который может
привести к непредсказуемым результатам. Рассмотрим, например,
следующий фрагмент программы:
NAME SEGMENT
Если вы записали эту строку, рассчитывая открыть сегмент с
именем NAME, то будете разочарованы. Турбо Ассемблер распознает
ключевое слово NAME раньше, чем SEGMENT, называя ваш код именем
SEGMENT.
В общем случае определяет значение строки на основе первых
двух символов строки. Самый левый символ находится в первой пози-
ции, а символ справа от него находится во второй позиции.
Старшинство операций в режиме Ideal
В режиме Ideal применяются следующие правила старшинства
операций:
1. Наивысший приоритет (приоритет 1) имеют все ключевые сло-
ва в первой позиции строки. Они проверяются первыми.
2. Ключевые слова на второй позиции строки имеют второй при-
орите и рассматриваются во вторую очередь.
Старшинство операций в режиме MASM
Правила синтаксического анализа строк в режиме MASM значи-
тельно более сложны, чем в режиме Ideal. Вместо двух здесь имеет-
ся три уровня приоритета:
1. Наивысший приоритет (приоритет 1) присваивается отдельным
ключевым словам в первой позиции (таким как NAME и %OUT).
2. Следующий по старшинству приоритет (приоритет 2) имеют
все идентификаторы, обнаруженные на второй позиции.
3. Все другие ключевые слова в первой позиции имеют наимень-
ший (третий) приоритет.
Примечание: Внутри определений структур Турбо Ассемб-
лер интерпретирует ключевые слова приоритета 1 как приори-
тет 3. В этом случае ключевые слова приоритета 2 имеют выс-
ший приоритет.
Например, в следующем фрагменте кода:
NAME SEGMENT
NAME - это ключевое слово первого приоритета, а SEGMENT -
ключевое слово второго приоритета. Таким образом, Турбо Ассемблер
будет интерпретировать эту строку, как директиву NAME, а не как
директиву SEGMENT. В другом примере:
MOV INSTR,1
MOV - ключевое слово приоритета 3, а INSTR - ключевое слово прио-
ритета 2. Таким образом, Турбо Ассемблер интерпретирует эту стро-
ку как инструкцию INSTR, а не как инструкцию MOV (как вы можете
предполагать).
Ключевые слова и предопределенные идентификаторы
В данном разделе приведен полный перечень всех ключевых слов
Турбо Ассемблера. Значение в скобках после ключевых слов указыва-
ют их приоритет (1 или 2) в режиме MASM. Приоритет для ключевых
слов указан только, если он имеет значение 1 или 2. Для всех дру-
гих ключевых слов подразумевается приоритет 3. Турбо Ассемблер
распознает ключевые слова только в том случае, если он находит
их. В режиме MASM ключевые слова приоритета 1 или 3 всегда нахо-
дятся в первой позиции, а ключевые слова приоритета 2 - во второй
позиции. Символ M после ключевого слово указывает, что оно допус-
тимо только для режима MASM, а I показывает ключевое слово, дос-
тупное только в режиме Ideal. Если буква не указана, то ключевые
слова работают в обоих режимах. Номер после ключевого слова пока-
зывает приоритет.
Ключевые слова директив
В следующем списке содержатся все ключевые слова директив
Турбо Ассемблера. Ключевые слова группируются по версиям Турбо
Ассемблера, в которых они вводились.
Следующие ключевые слова были введены в Турбо Ассемблере
версии 1.0.
Ключевые слова Турбо Ассемблера 1.0 (VERSION T100)
Таблица B.1
----------------------------------------------------------------¬
¦ % (1) %NOLIST JZ SETNLE ¦
¦ .186 (M) NOLOCALS LAHF SETNO ¦
¦ .286 (M) NOMASM51 LDS SETNP ¦
¦ .286C (M) %NOMACS LEA SETNS ¦
¦ .286P (M) NOMULTERRS LES SETNZ ¦
¦ .287 (M) NOSMART LOCK SETO ¦
¦ .386 (M) %NOSYMS LODS SETP ¦
¦ .386C (M) %NOTRUNCS LODSB SETPE ¦
¦ .386P (M) NOWARN LODSW SETPO ¦
¦ .387 (M) ORG LOOP SETS ¦
¦ .486 (M) %OUT (1) LOOPE SETZ ¦
¦ .486C (M) P186 LOOPNE SHLD ¦
¦ .486P (M) P286 LOOPNZ SHRD ¦
¦ .8086 (M) P286N LOOPZ STOSD ¦
¦ .8087 (M) P286P MOV LOOPW ¦
¦ : (2) P287 MOVS LOOPWE ¦
¦ = (2) P286 MOVSB LOOPWNE ¦
¦ ALIGN P386N MOVSW LOOPWNZ ¦
¦ .ALPHA P386P MUL LOOPWZ ¦
¦ ARG P387 NEG F2XM1 ¦
¦ ASSUME P486 NOP FABS ¦
¦ %BI P486N NOT FADD ¦
¦ .CODE (M) P8086 OR FADDP ¦
¦ .CODESEG P8087 OUT FBLD ¦
¦ COMM (10) PAGE POP FBSTP ¦
¦ COMMENT (1) %PAGESIZE PUSH FCHS ¦
¦ %CONDS %PCNT PUSHF FCLEX ¦
¦ CONST PNO87 RCL FCOM ¦
¦ .CONST (M) %POPLCTL RCR FCOMP ¦
¦ .CREF (M) PROC (2) REP FCOMPP ¦
¦ %CREF %PUSHLCTL REPE FCOS ¦
¦ %CREFALL PUBLIC (1) REPNE FDECSTP ¦
¦ %CREFREF PURGE REPNZ FDISI ¦
¦ %CREFUREF QUIRKS REPZ FDIV ¦
¦ %CTLS .RADIX (M) RET FDIVP ¦
¦ .DATA (M) RADIX RETF FDIVR ¦
¦ .DATA? (M) RECORD (2) RETN FDIVRP ¦
¦ DATASEG REPT (1) ROL FENI ¦
¦ DB .SALL (M) ROL FFREE ¦
¦ DD SEGMENT (2) SAHF FIADD ¦
¦ %DEPTH .SEQ (M) SAL FICOM ¦
¦ DF (2) .SFCOND (M) SAR FICOMP ¦
¦ DISPLAY SMART SBB FIDIV ¦
¦ DOSSEG .STACK (M) SCAS FIDIVR ¦
¦ DP (2) .STARTUP (M) SCASB FILD ¦
¦ DQ (2) STRUC (2) SCASW FIMUL ¦
¦ DT (2) SUBTTL (1) SHL FINCSTP ¦
¦ DW (2) %SUBTTL [Р SHR FINIT ¦
¦ ELSE (1) %SYMS STC FIST ¦
¦ ELSEIF (1) %TABSIZE STD FISTP ¦
¦ ELSEIF1 (1) %TEXT STI FISUB ¦
¦ ELSEIF2 (1) .TFCOND (M) STOS FISUBR ¦
¦ ELSEIFB (1) TITLE (1) STOSB FLD ¦
¦ ELSEIFDEF (1) %TITLE STOSW FLDCTW ¦
¦ ELSEIFDIF (1) %TRUNC SUB FLDENV ¦
¦ ELSEIFDIFI (1) UDATASEG TEST FLDLG2 ¦
¦ ELSEIFE (1) UFARDATA WAIT FLDLN2 ¦
¦ ELSEIFIDN (1) UNION (2) WBINV FLDL2E ¦
¦ ELSEIFIDNI (1) USES XCHG FLDL2T ¦
¦ ELSEIFNB (1) WARN XLAT FLDPI ¦
¦ ELSEIFNDEF (1) .XALL (M) XLATB FLDZ ¦
¦ EMUL .XCREF (M) SOR FMUL ¦
¦ END .XLIST (M) BOUND FMULP ¦
¦ ENDIF (1) USECS ENTER FNCLEX ¦
¦ ENDM USEDS INS FNDSI ¦
¦ ENDP (2) USESS INSB FNENI ¦
¦ ENDS (2) USEES INSW FNINIT ¦
¦ EQU (2) USEFS LEAVE FNOP ¦
¦ .ERR (1) (M) USEFS OUTS FNSAVE ¦
¦ ERR CATSTR (2) OUTSB FNSTCW ¦
¦ .ERR1 (1) (M) INSTR (2) OUTSW FNSTENV ¦
¦ .ERR2 (1) (M) SIZESTR (2) POPA FNSTSW ¦
¦ .ERRB (1) (M) SUBSTR (2) PUSHA FPATAN ¦
¦ .ERRDEF (1) (M) AAA ARPL FPREM ¦
¦ .ERRDIF (1) (M) AAD CTLS FPTAN ¦
¦ .ERRDIFI (1) (M) AAM LAR FRNDINT ¦
¦ .ERRE (1) (M) AAS LGDT FRSTOR ¦
¦ .ERRIDN (1) (M) ADC LIDT FSAVE ¦
¦ ERRIF ADD LLDT FSCALE ¦
¦ .ERRDIF (1) (M) AND LMSW FSQRT ¦
¦ .ERRDIFI (1) (M) ARPL LSL FST ¦
¦ .ERRE (1) (M) BSF LTR FSTCW ¦
¦ .ERRIDN (1) (M) BSR SGDT FSTENV ¦
¦ ERRIF BSWAP SIDT FSTP ¦
¦ ERRIF1 BT SLDT FSTSW ¦
¦ ERRIF2 BTC SMSW FSTSW ¦
¦ ERRIFB BT STR FSUB ¦
¦ ERRIFDEF BTR VERR FSUBP ¦
¦ ERRIFDIF BTS VERW FSUBR ¦
¦ ERRIFDIFI CALL BSF FSUBRP ¦
¦ ERRIFE CBW BSR FTST ¦
¦ ERRIFDIDN CDQ BT FUCOM ¦
¦ ERRIFDIDNI CLC BTC FUCOMP ¦
¦ ERRIFNB CLD BTR FUCOMPP ¦
¦ ERRIFNDEF CLI BTS FWAIT ¦
¦ .ERRIFNB (1) (M) CLTS CDQ FXAM ¦
¦ .ERRIFDEF (1) (M) CMC CMPSD FXCH ¦
¦ .ERRNZ (1) (M) CMP CWDE FXTRACT ¦
¦ .EVEN CMPS INSD FYL2X ¦
¦ EVENDATA CMPS IRETD FYL2XP1 ¦
¦ EXITM CMPXCHG IJECXZ FSETPM ¦
¦ EXTRN (1) CWD LPS FPCOS ¦
¦ .FARDATA CWDE LGS FPREM1 ¦
¦ FARDATA DAA LODSD FPSIN ¦
¦ .FARDATA (M) DAS LOOPD FPSINCOS¦
¦ .FARDATA? (M) DEC LOOPDE FUCOM ¦
¦ GLOBAL (1) DIV LOOPDNE FUCOMP ¦
¦ GROUP (2) ESC LOOPDNZ FUCOMPP ¦
¦ %INCL HLT LOOPDZ ¦
¦ IDEAL IDIV LSS ¦
¦ IF (1) IMUL MOVSD ¦
¦ IF1 (1) IN MOVSX ¦
¦ IF2 (1) INC MOVZX ¦
¦ IFb (1) INS OUTSD ¦
¦ IFDEF (1) INT POPAD ¦
¦ IFDIFI (1) INVO POPFD ¦
¦ IFE (1) IRET PUSHAD ¦
¦ IFIDN (1) JA PUSHFD ¦
¦ FIDNI (1) JAE SCASD ¦
¦ IFNB (1) JB SETA ¦
¦ IFNDEF (1) JBT SETAE ¦
¦ %INCTL (1) JCXZ SETB ¦
¦ INCLUD (1) JE SETBE ¦
¦ INCLUDELIB (1) JG SETC ¦
¦ IRP (1) JGT OUTSD ¦
¦ IRPC (1) JL POPAD ¦
¦ JUMPS JLE POPFD ¦
¦ LABEL (2) JNA PUSHAD ¦
¦ .LALL (M) JNAE PUSHFD ¦
¦ .LFCOND (M) JNB SCASD ¦
¦ %LINUM JNBE SETA ¦
¦ %LIST JNC SETAE ¦
¦ .LIST (M) JNE SETB ¦
¦ LOCAL JNG SETBE ¦
¦ LOCALS JNGE SETC ¦
¦ MASM JNL SETE ¦
¦ %MACS JNLE SETG ¦
¦ MACRO (2) JNO SETGE ¦
¦ MODEL JNP SETL ¦
¦ .MODEL (M) JNC SETLE ¦
¦ MULTERRS JNP SETNA ¦
¦ NAME (1) JNS SETNAE ¦
¦ %NEWPAGE JNZ SETNB ¦
¦ %NOCONDS JO SETNBE ¦
¦ %NNOCREF JP SETNC ¦
¦ %NOCTLS JPE SETNE ¦
¦ NOEMUL JPO SETNG ¦
¦ %NOINCL JS SETNGE ¦
¦ NOJUMPS JUMP SETNL ¦
L----------------------------------------------------------------
В Турбо Ассемблере версии 2.0 поддерживаются все ключевые
слова версии 1.0 со следующими дополнениями:
Новые ключевые слова Турбо Ассемблера версии 2.0 (VERSION T200)
Таблица B.2
----------------------------------------------------------------¬
¦ BSWAP P486 STARTUPCODE ¦
¦ CMPXCHG P486N WBINVD ¦
¦ INVD PUBLICDLL(I) XADD ¦
¦ INVLPG RETCODE ¦
L----------------------------------------------------------------
В Турбо Ассемблере версии 2.5 поддерживаются все ключевые
слова версии 2.0 со следующими дополнениями:
Новые ключевые слова Турбо Ассемблера версии 2.5 (VERSION T250)
Таблица B.3
----------------------------------------------------------------¬
¦ ENTERD LEAVED ¦
¦ ENTERW LEAVEW ¦
L----------------------------------------------------------------
В Турбо Ассемблере версии 3.0 поддерживаются все ключевые
слова версии 2.5 со следующими дополнениями:
Новые ключевые слова Турбо Ассемблера версии 3.0 (VERSION T200)
Таблица B.4
----------------------------------------------------------------¬
¦ CLRFLAG LARGESTACK TBLINIT ¦
¦ ENUM(2) SETFIELD TBLINST ¦
¦ FASTIMUL SETFLAG TBLPTR ¦
¦ FLIPFLAG SMALLSTACK TESTFLAG ¦
¦ GETFIELD TABLE(2) VERSION ¦
¦ GOTO(1) WHILE(1) ¦
L----------------------------------------------------------------
Назад | Содержание | Вперед