Microsoft Macro Assembler BNF 文法

このページには、MASM 文法の BNF の説明が含まれています。 リファレンスに対する補足として提供されており、完全であるとは限りません。 キーワード、パラメーター、演算などの詳細については、リファレンスを参照してください。

BNF の使用方法について説明するために、次の図には、非終端要素 typedefDir から始まる TYPEDEF ディレクティブの定義が示されています。

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

各水平方向の中かっこの下にあるエントリは、NEAR16NEAR32FAR16FAR32 などの終端要素です。 または、さらに定義することができる qualifierqualifiedTypedistanceprotoSpec などの非終端要素です。 typedefDir 定義内の斜体になっている各非終端要素は、BNF 内のエントリでもあります。 3 つの縦方向のドットは、非終端要素の分岐定義を示しています。わかりやすくするために、この図については説明しません。

BNF 文法では、再帰的な定義が許可されます。 たとえば、文法では qualifiedType に可能な定義として qualifiedType を使用します。これは、qualifier の定義のコンポーネントでもあります。 "|" 記号は、別の式 (endOfLine | comment など) の間の選択肢を指定します。 二重中かっこは、⟦ macroParmList ⟧ などの省略可能なパラメーターを指定します。 角かっこは、実際にはソース コードには表示されません。

MASM 非終端要素

;;
endOfLine | comment

=Dir
id = immExpr ;;

addOp
+ | -

aExpr
term | aExpr && term

altId
id

alpha
  任意の大文字または小文字 (A から Z)、または @ _ $ ? の 4 つの文字のいずれか

arbitraryText
charList

asmInstruction

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

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

bitDef

bitDefList

bitFieldId
id

bitFieldSize
constExpr

blockStatements
directiveList

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

commDir
COMM
commList ;;

comment
; text ;;

commentDir
COMMENT delimiter
text
text delimiter text ;;

commList
commDecl | commList , commDecl

commType
type | constExpr

constant

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

controlIf
.IF cExpr ;;
directiveList



.ENDIF ;;

coprocessor
.8087 | .287 | .387 | .NO87

crefDir
crefOption ;;

crefOption
.CREF

cxzExpr
expr
  | ! expr
  | expr == expr
  | expr != expr

dataDecl
DB | DW | DD | DF | DQ | DT | dataType | typeId

dataDir

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

  | e11

e11
( 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

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

endpDir
procId ENDP ;;

endsDir
id ENDS ;;

equDir
textMacroId EQU equType ;;

equType
immExpr | textLiteral

errorDir
errorOpt ;;

errorOpt












exitDir

exitmDir
: EXITM | EXITM textItem

exponent

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

exprList
expr | exprList , expr

externDef

externDir
externKey externList ;;

externKey
EXTRN | EXTERN | EXTERNDEF

externList

externType
ABS | qualifiedType

fieldAlign
constExpr

fieldInit

fieldInitList

fileChar
delimiter

fileCharList
fileChar | fileCharList fileChar

fileSpec
fileCharList | textLiteral

flagName
ZERO? | CARRY? | OVERFLOW? | SIGN? | PARITY?

floatNumber

  | digits R
  | digits r

forcDir
FORC | IRPC

forDir
FOR | IRP

forParm

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


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

inSegDirList
inSegDir | inSegDirList inSegDir

inSegmentDir
instruction
  | dataDir
  | controlDir
  | startupDir
  | exitDir
  | offsetDir
  | labelDir

  | invokeDir
  | generalDir

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

instruction

invokeArg
register :: register
  | expr
  | ADDR expr

invokeDir

invokeList

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

macroCall
id macroArgList ;;
  | id ( macroArgList )

macroDir

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

macroParmList

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

modelOpt
langType | stackOption

modelOptlist
modelOpt | modelOptlist , modelOpt

module

mulOp
* | / | MOD

nameDir
NAME id ;;

nearfar
NEAR | FAR

nestedStruct

structBody
ENDS ;;

offsetDir
offsetDirType ;;

offsetDirType
EVEN
  | ORG immExpr

offsetType
GROUP | SEGMENT | FLAT

oldRecordFieldList

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

optText
, textItem

orOp
OR | XOR

oVisibility
PUBLIC | PRIVATE | EXPORT

pageDir

pageExpr

pageLength
constExpr

pageWidth
constExpr

parm

parmId
id

parmList

parmType
REQ | = textLiteral | VARARG

pOptions

primary
expr binaryOp expr | flagName | expr

procDir

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

processorDir
processor ;;
  | coprocessor ;;

procId
id

procItem
instrPrefix | dataDir | labelDir | offsetDir | generalDir

procParmList

protoArg

protoArgList

protoList
protoArg

protoSpec

  | typeId

protoTypeDir
id PROTO protoSpec

pubDef

publicDir
PUBLIC pubList ;;

pubList

purgeDir
PURGE macroIdList

qualifiedType
type

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

recordInstance

  | < oldRecordFieldList >
  | constExpr DUP ( recordInstance )

recordInstList

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

segAlign
BYTE | WORD | DWORD | PARA | PAGE

segAttrib
PUBLIC | STACK | COMMON | MEMORY | AT constExpr | PRIVATE

segDir

  | .DATA
  | .DATA?
  | .CONST


segId
id

segIdList
segId
  | segIdList , segId

segmentDef

segmentDir

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

stringChar
quotequote | 引用符を除く任意の文字。

structBody
structItem ;;
  | structBody structItem ;;

structDir


structBody
structTag ENDS ;;

structHdr
STRUC | STRUCT | UNION

structInstance


structInstList

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

textLiteral
< text > ;;

textMacroDir


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

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