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

标签 ios iphone lldb arm64

我很难理解 Apple ARM64 Function Calling Conventions文档和 ARM Procedure Call Standard .

调用函数时,我了解到 $r0self,而 $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/

相关文章:

iphone - 对具有许多对象的核心数据进行单元测试

Objective-C 线程安全代码以防止崩溃

iPhone,令人困惑的内存泄漏

iphone - 我们可以向 iphone native 地址簿 View Controller 添加额外的按钮吗?

xcode - 任何人都可以分享示例 .lldbinit 文件吗?

iOS UIScrollView 双指缩放添加空白

ios - cocos2d无法异步添加child

ios - 在 iPhone 上安装自己的应用程序

ios - LLDB 中是否有 Quicklook 调试命令?

xcode - 如何记录自定义 LLDB 命令(别名)?