C语言中的功能序言与结语

use*_*665 11 c c++

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

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

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

Jon*_*art 18

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

仅举几例.

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

  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
Run Code Online (Sandbox Code Playgroud)

在这一点上,我们有:

...
ebp + 4:    Return address
ebp + 0:    Calling function's old ebp value
ebp - 4:    (local variables)
...
Run Code Online (Sandbox Code Playgroud)

结语:

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.
Run Code Online (Sandbox Code Playgroud)