我正在编写一个反汇编程序,我正在查看指令格式(并手动进行一些反汇编),然后我遇到了一条似乎无法解码的指令。
该特定指令的输出(来自objdump)是:
c6 05 14 a0 04 08 01 movb $0x1,0x804a014
但是,我不明白指令是如何解码的,因为操作码c6应该是MOV Eb Ib(Mod R / M到imm8)。
有人可以告诉我它是如何被解码的吗?
谢谢!
答案 0 :(得分:4)
这可以通过Alex Frunze的答案(部分)解释,但他有点简洁,所以我将在这里提供一些解释:
我希望这会有所帮助。
答案 1 :(得分:3)
好吧,立即将移动到并不意味着什么。该指令的作用是将常数1移入位于0x804a014的存储器字节。类似于等效的C代码:
*(unsigned char *)0x804a014 = 1;
你知道,你有操作码c6
。您可以将其作为Volume 2A of the docs中MOV
指令的一部分进行查找。
05
是ModR / M字节。您可以使用Table 2-2 of volume 2A,“使用ModR / M字节的32位寻址表”来解密。在图表的“ModR / M字节值(以十六进制表示)”部分中查找05
。从那里开始跟踪,你会看到这个ModR / M值的有效地址以'disp32'形式给出。那里的脚注说“disp32命名法表示跟随ModR / M字节的32位位移”。在这种情况下,这是指令的下四个字节:14 a0 04 08
。
最后,你有8位立即01
,完整的指令被解码。
答案 2 :(得分:3)
c6 - 操作码(Mod / RM字节中还有一部分操作码,在/ digit(reg)字段中)
05 - Mod / RM字节(mod = 00b,r / m = 101b,/ digit(reg)= 0 - 操作码的一部分)
14 a0 04 08 - disp32
01 - imm8
从mov
到Ib
是Eb
。您可能会混淆AT& T语法,其中objdump显示反汇编,以及Intel / AMD文档。 AT& T语法中的操作数顺序与x86 CPU手册中的顺序相反。