2017-08-15 41 views
2

我正在浏览一个对应于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

你是如何实际显示在'gdb'这些价值观? –

+0

您正在复制的位序列总是相同的,但解释可能会有所不同,可能gdb默认为二进制补码32位值 –

+0

我正在使用'print%eax'显示'%eax' –

回答

4

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

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

+0

plus1用于解释数据和这些数据的解释 –

+0

但是,当'cmp'使用'0x4c(%esp)'时,我得到了不同的结果。为什么这样? –

+0

@JithinPavithran:我不知道它是什么意思。猜测:你的意思是:紧接着'cmp%eax,0x4c(%esp; jne ...'跳转吗?我不知道为什么这个序列会出现在已编译的C代码中 – MSalters

0

如果你使用GDB以下命令:

print $esp-0x4c 

你实际上是显示个地址-0x4c(%esp)(即:寄存器esp加上偏移-0x4c的值)和位于该地址的内容。为了显示内容-0x4c(%esp)(即:看看什么是真正的在这个地址),您可以使用x命令:

x $esp-0x4c