`

函数调用的过程

 
阅读更多

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]  

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics