此页面包含 MASM 语法的 BNF 说明。 它作为参考的补充提供,不保证是完整的。 有关关键字、参数、操作等的完整信息,请参阅参考。
为了说明 BNF 的使用,下图显示了 TYPEDEF 指令的定义,从非终止符 typedefDir 开始。

每个水平大括号下的条目都是终止符,例如 NEAR16、NEAR32、FAR16 和 FAR32。 否则,它们是可以进一步定义的非终止符,例如 qualifier、qualifiedType、distance 和 protoSpec。 typedefDir 定义中的每个斜体非终止符也是 BNF 中的条目。 三个垂直的点表示非终止符的分支定义,为了简单起见,此图不进行说明。
BNF 语法允许递归定义。 例如,语法使用 qualifiedType 作为 qualifiedType 的可能定义,这也是 qualifier 的定义的组成部分。 例如,“|”符号在备用表达式之间指定一个选择,例如 endOfLine | comment。 双大括号指定可选参数,例如 ⟦ macroParmList ⟧。 大括号实际上不会出现在源代码中。
MASM 非终止符
;;
endOfLine | comment
=Dir
id = immExpr ;;
addOp
+ | -
aExpr
term | aExpr && term
altId
id
alpha
任何大写或小写字母 (A-Z) 或以下四个字符之一:@ _ $ ?
arbitraryText
charList
asmInstruction
mnemonicexprList ⟦ ⟧
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
范围 0-255 中带序号的任意字符,换行符 (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
digitsradixOverride ⟦ ⟧
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
| .XCREFidList ⟦ ⟧
| .NOCREFidList ⟦ ⟧
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
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
| e10expr ⟦ ⟧
| 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
ENDimmExpr ⟦ ⟧;;
endpDir
procId ENDP ;;
endsDir
id ENDS ;;
equDir
textMacroId EQU equType ;;
equType
immExpr | textLiteral
errorDir
errorOpt ;;
errorOpt
.ERRtextItem ⟦ ⟧
| .ERREconstExpr optText ⟦ ⟧
| .ERRNZconstExpr optText ⟦ ⟧
| .ERRBtextItem optText ⟦ ⟧
| .ERRNBtextItem optText ⟦ ⟧
| .ERRDEFid optText ⟦ ⟧
| .ERRNDEFid optText ⟦ ⟧
| .ERRDIFtextItem , textItemoptText ⟦ ⟧
| .ERRDIFItextItem , textItemoptText ⟦ ⟧
| .ERRIDNtextItem , textItemoptText ⟦ ⟧
| .ERRIDNItextItem , textItemoptText ⟦ ⟧
| .ERR1textItem ⟦ ⟧
| .ERR2textItem ⟦ ⟧
exitDir
.EXITexpr ⟦ ⟧;;
exitmDir
: EXITM | EXITM textItem
exponent
Esign ⟦ ⟧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
最大长度为 247 个字符。
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
| procDirlocalDirList ⟦ ⟧ ⟦ inSegDirList ⟧endpDir
| invokeDir
| generalDir
instrPrefix
REP | REPE | REPZ | REPNE | REPNZ | LOCK
instruction
instrPrefix ⟦ ⟧asmInstruction
invokeArg
register :: register
| expr
| ADDR expr
invokeDir
INVOKEexpr , ⟦ ⟦ ;; ⟧ invokeList ⟧;;
invokeList
invokeArg | invokeList, ;; ⟦ ⟧invokeArg
keyword
任意保留字。
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
idMACRO 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
指令名称。
modelDir
.MODELmemOption , modelOptlist⟦⟧;;
modelOpt
langType | stackOption
modelOptlist
modelOpt | modelOptlist , modelOpt
module
directiveList ⟦ ⟧endDir
mulOp
* | / | MOD
nameDir
NAME id ;;
nearfar
NEAR | FAR
nestedStruct
structHdrid ⟦ ⟧;;
structBody
ENDS ;;
offsetDir
offsetDirType ;;
offsetDirType
EVEN
| ORG immExpr
| ALIGNconstExpr ⟦ ⟧
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
PAGEpageExpr ⟦ ⟧;;
pageExpr
+ | pageLength ⟦ ⟧ ⟦ , pageWidth ⟧
pageLength
constExpr
pageWidth
constExpr
parm
parmId: qualifiedType ⟦ ⟧
| parmIdconstExpr ⟦ ⟧ ⟦ : qualifiedType ⟧
parmId
id
parmList
parm | parmList, ;; ⟦ ⟧parm
parmType
REQ | = textLiteral | VARARG
pOptions
distance ⟦ ⟧ ⟦ langType ⟧ ⟦ ⟧ oVisibility
primary
expr binaryOp expr | flagName | expr
procDir
procIdPROC 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
.CODEsegId ⟦ ⟧
| .DATA
| .DATA?
| .CONST
| .FARDATAsegId ⟦ ⟧
| .FARDATA?segId ⟦ ⟧
| .STACKconstExpr ⟦ ⟧
segId
id
segIdList
segId
| segIdList , segId
segmentDef
segmentDirinSegDirList ⟦ ⟧ endsDirsimpleSegDir | ⟦ inSegDirList ⟧ ⟦ ⟧ endsDir
segmentDir
segIdSEGMENT 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
quotestext ⟦ ⟧quote
stringChar
quotequote |引号以外的任何字符。
structBody
structItem ;;
| structBody structItem ;;
structDir
structTagstructHdr fieldAlign ⟦ ⟧
, NONUNIQUE ⟦ ⟧;;
structBody
structTag ENDS ;;
structHdr
STRUC | STRUCT | UNION
structInstance
<fieldInitList ⟦ ⟧>
| {;; ⟦ ⟧ ⟦ fieldInitList ⟧ ⟦ ⟧ ;;}
| constExprDUP ( 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
CATSTRtextList ⟦ ⟧
| TEXTEQUtextList ⟦ ⟧
| SIZESTR textItem
| SUBSTRtextItem , textStart, textLen ⟦ ⟧
| INSTRtextStart , ⟦ ⟧ 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 ;;
.UNTILCXZcxzExpr ⟦ ⟧;;
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