7

ja chcę wiedzieć, jak Objective C argumenty uchwyt Runtime kiedy wezwać obiektywną metodę C jakPytanie o Cel konwencja C powołanie i argumentem przekazując ARM

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

Istnieją trzy argumenty na ten cel C rozmowy, jak działa w porównaniu do typowego sposobu w systemie ARM. Znam rejestr r0, r1, r2, r3 zachowa pierwsze 4 argumenty, a co powiesz na dodatkowe argumenty? W jaki sposób umieszcza je na stosie i wyskakuje później?

Odpowiedz

18

Dla funkcji, która zwraca prosty typ:

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

następnie reszta jest umieszczone na stosie:

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

Oczywiście, "argument" oznacza tutaj obiekt 4-bajtowy. Jeśli argument ma> 4 bajty, zostanie on podzielony, np.

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

Zwrócona wartości (do 16 bajtów) zostaną umieszczone w r0, R1, R2, R3.


Dla funkcji, która zwraca struct: r0 służy do przechowywania wskaźnik wartości powrotnej.

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

To jest dokładnie to, co muszę wiedzieć, dzięki za heads up! – overboming

+0

Doskonała odpowiedź. –

+0

um, zdaję sobie sprawę, że to głupie pytanie, ale ... w jaki sposób uzyskujesz dostęp do rejestrów? –