《深入理解计算机系统》第三章习题3.49的疑问

xuhuize 2018-07-15 04:36:46






x86-64关于管理变长栈帧的套路,图片1是C代码,2是对应的部分汇编代码,3是栈帧结构
我的疑问就是,栈顶指针%rsp每次分配的大小不都是8的倍数么,有可能存在s1=2065这种奇数的情况么???s1表示的是什么,难道是我理解错了,不是表示栈顶指针,那表示的是什么??
...全文
1038 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xwj 2018-12-19
  • 打赏
  • 举报
回复
我来好好学习一下,不断进步
zara 2018-07-17
  • 打赏
  • 举报
回复
%rsp 需要对齐的吧,否则可能会出现异常致程序崩溃的;当然了,你尽可以 sub $1, %rsp 但在对齐前最好别使用堆栈。
xuhuize 2018-07-17
  • 打赏
  • 举报
回复
引用 1 楼 zara 的回复:
64位搞得是复杂,那个 +22 都不知道什么意思。
s1=2065 的那两个例子,怀疑是随便说的,不是针对这个代码,尽管这个汇编里的功能是普适的。大致意思就是为了让这 n 个单元能对齐,前面定义的数据如果不对齐时,怎么让它对齐了,即补上 e1 的空;分配到最后的 rsp 也一样地要对齐了,就是 e2 来补空。


你的意思是栈顶%rsp并不总是对齐的,%rsp可以在有限范围内可以分配任意空间,即假设%rsp一开始偏移32字节这个位置上,然后 sub $1 %rsp 之后%rsp在偏移33个字节上,这样也是合法的是吧。这个和栈顶边界需要16字节对齐这个不是冲突的吗???
  • 打赏
  • 举报
回复
16字节对齐是ABI的约束,不是硬件约束,硬件上来说,rsp在push/pop时保证8字节对齐就可以,不push/pop时可以是任意值

xuhuize 2018-07-17
  • 打赏
  • 举报
回复
引用 6 楼 DelphiGuy 的回复:
esp/rsp只要不进行push/pop,作为普通寄存器用,可以存储任意值,不会导致异常。

所以%rsp是有可能偏移2065个字节的是吧,比如在方法内分配2065个char的话,那么在栈上分配的空间就是2065个字节是吧,可以不考虑%rsp 16字节对齐这种约束吗?
  • 打赏
  • 举报
回复
esp/rsp只要不进行push/pop,作为普通寄存器用,可以存储任意值,不会导致异常。
  • 打赏
  • 举报
回复
第5行这个+22确实有点费解,+16就可以了
8、9、10行应该是多余的,因为第7行分配数组空间是做了16字节对齐的,之后三行再 (数组首地址+7) div 8 * 8多此一举
xuhuize 2018-07-17
  • 打赏
  • 举报
回复
引用 3 楼 zara 的回复:
%rsp 需要对齐的吧,否则可能会出现异常致程序崩溃的;当然了,你尽可以 sub $1, %rsp 但在对齐前最好别使用堆栈。

如果需要对齐的话,那应该不会出现s1=2065这种情况吧。我想不通什么场景下s1会可以偏移2065字节。
zara 2018-07-16
  • 打赏
  • 举报
回复
64位搞得是复杂,那个 +22 都不知道什么意思。
s1=2065 的那两个例子,怀疑是随便说的,不是针对这个代码,尽管这个汇编里的功能是普适的。大致意思就是为了让这 n 个单元能对齐,前面定义的数据如果不对齐时,怎么让它对齐了,即补上 e1 的空;分配到最后的 rsp 也一样地要对齐了,就是 e2 来补空。

21,459

社区成员

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

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