相同变量 x86 的 mov 意外结果

Unexpected result on mov for same variable x86

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

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

我理解内存引用模式的方式,对于mov 0x10(%rdx), %rdx,我们首先取%rdx中的值0x604300,加上0x10它给我们0x604310。现在这是我们应该查看我们想要的值的内存位置。现在,如果我们查看 0x604310,我们会看到答案是 d320x20。现在,我们将此值移动到 %rdx

但是,执行此命令并移至下一行后,我打印了 $rdx 的值,它是 d63086400x604320

这怎么可能?我的理解有缺陷吗?我一头雾水

您的 x 命令只转储了 1 个字节,但您的 mov 指令加载了 8 个字节。低字节是0x20,因为x86是little-endian。 (您的手动地址计算是正确的)。

使用 help x 查看可以为不同大小使用哪些修饰符,并转储多个元素。

当您使用 print $rdx 时,那是 十进制 而不是十六进制。很巧的是低2位是40也就是similar-looking到0x20。 (但是您已经知道了,是的,十六进制表示确实以 0x20 结尾)。

使用 p /x $rdx 以十六进制打印注册值。或使用layout reg使用TUI模式反汇编并在终端内注册"windows"。

另外,我建议使用 si(步进指令)而不是 ni,后者会跳过调用。但是,如果您知道它们的作用,那么两者都可以,只要您避免 ns 在您打算按说明逐步执行时按 C 源代码行进行逐步执行。