离开 foo()
章节大纲
-
现在控制权已经传递给函数foo()。让我们看看函数返回时堆栈会发生什么。
-
第16行:leave:这条指令其实执行了两个指令(它在早期 x86 版本中是一个宏,但后来被制作成了指令):
mov %ebp, %esp pop %ebp
第一条语句释放为函数分配的堆栈空间; 第二条语句恢复先前的框架指针。 当前堆栈如图 (e) 所示。
-
第17行:ret:这 条指令从堆栈中弹出返回地址,然后跳转到返回地址。 当前堆栈如图(f)所示。
-
第32行:addl $4, %esp:进一步释放为 foo 分配的内存。 如你所见,堆栈现在的状态与进入函数 foo 之前完全相同(即,第28行之前)。
-