我很难理解 Apple ARM64 Function Calling Conventions文档和 ARM Procedure Call Standard .
调用函数时,我了解到 $r0
是 self
,而 $r2
似乎是第一个函数参数。
$x1
中有什么?
堆栈指针是否指向超过四个的第一个参数?
最佳答案
您想阅读 AAPCS64 的“基本过程调用标准”一章的“子例程调用”部分;他们的寄存器命名约定使用“r0..r30”,而 lldb 使用“x0..x30”。 x1
是第二个参数寄存器。 x0
是第一个。 arm64 iOS ABI 与 AAPCS64 的最大区别在于可变参数函数(printf
等)的调用方式。您链接到的苹果文档详细说明了确切的区别。
lldb 为 armv7/arm64/x86_64 提供寄存器别名 $argi,以引用第 i 个参数。 $arg1
、$arg2
等(参数在 i386 上的堆栈上传递,因此别名未在此处定义)我建议使用这些方便的名称而不是如果可能的话,担心架构的细节。
注意这些参数传递寄存器内容仅在函数开始时有效。它们通常保存在堆栈中或复制到其他寄存器中——只要进行另一个函数调用,这些寄存器就会被重用/覆盖。
关于ios - 在 iPhone ARM64 调用约定中,寄存器 $x1 中的内容是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27831946/