Вопрос о соглашении вызовов Objective C и передаче аргументов в ARM - PullRequest
7 голосов
/ 14 марта 2010

Я хочу знать, как объективная среда выполнения C обрабатывает аргументы, когда я вызываю объективный метод C, такой как

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

Есть три аргумента для этого объективного вызова C, как он работает по сравнению с обычным способом в системе ARM. Я знал, что регистр r0, r1, r2, r3 будет содержать первые 4 аргумента, как насчет дополнительных аргументов? Как это помещает их в стек и выталкивает их позже?

1 Ответ

18 голосов
/ 14 марта 2010

Для функций, которые возвращают простой тип:

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

, остальное помещается в стек:

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

Конечно, «аргумент» здесь означает 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

Возвращаемое значение (до 16 байт) будет помещено в r0, r1, r2, r3.


Для функций, которые возвращают структуру: 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
...