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

In the iPhone ARM64 calling convention, what is in register $x1?

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

调用函数时,我了解到 $r0self,并且 $r2 似乎是第一个函数参数。

$x1 中有什么?

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

您想阅读 AAPCS64 的 "The Base Procedure Call Standard" 章,第 'Subroutine Calls' 节;他们的寄存器命名约定使用 "r0..r30" 而 lldb 使用 "x0..x30"。 x1 是第二个参数寄存器。 x0 是第一个。 arm64 iOS ABI 与 AAPCS64 的最大区别在于可变参数函数(printf 等)的调用方式。您链接到的苹果文档详细说明了确切的区别。

lldb 为 armv7/arm64/x86_64、$argi 提供寄存器别名,以引用第 i 个参数。 $arg1$arg2 等(参数在 i386 上的堆栈上传递,因此别名未在那里定义)我建议使用这些方便的名称,而不用担心体系结构的细节,如果可能的话。

注意这些参数传递寄存器内容仅在函数开始时有效。它们通常保存在堆栈中或复制到其他寄存器中——一旦进行另一个函数调用,寄存器将 reused/overwritten。

根据 Mike Ash 博客 post here,写了一个这样的方法:

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

翻译成这样的函数:

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

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