Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何反汇编movb指令_Assembly_X86_Disassembly_Objdump_I386 - Fatal编程技术网

Assembly 如何反汇编movb指令

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。您

我正在编写一个反汇编程序,我正在检查指令格式(并手动进行一些反汇编),我遇到了一个似乎无法解码的指令

该特定指令(来自objdump)的输出为:

但是,我不明白指令是如何解码的,因为操作码c6应该是MOV Eb Ib(Mod R/M到imm8)

有人能告诉我它是如何解码的吗

谢谢

好吧,换成立即生效并不意味着什么。该指令的作用是将常量1移动到位于0x804a014的内存字节中。类似于等效的C代码:

*(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的回答(部分)解释了这一点,但他的回答有点简洁,因此我将在这里提供一些解释:

  • 操作码为c6/0,表示指令有2个操作数。一个是r/m 8,表示以mod/rm字节编码的操作数和立即数操作数。两个操作数均为8位宽
  • 操作码中的/0表示操作码的一部分编码在mod/rm字节中。mod/rm字节中的第3-5位是操作码的一部分。当c6后面跟一个mod/rm字节,其位3-5的值为0时,就得到了一个mov操作码
  • 值5(紧跟在c6后面的字节)对应于r/m字节00 000 101(二进制)
  • r/m字节的“最后三个”(位0-2)对应于r/m字段。r/m值为101(5)意味着“使用置换dword”,因此mod/rm字节后的下4个字节构成即时地址
  • 14 a0 04 08是0x0804a014的小端编码
  • 最后一个字节1是要加载到地址中的立即数

  • 我希望这能有所帮助。

    非常感谢您的回答,我完全错过了表中的条目(以某种方式将其作为注册表而不是disp32阅读)。感谢您的回答!这三个都很完整,我不喜欢只选一个,因为它们都回答了我的问题。是的,我仍然把它们混淆了很多(使用不同的参考文献的结果),很抱歉混淆了。谢谢你的回答。
    *(unsigned char *)0x804a014 = 1;