Assembly 如何反汇编movb指令
我正在编写一个反汇编程序,我正在检查指令格式(并手动进行一些反汇编),我遇到了一个似乎无法解码的指令 该特定指令(来自objdump)的输出为: 但是,我不明白指令是如何解码的,因为操作码c6应该是MOV Eb Ib(Mod R/M到imm8) 有人能告诉我它是如何解码的吗 谢谢 好吧,换成立即生效并不意味着什么。该指令的作用是将常量1移动到位于0x804a014的内存字节中。类似于等效的C代码:Assembly 如何反汇编movb指令,assembly,x86,disassembly,objdump,i386,Assembly,X86,Disassembly,Objdump,I386,我正在编写一个反汇编程序,我正在检查指令格式(并手动进行一些反汇编),我遇到了一个似乎无法解码的指令 该特定指令(来自objdump)的输出为: 但是,我不明白指令是如何解码的,因为操作码c6应该是MOV Eb Ib(Mod R/M到imm8) 有人能告诉我它是如何解码的吗 谢谢 好吧,换成立即生效并不意味着什么。该指令的作用是将常量1移动到位于0x804a014的内存字节中。类似于等效的C代码: *(unsigned char *)0x804a014 = 1; 正如您所知,您有操作码c6。您
*(unsigned char *)0x804a014 = 1;
正如您所知,您有操作码c6。您可以在中作为MOV
指令的一部分进行查找
05
是ModR/M字节。您可以使用“带ModR/M字节的32位寻址形式”来破译它。在图表的“ModR/M字节值(十六进制)”部分查找05
。从这里向左跟踪,您将看到这个ModR/M值的有效地址以'disp32'形式给出。脚注中说“disp32术语表示ModR/M字节后的32位位移”。在本例中,这是指令的下四个字节:14 a0 04 08
最后是8位立即数01
,完整的指令被解码。c6-操作码(Mod/RM byte,in/digit(reg)字段中还有一部分操作码)05-Mod/RM字节(Mod=00b,r/m=101b,/位(reg)=0-操作码的一部分)
14 a0 04 08-disp32
01-imm8 它是一个从
Ib
到Eb
的mov
。您可能混淆了AT&T语法(其中objdump显示反汇编)和Intel/AMD文档的语法。AT&T语法中的操作数顺序与x86 CPU手册中的操作数顺序相反。Alex Frunze的回答(部分)解释了这一点,但他的回答有点简洁,因此我将在这里提供一些解释:
我希望这能有所帮助。非常感谢您的回答,我完全错过了表中的条目(以某种方式将其作为注册表而不是disp32阅读)。感谢您的回答!这三个都很完整,我不喜欢只选一个,因为它们都回答了我的问题。是的,我仍然把它们混淆了很多(使用不同的参考文献的结果),很抱歉混淆了。谢谢你的回答。
*(unsigned char *)0x804a014 = 1;