我试图得到(合理)完整的x86(-64)装配图片。所以x86汇编在大图片视图中是一个相当简单的语法;我们有EBNF-ish:
Assembly ::= Line+
Line ::= Label?: Operation Operand? Operand?
汇编是一个行列表,其中每一行是(可能)标签,后跟一个操作和0,1或2个操作数。例如,可以在英特尔手册中轻松找到相当完整的操作数列表。
我正在努力的操作系统 - 确保我已经掌握了所有案例。英特尔手册虽然它确实讨论了语法,但它经常将它混合到语义的讨论中,这使得很难评估你的图片是完整/正确的。例如,花了一段时间才找到原因
add [gs:rdi+0x49],bl
是对的。
"在汇编程序中,段覆盖通常用冒号“:”运算符处理。" Vol.1 3-21。不过,我必须看到一些例子来确切地知道使用冒号运算符的语法,并且从未在手册中找到它(但!!)。
我的问题是:是否有任何地方/项目准确提供x86(-64)中允许的操作数的语法?
以下是我的第一次尝试:随时随地纠正,改进和添加。我使用EBNF-ish语法,?表示0或1,[X-Y]表示X和Y范围内的字符中的1个字符,|意思是。或
定义寄存器:
Reg ::= (E|R)?[A-D]X | (E|R)?(S|D)I | (E|R)?(B|S)P | R815(W|D)? | 8BitR | FPU
| MMX | SSE | AVX | EFLAGs
8BitR ::= [A-D]L |[A-D]H | (S|D)IL | (B|S)PL | R815B
815 ::= 8 | 9 | 1[0-5]
FPU ::= ST[0-7]
MMX ::= MM[0-7]
SSE ::= XMM[0-7] | MXCSR
AVX ::= SSE | XMM8 | XMM9 | (X|Y|Z)MM1[0-9] | (X|Y|Z)MM2[0-9] | (X|Y|Z)MM(0|1)
| (Y|Z)MM[0-9]
区隔:
Seg ::= (C|F|G)S
数据类型:
Data ::= Byte | (D|Q)?Word | Real(4|8|10)
......我说得对吗?所有这些
操作数:
Operand ::= Reg | Memory | Data Reg | Data "PTR" Memory | Data? Literal
Memory ::= "[" (Seg":")? Reg ("+"Literal)? "]"
Literal ::= 0xInteger
我错过了什么吗?鼓励参考!如果有人发现这个有用,我会使解析器可用。