在iPhone ARM64调用约定中,什么是寄存器$ x1?

时间:2015-01-08 02:18:52

标签: ios iphone lldb arm64

我很难理解Apple ARM64 Function Calling Conventions doc和ARM Procedure Call Standard

调用函数时,我理解$r0self,而$r2似乎是第一个函数参数。

$x1中的内容是什么?

堆栈指针是否引用超过四的第一个参数?

2 个答案:

答案 0 :(得分:9)

您想阅读AAPCS64的“基本过程调用标准”一章,“子程序调用”部分;它们的寄存器命名约定使用“r0..r30”,其中lldb使用“x0..x30”。 x1是第二个参数寄存器。 x0是第一个。 arm64 iOS ABI与AAPCS64的最大区别在于如何调用可变函数(printf等)。您链接的苹果文档详细说明了确切的区别。

lldb为armv7 / arm64 / x86_64,$ arg i 提供寄存器别名,以引用 i 参数。 $arg1$arg2等(在i386上的堆栈上传递参数,因此没有定义别名)我建议使用这些便利名称而不用担心架构的细节,如果可能的话。

注意,这些参数传递寄存器内容仅在函数开头有效。它们通常保存在堆栈中或复制到其他寄存器中 - 只要进行另一个函数调用,寄存器就会被重用/覆盖。

答案 1 :(得分:0)

根据Mike Ash博客文章here,编写如下方法:

- (int)foo:(NSString *)str { ...

转换为这样的函数:

int SomeClass_method_foo_(SomeClass *self, SEL _cmd, NSString *str) { ...

因此$x1中的参数是指向选择器的指针,它基本上只是一个包含方法名称的字符串。