C函数调用的栈内容分析

来源:互联网 发布:大数据服务器搭建 编辑:程序博客网 时间:2024/05/15 14:05

C中函数默认使用_cdecl方式,即函数的参数是从右到左方式进行压栈。

 

 

int main(int argv,char*argc[]){   int a , b.   Printf("hello world");}

压栈的顺序

SP (main 函数的return address)

a   (4 字节)

b   (4字节)

char*  (4字节)

SP (Printf 函数的return address)

....   (Pritnft 内部声明的变量)

 

 

 

函数的压栈顺序为

最右参数

...

最左参数

SP 函数return address

局部变量 从上至下

例如

void swap (int *x, int *y){   int temp = *x    *x = *y;   *y = temp;}int main (){   int a = 6;   int b = 8;   swap(&a,&b);}

 

1.  压a入栈

2.  压b入栈

3   压b的地址入栈

4   压a的地址入栈

call swap   压函数的返回地址入栈 

压temp 入栈

 

 

弹出temp

RET (弹出函数的返回地址,控制权重新到main函数)

弹出swap的参数以及main函数的局部变量

 

SP = SP-4

R1 =SP

SP=SP

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击