17692|15

16

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

介绍一下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)中的存储地址是浮动的、可重定义的、相对可变的。
  “绝对段”:其地址在连接前就已确定不变,连接器据此为它分配地址。
  经Keil编译器生成的“段”具有如下属性:
1)段的存储属性(program code data pdata xdata bdata bit等);
2)段的起始地址;3)段的长度;
4)段的定位要求:绝对段地址固定,可重定位段定位的要求如要求代码段在2K范围内,数据段定位在可位寻址区等;
5)段名:包括程序和数据(变量和常量)的段的存储属性及段所属的程序模块(文件)。代码段: ?PR? funcname?Filename
 数据段如:?DT? funcname?Filename; ?BI? funcname?Filename
       标准段名前缀列表
段前缀 存储类型             含义
?PR? Program            程序存储区的代码
?CO? code 程序存储区的常量
?BI? Bit 内部数据存储区的可位寻址的位变量
?BA? Bdata 内部数据存储区的可位寻址的字节变量
?DT? Data 内部数据存储区的变量
?ID? Idata 内部数据存储区可间接寻址的变量
?PD? Pdata 外部数据存储区的页变量
?XD? Xdata 外部数据存储区的变量

KEIL C51在线汇编举例和汇编模块举例可供大家下载参考!

KEIL C51在线汇编举例.rar (18.12 KB, 下载次数: 395)

KEIL C51汇编模块举例.rar (24.21 KB, 下载次数: 297)

此帖出自51单片机论坛

最新回复

太给力啊  详情 回复 发表于 2012-4-19 17:19
点赞 关注
 

回复
举报

228

帖子

3756

TA的资源

一粒金砂(中级)

沙发
 
谢谢楼主分享 来看看 :)
此帖出自51单片机论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
谢谢,准备先学汇编,学好后再看C
此帖出自51单片机论坛
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

4
 

用C和汇编混合编程的方法,用6T的51单片机可实现对320kbpsMP3文件的流畅播放,顺便发几张图片看看

此帖出自51单片机论坛

赞赏

1

查看全部赞赏

 
 
 

回复

7815

帖子

55

TA的资源

裸片初长成(中级)

5
 
顶起来先。
刚才在写DS18B20的程序。
想写一个US级别的延时程序。
后来顺带想用它实现长时间的延时,发现因为用了FOR循环,从反汇编窗口看出中间多了很多乱七八糟的代码。
使用混合编程,不知道直接插入汇编语句,可否像汇编中的标号一样反复调用呢?
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

6
 
回版主,如想实现us级的精确延时且可以被反复调用的话的,最好采用按照Keil C51接口规则,讲延时语句编写程汇编模块,在C语言中当做一个函数反复调用即可!
此帖出自51单片机论坛
 
 
 

回复

1万

帖子

16

TA的资源

版主

7
 

好东东,顶一下

此帖出自51单片机论坛
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

14

帖子

0

TA的资源

一粒金砂(初级)

8
 
LZ威武~~~~~~
此帖出自51单片机论坛
 
个人签名不断学习才是王道~~~
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

9
 
图片很不错
此帖出自51单片机论坛
 
 
 

回复

259

帖子

0

TA的资源

一粒金砂(中级)

10
 
这个太强大了,这也是用51做的?
此帖出自51单片机论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

11
 
有没有源程序,光看图片不明白
此帖出自51单片机论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

12
 

谢谢分享

谢谢楼主分享,非常好
此帖出自51单片机论坛
 
 
 

回复

23

帖子

0

TA的资源

一粒金砂(初级)

13
 
谢谢楼主
此帖出自51单片机论坛
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(初级)

14
 

这个太强大了

这个太强大了
此帖出自51单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

15
 

谢谢楼主分享

太给力啊
此帖出自51单片机论坛
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

16
 

谢谢夸奖!单片机这东西,有兴趣就有动力!

此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
报名赢【小米双肩包、contigo水杯】 | TI MSPM0 系列 MCU 再添新成员
了解TI 前沿新品——高性能与高性价比的优秀组合 MSPM0G351x / MSPM0L111x,4月24日(周四)上午10:00直播~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 5

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表