考虑以下目标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
)将PC设置为标签_objc_getProperty
。但是这个程序怎么知道要跳回去?它是否假定该方法是用bl
调用的,因此链接寄存器包含目标地址?
2)第二个@DEBUG_VALUE下面的3行是做什么的?
如果我理解正确,r0的内容存储在堆栈偏移量4,r1存储在当前堆栈(偏移量0),r0堆栈偏移量4填充。但为什么最后一条指令改变了什么?这不仅仅意味着r0充满了它已经包含的内容吗?用于什么值? _obj_getProperty
?
3)为什么r3在最后设置为1? (movs r3, #1
)?
编译器在关闭优化的情况下看起来非常愚蠢,并且将所有参数保存到堆栈而不触及它们,然后将它们重新加载到-O0的完全相同的寄存器气味。试图推理-O0输出可能是相当无用的; -O1可能是一个更好的选择。这看起来像一个蹦床,它增加了两个额外的参数来标识特定的属性,然后转发到通用的“get”例程,但我真的不知道Objective-C的内部及其调用约定。 – Notlikethat 2014-12-02 11:40:12