天天看點

函數調用過程,棧幀的建立和銷毀

#include<stdio.h>
#include<windows.h>
int myadd (int x,int y)
{
    int z = x + y;
    return z;
}
int main()
{
    int a = ;
    int b = ;
    int c = myadd(a,b);
    printf("you should run here!\n");
    printf("result:%d\n",c);
    system("pause");
    return ;
}
           

最初的棧結構

函數調用過程,棧幀的建立和銷毀

定義a,b

函數調用過程,棧幀的建立和銷毀

将b放在eax,将eax push入棧,esp下移

函數調用過程,棧幀的建立和銷毀

将a放在ecx,将ecx push入棧,esp下移

函數調用過程,棧幀的建立和銷毀

執行call指令,将目前正在執行的指令的下一條位址壓入棧中

函數調用過程,棧幀的建立和銷毀

執行call指令,通過jump指令跳轉到指定函數處,myadd函數的位址是00401020,則eip變為00401020

函數調用過程,棧幀的建立和銷毀

将mian函數的ebp壓入棧底,mov ebp,esp

函數調用過程,棧幀的建立和銷毀

形成一個新空間myadd函數的棧幀

函數調用過程,棧幀的建立和銷毀

将[ebp+8]加上[ebp+0ch]放入eax,再把eax放入[ebp-4]

函數調用過程,棧幀的建立和銷毀

mov esp,ebp

函數調用過程,棧幀的建立和銷毀

将ebp彈出

函數調用過程,棧幀的建立和銷毀

把00401093彈入eip中,esp上移,執行main函數目前執行的指令

函數調用過程,棧幀的建立和銷毀

add esp,8,把eax的值z放入[ebp-0ch],回到最初

函數調用過程,棧幀的建立和銷毀

繼續閱讀