相同变量 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
,我们会看到答案是 d32
或 0x20
。现在,我们将此值移动到 %rdx
。
但是,执行此命令并移至下一行后,我打印了 $rdx 的值,它是 d6308640
或 0x604320
。
这怎么可能?我的理解有缺陷吗?我一头雾水
您的 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
,后者会跳过调用。但是,如果您知道它们的作用,那么两者都可以,只要您避免 n
和 s
在您打算按说明逐步执行时按 C 源代码行进行逐步执行。
我正在 GDB 中调试一些 C 代码,并将其反汇编为 x86 代码。这是片段
我理解内存引用模式的方式,对于mov 0x10(%rdx), %rdx
,我们首先取%rdx
中的值0x604300
,加上0x10
它给我们0x604310
。现在这是我们应该查看我们想要的值的内存位置。现在,如果我们查看 0x604310
,我们会看到答案是 d32
或 0x20
。现在,我们将此值移动到 %rdx
。
但是,执行此命令并移至下一行后,我打印了 $rdx 的值,它是 d6308640
或 0x604320
。
这怎么可能?我的理解有缺陷吗?我一头雾水
您的 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
,后者会跳过调用。但是,如果您知道它们的作用,那么两者都可以,只要您避免 n
和 s
在您打算按说明逐步执行时按 C 源代码行进行逐步执行。