Sdílet prostřednictvím


Microsoft Macro Assembler BNF – gramatika

Tato stránka obsahuje popis BNF gramatiky MASM. Poskytuje se jako dodatek k odkazu a není zaručeno, že bude dokončený. Úplné informace o klíčových slovech, parametrech, operacích atd. najdete v referenčních informacích.

Pro ilustraci použití BNF, následující diagram znázorňuje definici TYPEDEF direktivy počínaje netermiální typedefDir.

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

Položky pod každou vodorovnou závorkou jsou terminály, například NEAR16, NEAR32, FAR16a FAR32. Nebo jsou to neterminaly, jako qualifierje , qualifiedTypedistance, a protoSpec které je možné dále definovat. Každá kurzíva neterminal v typedefDir definici je také položka v BNF. Tři svislé tečky označují definici větvení pro netermiální, která kvůli jednoduchosti tento obrázek ilustruje.

Gramatika BNF umožňuje rekurzivní definice. Například gramatika používá qualifiedType jako možnou definici , qualifiedTypekterá je také součástí definice pro qualifier. Symbol |určuje volbu mezi alternativními výrazy, například endOfLine | comment. Dvojité složené závorky určují volitelný parametr, například ⟦ macroParmList ⟧. Hranaté závorky se ve zdrojovém kódu ve skutečnosti nezobrazují.

Neterminaly MASM

;;
endOfLine | comment

=Dir
id = immExpr ;;

addOp
+ | -

aExpr
term | aExpr && term

altId
id

alpha
  Všechna velká nebo malá písmena (A-Z) nebo jeden z těchto čtyř znaků: @ _ $ ?

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.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
  Libovolný znak s řadovým znakem v rozsahu 0–255 s výjimkou spojnicového kanálu (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
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
  Libovolný znak s výjimkou 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
Esign ⟦ ⟧decNumber

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

exprList
expr | exprList , expr

externDef
langType ⟦ ⟧ idaltId():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
  Maximální délka je 247 znaků.

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 ⟦ ⟧ ⟦ inSegDirListendpDir
  | 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
  Jakékoli rezervované slovo.

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
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
  Název instrukce.

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
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
langType ⟦ ⟧id

publicDir
PUBLIC pubList ;;

pubList
pubDef | pubList,;; ⟦ ⟧pubDef

purgeDir
PURGE macroIdList

qualifiedType
type
  | distance ⟦ ⟧ PTRqualifiedType

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
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
quotestext ⟦ ⟧quote

stringChar
quotequote | Libovolný znak s výjimkou uvozovek.

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