找回密码
 注册会员
搜索附件  
MCU资讯论坛 附件中心 单片机论坛 51单片机论坛 KEIL_C51汇编模块举例.rar

KEIL_C51汇编模块举例.rar

 

介绍一下KEIL C51所支持的C语言和汇编语言混合编程的方法!:
51单片机是最早的单片机,也是在国内应用最广泛的单片机,为大家所喜爱!但执行速度较其它单片机较慢。因此在编程时更加要注重程序的执行效率及编程上的技巧处理,最大限度的发挥其性能,满足项目开发的实际需要。在嵌入式开发中,C语言具有可移植性强和可读性好等优点,而汇编语言的高效、快速及可直接对硬件进行操作等优点又是C语言所难以达到的,本帖就为大家介绍一下KEIL C51所支持C和汇编混合编程的方法,将这两种语言的优点完美的结合,更大限度的发挥51单片机的性能,加快我们的产品开发周期!

如用此方法实现6时钟(6T)的51单片机对320kbps mp3文件的流畅播放,就是这种混合编程的方法的一个很好的应用实例!下面就为大家介绍一下混合编程的方法。

所谓混合编程,就是在一个项目中,同时使用C和汇编两种语言。 C语言和汇编语言混合编程的方法形式多样,可以是以汇编语言为主体,在其中内嵌部分C语言;也可以是以C语言为主体在其中加入部分汇编语言(此方法实用价值较高,而被工程师们广泛的采用)。在此方法中,用汇编语言编写对有关硬件的驱动和处理、复杂的算法、实时性要求较高等底层的东西,来满足单片机对某些硬件高效、快速、精确的处理等性能上的要求。用C语言来编写程序的主体部分。这样就将C语言的可移植性强和可读性好与汇编语言的高效、快速及可直接对硬件进行操作等优点相结合。两者优劣互补、相得益彰,加快我们产品的开发周期,具有极高的现实意义和实用价值!

在KEIL C51中加入的汇编代码需按照其编译器中约定的规则才可以实现C语言程序对汇编代码的调用。即KEIL C51的命名规则和参数传递规则。

一. KEIL C51的命名规则

在KEIL C51中,编译器对C语言程序中的函数会自动的进行转换,转换规则如下表:

函数属性 函数举例 段中的函数名

无参数或无寄存器参数传递的函数 void func1(void) func1

含通过寄存器传递的参数 void func2(int) _func2

可重入函数 void func3(char)reentrant _?func3

二. KEIL C51函数的参数传递规则

(一)通过寄存器传递的函数参数表

参数长度 第1个形参 第2个形参 第3个形参

1字节(char) R7 R5 R3

2字节(int) R6(H) R7 R4(H) R5 R2(H) R3

3字节(通用指针) R1(H)~R3

4字节(long) R4(H)~R7

(二)函数返回值使用的寄存器列表

返回类 使用的寄存器

位数据(bit) 位累加器CY

1字节(char) R7

2字节(int) R6(H) R7

3字节(通用指针) R3(类型)R2(H) R1

4字节(long) R4(H)~R7

4字节(float) R4(H)~R7,32位IEEE格式,指数和符号位在R7



在混合编程中,最常用也是最实用的方法是在C语言中加入部分汇编语言的代码,分为两种方法。

方法1)在Keil C51的函数中直接插入汇编语句

方法2)按照Keil C51接口规则,编写汇编模块

方法1是利用编译控制命令#pragma asm(用来标识所插入的汇编语句的起始位置) 和 #pragma endasm (用来标识所插入的汇编语句的结束位置) ,这两条命令必须成对出现,并可以多次出现。在Keil C51中不对插入的汇编代码做任何的处理。

方法2编写汇编模块,需对KEIL编译器的编译过程做些了解。Keil编译器的编译过程是首先将项目中的一个个源文件编译为目标代码(obj文件),然在再通过连接器产生为最终可执行的hex文件。

目标代码将其中的代码、数据、常量放在不同的“段”中,保存程序的段称为“代码段”,保存数据的段称为“数据段”,最终目标代码经过Keil的连接器按照“段”的要求转换为程序和数据地址固定的可执行文件。

在Keil软件中,“段”按定位属性分为:“可重定位段”和“绝对段”。

“可重定位段”:程序和数据在其分别所对应的存储单元(FLASH和RAM)中的存储地址是浮动的、可重定义的、相对可变的。

“绝对段”:其地址在连接前就已确定不变,连接器据此为它分配地址。


QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-24 04:56 , Processed in 0.038670 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

返回顶部