2017-08-15 61 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