|
对于如下程序:
#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中,将要根据这些内容进行移植!