我目前正在开发一个 x86 反汇编程序,并开始反汇编一个 win32 PE 文件。大部分反汇编代码看起来不错,但是有一些非法的 0xff /7 操作码的出现(/7 表示 reg=111,0xff 是操作码组 inc/dec/call/callf/jmp/jmpf/push/非法操作数r/m 16/32)。第一个猜测是,/7 是 pop 指令,但它是用 0x8f /0 编码的。我已经对照官方的英特尔架构软件开发人员手册第 2 卷:指令集参考检查了这一点——所以我不只是被误导了。
反汇编示例:(S0000O0040683a 是被另一条指令跳转到的标签)
S0000O0040683a: inc edi ; 0000:0040683a ff c7
test dword ptr [eax+0xff],edi ; 0000:0040683c 85 78 ff
0xff/7 edi ; 0000:0040683f ff ff
顺便说一句:gdb 对此进行了同样的反汇编(除了错误 0xff 在我的反汇编中没有产生 -1 ):
(gdb) disassemble 0x0040683a 0x00406840
Dump of assembler code from 0x40683a to 0x406840:
0x0040683a: inc %edi
0x0040683c: test %edi,0xffffffff(%eax)
0x0040683f: (bad)
End of assembler dump.
所以问题是:Windows的非法操作码异常处理程序中是否有任何默认处理程序,它实现了这个非法操作码中的任何功能,如果是:那里发生了什么?
问候, 博多