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不需要出栈吧?
展开
 我来答
fengswd
2013-12-04
知道答主
回答量:0
采纳率:0%
帮助的人:0
展开全部
其实想知道这些东西,单从C代码上是看不出什么来的。反汇编后看汇编代码一清二楚。当一个父函数调用子函数时,在父函数中先将子函数用到的参数压入堆栈,然后再以一个call指令调用子函数。而call指令其实要做两件事:将自己的EIP值压入堆栈;以一个jmp跳转到子函数代码的开始位置。而在子函数内,首先就是这样:
MOV EBP,ESP
SUB ESP,0x100
... ...
也就是要将当前ESP保存到EBP,然后用一个SUB指令开辟子函数所用的局部内存空间。子函数对父函数的参数的引用一般都是EBP+4,EBP+8这样的,这样刚好就能访问父函数压入堆栈的参数。而对自己申明的参数的访问,就是EBP-0,EBP-4等等。对汇编不太熟悉的只从C代码的逻辑上去分析这样的问题,而实际情况是C代码要转换成机器代码,机器代码做的一些工作只有在汇编中能看到。堆栈就是一个传递参数的内存块,编译器在编译代码时,自动生成了子函数访问父函数参数的代码。
不知道这样说能不能帮你解决问题。
匿名用户
2013-12-04
展开全部
  1. 有机会直接看 汇编就一目了然了

  2.  其实就是把 a,b传给了两个寄存器

  3. a,b不需要出栈

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
南瓜猪的的的
2013-12-04
知道答主
回答量:0
采纳率:0%
帮助的人:0
展开全部
这个哪本书误人子弟啊 这个模型彻头彻尾是50-60年前的 现代模型不是这个样子了
假设这个模型是对的 实参a,b传递给aa,bb实际上就是复制 a,b无需出栈
请看下面这本书吧
现代编译原理 c语言描述
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
?>

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式