第四章
函数的序幕和清尾
C语言的函数通常使用类似下面的代码片段作为序幕:
push ebp
mov ebp, esp
sub esp, X
这些指令将EBP寄存器的值入栈,然后把ESP赋值给EBP,最后在栈中为局部变量分配一段空间。
在函数执行过程中EBP是固定的,可以用来作为访问局部变量和函数参数的基址。虽然也可以使用ESP,但在函数运行过程中,ESP可能会变化,使用起来不太方便。
函数清尾主要包括:释放栈中分配的空间,恢复EBP寄存器中的值,最后把控制流交由调用者:
mov esp, ebp
pop ebp
ret 0
函数的序幕和清尾代码片段通常被反汇编器作为函数定义的检测代码。
4.1 递归
函数的序幕和清尾代码片段可能会影响到递归函数的性能。
更多的信息请查看36.3一章。