CSAPP:程序的机器级表示-4

本文最后更新于:2022年9月4日 下午

函数调用栈

栈的布局

  • 由高地址向低地址增长
  • 栈帧结构的两端由两个指针来指定
    • 栈指针:%rsp,指向栈顶,地址更高
    • 桢指针:%rbp,指向栈底,地址更低

出栈入栈

  • pushq Src
    • 从Src取操作数
    • 将%rsp减8
    • 将操作数写到%rsp指向的地址
  • popq Dst
    • 从%rsp中保存的地址值读取数值
    • 将 %rsp加 8
    • 将数值保存到Dst (必须是寄存器)

过程控制

  • A函数调用B函数
    • A是调用过程
    • B是被调用过程
  • 返回地址入栈
    • 返回地址(return address)是紧随call指令的下一条指令的地址
  • 过程返回ret
    • 从栈中弹出返回地址
    • 跳转到返回地址
  • 要注意理解%rsp、%rip的变化

需要保存的几个状态

栈分配单位——帧,栈中单个过程实例的状态数据

  • 参数
  • 局部变量
  • 返回地址

  • call对应push操作(栈帧开辟)
  • ret对应pop操作(栈帧回收)

这个地方还是要自己调试一遍程序,或者画一下过程图,分析一下地址和几个主要寄存器


CSAPP:程序的机器级表示-4
http://gls.show/p/3754ea8a/
作者
郭佳明
发布于
2022年9月4日
许可协议