7

io voglio sapere come Objective C argomenti maniglia runtime quando chiamo un metodo oggettivo C comeDomanda su Objective convenzione di chiamata C e l'argomento passando su ARM

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

Ci sono tre argomenti per questa chiamata obiettivo C, come funziona rispetto al modo tipico di un sistema ARM. Ho conosciuto registro r0, r1, r2, r3 conterrà i primi 4 argomenti, che ne pensi di argomenti addizionali? Come li mette su una pila e li schiocca in seguito?

risposta

18

Per funzioni che restituisce un tipo semplice:

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

poi il resto è posto sulla pila:

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

Naturalmente, "argomento" qui significa un oggetto a 4 byte. Se l'argomento ha> 4 byte, verrà suddiviso, ad es.

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

Il valore restituito (fino a 16 byte) verrà posto in r0, r1, r2, r3.


Per le funzioni che restituisce una struct: r0 viene utilizzata per memorizzare il puntatore del valore di ritorno.

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

Questo è esattamente ciò che ho bisogno di sapere, grazie per l'attenzione! – overboming

+0

Ottima risposta. –

+0

um, mi rendo conto che questa è una domanda stupida ma ... come si accede ai registri? –