函数调用时的堆栈存储

时间:2010-04-09 02:41:31

标签: c memory-management

当我们调用一个函数(假设有3个参数)时,变量如何存储在堆栈内存中。

2 个答案:

答案 0 :(得分:4)

它完全依赖于实现,如何将参数传递给函数。

函数参数甚至可能不会在堆栈上传递;例如,它们可以通过寄存器传递。

您需要查找特定平台的信息,以确定如何传递参数。维基百科有一整页专门用于the various x86 calling conventions

答案 1 :(得分:1)

当参数被推入堆栈时,C从右到左执行此操作。但是,根据体系结构和参数数量,可能不会使用堆栈(或仅部分使用堆栈),而是使用寄存器。

为了论证,让我们说我们正在处理x86架构(32位)。堆栈框架看起来像......

(Stack grows down.  High stack address is here)
arg3
arg2
arg1
ret addr         <--- Auto pushed by 'call'
old base ptr     <--- Called function typically saves the old base ptr
...              <--- Carve space for local variables
(Low stack address is here.)

继续上面的例子,被调用的函数可以使用以下内容访问参数...

movl  8(%ebp), %eax    // move arg1 into EAX
movl  12(%ebp), %edx   // move arg2 into EDX

等等。

如果我没记错的话,PowerPC有八(8)个寄存器可用于传递参数 - r3 ... r10包含。至于其他架构,你必须查找它们。

希望这有帮助。