SPMC75和ASM(汇编)混合编程的应用
C 程序调用ASM函数,输入两个UInt16参数,返回一个UInt16参数。
/*-------------------------------------------------------*/ /* C 程序 /*-------------------------------------------------------*/ extern UInt16 F_F_Addition(UInt16 arg1,UInt16 arg2); main() { UInt16 uiErr=0; /*-------------------------------------------------------*/ /* C 程序调用 ASM 函数,输入两个 UInt16 参数, /* 返回一个 UInt16 参数 /*-------------------------------------------------------*/ uiErr = F_Addition(0x00F3,0x9F00); while(1){;} } /*-------------------------------------------------------*/ /* ASM 程序 /*-------------------------------------------------------*/ .CODE //============================================================= // ----Function: UInt16 F_Addition(UInt16 arg1,UInt16 arg2); // -Description: 两数相加 // --Parameters: arg1 ,被加数; arg2 ,加数 // -----Returns: UInt16 两数相加的和 // -------Notes: ASM 程序,示范参数传递及 UInt16 参数返回 // -----Destroy: R1 、 R2 //============================================================= .PUBLIC _F_Addition _F_Addition: .proc PUSH BP to [SP]; // 保护 BP 数据 ( 1 ) BP = SP+1; // 调整指针 ( 2 ) R1 = [BP+3]; // 第一个参数 ( 3 ) R2 = [BP+4]; // 第二个参数 ( 4 ) R1 += R2; // 通过 R1 返回结果 ( 5 ) POP BP from [SP]; ( 6 ) RETF; .endp |
如图3-2所示程序调用时堆栈使用情况。通过图可以清楚的看出在C调用ASM函数的时候,第一个参数将跟着第二个参数陆续自动的压入堆栈;接下来是PC指针和SR寄存器在CALL指令执行后压入堆栈,这些都是自动完成的,使用者只需要了解,是无法也没有必要干预的。
在下来将跳入执行ASM函数,在执行语句(1)的时BP被压入堆栈保护起来。那么可以发现ASM所需要接收的参数在堆栈中的实际位置,再执行语句(2)将当前堆栈指针加一赋给变址寄存器BP,则第一个参数的位置就应该是BP+3,第二个参数的位置为BP+4,可以通过语句(3)、(4)来取出参数。
结果的返回可以按照调用协议所讲的保存在R1中来返回参数。
图3-2 程序调用时堆栈使用情况
C 程序调用ASM函数,输入两个UInt16参数,返回一个Uint32参数。
/*-------------------------------------------------------*/ /* C 程序 /*-------------------------------------------------------*/ extern UInt32 F_Multiplication(UInt16 arg1,UInt16 arg2); main() { UInt32 ulErr=0; /*-------------------------------------------------------*/ /* C 程序调用 ASM 函数,输入两个 UInt16 参数, /* 返回一个 Uint32 参数 /*-------------------------------------------------------*/ uiErr = F_ Multiplication(0xF0F3,0x0F00); while(1){;} } /*-------------------------------------------------------*/ /* ASM 程序 /*-------------------------------------------------------*/ .CODE //============================================================= // ----Function: UInt32 F_Multiplication(UInt16 arg1,UInt16 arg2); // -Description: 两数相乘 // --Parameters: arg1 ,被乘数; arg2 ,乘数 // -----Returns: UInt32 两数相乘的积 // -------Notes: ASM 程序,示范参数传递及 UInt32 参数返回 // -----Destroy: R1 、 R2 、 R3 、 R4 //============================================================= .PUBLIC _F_Multiplication _F_Multiplication: .proc PUSH BP to [SP]; BP = SP+1; R1 = [BP+3]; |
- 用SPMC75F2313A实现LIN结点(10-15)
- 使用SPMC75F2413A设计的通用变频器(06-07)
- 基于SPMC75F2413A单片机的直流变频洗衣机的设计(05-29)
- 基于SPMC75F2413A的直流变频洗衣机的设计方法(05-10)
- 采用SPMC75F2313A的直流伺服驱动器(05-09)
- 基于智能功率模组芯片PS21865A和SPMC75F2413A的AC变频空调方案实现(05-02)