2013-02-08 18 views
6

我知道嵌套函数调用中的数据会转到堆栈。堆栈本身实现了一种逐步的方法,用于在函数被调用或返回时存储和检索堆栈中的数据。名称这些方法中最有名的是序言和后记。C中的函数序言和后记

我试过没有成功搜索这个主题的材料。你们知道任何资源(网站,视频,文章)关于函数序言和结尾在C中如何工作吗?或者如果你能解释会更好。

P.S:我只是想要一些普遍的看法,不是太详细。

+0

您可以搜索编译器和代码生成的材料。 –

回答

13

有很多资源,在那里,解释这一点:

仅举几例。

基本上,你有所描述,“堆”在程序的执行有几个目的:

  1. 保持跟踪到哪里返回,调用函数
  2. 存储局部变量的时候在函数调用的情况下
  3. 将调用函数的参数传递给被调用者。

该函数是在函数开始时发生的。其职责是设置被调用函数的堆栈帧。 epilog恰恰相反:它是函数中最后发生的事情,其目的是恢复调用(父)函数的堆栈框架。

在IA-32(x86)cdecl中,该语言使用ebp寄存器来跟踪函数的堆栈帧。处理器使用esp寄存器指向堆栈上最近的加法(最高值)。

call指令执行两件事:首先它将返回地址压入堆栈,然后跳转到被调用的函数。在call之后,esp立即指向堆栈上的返回地址。

然后序幕执行:

push ebp   ; Save the stack-frame base pointer (of the calling function). 
mov ebp, esp ; Set the stack-frame base pointer to be the current 
        ; location on the stack. 
sub esp, N  ; Grow the stack by N bytes to reserve space for local variables 

在这一点上,我们有:

... 
ebp + 4: Return address 
ebp + 0: Calling function's old ebp value 
ebp - 4: (local variables) 
... 

的结语:

mov esp, ebp ; Put the stack pointer back where it was when this function 
        ; was called. 
pop ebp   ; Restore the calling function's stack frame. 
ret    ; Return to the calling function. 
-1

每个函数都有一个相同的开端和结尾(函数的结束)(的函数代码的起始)。

序章:序章的结构是这样的: 推EBP MOV ESP,EBP

结语:序章的结构是这样的: 离开 RET

更详细:what is Prologue and Epilogue

+0

取决于调用约定 –