【发布时间】:2011-02-05 01:49:48
【问题描述】:
假设这两个本质上是相同的:
push 1
和
0x1231
这表示每个汇编指令都映射到一个机器代码。
但是每个机器码是否必须只能映射到一个汇编代码?
【问题讨论】:
标签: assembly machine-code
假设这两个本质上是相同的:
push 1
和
0x1231
这表示每个汇编指令都映射到一个机器代码。
但是每个机器码是否必须只能映射到一个汇编代码?
【问题讨论】:
标签: assembly machine-code
MIPS 汇编语言有几个“伪指令”。例如,“move”在内部只是一个带有隐式 $0 操作数的“add”。
【讨论】:
您可以完美地定义一个支持指令“同义词”的汇编程序:如果您让用户代码FOO 的含义与BAR 完全相同,则不会造成任何伤害。我不知道这样做的汇编器的副手,但你当然可以在任何宏汇编器中使用一个非常简单的宏来实现相同的效果;-)。
【讨论】:
je 和 jz 执行此操作。它们的含义完全相同,但有时对于程序员来说,两者中的一个更容易理解。
是的。一个真实的例子是68k assembler,其中
官方助记词 BCC(上支 携带清除)和 BCS (携带分支 set) 可以重命名为 BHS (branch on 高于或相同)和 BLO(分支 小于),分别。许多 68000 个汇编器支持这些 替代助记符。
【讨论】:
即使没有同义词,一条汇编指令也可以映射到多个机器代码。
例如。 add eax, ebx 可以表示为 03 C3 或 01 D8。
事实上,这可能很有用,例如识别特定的编译器。
您可以在this article 中找到更多示例。
在某种程度上,反过来也可以。
这个例子有点牵强,但相同的机器代码 (F3 90) 在 x86 上映射到 REP NOP 或 PAUSE。
执行哪一个,取决于代码运行的 CPU。
尽管有意选择了相同的操作码,就处理器状态而言,它们没有区别,the execution time - 以及 确切 内部实现 - 在HT (PAUSE) 与非 HT (NOP) CPU。
除了PAUSE 与REP NOP 差别不大之外,还可以编写难以静态反汇编的机器代码。
例如。如果反汇编从偏移量 0 与偏移量 1 开始,则可以仔细构建一个机器代码序列,该序列会导致完全不同的汇编指令。
还可以编写自修改汇编代码,使静态分析更加困难。
【讨论】:
我看不出有任何概念上的原因说明您不能设计一种汇编语言,其中多个汇编语句映射到底层处理器上的相同操作码。
我也没有立即看到任何特别好的理由这样做,但已经晚了,也许我错过了一些东西。
【讨论】:
特定机器代码指令的作用取决于它所针对的处理器(或处理器系列)。并且相同的机器代码指令在本质上总是会做同样的事情。
通常,一条特定的机器代码指令将反汇编为仅一条语句。在一些更复杂的指令集中,有几种方法可以在汇编程序中编写相同的表达式。一个很好的例子是索引查找。有些语句也可以有同义词,但同样,对于处理器来说仍然意味着同样的事情。
但是,一个体系结构可能存在多个完整的装配集。 x86 架构发生了这种情况,其中有 Intel 定义的标准集,然后还有另一个基于 AT&T 创建的标准集,他是 GCC 使用的标准集。
【讨论】:
通常,组装的目的是让您可以直接对机器进行编程,而不会对将要执行的内容产生歧义。这几乎需要 1:1 映射。
如果在某些汇编程序中的某个地方有一些间接映射可能用于处理某些处理器系列中操作码的更改,我不会感到惊讶。不过我不知道。
【讨论】: