如何解码长度不明确的 x86 指令? [重复]

问题描述 投票:0回答:0

我正在查看 Intel64 和 IA-32 架构软件开发人员手册,作为进行一些简单的 x86 机器代码反汇编的参考。

某些操作码的定义方式似乎有些含糊不清,我不知道如何解决。

例如,Add-With-Carry

ADC
的定义在第 2A 卷第 3-27 页给出,并且包含以下两种形式(我稍微重新格式化):

字节码 |装配|操作/英语 | 64 位有效吗? |兼容模式有效吗? |说明

(0x15iw)| “ADC AX,imm16” |我 |有效 |有效的“用进位 imm16 添加到 AX。”

(0x15 ID)| “ADC EAX,imm32”|我 |有效 |有效的“用进位 imm32 添加到 EAX。”

现在,这里的问题是这些指令形式的长度不同(第一种形式采用

iw
参数,因此长 3 个字节,第二个采用
id
参数,因此长 5 个字节。

然而,它们都是0x15,无法区分!如果我正在扫描一些机器代码并看到 0x15,我希望指令中有 2 个后续字节还是 4 个字节?

这是根据处理器的操作模式隐式选择一个或另一个吗(即“指令的默认操作大小”,在下面的注释中向下)?或者发生了什么事?如果是这样的话,那将是非常令人失望的,而且在表格中没有以某种方式指出,因为我正在尝试将本手册处理成一种数据格式,以生成反汇编程序……

无论如何,如何区分这些形式?

assembly x86 intel machine-code instruction-encoding
© www.soinside.com 2019 - 2024. All rights reserved.