Microsoft 宏汇编程序 BNF 语法

此页面包含 MASM 语法的 BNF 说明。 它作为参考的补充提供,不保证是完整的。 有关关键字、参数、操作等的完整信息,请参阅参考。

为了说明 BNF 的使用,下图显示了 TYPEDEF 指令的定义,从非终止符 typedefDir 开始。

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

每个水平大括号下的条目都是终止符,例如 NEAR16NEAR32FAR16FAR32。 否则,它们是可以进一步定义的非终止符,例如 qualifierqualifiedTypedistanceprotoSpectypedefDir 定义中的每个斜体非终止符也是 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
  ⟦ signdecNumber

binaryOp
== | != | >= | <= | > | < | &

bitDef
bitFieldId:bitFieldSize=constExpr

bitDefList
bitDef | bitDefList,;;bitDef

bitFieldId
id

bitFieldSize
constExpr

blockStatements
directiveList
  | .CONTINUE.IFcExpr
  | .BREAK.IFcExpr

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 ⟧ ⟦ langTypeid: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
  ⟦ iddataItem;;

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
  | .ERREconstExproptText
  | .ERRNZconstExproptText
  | .ERRBtextItemoptText
  | .ERRNBtextItemoptText
  | .ERRDEFidoptText
  | .ERRNDEFidoptText
  | .ERRDIFtextItem,textItemoptText
  | .ERRDIFItextItem,textItemoptText
  | .ERRIDNtextItem,textItemoptText
  | .ERRIDNItextItem,textItemoptText
  | .ERR1textItem
  | .ERR2textItem

exitDir
.EXITexpr;;

exitmDir
: EXITM | EXITM textItem

exponent
EsigndecNumber

expr
SHORT e05
  | .TYPE e01
  | OPATTR e01
  | e01

exprList
expr | exprList , expr

externDef
  ⟦ langTypeid(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
  ⟦ signdecNumber.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
  ⟦ labelDefinSegmentDir

inSegDirList
inSegDir | inSegDirList inSegDir

inSegmentDir
instruction
  | dataDir
  | controlDir
  | startupDir
  | exitDir
  | offsetDir
  | labelDir
  | procDirlocalDirList ⟧ ⟦ inSegDirListendpDir
  | invokeDir
  | generalDir

instrPrefix
REP | REPE | REPZ | REPNE | REPNZ | LOCK

instruction
  ⟦ instrPrefixasmInstruction

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
  ⟦ localListmacroStmtList

macroCall
id macroArgList ;;
  | id ( macroArgList )

macroDir
idMACROmacroParmList;;
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
  ⟦ directiveListendDir

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
procIdPROCpOptions ⟧ ⟦ <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
  ⟦ langTypeid

publicDir
PUBLIC pubList ;;

pubList
pubDef | pubList,;;pubDef

purgeDir
PURGE macroIdList

qualifiedType
type
  | ⟦ distancePTRqualifiedType

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
segmentDirinSegDirListendsDir | simpleSegDirinSegDirList ⟧ ⟦ endsDir

segmentDir
segIdSEGMENTsegOptionList;;

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
quotestextquote

stringChar
quotequote | 引号以外的任意字符。

structBody
structItem ;;
  | structBody structItem ;;

structDir
structTagstructHdrfieldAlign
  ⟦ ,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