【问题标题】:Is it necessary that each machine code can only map to one assembly code?每个机器代码是否必须只能映射到一个汇编代码?
【发布时间】:2011-02-05 01:49:48
【问题描述】:

假设这两个本质上是相同的:

push 1

0x1231

这表示每个汇编指令都映射到一个机器代码。

但是每个机器码是否必须只能映射到一个汇编代码?

【问题讨论】:

    标签: assembly machine-code


    【解决方案1】:

    MIPS 汇编语言有几个“伪指令”。例如,“move”在内部只是一个带有隐式 $0 操作数的“add”。

    【讨论】:

      【解决方案2】:

      您可以完美地定义一个支持指令“同义词”的汇编程序:如果您让用户代码FOO 的含义与BAR 完全相同,则不会造成任何伤害。我不知道这样做的汇编器的副手,但你当然可以在任何宏汇编器中使用一个非常简单的宏来实现相同的效果;-)。

      【讨论】:

      • 处理器如何对机器代码进行分段,每条指令按两个字?
      • 机器码的二进制格式和生成该机器码的汇编语言的语法是完全不相关的。例如,x86 的二进制指令长度各不相同,从一个字节开始,但每个指令都是从一条汇编语言指令生成的。
      • 在处理器看来,都是位序列,它是如何知道每条指令的起始位和结束位的?
      • @Mask,所有现代处理器都使用字序列(可能包括字节),而不是位。那些具有不同长度指令的人显然有一些额外的逻辑,这样,根据第一个字节或字,他们知道他们还需要多少。同样,汇编器(其工作是读取汇编代码文本并生成二进制机器代码)与案例无关。
      • 是的,汇编程序实际上是这样做的。几乎每个 x86 汇编程序都为 jejz 执行此操作。它们的含义完全相同,但有时对于程序员来说,两者中的一个更容易理解。
      【解决方案3】:

      是的。一个真实的例子是68k assembler,其中

      官方助记词 BCC(上支 携带清除)和 BCS (携带分支 set) 可以重命名为 BHS (branch on 高于或相同)和 BLO(分支 小于),分别。许多 68000 个汇编器支持这些 替代助记符。

      【讨论】:

        【解决方案4】:

        即使没有同义词,一条汇编指令也可以映射到多个机器代码。
        例如。 add eax, ebx 可以表示为 03 C301 D8
        事实上,这可能很有用,例如识别特定的编译器。
        您可以在this article 中找到更多示例。

        在某种程度上,反过来也可以。
        这个例子有点牵强,但相同的机器代码 (F3 90) 在 x86 上映射到 REP NOPPAUSE
        执行哪一个,取决于代码运行的 CPU。
        尽管有意选择了相同的操作码,就处理器状态而言,它们没有区别the execution time - 以及 确切 内部实现 - 在HT (PAUSE) 与非 HT (NOP) CPU。

        除了PAUSEREP NOP 差别不大之外,还可以编写难以静态反汇编的机器代码。
        例如。如果反汇编从偏移量 0 与偏移量 1 开始,则可以仔细构建一个机器代码序列,该序列会导致完全不同的汇编指令。
        还可以编写自修改汇编代码,使静态分析更加困难。

        【讨论】:

        • 顺便说一句,处理器如何将机器代码分段,每条指令两个字?
        • @Mask:如果你的问题是机器码中是否有一个字节的指令,那么是的,有很多。
        • 否。在处理器看来,都是位序列。它如何知道每条指令的起始位和结束位?
        • @Mask:操作码可以对有关参数及其长度的必要信息进行编码。一个操作码表:sandpile.org/ia32/opc_1.htm 一篇关于机器码冗余的文章:strchr.com/machine_code_redundancy
        • @Mask:虽然更好——尽管更长更复杂——来源是“英特尔® 64 和 IA-32 架构软件开发人员手册,第 2A 卷:指令集参考,AM”,其中整章专门介绍指令和操作码格式。 intel.com/Assets/PDF/manual/253666.pdf
        【解决方案5】:

        我看不出有任何概念上的原因说明您不能设计一种汇编语言,其中多个汇编语句映射到底层处理器上的相同操作码。

        我也没有立即看到任何特别好的理由这样做,但已经晚了,也许我错过了一些东西。

        【讨论】:

          【解决方案6】:

          特定机器代码指令的作用取决于它所针对的处理器(或处理器系列)。并且相同的机器代码指令在本质上总是会做同样的事情。

          通常,一条特定的机器代码指令将反汇编为仅一条语句。在一些更复杂的指令集中,有几种方法可以在汇编程序中编写相同的表达式。一个很好的例子是索引查找。有些语句也可以有同义词,但同样,对于处理器来说仍然意味着同样的事情。

          但是,一个体系结构可能存在多个完整的装配集。 x86 架构发生了这种情况,其中有 Intel 定义的标准集,然后还有另一个基于 AT&T 创建的标准集,他是 GCC 使用的标准集。

          【讨论】:

            【解决方案7】:

            通常,组装的目的是让您可以直接对机器进行编程,而不会对将要执行的内容产生歧义。这几乎需要 1:1 映射。

            如果在某些汇编程序中的某个地方有一些间接映射可能用于处理某些处理器系列中操作码的更改,我不会感到惊讶。不过我不知道。

            【讨论】:

              猜你喜欢
              • 2011-06-14
              • 1970-01-01
              • 1970-01-01
              • 2011-03-26
              • 1970-01-01
              • 2011-09-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多