是否可以编写不可能的汇编代码?

时间:2013-07-25 17:53:54

标签: assembly disassembly

说我的意思是说我们有这个

xx xx xx xx xx xx xx xx xx xx xx ...

字节流。

现在,如果反汇编程序经历了该流的每个可能的组合,它会在任何时候抱怨命令是不可能的吗?我希望反汇编程序为每个可能的组合提供LEGIT输出,无论它做什么都无关紧要,但我希望它能成功地吐出指令,无论如何。

这可能吗?

3 个答案:

答案 0 :(得分:8)

当然,这种情况经常发生。代码通常也包含数据。像内联字符串或表,就像为switch语句生成的那种。一个跳转表,包含地址而不是代码。反汇编程序倾向于严重违反此类代码。他们通常可以发现第一个表项是一个地址,但不知道该表有多长。

但这通常只会生成错误的汇编代码,典型的处理器没有那么多不可能的指令。它们倾向于将任何字节值映射到指令。 YMMV。

答案 1 :(得分:3)

奇怪的问题,不确定我是否正确理解你,但是......

不,不可能。并非每个位组合都对应于有效指令。说明书有预定义的格式。任何不符合此格式的内容都会引发“无效指令”硬件异常/陷阱/中断。

此外,如果字节流太长,拥有所有可能的组合可能需要一些时间。

答案 2 :(得分:3)

某些处理器使用固定长度指令,并且可能出现在指令中的每个可能的位组合都具有明确定义的含义。有些使用固定长度指令,但某些位组合没有任何明确的含义(如果尝试执行此类组合,制造商不会指定会发生什么)。在任何一种情况下,如果执行该代码,确定代码将会相当容易。

在许多其他处理器上,代码字节序列的含义将取决于开始解析它的位置。在6502处理器上,字节序列(从地址0xFFC0开始):

A9 00 2C A9 01 85 73 ...

将作为

处理
FFC0:   A9 00    -- LDA #$00
FFC2:   2C A9 01 -- BIT $01A9
FFC5:   85 73    -- STA $73
FFC6:   ...

但是,如果从地址0xFFC3开始执行,则序列将被处理为

FFC3:   A9 01    -- LDA #$01
FFC5:   85 73    -- STA $73
FFC6:   ...

无法确定地址0xFFC3处的A9 01是“LDA#$ 01”指令,还是“BIT”指令的操作数。实际上,在一些真实的6502代码中,相同的字节可能会用于两个目的(BIT $ 01A9指令的唯一影响通常是设置一些标志,因此$ 2C操作码有效地用于跳过接下来的两个字节)

在许多处理器上,没有唯一定义的所有可能字节代码的助记符。因此,以汇编语言生成它们的唯一方法可能是显式使用define-byte指令。例如,在6502上,尝试执行某些字节值(包括0x02,0x12和0x22)将使处理器停止,直到下一次复位。由于此类行为无用,因此没有为其分配已定义的操作码。 6502的一些后来的衍生物在执行这样的操作码时执行更有用的操作,并且针对那些特定衍生物的汇编器将具有可以生成它们的助记符,但是反汇编器的其他常见行为要么将0x02反汇编为“??? “或”?02“,或假设与其表观功能相关的通用伪操作码(例如”KIL“)。