x86 栈的使用有 rbp 和 rsp,只设计 rsp 可不可以?为什么?

查看 39|回复 4
作者:amiwrong123   
https://zhuanlan.zhihu.com/p/656740329

在 x86-64 架构中,rbp 和 rsp 寄存器分别是栈帧基址指针( Base Pointer )和栈指针( Stack Pointer )。

看完了这篇文章,完全搞懂了函数调用过程中,rbp 和 rsp 的使用情况。
但是还是有一点不太理解,就是假如 CPU 只设计 rsp 可以吗?从我简单来看,好像也是可以够用的啊。我总结一下,无外乎是这些:
  • 函数使用过程中,减 rsp ,用来放局部变量
  • 调用函数瞬间,硬件自动减 rsp ,用来放 return Address
  • 下一个函数,继续减 rsp ,用来放局部变量
  • 以此类推

    返回过程:
  • 如果是“减 rsp ,用来放局部变量”,那么直接加 rsp ,就回收了栈空间。
  • 如果是“硬件自动减 rsp ,用来放 return Address”,那么 pop 到 pc 即可( x86 里,ret 指令就是这个效果)

    那从上面分析来看,只有 rsp ,好像也能完成函数调用的工作啊?
  • shawnsh   
    怎么取参数
    ThirdFlame   
    RSP 可以移动
    RBP 是不动的
    你去取变量肯定是靠 RBP+偏移来取啊。 靠 RSP 那你还得设计个地方去记录 RSP 的变化,还不如直接设计一个 RBP 呢
    amiwrong123
    OP
      
    @shawnsh #1
    你是指,函数调用传参,不是通过寄存器传递;而是通过栈来传递参数的情况呗?
    luxor   
    gcc: -fomit-frame-pointer msvc: /Oy
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部