相同变量x86在mov上的意外结果

时间:2019-06-06 16:07:08

标签: assembly x86 gdb disassembly

我正在GDB中调试一些C代码,并将其反汇编为x86代码。这是代码段

enter image description here 请注意,为了理解,我在控制台中编写了下一个命令-下一个命令是mov 0x10(%rdx),%rdx`

我了解内存引用模式的方式,对于mov 0x10(%rdx), %rdx,我们首先获取%rdx中的值0x604300,然后向其中添加0x10,得到{{ 1}}。现在,这是我们应该寻找所需值的存储位置。现在,如果我们查看0x604310的内部,我们会看到答案是0x604310d32。现在,我们将该值移至0x20

但是,执行此命令并移至下一行后,我将打印$ rdx的值,其值为%rdxd6308640

这怎么可能?我的理解有缺陷吗?我一无所知。

1 个答案:

答案 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来代替通话。但是,只要您知道它们的作用,就可以了,只要在您打算按指令操作时避免ns步入C源代码行即可。