能力值:
( LV13,RANK:290 )
|
-
-
2 楼
__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]
|
能力值:
( LV13,RANK:290 )
|
-
-
3 楼
__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__
|
能力值:
( LV13,RANK:290 )
|
-
-
4 楼
总结:
1、arm汇编会在栈上分配内存来保存全部输入参数;
2、用户只定义了3个参数,而实际上编译器会增加一些代码和参数;
3、参数的存放次序依参数的定义顺序而定。先定义的参数,存放在栈的高地址,后定义的存放在栈的低地址。
|