7

Je veux savoir comment les arguments de la poignée d'exécution objectif C quand je l'appelle une méthode objective de C commeQuestion sur convention d'appel Objective C et des arguments qui passe sur ARM

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

Il y a trois arguments pour cet appel objectif C, comment fonctionne-t-il par rapport à la façon typique sur un système ARM. J'ai connu le registre r0, r1, r2, r3 tiendra les 4 premiers arguments, pourquoi pas d'autres arguments? Comment ça les met sur une pile et les pop plus tard?

Répondre

18

Pour les fonctions qui renvoie un type simple:

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

le reste est placé sur la pile:

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

Bien sûr, "argument" signifie ici un objet de 4 octets. Si l'argument a> 4 octets, il sera divisé, par ex.

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

La valeur renvoyée (jusqu'à 16 octets) seront placés dans r0, r1, r2, r3.


Pour les fonctions qui renvoie une struct: r0 est utilisé pour stocker le pointeur de la valeur de retour.

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

C'est exactement ce que j'ai besoin de savoir, merci pour le heads up! – overboming

+0

Excellente réponse. –

+0

euh, je réalise que c'est une question stupide mais ... comment accéder aux registres? –