我很难理解Apple ARM64 Function Calling Conventions doc和ARM Procedure Call Standard。
调用函数时,我理解$r0
为self
,而$r2
似乎是第一个函数参数。
$x1
中的内容是什么?
堆栈指针是否引用超过四的第一个参数?
答案 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
中的参数是指向选择器的指针,它基本上只是一个包含方法名称的字符串。