【问题标题】:How Do Assemblers Map x86 Instruction Mnemonics to Binary Machine Instructions?汇编程序如何将 x86 指令助记符映射到二进制机器指令?
【发布时间】:2010-05-03 18:22:48
【问题描述】:

我对编写 x86 汇编程序很感兴趣。我想知道将 x86 汇编助记指令(使用类似 Intel 的语法)映射到相应的二进制机器代码指令的好方法是什么。

【问题讨论】:

标签: x86 assembly


【解决方案1】:

您想了解助记符到机器码的物理映射吗?如果是Intel IA32/IA64 reference manuals的第2A&2B卷描述了x86机器码的二进制格式。

Wikipedia 上的 x86 instruction set page 有一个按引入时间分类的所有指令的简洁列表,这可能有助于您确定首先实施的优先级。

但是,如果您询问如何解析汇编代码文本文件以使您的程序可以开始写出机器代码,那么您基本上需要了解如何编写编译器。 lex 和 yacc 工具是很好的起点,但如果您不知道如何构建编译器,您还需要买一本书。我认为Dragon book 是最好的,但还有很多其他书籍可供您使用,所以有很多建议。

【讨论】:

  • 你可能不需要一个成熟的编译器来做这个。您需要一个带有某种查找表的简单的两遍汇编器。你可能并不总是以这种方式生成最好的代码,但你会得到一些有用的东西。
  • @Nathan:汇编器是成熟的编译器。请记住,编译器只是从其他语言到操作码的翻译器。如果计算整个翻译过程,汇编器和编译器最终会做完全相同的事情。碰巧大多数其他语言都足够复杂,而汇编语言也足够简单,因此汇编充当了一个不错的中点——因此许多编译器将翻译分为两个阶段:翻译为汇编,并让汇编器完成繁重的工作实际生成操作码。汇编程序通常不会从中受益。
  • @cHao:感谢您的澄清。这是一个有趣的观点:-)
  • 所有英特尔操作码引用的问题是,它们没有提供一个特定的汇编语句如何映射到机器代码的单一示例。很容易迷失在 ModR/N SIB 字节混乱中......
【解决方案2】:

对于 x86,它非常复杂。自从 32 位处理器接管以来,它的复杂性稍微降低了一点,但是是的。还是很痛。

您可能想看看 nasm (http://www.nasm.us)。它是一个开源的 32 位汇编器。看看他们是怎么做的。或者,改用它。 :)

【讨论】:

    【解决方案3】:

    这只是一个直接的一对一映射;英特尔文档描述了所有指令及其编码。您需要构建一个巨大的查找表或类似的东西来进行匹配和代码生成。

    【讨论】:

    • 某事告诉我你从未看过 x86 编码。一个助记符可以对应多个操作码,每个操作码可以有很多前缀,大小覆盖......我确定我错过了一些东西。
    • 我每天都在写 x86 汇编代码。它必须是一对一的,否则你怎么知道为你编写的指令发出了哪个操作码?仅仅因为有前缀、特殊修饰符、内存访问或注册版本等并不会改变这样一个事实,即对于您在汇编文件中编写的每条指令,您都必须知道发出了哪些机器指令......
    • 好吧,如果你想有更多没有前缀的例子,mov eax, [ebx] 和 mov [eax], ebx 不要使用相同的操作码(89 和 8b,我相信)。 x86 编码实际上不是与 mnemonics 的 1-1 映射。是的,汇编器拥有从源代码生成汇编所需的所有数据。我说的不仅仅是助记符。
    • 一个大的查找表可能是这些天要走的路。早在 1980 年代,我确信有一种更奇特的方法使用了特定的模式来节省空间。因为 640kB 并没有那么多空间。当然他们只需要处理 16 位指令...
    • @Bahbar 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)
    猜你喜欢
    • 2019-12-10
    • 1970-01-01
    • 2010-09-16
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2015-06-29
    相关资源
    最近更新 更多