2013-05-22 56 views
4

我是新來組裝,然後我碰到這個article訪問堆棧幀

來到它說,這個代碼

void MyFunction() 
{ 
    int a, b, c; 
    a = 10; 
    b = 5; 
    c = 2; 

相當於該

push ebp  ; save the value of ebp 
mov ebp, esp ; ebp now points to the top of the stack 
sub esp, 12 ; space allocated on the stack for the local variables 
mov [ebp - 4], 10 ; location of variable a 
mov [ebp - 8], 5 ; location of b 
mov [ebp - 12], 2 ; location of c 

根據這個video,要訪問基址指針上面的堆棧的值,我們應該添加。如果它低於指針,我們應該減去。考慮到上面的例子,他們從基指針中減去一些東西來移動所需變量的位置,這與視頻中所述的內容相反。

我錯過了什麼?我知道sub esp 12爲局部變量分配一個空間,所以我想到的是EBP低於這個分配,所以我認爲它應該是[ebp + something]而不是減去。

因此,當他做了這個亞esp,12,這是堆棧的樣子。

  ESP is here 
|  2 | Ebp + 12 
|  5 | Ebp + 8 
|  4 | Ebp + 4 
|   | Old EBP value 

是文章錯誤,還是我誤拼了?

回答

6

使用ebp的原因是esp會改變,例如,將參數傳遞給子例程。所以你的ebp將使你能夠使用相同的偏移量訪問相同的變量,而不管esp指向那一刻。

當您在棧上壓入值時,其值會減少;當你彈出時增加。

該代碼減去12(4 * 3),爲3個32位(4字節)整數騰出空間。 Ebp指向「底部」,其中ESP是之前的。因此,您使用負偏移訪問變量,例如EBP-4。所以你的圖片是錯誤的:ebp +無論你的代碼不應該使用什麼點。

 BEFORE 

    lower address 
    | 
    |<-------------- esp (=ebp after mov ebp, esp) 
    | 
    | 
    higher address 


    AFTER mov ebp, esp; sub esp, 12 

    lower address 
    |<-------------- esp 
    | 
    | 
    |<-------------- ebp 
    | 
    | 
    higher address 


    AFTER mov [ebp-4], 10 ecc. 

    lower address 
    | 2 <-------------- esp 
    | 5 
    | 10 
    |<-------------- ebp 
    | 
    | 
    higher address 

這時[esp]將檢索[EBP-12]即2

+0

所以這是肯定地說,什麼是在視頻中提到是錯誤的?我已經掌握了Stack的概念,但是當我觀看視頻時,我感到困惑。根據視頻,要訪問基本指針以上的值或任何內容,您應該添加一些內容給EBP。要從基指針下訪問任何東西,我們應該從EBP中減去。 ?? –

+0

我現在看不到視頻;假設「高於」意味着「遞減地址」,答案顯而易見:要訪問指針指向的「之前」(它位於「之上」)的內容,必須減少指針。反之,你必須增加它。 (在你的**中,從下面訪問任何東西的意義並不清楚...... **) – ShinTakezou

+0

這很好。此外,除了視頻,我已閱讀的所有文章都說我需要這樣做[EBP - 無論如何]以獲得高於EBP的價值。謝謝。現在很清楚。 :d –

2

stack-pointer(基指針)地址向下「增長」,朝向地址空間中的較低地址。
你的堆棧開始於例如0x70000000,當你push東西在上面時,esp (ebp)將會降低dword - >0x6ffffffc(如果我是正確的)。

參見hereherehere