C语言中的function序言与结语
我知道嵌套函数调用中的数据会转到堆栈。堆栈本身实现了一个逐步的方法,用于在函数被调用或返回时从堆栈中存储和检索数据。这些方法的名称最常见的是Prologue和结语。
我试图搜索关于这个主题的材料没有成功。 你们知道关于函数序言和结语如何在C中起作用的任何资源(网站,video,文章)吗? 或者,如果你能解释会更好。
PS:我只是想要一些一般性观点,不太详细。
有很多资源可以解释这个:
- function序幕 (维基百科)
- x86反汇编/调用约定 (WikiBooks)
- 编写Prolog / Epilog代码 (MSDN)的注意事项
仅举几例。
基本上,正如您所描述的那样,“堆栈”在执行程序时有多种用途:
- 在调用函数时,跟踪返回的位置
- 在函数调用的上下文中存储局部变量
- 将参数从调用函数传递给被调用者。
延长是在函数开始时发生的。 它的职责是设置被调用函数的堆栈帧 。 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.
-
C函数调用约定和堆栈很好地解释了调用堆栈的概念
-
function序言简要介绍了汇编代码以及方法和原因。
-
关于函数perilogues的一代
每个函数都有相同的序言(函数代码的开头)和结尾(函数的结尾)。
序言:Prologue的结构如下:push ebp mov esp,ebp
结语:Prologue的结构如下:离开ret
更详细: 什么是Prologue和Epilogue