我正在GDB中调试一些C代码,并将其反汇编为x86代码。这是代码段
请注意,为了理解,我在控制台中编写了下一个命令-下一个命令是mov 0x10(%rdx),%rdx`
我了解内存引用模式的方式,对于mov 0x10(%rdx), %rdx
,我们首先获取%rdx
中的值0x604300
,然后向其中添加0x10
,得到{{ 1}}。现在,这是我们应该寻找所需值的存储位置。现在,如果我们查看0x604310
的内部,我们会看到答案是0x604310
或d32
。现在,我们将该值移至0x20
。
但是,执行此命令并移至下一行后,我将打印$ rdx的值,其值为%rdx
或d6308640
。
这怎么可能?我的理解有缺陷吗?我一无所知。
答案 0 :(得分:1)
您的x
命令仅转储了1个字节,但是您的mov
指令却转储了8个字节。低字节是0x20
,因为x86是little-endian。 (您的手动地址计算正确)。
使用help x
查看可用于不同大小的修饰符,并转储多个元素。
当您使用print $rdx
时,它是十进制而不是十六进制。巧合的是,低2位数字是40
,看起来与0x20
类似。 (但是您已经知道了,是的,十六进制表示的确以0x20
结尾)。
使用p /x $rdx
以十六进制打印reg值。或使用layout reg
在拆卸时使用TUI模式,并在终端内注册“窗口”。
我也建议使用si
(以进行指示),而不是ni
来代替通话。但是,只要您知道它们的作用,就可以了,只要在您打算按指令操作时避免n
和s
步入C源代码行即可。