【发布时间】:2010-05-03 18:22:48
【问题描述】:
我对编写 x86 汇编程序很感兴趣。我想知道将 x86 汇编助记指令(使用类似 Intel 的语法)映射到相应的二进制机器代码指令的好方法是什么。
【问题讨论】:
我对编写 x86 汇编程序很感兴趣。我想知道将 x86 汇编助记指令(使用类似 Intel 的语法)映射到相应的二进制机器代码指令的好方法是什么。
【问题讨论】:
您想了解助记符到机器码的物理映射吗?如果是Intel IA32/IA64 reference manuals的第2A&2B卷描述了x86机器码的二进制格式。
Wikipedia 上的 x86 instruction set page 有一个按引入时间分类的所有指令的简洁列表,这可能有助于您确定首先实施的优先级。
但是,如果您询问如何解析汇编代码文本文件以使您的程序可以开始写出机器代码,那么您基本上需要了解如何编写编译器。 lex 和 yacc 工具是很好的起点,但如果您不知道如何构建编译器,您还需要买一本书。我认为Dragon book 是最好的,但还有很多其他书籍可供您使用,所以有很多建议。
【讨论】:
对于 x86,它非常复杂。自从 32 位处理器接管以来,它的复杂性稍微降低了一点,但是是的。还是很痛。
您可能想看看 nasm (http://www.nasm.us)。它是一个开源的 32 位汇编器。看看他们是怎么做的。或者,改用它。 :)
【讨论】:
这只是一个直接的一对一映射;英特尔文档描述了所有指令及其编码。您需要构建一个巨大的查找表或类似的东西来进行匹配和代码生成。
【讨论】:
mov eax, [ebx] 是 8b 03 和 mov [eax], ebx 是 89 18。这可能看起来不同,但如果您实际上是在二进制/八进制中查看 它是相同的操作码。 213 003 与 211 030。第一个字节包含 6 位操作码(100010b - 21o)+ 方向位(d = 1:移动到 eax/d = 0:反向)+ s = 1(32 位操作)。下一个字节是前 2 位中的 mod = 0(无位移),其余 6 位中交换了 2 个寄存器(03 vs 30)