2017-10-09 196 views
0

我看到這種情況下,從一個網站:如何進行地址計算?

cmpl $0x0,-0x20(%ebp) 

jne xxx (program terminated so -0x20(%ebp) == 0) 

cmpl $0x1,-0x1c(%ebp) 

jne xxx (program terminated so -0x1c(%ebp) == $1) 

則:

lea -0x18(%ebp),%ebx 

mov -0x4(%ebx),%eax 

該網站說,EAX%= -0x4(%EBX)= -1C(%EBP)== $ 0

所以我不知道爲什麼-0x4(-0x18(%ebp))等於-1c(%ebp) 請幫忙,謝謝!

+1

0x18 + 0x4 = 0x1c。 (十進制,24 + 4 = 28)。這就是你要問的嗎? –

+1

這聽起來像網站試圖傳達,你可以從寄存器ebx和ebp中存儲的兩個不同的基地址讀取相同的內存位置,但誰知道你沒有提供足夠的信息。 – Rafael

+1

它真的說-1c(%ebp)是0,還是一個錯字?因爲在代碼第4行的註釋中,它表示它是1. – prl

回答

2

所以我不知道爲什麼-0x4(-0x18(%ebp))將等於-1c(%ebp)請幫忙,謝謝!

字面上採取的-0x4(-0x18(%ebp))在x86彙編語法中沒有任何意義,所以它也不能等於-1c(%ebp)

因此,它取決於您在「-0x4(-0x18(%ebp))」下了解的內容。

有兩種邏輯方法來評估(猜測你的意思)。

1)取消引用ebp-0x18,並使用內存中的值(來自您的問題未知)作爲內存地址,將其調整爲-4並將該地址再次解除引用=這與您提供的其餘問題文本和代碼無關,所以如果你這樣理解,你會走錯方向。

2)計算值ebp-0x18,然後再添加-0x4,然後將該值解引用爲內存地址(內存中的加載值)=這是更明智的一個,與您發佈的其他內容相關聯。即只有一個解引用發生。它不會使這個表達式成爲有效的ASM語法,只是像這樣評估纔有意義。

然後最後的地址等於ebp - 0x18 - 0x04,可以簡化爲ebp - 0x1C。正如Peter Corder評論的那樣,它就像24 + 4 = 28(0x18 + 0x04 = 0x1C)一樣簡單。

如果你確實瞭解它,如1)所述,那麼你可能誤解了lea指令?目前已經有一些關於它的SO問題:
What's the purpose of the LEA instruction?(有幾個很好的答案,每個加入一些細節)
What is the difference between MOV and LEA?

綜上所述,lea確實使用內存操作數mov相同的語法,但之後將會計算內存地址(與mov指令相同),它將在那裏停止並將地址值本身放入目標寄存器中。它不接觸內存芯片的價值(無需解除引用)。 mov指令繼續向前,從存儲器獲取最終值,並將其存儲到目標寄存器中。

最後,如prl所述,通過代碼的第一部分,地址ebp-0x1c的內存值爲1,而不是0.必須是您身邊的錯字或網絡作者。也許在第一個版本中,他確實使用-0x1c作爲lea,然後mov將從ebp-0x20獲取0。然後通過引入第三個偏移量-0x18並忘記調整mov偏移量爲-8或結果爲1來使其不那麼明顯?只是猜測。