三,反組譯碼器[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!指令總是開啟的,儘管您的處理器並不支援這些指令。