rbp和rsp?傻傻分不清楚

Vincent's Blog
博客专家认证
2019-03-11 09:23:20



上面那个函数汇编之后得到下面的结果,为甚么红框内是ecx的值送入rbp+16这个位置,而不是esp+16这个位置呢?
...全文
9371 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Vincent's Blog 2019-03-12
  • 打赏
  • 举报
回复
引用 1 楼 zara 的回复:
为什么要认为是 rsp+16 呢? 64位的函数调用,最好是找份调用约定来看看,看仔细、看明白了,反正是很烦琐、很无语的,不再似 32位那样易于理解。 rbp 和 rsp,由于程序里,rsp 是随时可能变化的,所以,为了方便理解,通常以 rbp 来作为参数和局部变量的基址;如果用 rsp,rbp 可以释放出来作为通用寄存器,但随着栈操作 rsp 可能发生变化,对同一内容的引用 rsp+?? 里的偏址就要随时变化,人工不容易看清。 这个代码,是标准化了的函数形式,从汇编角度来看,有太多的多余的、不必要的操作,所以,不能太过考究。经优化选项后,会有不同的,往往会更精简、更高效。
谢谢前辈,我做这个实验的目的是想验证一下《CSAPP》这本书关于函数调用实现的说法,昨天没搞明白的一点是,被调用函数的参数实际上是存储在调用者的栈帧里面(我以为是在被调用者的栈帧里),所以需要用rbp来寻址。有很多基础的问题我很好奇,希望通过从汇编层面学习的更深入一点,你有什么建议么?
zara 2019-03-12
  • 打赏
  • 举报
回复
为什么要认为是 rsp+16 呢?
64位的函数调用,最好是找份调用约定来看看,看仔细、看明白了,反正是很烦琐、很无语的,不再似 32位那样易于理解。
rbp 和 rsp,由于程序里,rsp 是随时可能变化的,所以,为了方便理解,通常以 rbp 来作为参数和局部变量的基址;如果用 rsp,rbp 可以释放出来作为通用寄存器,但随着栈操作 rsp 可能发生变化,对同一内容的引用 rsp+?? 里的偏址就要随时变化,人工不容易看清。
这个代码,是标准化了的函数形式,从汇编角度来看,有太多的多余的、不必要的操作,所以,不能太过考究。经优化选项后,会有不同的,往往会更精简、更高效。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧