给个例子。
LDR R0, PARAM2
STR R0, [SP, #-4]! ;将参数推入堆栈
LDR R0, PARAM1
STR R0, [SP, #-4]!
BL SUB1
2020 LDR R0, [SP] ;保存SUB1的结果
STR R0, RESULT
ADD SP, SP, #8 ;恢复堆栈
子程序
SUB1
STMFD SP!, {R0-R3, FP,LR}
ADD FP, SP, #16 ;计算帧指针
LDR R0, [FP, #8] ;载入参数1
LDR R1, [FP, #12] ;载入参数2
LDR R2, PARAM3 ;载入参数3
STR R2, [SP, #-4]! ;将参数3推入堆栈
BL SUB2
LDR R2, [SP], #4 ;将SUB2的结果弹出并存储在R2中,并递增SP
STR R3, [FP, #8] ;将结果推入堆栈
LDMFD SP!, {R0-R3, FP, PC} ;恢复寄存器并返回
SUB2
STMFD SP!, {R0, R1, FP, LR}
ADD FP, SP, #8 ;载入结构指针
LDR R0, [FP, #8] ;载入参数
STR R1, [FP, #8] ;将结果推入堆栈
LDMFD SP!, {R0, R1, FP, PC}
|