And*_*zos 5 linux x86 assembly
我在objdump -d
x86 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"取决于其他因素.