V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xmpx310
V2EX  ›  C

深入理解计算机系统 3-7 有一个例子不太明白,求解?

  •  
  •   xmpx310 · 2021-11-30 23:56:31 +08:00 · 2307 次点击
    这是一个创建于 1090 天前的主题,其中的信息可能已经有所发展或是发生改变。

    image.png

    P 函数的汇编码第 4 行,为什么需要申请 8 字节的栈帧空间,申请了也没用到啊?

    8 条回复    2021-12-01 02:08:08 +08:00
    xarthur
        1
    xarthur  
       2021-11-30 23:59:39 +08:00 via iPhone   ❤️ 1
    用来做内存对齐,提升效率用的。
    StackOverflow 有类似的问题。
    https://stackoverflow.com/questions/4175281/what-does-it-mean-to-align-the-stack
    xmpx310
        2
    xmpx310  
    OP
       2021-12-01 00:29:26 +08:00
    @xarthur 内存地址已经是 16 的倍数了,-8 后反而只能地址只能对齐到 8 的倍数了?不太明白
    xarthur
        3
    xarthur  
       2021-12-01 01:11:46 +08:00 via iPhone
    @xmpx310 根据这个 stackoverflow 上的解释。
    https://stackoverflow.com/questions/49478020/an-assembly-code-in-book-csapp
    因为 The 64 位 System V ABI 是按照 16 十六字节对齐的,在你 call 的时候会把 call 的返回地址压入栈,这个返回地址占 8 个字节,所以需要先预留 8 个字节用来做内存对齐。
    xarthur
        4
    xarthur  
       2021-12-01 01:18:05 +08:00 via iPhone
    @xmpx310 我记得这种书里都是假设 stack 是从高位向地位增长的,所以这里 subq 其实是增加空间不是减少空间。
    xarthur
        5
    xarthur  
       2021-12-01 01:18:13 +08:00 via iPhone
    *低位
    secondwtq
        6
    secondwtq  
       2021-12-01 01:58:02 +08:00
    最近正好在搞 stack frame 相关的东西,有点上头

    你这个应该是因为你这个函数不是 leaf function ,还会 call 别的函数,AMD64 SysV ABI 要求 call 函数时 stack 必须 16-byte align 。

    现在你知道调用 call P 时是 16-byte align 的,call 会 push 一个 RIP 进去,就变成了 8-byte align ,prologue 又 push 了俩 64-bit GPR ,还是 8-byte align ,L7 还要个 call ,想要 16-byte align 就得再 pad 8-byte 。
    secondwtq
        7
    secondwtq  
       2021-12-01 02:05:36 +08:00
    这是 alignment 要求不大于 16 bytes 的情况,有时会要求大于 16 bytes 的 alignment ,通常是有 local 有相关的要求。

    这时由于编译器只能保证 stack 最开始 align 到 16 ,就会插一个 and 来实现。
    secondwtq
        8
    secondwtq  
       2021-12-01 02:08:08 +08:00
    另外至少 LLVM ,在个别情况下会借用 RBX 做一个特殊的 base pointer ,还没研究透 ...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3163 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:45 · PVG 08:45 · LAX 16:45 · JFK 19:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.