函数调用堆栈对齐
在提供的汇编代码中,看到 RAX 作为第一个操作被压入堆栈可能会令人困惑在函数 f 内。要了解此操作背后的原因,需要检查 64 位 ABI。
64 位 ABI 要求堆栈在调用指令之前进行 16 字节对齐。然而,调用指令将 8 字节返回地址压入堆栈,从而破坏了这种对齐方式。因此,编译器有义务在继续下一个调用之前采取措施将堆栈重新对齐为 16 的倍数。
在这种情况下,推送一个无关值(例如 RAX)可以起到以下作用:高效的目的。它提供了一种对齐堆栈的方法,而不会产生执行额外的 sub rsp, 8 指令的开销,这在配备堆栈引擎的 CPU 上可能效率较低。
与没有 std 的 tailcall 的比较: :function 包装器说明了这一原理。在普通函数 g 中,编译器可以简单地执行 jmp 指令,而无需任何事先的堆栈对齐操作。然而,在 f 的情况下,需要额外推送 RAX 来维持 16 字节对齐,确保与 ABI 要求的兼容性。
以上是为什么函数'f”会在其他操作之前将 RAX 压入堆栈?的详细内容。更多信息请关注PHP中文网其他相关文章!