当我遇到一个小bug时,我正在使用Libdisasm(来自http://sourceforge.net/projects/bastard/files/libdisasm/0.23/的版本.23)进行一些反汇编。当我从enum x86_insn_type
结构(http://bastard.sourceforge.net/libdisasm.html之后)打印x86_insn_t
时,我发现所有浮点指令似乎都具有相同的类型(所有其他指令都很好)(因为你可以当我打印指令时见下文)
Instruction type a000, fld [ebp-0x10]
Instruction type a000, fld [0x8048588]
Instruction type a000, fmulp st(1), st(0)
Instruction type a000, fstp [ebp-0x10]
以下是enum x86_insn_type
的一小部分,
/* insn_fpu */
insn_fmov = 0xA001,
insn_fmovcc = 0xA002,
insn_fneg = 0xA003,
insn_fabs = 0xA004,
insn_fadd = 0xA005,
insn_fsub = 0xA006,
insn_fmul = 0xA007,
insn_fdiv = 0xA008,
这是libdisasm库中的一个错误(因为它很旧并且很长时间没有更新),或者我做错了什么?
使用的代码。
x86_insn_t insn;
char buf[MAX_INSN_SIZE];
char line_to_print[LINE_SIZE];
int size;
int to_return;
x86_init(opt_none, NULL, NULL);
//Here I read one Instruction into buf and then call x86_disasm
size = x86_disasm((unsigned char*)buf, MAX_INSN_SIZE, 0, 0, insn);
if(size)
{
x86_format_insn(&insn, line_to_print, LINE_SIZE, intel_syntax);
printf("Instruction type %x, %s \n", insn.type, line_to_print);
}
x86_cleanup();