C语言在函数调用的过程中的参数到底是怎么传递的,传值和传参数的差别在哪里,我从最简单的过程开始,让自己复习一下。
如果我们不采用方法调用,正常的计算过程是这样的。
int a = 9; int b =8; int c = a+b;
其对应的汇编代码如下:
int a = 9; 000913BE mov dword ptr [a],9 int b =8; 000913C5 mov dword ptr [b],8 int c = a+b; 000913CC mov eax,dword ptr [a] 000913CF add eax,dword ptr [b] 000913D2 mov dword ptr [c],eax
这个过程都非常简单,也很容易理解,计算的过程没有额外的开销。下面把a+b的过程封装成一个函数int add(int,int);
对应的汇编代码如下:
int c = add(a,b);这个是调用前的准备工作,将参数从右到左压入堆栈 009617EC mov eax,dword ptr [b] //将b压入堆栈 009617EF push eax 009617F0 mov ecx,dword ptr [a] //将a压入堆栈 009617F3 push ecx 009617F4 call add (09611D6h) //调用add方法 009617F9 add esp,8 009617FC mov dword ptr [c],eax
下面是add的方面内部的过程
009613A0 push ebp 009613A1 mov ebp,esp 009613A3 sub esp,0C0h 009613A9 push ebx 009613AA push esi 009613AB push edi 009613AC lea edi,[ebp-0C0h] 009613B2 mov ecx,30h 009613B7 mov eax,0CCCCCCCCh 009613BC rep stos dword ptr es:[edi]
return a+b; 009613BE mov eax,dword ptr [a] 009613C1 add eax,dword ptr [b]
本文详细解析了C语言中函数参数的传递方式,通过具体的示例代码对比了直接操作变量与通过函数调用的方式,并展示了对应的汇编代码,帮助读者深入理解C语言中的传值调用。
491

被折叠的 条评论
为什么被折叠?



