c语言 :函数调用时,栈的变化问题————(有请高手高手高高手) 100
有如下一个例子:voidfuncA(int,int);voidfuncB(int);voidmain(){inta=6,b=12;funcA(a,b);}voidfunc...
有如下一个例子:
void funcA(int,int);void funcB(int);
void main(){ int a=6,b=12; funcA(a,b);}
void funcA(int aa,int bb){ int n=5; //... funcB(n);}
void funcB(int s){ int x; //...}
栈的详细内容如下图所示:
书上说:当主函数调用 funcA()时,funcA()着手保护调用函数的地址等数据,分配两个形参的空间,将主函数的实参传递过来,所以funcA()中的形参aa和bb分别为6和12。
我想问的是:实参a和b是怎样传递给形参aa和bb的?将实参a和b的值传递给形参aa和bb这个过程中,实参a和b不需要出栈吧? 展开
void funcA(int,int);void funcB(int);
void main(){ int a=6,b=12; funcA(a,b);}
void funcA(int aa,int bb){ int n=5; //... funcB(n);}
void funcB(int s){ int x; //...}
栈的详细内容如下图所示:
书上说:当主函数调用 funcA()时,funcA()着手保护调用函数的地址等数据,分配两个形参的空间,将主函数的实参传递过来,所以funcA()中的形参aa和bb分别为6和12。
我想问的是:实参a和b是怎样传递给形参aa和bb的?将实参a和b的值传递给形参aa和bb这个过程中,实参a和b不需要出栈吧? 展开
3个回答
展开全部
其实想知道这些东西,单从C代码上是看不出什么来的。反汇编后看汇编代码一清二楚。当一个父函数调用子函数时,在父函数中先将子函数用到的参数压入堆栈,然后再以一个call指令调用子函数。而call指令其实要做两件事:将自己的EIP值压入堆栈;以一个jmp跳转到子函数代码的开始位置。而在子函数内,首先就是这样:
MOV EBP,ESP
SUB ESP,0x100
... ...
也就是要将当前ESP保存到EBP,然后用一个SUB指令开辟子函数所用的局部内存空间。子函数对父函数的参数的引用一般都是EBP+4,EBP+8这样的,这样刚好就能访问父函数压入堆栈的参数。而对自己申明的参数的访问,就是EBP-0,EBP-4等等。对汇编不太熟悉的只从C代码的逻辑上去分析这样的问题,而实际情况是C代码要转换成机器代码,机器代码做的一些工作只有在汇编中能看到。堆栈就是一个传递参数的内存块,编译器在编译代码时,自动生成了子函数访问父函数参数的代码。
不知道这样说能不能帮你解决问题。
MOV EBP,ESP
SUB ESP,0x100
... ...
也就是要将当前ESP保存到EBP,然后用一个SUB指令开辟子函数所用的局部内存空间。子函数对父函数的参数的引用一般都是EBP+4,EBP+8这样的,这样刚好就能访问父函数压入堆栈的参数。而对自己申明的参数的访问,就是EBP-0,EBP-4等等。对汇编不太熟悉的只从C代码的逻辑上去分析这样的问题,而实际情况是C代码要转换成机器代码,机器代码做的一些工作只有在汇编中能看到。堆栈就是一个传递参数的内存块,编译器在编译代码时,自动生成了子函数访问父函数参数的代码。
不知道这样说能不能帮你解决问题。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询