函式呼叫過程(棧幀)
阿新 • • 發佈:2019-02-09
函式呼叫過程詳解
原始碼#include<stdio.h>
int add(int x,int y)
{
int c=x+y;
return c;
}
int main()
{
int a=0xaaaaaaaa;
int b=0xbbbbbbbb;
int c=add(a,b);
printf("you should run here:%d\n",c);
system("pause");
return 0;
}
1、1將a壓入ebp-4的棧位置,將b壓入ebp-8的位置
2mov EAX,b;push EAX
mov ECX,a;push ECX
3call指令:1、將當前所執行指令的下一條指令地址壓棧
2、修改EIP值,跳轉到目標函式的入口地址
4pushebp
將函式棧底指標壓棧
5mov EBP,ESPEBP同ESP指向同一位置
subESP,44hESP地址下移
6將a(ebp+8)送入eax
將eax+b(ebp+12)送入eax,然後將eax壓棧,將c返回值送入eax中
7 movesp,ebp8pop ebp出棧 main函式棧底送入ebp中9 ret指令:當前棧頂返回值地址出棧,將彈出地址存入eip(00401093)10 esp+8;恢復main函式棧幀mov eax:存入main函式棧幀中