2014-01-24 32 views
1

我想知道var_10 = dword ptr -10h是什麼意思? 我知道這意味着我有一個指向雙字變量的指針, 但-10h是什麼意思(地址如何可以減號)? 代碼:彙編變量聲明含義

main proc near 
var_10 = dword ptr -10h 
push ebp 
mov ebp, esp 
and esp, 0FFFFFFF0h 
sub esp, 10h 

mov eax, offset aHelloWorld ; "hello, world" 
mov [esp+10h+var_10], eax 
call _printf 

mov eax, 0 
leave 
retn 
main endp 
+0

你可以發佈你看過的代碼嗎?這可能是一個必須添加到某些索引寄存器的偏移量,例如EBP –

回答

0

我沒有分給一個評論,所以我把這個作爲一個解決方案。我相當肯定你可以做直接尋址,並且不需要寄存器(即ebp)來解決。如果我錯了,有人糾正我,但我相信-10h是指代碼從數據段,代碼段或其他段的偏移量爲-10h加載的相對段。有人告訴我,如果我在正確的軌道上? 您似乎缺少的代碼是包含db「hello world」變量的數據段。

2

dword ptr-10h的組合確實很奇怪。前者提出一個地址,後者是一個位移或偏移量。在您發佈的代碼,var_10只使用一次:

mov [esp+10h+var_10], eax 

我想彙編器將擴展爲:

mov dword ptr [esp + 10h - 10h], eax 

相當於擁有了:

mov dword ptr [esp], eax 

因此,組合似乎是有道理的,只是各個組件都很奇怪。

這個特殊函數處理堆棧的方式令人費解。尤其是這些操作的指令:

and esp, 0FFFFFFF0h 
sub esp, 10h 

什麼情況是,16個字節的塊被分配在堆棧上,對準的16個字節(可能犧牲小片的堆疊空間到那裏)最接近的倍數。

內部的16字節的塊中,我們填充頂部DWORD(即最靠近疊層的新的頂部的4個字節)用的指針「世界你好」字符串:

mov eax, offset aHelloWorld 
mov [esp+10h+var_10], eax 

另16字節塊中的12個字節保持未初始化;他們很可能充滿了隨機垃圾。

最後,我們調用_printf,這明顯地發現字符串指針是堆棧中的第一個參數。這個電話應該沒問題。

在實踐中,你可以這樣做,以及:

mov eax, offset aHelloWorld 
push eax 
call _printf 

你的貼吧功能,似乎完全準備採取128位架構的優勢。奇怪的。

我最好猜測:這段代碼是生成的;不是手寫的。