2012-06-21 101 views
5

我收到來自86的Linux程序的objdump -d在拆卸以下行...

4000b0: ba 0e 00 00 00   mov $0xe,%edx 

我想了解機器代碼 「BA 0E 00 00 00」 映射到 「MOV $ 0xe,EDX%」

在手動移動即時32位的是:

B8 + rd ... MOV r32, imm32 

即「B8」而非「BA」

實際上MOV操作碼都不是「BA」。

如果有人可以分解「ba 0e 00 00 00」,並且按位解釋如何進入「mov $ 0xe,%edx」,這將是最有幫助的。

回答

12

操作碼0xba是「MOV EDX,imm32」。這種混淆來自IA手冊,它在呈現指令編碼時採用了太多的快捷方式,即使對於像0xba這樣的短單字節操作碼也是如此。

在IA手冊,你會看到:

 
B8+ rd MOV r32, imm32 OI Valid Valid Move imm32 to r32. 

這意味着採取0xb8,並添加特定R32的編碼得到最終的碼字節。

具體的r32編碼在第2A卷表2-2中。在英特爾的參考卷2C

 
EAX 000 = 0 
ECX 001 = 1 
EDX 010 = 2 
EBX 011 = 3 
ESP 100 = 4 
EBP 101 = 5 
ESI 110 = 6 
EDI 111 = 7 

附錄A還可以幫助在這些情況下。本附錄提供了1,2和3字節指令的操作碼映射。在你的情況下,查找單字節操作碼0xBA那裏說,該指令是一個MOV立即進入寄存器rDX,寬度'r'取決於其他因素。

相關問題