【发布时间】:2021-04-29 08:36:44
【问题描述】:
我总是有一个关于如何计算堆栈伸展的问题。比如我arm64的参数超过8个的时候,他其实是用了我之前的函数调用栈的区域。 BL进入函数后,用SP加回获取参数,相当于穿越了一个栈。在这种情况下,他如何避免污染之前的堆栈?谢谢你的回答
【问题讨论】:
-
堆栈参数归被调用者所有,而不是调用者堆栈帧的一部分,即使它们是由调用者推送的。一些旧的调用约定(对于像 x86 这样的 ISA)只使用堆栈参数,而不是寄存器。更好的调用约定只有在寄存器用完时才会退回到堆栈参数,但同样的原则也适用:它不是调用者的堆栈帧。例如How exactly does the callstack work?中的图表
标签: ios assembly arm64 calling-convention