рассмотрим следующую цель C определение интерфейсаПытаясь понять ARM сборки IOS приложение
#import <Foundation/Foundation.h>
@interface MyClass : NSObject
@property NSObject* myprop;
@end
Узел Генерация ARMv7 на Xcode 5 для [MyClass myprop]
выглядит
.code 16 @ @"\01-[MyClass myprop]"
.thumb_func "-[MyClass myprop]"
"-[MyClass myprop]":
Lfunc_begin0:
.cfi_startproc
@ BB#0:
sub sp, #8
@DEBUG_VALUE: -[MyClass myprop]:self <- undef
@DEBUG_VALUE: -[MyClass myprop]:_cmd <- undef
str r0, [sp, #4]
str r1, [sp]
ldr r0, [sp, #4]
movw r2, :lower16:(_OBJC_IVAR_$_MyClass.myprop-(LPC0_0+4))
movt r2, :upper16:(_OBJC_IVAR_$_MyClass.myprop-(LPC0_0+4))
LPC0_0:
add r2, pc
ldr r2, [r2]
movs r3, #1
add sp, #8
b.w _objc_getProperty
Ltmp0:
Lfunc_end0:
.cfi_endproc
Я хочу, чтобы понять, в результате сборка и задать следующие вопросы:
1) Последняя инструкция (b.w _objc_getProperty
) устанавливает ПК по адресу ярлык _objc_getProperty
. Но как эта процедура знает, куда вернуться? Предполагает ли он, что метод вызывается с помощью bl
, и поэтому в реестре ссылок указан адрес назначения?
2) Что делают 3 линии ниже второго @DEBUG_VALUE?
Если я правильно понимаю, содержимое r0 хранится при смещении стека 4, r1 хранится в текущем стеке (смещение 0), а r0 заполняется смещением стека 4. Но почему последняя инструкция меняет что-либо ? Разве это не означает, что r0 заполнено тем, что оно уже содержит? Для каких значений используются значения? _obj_getProperty
?
3) Почему r3 установлен в 1 в конце? (movs r3, #1
)?
Составители могут выглядеть невероятно глупо, при выключенной оптимизации и сохраняя все аргументы в стеке, не касаясь их, а затем перезагружая их до тех же самых регистров, что и запахи -O0. Попытка рассуждать о выходе -O0 может быть довольно бесполезной; -O1 может быть лучше.Этот _looks_, как батут, который добавляет два дополнительных аргумента, чтобы идентифицировать конкретное свойство, затем пересылает в общую процедуру «получить», но я действительно ничего не знаю о внутренних объектах Objective-C и его вызовах. – Notlikethat