非常大的地址复制为负值

Very large address copied as negative value

我正在浏览一个对应于 C 程序的二进制文件。
我在 %eax.
中存储了一个非常大的地址 当试图通过 gdb 查看值时,它会打印一个负值(原因 here)。

现在执行mov %eax, 0x4c(%esp)时,0x4c(%esp)中的结果值有时为正有时为负。这个效果cmp [=14=], 0x4c(%esp)后面的语句!

有人可以解释一下这种行为吗?

如果这有帮助:
core: ELF 32-bit LSB core file Intel 80386, version 1 (SYSV), SVR4-style

寄存器没有符号;他们持有位。这取决于你如何解释它们。堆栈也是如此:它保存位,如何解释它们取决于您。如果将值从寄存器移动到堆栈,则会复制这些位。如果你像解释寄存器中的位一样解释堆栈中的位,你会得到相同的值。

请注意, 条指令将这些位解释为值 - 乘法、比较等。但是 MOV 不是其中之一。

您复制的位序列始终相同,但解释可能不同,可能 gdb 默认为二进制补码 32 位值

如何更改 gdb 输出格式:

https://sourceware.org/gdb/onlinedocs/gdb/Output-Formats.html

如果在GDB中使用如下命令:

print $esp-0x4c

您实际上显示的是 地址 -0x4c(%esp)(即:寄存器的值 esp 加上偏移量 -0x4c)和 不是位于此地址的内容。为了显示 -0x4c(%esp) 内容 (即:查看此地址 的实际内容),您可以使用 x命令:

x $esp-0x4c