SAM8系列S3C825A型单片机及其软件设计

[09-12 17:48:05]   来源:http://www.88dzw.com  单片机学习   阅读:8966

文章摘要:函数返回值可根据其类型放在R15或R15:R14寄存器对中。若返回值是struct或union类型,则返回R15中的值是存放返回结果的堆栈指针起始位置。C语言编译器也是编译中断函数时会自动保护所用到的寄存器(包括R10-R15),状态寄存器FLAGS的保护也是在中断处理过程中自动完成的。中断过程中用到的寄存器都使用PUSH Rn的指令进行保护,而采用POP Rn指令恢复。当用IRET指令自动恢复状态寄存器FLAGS时,可以从中断中返回。3.2 对汇编语言函数的约定对于一个可以被C语言函数调用的汇编程序来说,使用时必须满足以下3点:(1)符合C语言参数传递规则;(2)有PUBLIC函数入口标志;

SAM8系列S3C825A型单片机及其软件设计,标签:单片机开发,单片机原理,单片机教程,http://www.88dzw.com

函数返回值可根据其类型放在R15或R15:R14寄存器对中。若返回值是struct或union类型,则返回R15中的值是存放返回结果的堆栈指针起始位置。

C语言编译器也是编译中断函数时会自动保护所用到的寄存器(包括R10-R15),状态寄存器FLAGS的保护也是在中断处理过程中自动完成的。中断过程中用到的寄存器都使用PUSH Rn的指令进行保护,而采用POP Rn指令恢复。当用IRET指令自动恢复状态寄存器FLAGS时,可以从中断中返回。

3.2 对汇编语言函数的约定

对于一个可以被C语言函数调用的汇编程序来说,使用时必须满足以下3点:

(1)符合C语言参数传递规则;

(2)有PUBLIC函数入口标志;

(3)在C语言函数中用extern声音为外部函数。

参加传递规则和C语言函数一样,所不同的是,要在汇编语言函数编写过程中具体体现出来。

4 应用实例

明确了以上调用规则,混合编程就比较容易了,归纳起来有以下几点:

(1)在C语言源文件中用“extern”关键字导入被汇编语言源文件导出的标号;

(2)在汇编语言源文件用“PUBLIC”关键字把标号导出到C语言源文件;

(3)在汇编语言中用“EXTERN”关键字导入被C语言函数源文件导出的关键字;

(4)用C语言把标号导出给汇编语言,这一步不需要关键字;

(5)把编辑好的C语言和汇编语言源文件导入设计系统,并用各自调用函数的指令调用。

下面以笔者在校音器设计中用到的2个例子来具体说明。

4.1 C语言和汇编语言相互调用

在该例中,用C语言函数main()调用汇编语言函数get_rand()以得到一个随机数,接着,用汇编语言函数get_rand()调用C语言库函数rand()再得到一个整型机随机数,然后用调用C语言函数mult()的方法把这个随机值的高位乘以main()函数传递给自己的实参,同时把乘积值返回给main()参数。

/****C语言源程序****/

#include<ios3c825a.h>/*头文件*/

extern unsigned char get_rand (unsigned char seed);/* 汇编语言原型声明*/

void main(void)/*主函数*/

{

unsigned char seed;

unsigned char value;/*定义变量*/

WTCON=0xa0; /*关闭watch dog*/

Seed=0x05;

Value=get_rand(seed); /*调用汇编语言函数,得到一个随机数*/

While(1); /*程序结束*/

}

/**加法子程序,供汇编语言调用**/

unsigned char add(unsigned char x,unsigned chary)

{

return (x+y);

}

/****C语言源程序结束 ****/

/****汇编语言源程序 ****/

#include <ios3c825a.h> ;头文件

EXTERN rand ;C语言库函数

EXTERN add ;用户自定义C函数

PUBLIC get_rand ;导出函数名给C函数调用

Get_rand:

PUSH R9 ;普通C函数入栈保护

上一页  [1] [2] [3] [4]  下一页


Tag:单片机学习单片机开发,单片机原理,单片机教程单片机学习

《SAM8系列S3C825A型单片机及其软件设计》相关文章

分类导航
最新更新
热门排行