Appendix B
BNF Grammar
This appendix provides a complete description of symbols, operators, and directives for MASM 6.1. It uses the Backus-Naur Form (BNF) for grammar notation. You can use BNF grammar to determine the exact syntax for any language component and find all available options for any MASM command.
BNF definitions consist of "nonterminals" and "terminals." Nonterminals are placeholders within a BNF definition, defined elsewhere in the BNF grammar. Terminals are endpoints in a BNF definition, consisting of MASM 6.1 keywords. In this Appendix, all nonterminals appear in italics type and all terminals appear in bold type.
BNF Conventions
The conventions use different font attributes for different items in the BNF. The symbols and formats are as follows:
Attribute Description
nonterminal Italic type indicates nonterminals.
RESERVED Terminals in boldface type are literal reserved words and symbols that must be entered as shown. Characters in this context are always case insensitive.
[[ ]] Objects enclosed in double brackets ([[ ]]) are optional. The brackets do not actually appear in the source code.
| A vertical bar indicates a choice between the items on each side of the bar.
.8086 Underlined items indicate the default option if one is given.
default typeface Characters in the set described or listed can be used as terminals in MASM statements.
How to Use the BNF Grammar
To illustrate the use of the BNF, Figure B.1 diagrams the definition of the TYPEDEF directive, starting with the nonterminal typedefDir.
The entries under each horizontal brace in Figure B.1 are terminals (such as NEAR16, NEAR32, FAR16, and FAR32) or nonterminals (such as qualifier, qualifiedType, distance, and protoSpec) that can be further defined. Each italicized nonterminal in the typedefDir definition is also an entry in the BNF. Three vertical dots indicate a branching definition for a nonterminal that, for the sake of simplicity, this figure does not illustrate.
The BNF grammar allows recursive definitions. For example, the grammar uses qualifiedType as a possible definition for qualifiedType, which is also a component of the definition for qualifier.
Figure B.1 BNF Definition of the TYPEDEF Directive
Nonterminal Definition
;; endOfLine | comment
=Dir id = immExpr ;;
addOp + | -
aExpr term | aExpr && term
Nonterminal Definition
altId id
arbitraryText charList
asmInstruction mnemonic [[ exprList ]]
assumeDir ASSUME assumeList ;; | ASSUME NOTHING ;;
assumeList assumeRegister | assumeList , assumeRegister
assumeReg register : assumeVal
assumeRegister assumeSegReg | assumeReg
assumeSegReg segmentRegister : assumeSegVal
assumeSegVal frameExpr | NOTHING | ERROR
assumeVal qualifiedType | NOTHING | ERROR
bcdConst [[ sign ]] decNumber
binaryOp == | != | >= | <= | > | < | &
bitDef bitFieldId : bitFieldSize [[ = constExpr ]]
bitDefList bitDef | bitDefList , [[ ;; ]] bitDef
bitFieldId id
bitFieldSize constExpr
blockStatements directiveList | .CONTINUE [[ .IF cExpr ]] | .BREAK [[ .IF cExpr ]]
bool TRUE | FALSE
byteRegister AL | AH | BL | BH | CL | CH | DL | DH
cExpr aExpr | cExpr || aExpr
character Any character with ordinal in the range 0-255 except linefeed (10)
charList character | charList character
className string
commDecl [[ nearfar ]] [[ langType ]] id : commType [[ : constExpr ]]
commDir COMM commList ;;
comment ; text ;;
Nonterminal Definition
commentDir COMMENT delimiter text text delimiter text ;;
commList commDecl | commList , commDecl
commType type | constExpr
constant digits [[ radixOverride ]]
constExpr expr
contextDir PUSHCONTEXT contextItemList ;; | POPCONTEXT contextItemList ;;
contextItem ASSUMES | RADIX | LISTING | CPU | ALL
contextItemList contextItem | contextItemList , contextItem
controlBlock whileBlock | repeatBlock
controlDir controlIf | controlBlock
controlElseif .ELSEIF cExpr ;; directiveList [[ controlElseif ]]
controlIf .IF cExpr ;; directiveList [[ controlElseif ]] [[ .ELSE ;; directiveList ]] .ENDIF ;;
coprocessor .8087 | .287 | .387 | .NO87
crefDir crefOption ;;
crefOption .CREF | .XCREF [[ idList ]] | .NOCREF [[ idList ]]
cxzExpr expr | ! expr | expr == expr | expr != expr
dataDecl DB | DW | DD | DF | DQ | DT | dataType | typeId
dataDir [[ id ]] dataItem ;;
Nonterminal Definition
dataItem dataDecl scalarInstList | structTag structInstList | typeId structInstList | unionTag structInstList | recordTag recordInstList
dataType BYTE | SBYTE | WORD | SWORD | DWORD | SDWORD | FWORD | QWORD | TBYTE | REAL4 | REAL8 | REAL10
decdigit 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
decNumber decdigit | decNumber decdigit
delimiter Any character except whiteSpaceCharacter
digits decdigit | digits decdigit | digits hexdigit
directive generalDir | segmentDef
directiveList directive | directiveList directive
distance nearfar | NEAR16 | NEAR32 | FAR16 | FAR32
e01 e01 orOp e02 | e02
e02 e02 AND e03 | e03
e03 NOT e04 | e04
e04 e04 relOp e05 | e05
e05 e05 addOp e06 | e06
e06 e06 mulOp e07 | e06 shiftOp e07 | e07
e07 e07 addOp e08 | e08
e08 HIGH e09 | LOW e09 | HIGHWORD e09 | LOWWORD e09 | e09
Nonterminal Definition
e09 OFFSET e10 | SEG e10 | LROFFSET e10 | TYPE e10 | THIS e10 | e09 PTR e10 | e09 : e10 | e10
e10 e10 . e11 | e10 [[ expr ]] | e11
e11 ( expr ) | [[ expr ]] | WIDTH id | MASK id | SIZE sizeArg | SIZEOF sizeArg | LENGTH id | LENGTHOF id | recordConst | string | constant | type | id | $ | segmentRegister | register | ST | ST ( expr )
echoDir ECHO arbitraryText ;; %OUT arbitraryText ;;
elseifBlock elseifStatement ;; directiveList [[ elseifBlock ]]
elseifStatement ELSEIF constExpr | ELSEIFE constExpr | ELSEIFB textItem | ELSEIFNB textItem | ELSEIFDEF id | ELSEIFNDEF id | ELSEIFDIF textItem , textItem | ELSEIFDIFI textItem , textItem | ELSEIFIDN textItem , textItem | ELSEIFIDNI textItem , textItem | ELSEIF1 | ELSEIF2
Nonterminal Definition
endDir END [[ immExpr ]] ;;
endpDir procId ENDP ;;
endsDir id ENDS ;;
equDir textMacroId EQU equType ;;
equType immExpr | textLiteral
errorDir errorOpt ;;
errorOpt .ERR [[ textItem ]] | .ERRE constExpr [[ optText ]] | .ERRNZ constExpr [[ optText ]] | .ERRB textItem [[ optText ]] | .ERRNB textItem [[ optText ]] | .ERRDEF id [[ optText ]] | .ERRNDEF id [[ optText ]] | .ERRDIF textItem , textItem [[ optText ]] | .ERRDIFI textItem , textItem [[ optText ]] | .ERRIDN textItem , textItem [[ optText ]] | .ERRIDNI textItem , textItem [[ optText ]] | .ERR1 [[ textItem ]] | .ERR2 [[ textItem ]]
exitDir .EXIT [[ expr ]] ;;
exitmDir: EXITM | EXITM textItem
exponent E [[ sign ]] decNumber
expr SHORT e05 | .TYPE e01 | OPATTR e01 | e01
exprList expr | exprList , expr
externDef [[ langType ]] id [[ ( altId ) ]] : externType
externDir externKey externList ;;
externKey EXTRN | EXTERN | EXTERNDEF
externList externDef | externList , [[ ;; ]] externDef
externType ABS | qualifiedType
fieldAlign constExpr
fieldInit [[ initValue ]] | structInstance
Nonterminal Definition
fieldInitList fieldInit | fieldInitList , [[ ;; ]] fieldInit
fileChar delimiter
fileCharList fileChar | fileCharList fileChar
fileSpec fileCharList | textLiteral
flagName ZERO? | CARRY? | OVERFLOW? |SIGN? | PARITY?
floatNumber [[ sign ]] decNumber . [[ decNumber ]] [[ exponent ]] | digits R | digits r
forcDir FORC | IRPC
forDir FOR |IRP
forParm id [[ : forParmType ]]
forParmType REQ | = textLiteral
frameExpr SEG id | DGROUP : id | segmentRegister : id | id
generalDir modelDir | segOrderDir | nameDir | includeLibDir | commentDir | groupDir | assumeDir | structDir | recordDir | typedefDir | externDir | publicDir | commDir | protoTypeDir | equDir | =Dir | textDir | contextDir | optionDir | processorDir | radixDir | titleDir | pageDir | listDir | crefDir | echoDir | ifDir | errorDir | includeDir | macroDir | macroCall | macroRepeat | purgeDir | macroWhile | macroFor | macroForc | aliasDir
gpRegister AX | EAX | BX | EBX | CX | ECX | DX | EDX | BP | EBP | SP | ESP | DI | EDI | SI | ESI
groupDir groupId GROUP segIdList
groupId id
hexdigit a | b | c | d | e | f | A | B | C | D | E | F
Nonterminal Definition
id alpha | id alpha | id decdigit
idList id | idList , id
ifDir ifStatement ;; directiveList [[ elseifBlock ]] [[ ELSE ;; directiveList ]] ENDIF ;;
ifStatement IF constExpr | IFE constExpr | IFB textItem | IFNB textItem | IFDEF id | IFNDEF id | IFDIF textItem , textItem | IFDIFI textItem , textItem | IFIDN textItem , textItem | IFIDNI textItem , textItem | IF1 | IF2
immExpr expr
includeDir INCLUDE fileSpec ;;
includeLibDir INCLUDELIB fileSpec ;;
initValue immExpr | string | ? | constExpr DUP ( scalarInstList ) | floatNumber | bcdConst
inSegDir [[ labelDef ]] inSegmentDir
inSegDirList inSegDir | inSegDirList inSegDir
Nonterminal Definition
inSegmentDir instruction | dataDir | controlDir | startupDir | exitDir | offsetDir | labelDir | procDir [[ localDirList ]] [[ inSegDirList ]] endpDir | invokeDir | generalDir
instrPrefix REP | REPE | REPZ | REPNE | REPNZ | LOCK
instruction [[ instrPrefix ]] asmInstruction
invokeArg register :: register | expr | ADDR expr
invokeDir INVOKE expr [[ , [[ ;; ]] invokeList ]] ;;
invokeList invokeArg | invokeList , [[ ;; ]] invokeArg
keyword Any reserved word
keywordList keyword | keyword keywordList
labelDef id : | id :: | @@:
labelDir id LABEL qualifiedType ;;
langType C | PASCAL | FORTRAN |BASIC | SYSCALL | STDCALL
listDir listOption ;;
listOption .LIST | .NOLIST | .XLIST | .LISTALL | .LISTIF | .LFCOND | .NOLISTIF | .SFCOND | .TFCOND | .LISTMACROALL | .LALL | .NOLISTMACRO | .SALL | .LISTMACRO | .XALL
localDef LOCAL idList ;;
localDir LOCAL parmList ;;
localDirList localDir | localDirList localDir
Nonterminal Definition
localList localDef | localList localDef
macroArg % constExpr | % textMacroId | % macroFuncId ( macroArgList ) | string | arbitraryText | < arbitraryText >
macroArgList macroArg | macroArgList , macroArg
macroBody [[ localList ]] macroStmtList
macroCall id macroArgList ;; | id ( macroArgList )
macroDir id MACRO [[ macroParmList ]] ;; macroBody ENDM ;;
macroFor forDir forParm , < macroArgList > ;; macroBody ENDM ;;
macroForc forcDir id , textLiteral ;; macroBody ENDM ;;
macroFuncId id
macroId macroProcId | macroFuncId
macroIdList macroId | macroIdList , macroId
macroLabel id
macroParm id [[ : parmType ]]
macroParmList macroParm | macroParmList , [[ ;; ]] macroParm
macroProcId id
macroRepeat repeatDir constExpr ;; macroBody ENDM ;;
macroStmt directive | exitmDir | : macroLabel | GOTO macroLabel
Nonterminal Definition
macroStmtList macroStmt ;; | macroStmtList macroStmt ;;
macroWhile WHILE constExpr ;; macroBody ENDM ;;
mapType ALL | NONE | NOTPUBLIC
memOption TINY | SMALL | MEDIUM | COMPACT | LARGE | HUGE | FLAT
mnemonic Instruction name
modelDir .MODEL memOption [[ , modelOptlist ]] ;;
modelOpt langType | stackOption
modelOptlist modelOpt | modelOptlist , modelOpt
module [[ directiveList ]] endDir
mulOp * | / | MOD
nameDir NAME id ;;
nearfar NEAR | FAR
nestedStruct structHdr [[ id ]] ;; structBody ENDS ;;
offsetDir offsetDirType ;;
offsetDirType EVEN | ORG immExpr | ALIGN [[ constExpr ]]
offsetType GROUP | SEGMENT | FLAT
oldRecordFieldList [[ constExpr ]] | oldRecordFieldList , [[ constExpr ]]
optionDir OPTION optionList ;;
Nonterminal Definition
optionItem CASEMAP : mapType | DOTNAME | NODOTNAME | EMULATOR | NOEMULATOR | EPILOGUE : macroId | EXPR16 | EXPR32 | LANGUAGE : langType | LJMP | NOLJMP | M510 | NOM510 | NOKEYWORD : < keywordList > | NOSIGNEXTEND | OFFSET : offsetType | OLDMACROS | NOOLDMACROS | OLDSTRUCTS | NOOLDSTRUCTS | PROC : oVisibility | PROLOGUE : macroId | READONLY | NOREADONLY | SCOPED | NOSCOPED | SEGMENT : segSize | SETIF2 : bool
optionList optionItem | optionList , [[ ;; ]] optionItem
optText , textItem
orOp OR | XOR
oVisibility PUBLIC |PRIVATE |EXPORT
pageDir PAGE [[ pageExpr ]] ;;
pageExpr + | [[ pageLength ]] [[ , pageWidth ]]
pageLength constExpr
pageWidth constExpr
parm parmId [[ : qualifiedType ]] | parmId [[ constExpr ]] [[ : qualifiedType ]]
parmId id
parmList parm | parmList , [[ ;; ]] parm
parmType REQ | = textLiteral | VARARG
pOptions [[ distance ]] [[ langType ]] [[ oVisibility ]]
primary expr binaryOp expr | flagName | expr
Nonterminal Definition
procDir procId PROC [[ pOptions ]] [[ < macroArgList > ]] [[ usesRegs ]] [[ procParmList ]]
processor .8086 | .186 | .286 | .286C | .286P | .386 | .386C | .386P | .486 | .486P
processorDir processor ;; | coprocessor ;;
procId id
procParmList [[ , [[ ;; ]] parmList ]] [[ , [[ ;; ]] parmId :VARARG]]
protoArg [[ id ]] : qualifiedType
protoArgList [[ , [[ ;; ]] protoList ]] [[ , [[ ;; ]] [[ id ]] :VARARG ]]
protoList protoArg | protoList , [[ ;; ]] protoArg
protoSpec [[ distance ]] [[ langType ]] [[ protoArgList ]] | typeId
protoTypeDir id PROTO protoSpec
pubDef [[ langType ]] id
publicDir PUBLIC pubList ;;
pubList pubDef | pubList , [[ ;; ]] pubDef
purgeDir PURGE macroIdList
qualifiedType type | [[ distance ]] PTR [[ qualifiedType ]]
qualifier qualifiedType | PROTO protoSpec
quote " | ‘
radixDir .RADIX constExpr ;;
radixOverride h | o | q | t | y | H | O | Q | T | Y
recordConst recordTag { oldRecordFieldList } | recordTag < oldRecordFieldList >
recordDir recordTag RECORD bitDefList ;;
recordFieldList [[ constExpr ]] | recordFieldList , [[ ;; ]] [[ constExpr ]]
Nonterminal Definition
recordInstance { [[ ;; ]] recordFieldList [[ ;; ]] } | < oldRecordFieldList > | constExpr DUP ( recordInstance )
recordInstList recordInstance | recordInstList , [[ ;; ]] recordInstance
recordTag id
register specialRegister | gpRegister | byteRegister
regList register | regList register
relOp EQ | NE | LT | LE | GT | GE
repeatBlock .REPEAT ;; blockStatements ;; untilDir ;;
repeatDir REPEAT | REPT
scalarInstList initValue | scalarInstList , [[ ;; ]] initValue
segAlign BYTE | WORD | DWORD | PARA | PAGE
segAttrib PUBLIC | STACK | COMMON | MEMORY | AT constExpr | PRIVATE
segDir .CODE [[ segId ]] | .DATA | .DATA? | .CONST | .FARDATA [[ segId ]] | .FARDATA? [[ segId ]] | .STACK [[ constExpr ]]
segId id
segIdList segId | segIdList , segId
segmentDef segmentDir [[ inSegDirList ]] endsDir | simpleSegDir [[ inSegDirList ]] [[ endsDir ]]
segmentDir segId SEGMENT [[ segOptionList ]] ;;
segmentRegister CS | DS | ES | FS | GS | SS
Nonterminal Definition
segOption segAlign | segRO | segAttrib | segSize | className
segOptionList segOption | segOptionList segOption
segOrderDir .ALPHA | .SEQ | .DOSSEG | DOSSEG
segRO READONLY
segSize USE16 | USE32 |FLAT
shiftOp SHR | SHL
sign - | +
simpleExpr ( cExpr ) | primary
simpleSegDir segDir ;;
sizeArg id | type | e10
specialChars : | . | [[ | ]] | ( | ) | < | > | { | } | + | - | / | * | & | % | ! | ’ | \ | = | ; | , | " | whiteSpaceCharacter | endOfLine
specialRegister CR0 | CR2 | CR3 | DR0 | DR1 | DR2 | DR3 | DR6 | DR7 | TR3 | TR4 | TR5 | TR6 | TR7
stackOption NEARSTACK | FARSTACK
startupDir .STARTUP ;;
stext stringChar | stext stringChar
string quote [[ stext ]] quote
stringChar quote quote | Any character except quote
structBody structItem ;; | structBody structItem ;;
structDir structTag structHdr [[ fieldAlign ]] [[, NONUNIQUE ]] ;; structBody structTag ENDS ;;
structHdr STRUC | STRUCT | UNION
Nonterminal Definition
structInstance < [[ fieldInitList ]] > | { [[ ;; ]] [[ fieldInitList ]] [[ ;; ]] } | constExpr DUP ( structInstList )
structInstList structInstance | structInstList , [[ ;; ]] structInstance
structItem dataDir | generalDir | offsetDir | nestedStruct
structTag id
term simpleExpr | ! simpleExpr
text textLiteral | text character | ! character text | character | ! character
textDir id textMacroDir ;;
textItem textLiteral | textMacroId | % constExpr
textLen constExpr
textList textItem | textList , [[ ;; ]] textItem
textLiteral < text >;;
textMacroDir CATSTR [[ textList ]] |TEXTEQU [[ textList ]] | SIZESTR textItem | SUBSTR textItem , textStart [[ , textLen ]] | INSTR [[ textStart , ]] textItem , textItem
textMacroId id
textStart constExpr
titleDir titleType arbitraryText ;;
titleType TITLE | SUBTITLE | SUBTTL
type structTag | unionTag | recordTag | distance | dataType | typeId
typedefDir typeId TYPEDEF qualifier
Nonterminal Definition
typeId id
unionTag id
untilDir .UNTIL cExpr ;; .UNTILCXZ [[ cxzExpr ]] ;;
usesRegs USES regList
whileBlock .WHILE cExpr ;; blockStatements ;; .ENDW
whiteSpaceCharacter ASCII 8, 9, 11-13, 26, 32