【问题标题】:How does Assembly Work with Stack Correctly装配如何正确使用堆栈
【发布时间】:2021-04-29 08:36:44
【问题描述】:

我总是有一个关于如何计算堆栈伸展的问题。比如我arm64的参数超过8个的时候,他其实是用了我之前的函数调用栈的区域。 BL进入函数后,用SP加回获取参数,相当于穿越了一个栈。在这种情况下,他如何避免污染之前的堆栈?谢谢你的回答

【问题讨论】:

  • 堆栈参数归被调用者所有,而不是调用者堆栈帧的一部分,即使它们是由调用者推送的。一些旧的调用约定(对于像 x86 这样的 ISA)只使用堆栈参数,而不是寄存器。更好的调用约定只有在寄存器用完时才会退回到堆栈参数,但同样的原则也适用:它不是调用者的堆栈帧。例如How exactly does the callstack work?中的图表

标签: ios assembly arm64 calling-convention


【解决方案1】:

你是对的:不适合寄存器的函数参数将在调用你的函数之前被压入堆栈。因此,它们将位于与SP 在进入您的函数时具有正偏移的地址,我可以理解您为什么可能担心访问此内存不安全。然而,这段记忆其实是“你的”。

ARM Procedure Call Standard 第 6.4.2 节声明“允许被调用者修改用于从调用者接收参数值的任何堆栈空间”。所以,没有必要担心。调用者希望您访问此内存,甚至可以根据需要对其进行修改,如果您这样做,什么都不会破坏。

【讨论】:

    猜你喜欢
    • 2021-11-08
    • 2021-07-19
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    相关资源
    最近更新 更多