搜索
bottom↓
回复: 126

C语言有可移植性强和可读性好等优点,而汇编语言的高效、快速等优点又是C语言所难以达

[复制链接]

出0入0汤圆

发表于 2010-12-7 20:27:08 | 显示全部楼层 |阅读模式
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在线汇编举例和汇编模块举例可供大家下载参考!

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2010-12-7 20:29:22 | 显示全部楼层
不错。。MARK

出0入0汤圆

 楼主| 发表于 2010-12-7 20:32:19 | 显示全部楼层
KEIL C51在线汇编举例ourdev_603288FIVV4Q.rar(文件大小:18K) (原文件名:KEIL C51在线汇编举例.rar)
KEIL C51汇编模块举例ourdev_603289N6N3YE.rar(文件大小:24K) (原文件名:KEIL C51汇编模块举例.rar)

出0入0汤圆

发表于 2010-12-7 21:00:39 | 显示全部楼层
C51中嵌入汇编以前用过一次,效率提升挺高的。可以先用C写出函数,然后从KEIL编译的某个文件里(忘了是哪个)找到这段汇编代码,修改汇编代码提升效率,比直接写要快和简单些。

出0入0汤圆

发表于 2010-12-7 21:11:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-7 21:29:21 | 显示全部楼层
不错,支持

出0入0汤圆

发表于 2010-12-7 21:40:45 | 显示全部楼层
学习!!

出0入0汤圆

发表于 2010-12-7 22:09:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-7 22:32:11 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-12-7 23:43:49 | 显示全部楼层
good

出0入0汤圆

发表于 2010-12-7 23:50:16 | 显示全部楼层
good

出50入0汤圆

发表于 2010-12-8 00:34:35 | 显示全部楼层
马克,备用

出0入0汤圆

发表于 2010-12-8 05:29:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-8 08:35:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-8 08:40:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-8 08:40:53 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2010-12-8 16:56:19 | 显示全部楼层
没想到,这个大家都还挺感兴趣的,那就把混合编程的视频教程也上传给大家学习!
《深入浅出玩转51单片机》『高级篇1-C51混合编程1』ourdev_603259VP1MEQ.rar(文件大小:37.60M) (原文件名:《深入浅出玩转51单片机》『高级篇1-C51混合编程1』.rar)

出0入0汤圆

发表于 2010-12-8 17:38:52 | 显示全部楼层
mark。

出0入0汤圆

发表于 2010-12-8 18:02:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-8 19:01:18 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2010-12-8 19:17:24 | 显示全部楼层
《深入浅出玩转51单片机》『高级篇1-C51混合编程2』ourdev_603286D3FZ0G.rar(文件大小:25.55M) (原文件名:《深入浅出玩转51单片机》『高级篇1-C51混合编程2』.rar)

出0入0汤圆

发表于 2010-12-8 19:24:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-8 21:01:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-9 20:31:55 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-12-9 21:11:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-10 19:58:27 | 显示全部楼层
学长发的贴啊,这个真得顶!

出0入0汤圆

发表于 2010-12-11 15:30:19 | 显示全部楼层
mark

出0入42汤圆

发表于 2010-12-11 15:45:23 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-12-11 18:43:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-11 20:38:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-11 20:44:06 | 显示全部楼层
写C的函数原型和框架,用Compile Only生成汇编框架,然后填写汇编代码即可。
一般不用那么费力的去折腾命名的问题。

命名错了可能导致不良后果。

出0入0汤圆

 楼主| 发表于 2010-12-11 21:06:14 | 显示全部楼层
楼上说的明白,但是学习知识不能浅尝则止!做深入一点的了解,肯定会让自己有更多的收获不是更好吗!

出0入0汤圆

发表于 2010-12-12 00:47:32 | 显示全部楼层
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1836281
看我在这个帖子19楼的回复。

http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3731568
还有这个帖子中4楼、5楼的回复。

出0入0汤圆

 楼主| 发表于 2010-12-12 08:29:50 | 显示全部楼层
再把这个视频上传,看完以后大家就什么都明白了,有需补充的直接发到本帖
《深入浅出玩转51单片机》『高级篇1-C51混合编程3』ourdev_604097YV2S6U.rar(文件大小:69.08M) (原文件名:《深入浅出玩转51单片机》『高级篇1-C51混合编程3』.rar)

出0入0汤圆

发表于 2010-12-12 09:32:29 | 显示全部楼层
内嵌汇编?这个有些意思,以前实验了一些,总是出莫名其妙的问题。

出0入0汤圆

发表于 2010-12-12 10:29:45 | 显示全部楼层
谢谢,mark

出0入0汤圆

发表于 2010-12-12 16:15:41 | 显示全部楼层
mark! 好

出0入0汤圆

发表于 2010-12-12 18:37:38 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-12-12 18:50:01 | 显示全部楼层
业邦广告找到人气最旺的论坛了

出0入0汤圆

发表于 2010-12-12 18:51:02 | 显示全部楼层
业邦广告找到人气最旺的论坛了

出0入0汤圆

发表于 2010-12-12 19:10:28 | 显示全部楼层
手机上网,先马克。

出0入0汤圆

 楼主| 发表于 2010-12-14 18:18:43 | 显示全部楼层
回复【40楼】Wangwy
业邦广告找到人气最旺的论坛了
-----------------------------------------------------------------------

看点广告你没有任何损失,但是从帖子中学到的东西,却能让你受益终生!
掌握了C和汇编混合编程的方法,开动你的脑筋,如果能让6T的51单片机就可实现对320kbps MP3文件的流畅播放!
你会发现混合编程绝对是个好方法!对了你的旺铺怎么收费啊?^_^^_^

出0入0汤圆

 楼主| 发表于 2010-12-14 18:30:49 | 显示全部楼层
回复【3楼】lukeunderwood 潜水的熊猫
c51中嵌入汇编以前用过一次,效率提升挺高的。可以先用c写出函数,然后从keil编译的某个文件里(忘了是哪个)找到这段汇编代码,修改汇编代码提升效率,比直接写要快和简单些。
-----------------------------------------------------------------------

回3楼,是将C文件设置为可产生SRC文件后,编译该C文件对其生成的SRC文件修改或添加汇编代码即可!

出0入0汤圆

发表于 2010-12-14 21:17:49 | 显示全部楼层
good

出0入0汤圆

发表于 2010-12-18 15:13:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-20 21:12:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-20 22:51:20 | 显示全部楼层
mark, 汇编还是太难记了

出0入0汤圆

发表于 2010-12-21 09:29:32 | 显示全部楼层
mark  。。

出50入0汤圆

发表于 2010-12-21 12:56:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-21 14:19:30 | 显示全部楼层
mark  很有用

出0入0汤圆

发表于 2010-12-21 14:23:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-24 01:28:21 | 显示全部楼层
mark~

出0入0汤圆

发表于 2010-12-29 10:30:58 | 显示全部楼层
收下了!!!

出0入0汤圆

发表于 2010-12-29 10:55:09 | 显示全部楼层
Mark

出0入0汤圆

发表于 2010-12-29 11:30:35 | 显示全部楼层
支持LZ奉献精神,顶了

出0入0汤圆

发表于 2011-1-6 20:31:31 | 显示全部楼层
长知识了!

出0入0汤圆

发表于 2011-1-10 12:22:35 | 显示全部楼层
正需要呢!

出0入0汤圆

发表于 2011-2-3 20:31:45 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-2-4 01:54:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-4 01:58:33 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-2-4 05:32:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-4 08:19:39 | 显示全部楼层
谢谢LZ分享

出0入0汤圆

发表于 2011-2-4 12:32:30 | 显示全部楼层
这个一定要MARK

出0入0汤圆

发表于 2011-2-4 16:23:16 | 显示全部楼层
马克

出0入0汤圆

发表于 2011-2-4 16:32:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-4 18:55:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-10 15:27:40 | 显示全部楼层
回复【楼主位】ybcomm  
-----------------------------------------------------------------------

楼主威武

出0入0汤圆

发表于 2011-2-12 00:27:24 | 显示全部楼层
采用这里介绍的c和汇编语言混合编程的方法,实现6T的51单片机就可实现对320kbps MP3文件的流畅播放的视频教程及图片等资料,连接如下:
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4297792&bbs_id=1000&bbs_page_no=1

出0入0汤圆

发表于 2011-2-12 04:09:52 | 显示全部楼层
PLM51 可移植性强和可读性也不错。。

出0入0汤圆

发表于 2011-2-26 18:01:40 | 显示全部楼层
楼主:用51单片机就可实现对320kbps MP3播放,能提供源码吗?很想学习学习!

出0入0汤圆

发表于 2011-2-26 23:20:19 | 显示全部楼层
看看呢!

出0入0汤圆

发表于 2011-2-26 23:40:34 | 显示全部楼层
留着慢慢消化

出0入0汤圆

发表于 2011-2-26 23:50:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-26 23:52:23 | 显示全部楼层
汇编比c快多少?有没有研究?

出0入0汤圆

发表于 2011-2-27 00:02:29 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-27 00:02:41 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2011-2-27 00:57:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-27 08:56:47 | 显示全部楼层
jh

出0入0汤圆

发表于 2011-2-27 09:21:40 | 显示全部楼层
Mark c和汇编

出0入0汤圆

发表于 2011-2-27 09:29:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-27 14:02:41 | 显示全部楼层
谢谢分享……

出0入0汤圆

发表于 2011-2-27 15:21:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-27 21:21:33 | 显示全部楼层
学习一下,最近有在考虑这个问题

出0入0汤圆

发表于 2011-2-28 11:07:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-28 13:18:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-28 13:28:46 | 显示全部楼层
mark先

出0入0汤圆

发表于 2011-3-15 21:47:11 | 显示全部楼层
不错

出0入0汤圆

发表于 2011-3-16 12:28:43 | 显示全部楼层
学习中

出0入0汤圆

发表于 2011-3-16 12:55:36 | 显示全部楼层
好贴子,受教了

出0入0汤圆

发表于 2011-3-16 13:17:48 | 显示全部楼层
受益匪浅~

出0入0汤圆

发表于 2011-3-17 01:11:39 | 显示全部楼层
mak

出0入0汤圆

发表于 2011-3-17 09:31:43 | 显示全部楼层
理解这个混合编程的原理,对学ARM的启动代码,和UCOS移植是有帮助的。

出0入0汤圆

发表于 2011-3-17 10:08:11 | 显示全部楼层
mark 标题:汇编和C混编

出0入0汤圆

发表于 2011-3-17 12:33:17 | 显示全部楼层
回复【70楼】avrfans1  
-----------------------------------------------------------------------

楼主:用51单片机就可实现对320kbps MP3播放,能提供源码吗?很想学习学习!

同问,非常想得到这个源代码

出0入0汤圆

发表于 2011-3-18 10:30:22 | 显示全部楼层
学习。。。

出0入0汤圆

发表于 2011-3-19 01:59:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-19 05:21:12 | 显示全部楼层
mark

出0入170汤圆

发表于 2011-3-19 08:35:24 | 显示全部楼层
留着慢慢消化
头像被屏蔽

出0入0汤圆

发表于 2011-3-19 09:49:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2011-3-28 21:19:49 | 显示全部楼层
回复【楼主位】ybcomm
-----------------------------------------------------------------------

厉害
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 10:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表