x86-64英特尔操作数语法

时间:2014-07-05 03:03:44

标签: assembly syntax x86 x86-64

我试图得到(合理)完整的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

我错过了什么吗?鼓励参考!如果有人发现这个有用,我会使解析器可用。

0 个答案:

没有答案