xmpx310
V2EX  ›  C

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

  •  
  •   xmpx310 · Nov 30, 2021 · 3128 views
    This topic created in 1649 days ago, the information mentioned may be changed or developed.

    image.png

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

    8 replies    2021-12-01 02:08:08 +08:00
    xarthur
        1
    xarthur  
       Nov 30, 2021 via iPhone   ❤️ 1
    用来做内存对齐,提升效率用的。
    StackOverflow 有类似的问题。
    https://stackoverflow.com/questions/4175281/what-does-it-mean-to-align-the-stack
    xmpx310
        2
    xmpx310  
    OP
       Dec 1, 2021
    @xarthur 内存地址已经是 16 的倍数了,-8 后反而只能地址只能对齐到 8 的倍数了?不太明白
    xarthur
        3
    xarthur  
       Dec 1, 2021 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  
       Dec 1, 2021 via iPhone
    @xmpx310 我记得这种书里都是假设 stack 是从高位向地位增长的,所以这里 subq 其实是增加空间不是减少空间。
    xarthur
        5
    xarthur  
       Dec 1, 2021 via iPhone
    *低位
    secondwtq
        6
    secondwtq  
       Dec 1, 2021
    最近正好在搞 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  
       Dec 1, 2021
    这是 alignment 要求不大于 16 bytes 的情况,有时会要求大于 16 bytes 的 alignment ,通常是有 local 有相关的要求。

    这时由于编译器只能保证 stack 最开始 align 到 16 ,就会插一个 and 来实现。
    secondwtq
        8
    secondwtq  
       Dec 1, 2021
    另外至少 LLVM ,在个别情况下会借用 RBX 做一个特殊的 base pointer ,还没研究透 ...
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2291 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 00:56 · PVG 08:56 · LAX 17:56 · JFK 20:56
    ♥ Do have faith in what you're doing.