7

Quiero saber como objetivo argumentos mango tiempo de ejecución C cuando llamo a un método objetivo C comoPregunta sobre el objetivo del Convenio de llamada C y el argumento que pasa en ARM

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

Hay tres argumentos para esta llamada C objetiva, cómo funciona en comparación con la forma típica en un sistema ARM. He sabido que registrar r0, r1, r2, r3 tendrá los primeros 4 argumentos, ¿qué hay de los argumentos adicionales? ¿Cómo los pone en una pila y los muestra más tarde?

Respuesta

18

Para las funciones que devuelve un tipo simple:

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

luego el resto se coloca en la pila:

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

Por supuesto, "argumento" significa aquí un objeto de 4 bytes. Si el argumento tiene> 4 bytes, se dividirá, p.

-[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 

El valor devuelto (hasta 16 bytes) serán colocados en r0, r1, r2, r3.


Para las funciones que devuelve una estructura: r0 se utiliza para almacenar el puntero del valor de retorno.

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 
+0

Esto es exactamente lo que necesito saber, ¡gracias por el aviso! – overboming

+0

Excelente respuesta. –

+0

um, me doy cuenta de que esta es una pregunta estúpida, pero ... ¿cómo se accede a los registros? –

Cuestiones relacionadas