Язык описания команд ассемблера
Множество команд ассемблера можно описать с помощью следующего языка:
ASM_LENG={ Vt=(+ – AL АН BL BH CL CH DL DH AX EAX BX EBX CX ECX DX EDX BP EBP SP ESP DI EDI SI ESI BYTE SBYTE WORD SWORD DWORD SDWORD FWORD QWORD TBYTE REAL4 REAL8 REAL10 0 12 3 4 56789abcdefABCDEF NEAR16 NEAR32 FAR16 FAR32 AND NOT HIGH LOW HIGHWORO LOWWORD OFFSET SEG LROFFSET TYPE THIS PTR:.{)[] WIDTH MASK SIZE SIZEOF LENGTH LENGTHOF ST SHORT.TYPE OPATTR. название_команды * / MOD NEAR FAR OR XOR " 'hoqt у H 0 Q T Y { } < >:; EQ NE LT LE GT GE CS DS ES FS GS SS SHR SHL CRO CR2 CR3 DRO DR1 DR2 DR3 DR6 DR7 TR3 TR4 TR5 TR6 TR7 А5СП_символ_буква любой_символ_кроме_кавычки). Vn-(addOp asmlnstruction byteRegister constant constExpr dataType decdigit digits distance expr exprtist Expr eOl eO2 eO3 eO4 eO5 eO6 eO7 eO8 eO9 eOlO eOll hexdigit id mnemonic mulOp nearfar radixOverride orOp oldRecordFieldList relOp recordConst recordFieldList register SHIFTOp sizeArg string type segmentRegister specialRegister stext string stringChar structTag quote type typeld unionTag). P. Z=(<asmlnstruction>) }
Множество правил Р грамматики ASM_LENG выглядит следующим образом:
smlnstruction › mnemonic [[ exprList ]] AddOp › + | – byteRegister › AL | AH | BL | BH 1 CL j CH | DL j DH constant › digits [[ radixOverride ]] constExpr › Expr dataType › BYTE | SBYTE | WORD | SWORD | DWORD | SDWORD | FWORD | QWORD | TBYTE | REAL4 | REAL8 | REAL 10 decdigit › 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 digits › decdigit | digits decdigit | digits hexdigit distance › nearfar | NEAR16 | NEAR32 | FAR16 | FAR32 eOl › eOl orOp eO2 | eO2 eO2 › eO2 AND еОЗ | еОЗ eO3 › NOT eO4 | eO4 eO4 › eO4 relOp eO5 | eO5 eO5 › eO5 addOp eO6 | eO6 eO6 › eO6 mulOp eO7 | eO6 SHIFTOp eO7 | eQ7 eO7 › eO7 addOp eO8 | eO8 eO8 › HIGH eO9 | LOW eO9 | HIGHWORD eO9 | LOWWORD eO9 | eO9 eO9 › OFFSET elO | SEG elO | LROFFSET elO | TYPE elO ] THIS elO | eO9 PTR elO | eO9: elO | elO elO › elO .ell | elO [[ expr ]] | ell , ell › (expr) | [ expr ] | WIDTH id | MASK id | SIZE SizeArg | SIZEOF sizeArg | LENGTH id | LENGTHOF id | recordConst | string | constant | type | id | $ | segmentRegister | register | ST | ST (expr) expr › SHORT eO5 |.TYPE eOl | OPATTR eOl | eOl exprList › expr | exprList .expr gpRegister › AX | EAX | BX | EBX | CX | ECX | DX 1 EDX | BP | EBP | SP | ESP I DI | EDI | SI | ESI hexdigit › a|b|c|d|e|f|A|B|C|D|E|F id › А5С11_символ_буква | id А5СП_символ_буква | id decdigit mnemonic › название_команды mulOp › * | / | MOD nearfar › NEAR | FAR oldRecordFieldList › [[ constExpr ]] | oldRecordFieldList. [[ constExpr ]]
За основу языка ASMLENG было взято описание языка MASM (из документации на него), ассемблер, поддерживаемый TASM, незначительно отличается от этого описания (в основном это касается некоторых операторов, типа OPATTR).
Подчеркнем тот факт, что язык ASMLENG описывает лишь правило построения команд ассемблера, не затрагивая синтаксиса всей программы ассемблера в целом. Все строки, не являющиеся командами, будут просто игнорироваться и включаться в выходной файл в своем изначальном виде.