非常大的地址被复制为负值

时间:2017-08-15 09:56:07

标签: assembly x86 gdb mov

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

现在执行mov %eax, 0x4c(%esp)时,0x4c(%esp)中的结果值有时为正数,有时为负值。随后的效果cmp $0, 0x4c(%esp)声明!

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

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

3 个答案:

答案 0 :(得分:4)

登记册没有迹象;他们持有位。它取决于你如何解释它们。堆栈也是如此:它包含位,并且由您决定如何解释它们。如果将值从寄存器移动到堆栈,则会复制这些位。如果您像解释寄存器中的位一样解释堆栈上的位,则会得到相同的值。

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

答案 1 :(得分:1)

您复制的位序列总是相同的,但解释可能不同,可能gdb默认为2位补码32位值

如何更改gdb输出格式:

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

答案 2 :(得分:0)

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

print $esp-0x4c

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

x $esp-0x4c