C语言中的function序言与结语

我知道嵌套函数调用中的数据会转到堆栈。堆栈本身实现了一个逐步的方法,用于在函数被调用或返回时从堆栈中存储和检索数据。这些方法的名称最常见的是Prologue和结语。

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

PS:我只是想要一些一般性观点,不太详细。

有很多资源可以解释这个:

  • function序幕 (维基百科)
  • x86反汇编/调用约定 (WikiBooks)
  • 编写Prolog / Epilog代码 (MSDN)的注意事项

仅举几例。

基本上,正如您所描述的那样,“堆栈”在执行程序时有多种用途:

  1. 在调用函数时,跟踪返回的位置
  2. 在函数调用的上下文中存储局部变量
  3. 将参数从调用函数传递给被调用者。

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

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

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

然后执行序言:

 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. C函数调用约定和堆栈很好地解释了调用堆栈的概念

  2. function序言简要介绍了汇编代码以及方法和原因。

  3. 关于函数perilogues的一代

每个函数都有相同的序言(函数代码的开头)和结尾(函数的结尾)。

序言:Prologue的结构如下:push ebp mov esp,ebp

结语:Prologue的结构如下:离开ret

更详细: 什么是Prologue和Epilogue