Skip to content

Latest commit

 

History

History
executable file
·
25 lines (17 loc) · 835 Bytes

File metadata and controls

executable file
·
25 lines (17 loc) · 835 Bytes

函数的序幕,是像下面这样的代码片段:

push  ebp
mov   ebp, esp
sub   esp, X

这些指令做了什么:将寄存器EBP的值入栈,将ESP赋值给EBP,在栈中分配空间, 用来保存局部变量。

在函数执行过程中,EBP是固定的,可以用来访问局部变量和函数参数。也可以使用 ESP,但在函数运行过程中,ESP会变化,使用起来不方便。

mov  esp, ebp
pop  ebp
ret  0

3.1 递归

函数调用开始和结束使递归变得难以理解。

举个例子,有一次我写了一个函数遍历二叉树右侧节点。使用了看起来很高⼤上的递归函数,但由于每次函数调用开始和结束都需要花费很长时间,它运行速度比迭代方 式要慢好多倍。

顺便提一下,这就是尾部调用存在的原因。