oc函数的汇编注释

 
 
源码:
- (void)Test123:(int)nIn{   // nIn    var_18          = -0x18
  int m = 5;  // var_1C          = -0x1C
  TestViewController *lockVc = [[TestViewController alloc]init]; // var_20 = -0x20
  int mm = m + 9 + nIn; // var_24          = -0x24
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
  [self Test123:32];
} 





__text:0000879C -_SPAppDelegate_Test123__               ; DATA XREF: __objc_const:00010658o
__text:0000879C
__text:0000879C var_34          = -0x34
__text:0000879C addressOflockVc_var_30= -0x30
__text:0000879C nameOfInit_var_2C= -0x2C
__text:0000879C addressOf__imp__objc_msgSend_var_28= -0x28
__text:0000879C mm_var_24       = -0x24
__text:0000879C lockVc_var_20   = -0x20
__text:0000879C m_var_1C        = -0x1C
__text:0000879C nIn_var_18      = -0x18
__text:0000879C seletor_var_14  = -0x14
__text:0000879C self_var_10     = -0x10
__text:0000879C
__text:0000879C                 PUSH            {R4-R7,LR}
__text:0000879E                 ADD             R7, SP, #0xC ; 构造新的栈帧
__text:000087A0                 SUB             SP, SP, #0x28 ; 在栈上分配临时变量需要的内存
__text:000087A2                 MOVS            R3, 0
__text:000087A8                 ADD.W           R9, SP, #0x34+lockVc_var_20
__text:000087AC                 MOV             R12, 0x78D0 ; <suspicious>
__text:000087B4                 ADD             R12, PC
__text:000087B6                 LDR.W           R12, [R12] ; 计算函数__imp__objc_msgSend的地址
__text:000087BA                 MOV             LR, 0x895E ; <suspicious>
__text:000087C2                 ADD             LR, PC
__text:000087C4                 MOV             R4, 0x891C ; <suspicious>
__text:000087CC                 ADD             R4, PC
__text:000087CE                 MOV             R5, 0x8B2E ; <suspicious>
__text:000087D6                 ADD             R5, PC
__text:000087D8                 MOVS            R6, 5
__text:000087DE                 STR             R0, [SP,#0x34+self_var_10] ; 保存self指针,函数Test123的实例类指针
__text:000087E0                 STR             R1, [SP,#0x34+seletor_var_14] ; 保存selector,这里是"Test123:"
__text:000087E2                 STR             R2, [SP,#0x34+nIn_var_18] ; R2保存参数nIn
__text:000087E4                 STR             R6, [SP,#0x34+m_var_1C] ; int m = 5;
__text:000087E6                 LDR             R0, [R5]
__text:000087E8                 LDR             R1, [R4] 



__text:000087EA                 STR.W           R12, [SP,#0x34+addressOf__imp__objc_msgSend_var_28] ; 保存函数__imp__objc_msgSend的地址
__text:000087EE                 STR.W           LR, [SP,#0x34+nameOfInit_var_2C] ; 保存函数名"init"
__text:000087F2                 STR.W           R9, [SP,#0x34+addressOflockVc_var_30] ; 保存变量lockVc的地址
__text:000087F6                 STR             R3, [SP,#0x34+var_34]
__text:000087F8                 BLX             R12 ; __imp__objc_msgSend ; [TestViewController alloc]
__text:000087F8
__text:000087FA                 LDR             R1, [SP,#0x34+nameOfInit_var_2C]
__text:000087FC                 LDR             R1, [R1] ; 取出init函数名
__text:000087FE                 LDR             R2, [SP,#0x34+addressOf__imp__objc_msgSend_var_28]
__text:00008800                 BLX             R2      ; 调用init函数
__text:00008800
__text:00008802                 STR             R0, [SP,#0x34+lockVc_var_20] ; 保存结果到lockVc中
__text:00008804                 LDR             R0, [SP,#0x34+m_var_1C] ; 取出m的值
__text:00008806                 ADDS            R0, #9  ; m+9
__text:00008808                 LDR             R1, [SP,#0x34+nIn_var_18] ; 取出nIn
__text:0000880A                 ADD             R0, R1  ; int mm = m + 9 + nIn;
__text:0000880C                 STR             R0, [SP,#0x34+mm_var_24]
__text:0000880E                 LDR             R0, [SP,#0x34+addressOflockVc_var_30] ; 取出变量lockVc的地址,后面的函数_objc_storeStrong需要
__text:00008810                 LDR             R1, [SP,#0x34+var_34] ; var_34保存_objc_storeStrong的第二个参数
__text:00008812                 BLX             _objc_storeStrong
__text:00008812
__text:00008816                 ADD             SP, SP, #0x28 ; 清除栈上分配的内存
__text:00008818                 POP             {R4-R7,PC}
__text:00008818
__text:00008818 ; End of function -_SPAppDelegate_Test123__ 


总结:
1、arm汇编会在栈上分配内存来保存全部输入参数;
2、用户只定义了3个参数,而实际上编译器会增加一些代码和参数;
3、参数的存放次序依参数的定义顺序而定。先定义的参数,存放在栈的高地址,后定义的存放在栈的低地址。 

你可能感兴趣的:(oc函数的汇编注释)