Iphone 关于目标C调用约定和参数在ARM上传递的问题

Iphone 关于目标C调用约定和参数在ARM上传递的问题,iphone,compiler-construction,assembly,arm,calling-convention,Iphone,Compiler Construction,Assembly,Arm,Calling Convention,我想知道当我调用像这样的objective C方法时,objective C运行时如何处理参数 [NSString stringWithFomat:@"%@, %@", @"Hello", @"World"] 这个objective C调用有三个参数,与ARM系统上的典型方式相比,它是如何工作的。我知道寄存器r0、r1、r2、r3将包含前4个参数,是否还有其他参数?它是如何将它们放在堆栈上并在以后弹出的?对于返回简单类型的函数: r0 = self (NSString) r1 = _cmd (

我想知道当我调用像这样的objective C方法时,objective C运行时如何处理参数

[NSString stringWithFomat:@"%@, %@", @"Hello", @"World"]

这个objective C调用有三个参数,与ARM系统上的典型方式相比,它是如何工作的。我知道寄存器r0、r1、r2、r3将包含前4个参数,是否还有其他参数?它是如何将它们放在堆栈上并在以后弹出的?

对于返回简单类型的函数:

r0 = self (NSString)
r1 = _cmd (@selector(stringWithFormat:))
r2 = 1st argument (@"%@, %@")
r3 = 2nd argument (@"Hello")
然后将其余的放在堆栈上:

[sp,#0] = 3rd argument (@"World")
[sp,#4] = 4th argument (does not exist in your example)
...
当然,这里的“参数”是指一个4字节的对象。如果参数大于4个字节,则会将其拆分,例如

-[UIView initWithFrame:rect];

r0 = self
r1 = _cmd
r2 = rect.origin.x
r3 = rect.origin.y
[sp,#0] = rect.size.width
[sp,#4] = rect.size.height
返回值(最多16个字节)将放在r0、r1、r2、r3中



对于返回结构的函数:
r0
用于存储返回值的指针

NSRange retval = [self rangeOfString:string options:options range:range]

r0 = &retval (of type NSRange*)
r1 = self
r2 = _cmd (@selector(rangeOfString:options:range:))
r3 = string
[sp,#0] = options
[sp,#4] = range.location
[sp,#8] = range.length

这正是我需要知道的,谢谢你的提醒!我知道这是个愚蠢的问题但是。。。您如何访问注册表?