三,反汇编器[Disassembler]
反汇编器识别所有的标准80x86、保护、FPU、MMX和3DNow!指令集(包括Athlon扩展的MMX指令集)。但它不识别ISSI命令,尽管计划要在下个版本中支持这种命令。某些过时或者未公开的命令,像LOADALL,也不支持。
反汇编器可以正确解码16位地址。但它假设所有的段都是32位的(段属性使用32位)。这对于PE[Portable Executable]格式文件总是真的。OllyDbg不支持16位的NE
[New Executables]格式。
如果您熟悉MASM或者TASM,那么反汇编的代码对于您没有任何问题。但是,一些特例也是存在的。以下命令的解码与Intel的标准不同:
AAD (ASCII Adjust AX Before Division) -
该命令的解码后的一般形式为:AAD imm8
AAM (ASCII Adjust AX After Multiply) -
该命令(非十进制数)的一般解码形式为:AAM imm8
SLDT (Store Local Descriptor Table register) -
操作数总被解码为16位。这个命令的32位形式会在目的操作数的低16位中存储段选择器,并保留高16位不变。
SALC (Sign-extend Carry bit to AL, undocumented) -
OllyDbg 支持这个未公开指令。
PINSRW (Insert Word From Integer Register, Athlon extension to MMX) -
在AMD的官方文档中,这个命令的内存形式使用了16位内存操作数;然而寄存器形式需要32位寄存器,但只使用了低16位。为了方便处理,反汇编器解码寄存器为16
位形式。而汇编器两种形式都支持。
CVTPS2PI and CVTTPS2PI (Convert Packed Single-Precision Floating to Packed Doubleword, Convert with Truncation Packed Single-Precision Floating to Packed Doubleword) -
在这些命令中,第一个操作数是MMX寄存器,第二个或者是128位XMM寄存器或者是64位内存区域。为了方便处理,内存操作数也被解码为128位。
有些指令的助记符要依赖操作数的大小:
不分大小的形式 明确的16位形式 明确的32位形式
PUSHA PUSHAW PUSHAD
POPA POPAW POPAD
LOOP LOOPW LOOPD
LOOPE LOOPWE LOOPDE
LOOPNE LOOPWNE LOOPDNE
PUSHF PUSHFW PUSHFD
POPF POPFW POPFD
IRET IRETW IRETD
您可以改变解码大小敏感助记符[decoding of size-sensitive mnemonics].。根据选项,反汇编器从三种可能中选择之一进行解码。这个选项也会影响汇编器的默认处理方式。
解码MMX和3DNow!指令总是开启的,尽管您的处理器并不支持这些指令。
|