装配如何正确使用堆栈

问题描述

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

解决方法

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

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