假设这两者基本相同:
push 1
和
0x1231
其中说每个汇编指令都映射到机器代码。
但是每个机器代码是否只能映射到一个汇编代码?
答案 0 :(得分:4)
MIPS汇编语言有几个“伪指令”。例如,“move”在内部只是一个带有隐式$ 0操作数的“add”。
答案 1 :(得分:3)
您可以很好地定义支持指令“同义词”的汇编程序:如果您让用户代码FOO
与BAR
完全相同,则不会造成任何损害。我不知道这样做的汇编程序,但你可以在任何宏汇编程序中使用一个简单的宏来实现相同的效果; - )。
答案 2 :(得分:2)
即使没有同义词,汇编指令也可以映射到多个机器码
例如。 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
vs REP NOP
之外没什么区别,可以编写很难静态拆解的机器代码。
例如。如果反汇编开始于偏移量0对偏移量1,则可以仔细构造机器代码序列,从而产生完全不同的汇编指令
人们还可以编写自修改汇编代码,使静态分析更难。
答案 3 :(得分:2)
是。一个真实的例子是68k assembler,其中
官方助记符BCC(分支机构 携带清晰)和BCS(携带分支) set)可以重命名为BHS(分支上) 高于或相同)和BLO(分支 小于),分别。许多 68000装配工支持这些 替代助记符。
答案 4 :(得分:0)
我没有看到任何概念上的原因导致您无法设计汇编语言,其中多个汇编语句映射到底层处理器上的相同操作码。
我也没有立即看到任何特别好的理由这样做,但现在已经很晚了,也许我错过了一些东西。
答案 5 :(得分:0)
特定机器代码指令的作用由处理器(或处理器系列)决定。同样的机器代码指令总是从根本上做同样的事情。
通常,特定的机器代码指令将只分解为一个语句。在一些更复杂的指令集中,有几种方法可以在汇编程序中编写相同的表达式。一个很好的例子是索引查找。有些陈述也可能有同义词,但对于处理器来说仍然意味着同样的事情。
但是,架构可能存在多个整个装配集。这种情况发生在x86架构中,其中有英特尔定义的标准集,然后是另一个基于AT& T创建的集合,他是GCC使用的集合。
答案 6 :(得分:-2)
通常,装配点是允许您直接对机器进行编程,而不会对将要执行的内容产生歧义。这几乎需要1:1的映射。
如果某些汇编程序中的某处有一些间接映射可能会处理某些处理器行中操作码的更改,我不会感到惊讶。我不知道。