关于Objective C调用约定和传递ARM的参数的问题

ove*_*ing 7 compiler-construction iphone assembly arm calling-convention

我想知道当我调用一个客观的C方法时,目标C运行时如何处理参数

[NSString stringWithFomat:@"%@, %@", @"Hello", @"World"]
Run Code Online (Sandbox Code Playgroud)

这个目标C调用有三个参数,与ARM系统上的典型方法相比,它是如何工作的.我知道寄存器r0,r1,r2,r3会保存前4个参数,还有其他参数怎么样?它是如何将它们放在堆栈中并在以后弹出它们的?

ken*_*ytm 18

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

r0 = self (NSString)
r1 = _cmd (@selector(stringWithFormat:))
r2 = 1st argument (@"%@, %@")
r3 = 2nd argument (@"Hello")
Run Code Online (Sandbox Code Playgroud)

然后其余的放在堆栈上:

[sp,#0] = 3rd argument (@"World")
[sp,#4] = 4th argument (does not exist in your example)
...
Run Code Online (Sandbox Code Playgroud)

当然,这里的"参数"意味着一个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
Run Code Online (Sandbox Code Playgroud)

返回值(最多16个字节)将放在r0,r1,r2,r3中.


对于返回struct的函数: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
Run Code Online (Sandbox Code Playgroud)