微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > SPMC75和ASM(汇编)混合编程的应用

SPMC75和ASM(汇编)混合编程的应用

时间:10-21 来源:互联网 点击:

程序调用 ASM 函数

/*-------------------------------------------------------*/

F_Function();

while(1){;}

}

/*-------------------------------------------------------*/

/* ASM 程序

/*-------------------------------------------------------*/

//=============================================================

// ----Function: void F_Function(void);

// -Description: ASM 函数

// --Parameters: none

// -----Returns: none

// -------Notes: none

// -----Destroy: none

//=============================================================

.CODE

.PUBLIC _F_Function

_F_Function: .proc

nop;

RETF;

.endp

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];

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top