章节大纲

  • 现在控制权已经传递给函数foo()。让我们看看函数返回时堆栈会发生什么。

    • 第16行:leave:这条指令其实执行了两个指令(它在早期 x86 版本中是一个宏,但后来被制作成了指令):

    mov  %ebp, %esp
    pop  %ebp

    第一条语句释放为函数分配的堆栈空间; 第二条语句恢复先前的框架指针。 当前堆栈如图 (e) 所示。

    • 第17行:ret:这 条指令从堆栈中弹出返回地址,然后跳转到返回地址。 当前堆栈如图(f)所示。

    • 第32行:addl $4, %esp:进一步释放为 foo 分配的内存。 如你所见,堆栈现在的状态与进入函数 foo 之前完全相同(即,第28行之前)。