c语言 :函数调用时,栈的变化问题————(有请高手高手高高手)

2025-03-07 08:45:06
推荐回答(3个)
回答1:

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

回答2:

  1. 有机会直接看 汇编就一目了然了

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

  3. a,b不需要出栈

回答3:

这个哪本书误人子弟啊 这个模型彻头彻尾是50-60年前的 现代模型不是这个样子了
假设这个模型是对的 实参a,b传递给aa,bb实际上就是复制 a,b无需出栈
请看下面这本书吧
现代编译原理 c语言描述