x86指令格式:"ba 0e 00 00 00"..."mov $ 0xe,%edx"

And*_*zos 5 linux x86 assembly

我在objdump -dx86 linux程序的反汇编中得到以下代码...

4000b0: ba 0e 00 00 00          mov $0xe,%edx
Run Code Online (Sandbox Code Playgroud)

我试图理解机器代码"ba 0e 00 00 00"如何映射到"mov $ 0xe,%edx"

在手动移动立即32位是:

B8 + rd  ... MOV r32, imm32
Run Code Online (Sandbox Code Playgroud)

即"B8"而不是"BA"

事实上,没有一个MOV操作码是"BA".

如果有人可以分解"ba 0e 00 00 00"并解释如何获得"mov $ 0xe,%edx",那将是最有帮助的.

srk*_*ing 12

操作码0xba是"MOV EDX,imm32".混淆来自IA手册,在​​呈现指令编码时采用了太多的快捷方式,即使对于像0xba这样的短单字节操作码也是如此.

在IA手册中你会看到:

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

这意味着取0xb8并添加特定r32的编码以获得最终的操作码字节.

具体的r32编码在表2-2的第2A卷中.

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

英特尔参考文献第2C卷的附录A也可以在这些情况下提供帮助.本附录提供了1,2和3字节指令的操作码映射.在您的情况下,查找单字节操作码0xBA,表示该指令是MOV立即进入寄存器rDX,其中宽度"r"取决于其他因素.