【问题标题】:In the iPhone ARM64 calling convention, what is in register $x1?在 iPhone ARM64 调用约定中,寄存器 $x1 中有什么?
【发布时间】:2015-03-06 02:02:12
【问题描述】:

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

当调用函数时,我知道$r0self,而$r2 似乎是第一个函数参数。

$x1 中有什么内容?

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

【问题讨论】:

    标签: ios iphone lldb arm64


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,很有帮助
    【解决方案2】:

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

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

    被翻译成这样的函数:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-20
      • 2011-07-14
      • 2015-11-20
      • 2015-08-18
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多