我知道嵌套函数调用中的数据会转到堆栈。堆栈本身实现了一种逐步的方法,用于在函数被调用或返回时存储和检索堆栈中的数据。名称这些方法中最有名的是序言和后记。C中的函数序言和后记
我试过没有成功搜索这个主题的材料。你们知道任何资源(网站,视频,文章)关于函数序言和结尾在C中如何工作吗?或者如果你能解释会更好。
P.S:我只是想要一些普遍的看法,不是太详细。
我知道嵌套函数调用中的数据会转到堆栈。堆栈本身实现了一种逐步的方法,用于在函数被调用或返回时存储和检索堆栈中的数据。名称这些方法中最有名的是序言和后记。C中的函数序言和后记
我试过没有成功搜索这个主题的材料。你们知道任何资源(网站,视频,文章)关于函数序言和结尾在C中如何工作吗?或者如果你能解释会更好。
P.S:我只是想要一些普遍的看法,不是太详细。
有很多资源,在那里,解释这一点:
仅举几例。
基本上,你有所描述,“堆”在程序的执行有几个目的:
该函数是在函数开始时发生的。其职责是设置被调用函数的堆栈帧。 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 Call Conventions and the Stack很好地解释了这一概念一个调用堆栈
Function prologue简要说明汇编代码和方法及理由。
每个函数都有一个相同的开端和结尾(函数的结束)(的函数代码的起始)。
序章:序章的结构是这样的: 推EBP MOV ESP,EBP
结语:序章的结构是这样的: 离开 RET
取决于调用约定 –
您可以搜索编译器和代码生成的材料。 –