Edit

Microsoft Macro Assembler BNF Grammar

This page contains a BNF description of the MASM grammar. It's provided as a supplement to the reference and isn't guaranteed to be complete. Consult the reference for full information on keywords, parameters, operations, and so on.

To illustrate the use of the BNF, the following diagram shows the definition of the TYPEDEF directive, starting with the nonterminal typedefDir.

A chart showing the hierarchy of terminals and nonterminals that produce a typedefDir.

The entries under each horizontal brace are terminals, such as NEAR16, NEAR32, FAR16, and FAR32. Or, they're 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 doesn't 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. The "|" symbol specifies a choice between alternate expressions, for example endOfLine | comment. Double braces specify an optional parameter, for example ⟦ macroParmList ⟧. The brackets don't actually appear in the source code.

MASM Nonterminals

;;
  endOfLine | comment

=Dir
  id = immExpr ;;

addOp
  + | -

aExpr
  term | aExpr && term

altId
  id

alpha
  Any upper or lowercase letter (A-Z) or one of these four characters: @ _ $ ?

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 | CL | CH | DL | DH | BL | BH | R8B | R9B | R10B | R11B | R12B | R13B | R14B | R15B

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 ;;

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 ;;

dataItem
  dataDecl scalarInstList
  | structTag structInstList
  | typeId structInstList
  | unionTag structInstList
  | recordTag recordInstList

dataType
  BYTE | SBYTE | WORD | SWORD | DWORD | SDWORD | FWORD | QWORD | SQWORD | TBYTE | OWORD | REAL4 | REAL8 | REAL10 | MMWORD | XMMWORD | YMMWORD

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

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

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

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

fpuRegister
  ST expr

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 | CX | ECX | DX | EDX | BX | EBX
  | DI | EDI | SI | ESI | BP | EBP | SP | ESP
  | R8W | R8D | R9W | R9D | R12D | R13W | R13D | R14W | R14D

groupDir
  groupId GROUP segIdList

groupId
  id

hexdigit
  a | b | c | d | e | f
  | A | B | C | D | E | F

id
  alpha
  | id alpha
  | id decdigit
  Maximum length is 247 characters.

idList
  id | idList , id

ifDir
  ifStatement ;;
  directiveList
  ⟦ elseifBlock ⟧
  ⟦ ELSE ;;
  directiveList ⟧ ;;

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

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

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

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 ;;

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

procDir
  procId PROC ⟦ pOptions ⟧ ⟦ < macroArgList > ⟧
  ⟦ usesRegs ⟧ ⟦ procParmList ⟧

processor
  | .386 | .386p | .486 | .486P
  | .586 | .586P | .686 | .686P | .387

processorDir
  processor ;;
  | coprocessor ;;

procId
  id

procItem
  instrPrefix | dataDir | labelDir | offsetDir | generalDir

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
  " | '

qwordRegister
  RAX | RCX | RDX | RBX | RSP | RBP | RSI | RDI
  | R8 | R9 | R10 | R11 | R12 | R13 | R14 | R15

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 ⟧

recordInstance
  { ⟦ ;; ⟧ recordFieldList ⟦ ;; ⟧ }
  | < oldRecordFieldList >
  | constExpr DUP ( recordInstance )

recordInstList
  recordInstance | recordInstList , ⟦ ;; ⟧ recordInstance

recordTag
  id

register
  specialRegister | gpRegister | byteRegister | qwordRegister | fpuRegister | SIMDRegister | segmentRegister

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

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
  + | -

simdRegister
  MM0 | MM1 | MM2 | MM3 | MM4 | MM5 | MM6 | MM7
  | xmmRegister
  | YMM0 | YMM1 | YMM2 | YMM3 | YMM4 | YMM5 | YMM6 | YMM7
  | YMM8 | YMM9 | YMM10 | YMM11 | YMM12 | YMM13 | YMM14 | YMM15

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

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

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

xmmRegister
  XMM0 | XMM1 | XMM2 | XMM3 | XMM4 | XMM5 | XMM6 | XMM7
  | XMM8 | XMM9 | XMM10 | XMM11 | XMM12 | XMM13 | XMM14 | XMM15