|
#include "testcfg.h"
void Func_tmp2() { int i=0; i++; }
void FUNC_TEMP (void) { Func_tmp2(); }
void main() { FUNC_TEMP(); }
其汇编结果:
0000CEC0 Func_tmp2: 0000CEC0 07BF005A SUB.L2 SP,8,SP//堆栈指针减8,这里没有对B3入栈是因为在这个函数中,没有用到B3,也就是说没有修改B3 0000CEC4 0200A35A MVK.L2 0,B4//B4对应变量i 0000CEC8 023C22F6 STW.D2T2 B4,*+SP[0x1]//将变量i入栈 0000CECC 00002000 NOP 2 0000CED0 0210205A ADD.L2 1,B4,B4//i++ 0000CED4 023C22F6 STW.D2T2 B4,*+SP[0x1]//将i再保存到原来栈的地方 0000CED8 00002000 NOP 2 0000CEDC 07BD005A ADD.L2 8,SP,SP//修正堆栈指针 0000CEE0 008CA362 BNOP.S2 B3,5//返回到RL0 0000CEE4 FUNC_TEMP://FUNC_TEMP函数的地址 0000CEE4 01BC54F6 STW.D2T2 B3,*SP--[0x2] //B3寄存器被用来保存函数调用时的返回地址,在函数执行之前需要入栈保护,直到函数返回前再出栈 0000CEE8 00002000 NOP 2 0000CEEC 0FFFFC10 B.S1 Func_tmp2//准备跳入Func_tmp2 0000CEF0 01858162 ADDKPC.S2 RL0,B3,4//保存从Func_tmp2返回的地址 0000CEF4 RL0: 0000CEF4 01BC52E6 LDW.D2T2 *++SP[0x2],B3//将入栈的B3再出栈,对应的是main函数的RL1地址 0000CEF8 00006000 NOP 4 0000CEFC 008CA362 BNOP.S2 B3,5//返回到RL1 0000CF00 main: //主函数地址 0000CF00 01BC54F6 STW.D2T2 B3,*SP--[0x2] //B3寄存器被用来保存函数调用时的返回地址,在函数执行之前需要入栈保护,直到函数返回前再出栈0000CF04 00002000 NOP 2 0000CF08 0FFFFC90 B.S1 FUNC_TEMP//准备进入FUNC_TEMP函数 0000CF0C 01848162 ADDKPC.S2 RL1,B3,4//保存返回地址到B3 0000CF10 RL1: //从FUNC_TEMP函数返回后应跳入的地方 0000CF10 01BC52E6 LDW.D2T2 *++SP[0x2],B3//将之前入栈的B3再出栈 0000CF14 00006000 NOP 4 0000CF18 008CA362 BNOP.S2 B3,5
在uC/OS中,将要根据这些内容进行移植!
|