我正在浏览一个与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
答案 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