我知道嵌套函数调用中的数据会转到堆栈.堆栈本身实现了一个逐步的方法,用于在函数被调用或返回时从堆栈中存储和检索数据.这些方法的名称大多称为Prologue和结语.
我试图搜索关于这个主题的材料没有成功.你们知道关于函数序言和结语如何在C中起作用的任何资源(网站,视频,文章)吗?或者,如果你能解释会更好.
PS:我只是想要一些一般的观点,不是太详细.
Jon*_*art 18
有很多资源可以解释这个:
仅举几例.
基本上,正如您所描述的那样,"堆栈"在执行程序时有多种用途:
延长是在函数开始时发生的事情.它的职责是设置被调用函数的堆栈帧.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)
| 归档时间: |
|
| 查看次数: |
15988 次 |
| 最近记录: |