c语言参数传递过程,C语言函数参数传递过程

下面通过一个简单的c函数调用分析参数的传递及返回过程。

示例代码

#include

int plus(int x,int y){

return x+y;

}

int main(){

__asm{

mov eax,eax

}

//调用函数

plus(1,2);

return 0;

}

通过在VC6中观察反汇编代码,如下

15: //调用函数

16: plus(1,2);

0041065A push 2

0041065C push 1

0041065E call @ILT+5(plus) (0040100a)

00410663 add esp,8

4: int plus(int x,int y){

00401010 push ebp

00401011 mov ebp,esp

00401013 sub esp,40h

00401016 push ebx

00401017 push esi

00401018 push edi

00401019 lea edi,[ebp-40h]

0040101C mov ecx,10h

00401021 mov eax,0CCCCCCCCh

00401026 rep stos dword ptr [edi]

5:

6: return x+y;

00401028 mov eax,dword ptr [ebp+8]

0040102B add eax,dword ptr [ebp+0Ch]

7: }

0040102E pop edi

0040102F pop esi

00401030 pop ebx

00401031 mov esp,ebp

00401033 pop ebp

00401034 ret

通过逐行分析堆栈变化画出相应堆栈图变化可以清楚的了解函数的调用过程

d5c62f31fd1829b12cb257b62bc38e29.png

c1cd2f4c07c6834ee66a9a185e8b62f1.png

036f19967de40a0147547f99847a1151.png

通过分析可知:

1)c语言函数调用参数通过堆栈进行传递,从左到右压入堆栈

2)返回值保存到了eax中(本例),最终保持了堆栈平衡

3)堆栈中的数据没有清除,变成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值