0

我的意思是说我们有这个

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

字节流。

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

这可能吗?

4

3 回答 3

8

当然,这种情况经常发生。代码通常也包含数据。像内联字符串或表格,像为 switch 语句生成的那种。一个跳转表,包含地址而不是代码。反汇编程序往往会在此类代码上严重失败。他们通常可以弄清楚第一个表条目是一个地址,但不知道该表有多长。

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

于 2013-07-25T18:04:08.093 回答
3

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

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

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

于 2013-07-25T17:57:04.703 回答
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:   ...

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

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

于 2013-07-25T18:26:37.203 回答