ybcomm 发表于 2010-12-7 20:27:08

C语言有可移植性强和可读性好等优点,而汇编语言的高效、快速等优点又是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
二. KEILC51函数的参数传递规则
(一)通过寄存器传递的函数参数表
参数长度        第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在线汇编举例和汇编模块举例可供大家下载参考!

37772166 发表于 2010-12-7 20:29:22

不错。。MARK

ybcomm 发表于 2010-12-7 20:32:19

KEIL C51在线汇编举例ourdev_603288FIVV4Q.rar(文件大小:18K) (原文件名:KEIL C51在线汇编举例.rar)
KEIL C51汇编模块举例ourdev_603289N6N3YE.rar(文件大小:24K) (原文件名:KEIL C51汇编模块举例.rar)

lukeunderwood 发表于 2010-12-7 21:00:39

C51中嵌入汇编以前用过一次,效率提升挺高的。可以先用C写出函数,然后从KEIL编译的某个文件里(忘了是哪个)找到这段汇编代码,修改汇编代码提升效率,比直接写要快和简单些。

b54wco 发表于 2010-12-7 21:11:42

mark

wangma 发表于 2010-12-7 21:29:21

不错,支持

lyxing 发表于 2010-12-7 21:40:45

学习!!

aeiowx 发表于 2010-12-7 22:09:54

mark

eagle2006 发表于 2010-12-7 22:32:11

学习

wxhland 发表于 2010-12-7 23:43:49

good

hubeilcsun3 发表于 2010-12-7 23:50:16

good

abc220 发表于 2010-12-8 00:34:35

马克,备用

z7001 发表于 2010-12-8 05:29:30

mark

liumaojun_cn 发表于 2010-12-8 08:35:53

mark

lsw0136 发表于 2010-12-8 08:40:37

mark

lsw0136 发表于 2010-12-8 08:40:53

mark

ybcomm 发表于 2010-12-8 16:56:19

没想到,这个大家都还挺感兴趣的,那就把混合编程的视频教程也上传给大家学习!
《深入浅出玩转51单片机》『高级篇1-C51混合编程1』ourdev_603259VP1MEQ.rar(文件大小:37.60M) (原文件名:《深入浅出玩转51单片机》『高级篇1-C51混合编程1』.rar)

intentydh 发表于 2010-12-8 17:38:52

mark。

yufan 发表于 2010-12-8 18:02:24

mark

cszwm 发表于 2010-12-8 19:01:18

mark

ybcomm 发表于 2010-12-8 19:17:24

《深入浅出玩转51单片机》『高级篇1-C51混合编程2』ourdev_603286D3FZ0G.rar(文件大小:25.55M) (原文件名:《深入浅出玩转51单片机》『高级篇1-C51混合编程2』.rar)

wuxin999 发表于 2010-12-8 19:24:14

mark

byin 发表于 2010-12-8 21:01:26

mark

muzheyun 发表于 2010-12-9 20:31:55

MARK

bulinsheng 发表于 2010-12-9 21:11:55

mark

hamipeter 发表于 2010-12-10 19:58:27

学长发的贴啊,这个真得顶!

clqfly 发表于 2010-12-11 15:30:19

mark

canback 发表于 2010-12-11 15:45:23

学习

tcp1985 发表于 2010-12-11 18:43:37

mark

kkalizee 发表于 2010-12-11 20:38:36

mark

dr2001 发表于 2010-12-11 20:44:06

写C的函数原型和框架,用Compile Only生成汇编框架,然后填写汇编代码即可。
一般不用那么费力的去折腾命名的问题。

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

ybcomm 发表于 2010-12-11 21:06:14

楼上说的明白,但是学习知识不能浅尝则止!做深入一点的了解,肯定会让自己有更多的收获不是更好吗!

eduhf_123 发表于 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楼的回复。

ybcomm 发表于 2010-12-12 08:29:50

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

XA144F 发表于 2010-12-12 09:32:29

内嵌汇编?这个有些意思,以前实验了一些,总是出莫名其妙的问题。

zlutian 发表于 2010-12-12 10:29:45

谢谢,mark

sandy_ds 发表于 2010-12-12 16:15:41

mark! 好

kongjie07 发表于 2010-12-12 18:37:38

mark!

Wangwy 发表于 2010-12-12 18:50:01

业邦广告找到人气最旺的论坛了

Wangwy 发表于 2010-12-12 18:51:02

业邦广告找到人气最旺的论坛了

AIHHLI 发表于 2010-12-12 19:10:28

手机上网,先马克。

ybcomm 发表于 2010-12-14 18:18:43

回复【40楼】Wangwy
业邦广告找到人气最旺的论坛了
-----------------------------------------------------------------------

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

ybcomm 发表于 2010-12-14 18:30:49

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

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

maikluo 发表于 2010-12-14 21:17:49

good

kkalizee 发表于 2010-12-18 15:13:16

mark

alexliu0915 发表于 2010-12-20 21:12:17

mark

hhdslb 发表于 2010-12-20 22:51:20

mark, 汇编还是太难记了

jiangkun0616 发表于 2010-12-21 09:29:32

mark。。

yuzr 发表于 2010-12-21 12:56:58

mark

tobe1989 发表于 2010-12-21 14:19:30

mark很有用

wpnx 发表于 2010-12-21 14:23:11

mark

BINGSHUIHUO 发表于 2010-12-24 01:28:21

mark~

lixupeng 发表于 2010-12-29 10:30:58

收下了!!!

liusoldier 发表于 2010-12-29 10:55:09

Mark

flywater 发表于 2010-12-29 11:30:35

支持LZ奉献精神,顶了

zxpt 发表于 2011-1-6 20:31:31

长知识了!

htlm2010 发表于 2011-1-10 12:22:35

正需要呢!

nicksean 发表于 2011-2-3 20:31:45

mark!

ERDTxiduoduo 发表于 2011-2-4 01:54:09

mark

joni 发表于 2011-2-4 01:58:33

MARK

liguan1024 发表于 2011-2-4 05:32:48

mark

wtiechen1969 发表于 2011-2-4 08:19:39

谢谢LZ分享

hfutwj 发表于 2011-2-4 12:32:30

这个一定要MARK

gloryzkl 发表于 2011-2-4 16:23:16

马克

akong 发表于 2011-2-4 16:32:22

mark

benjiang 发表于 2011-2-4 18:55:25

mark

Thorn_Birds 发表于 2011-2-10 15:27:40

回复【楼主位】ybcomm
-----------------------------------------------------------------------

楼主威武

hamipeter 发表于 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

tmlee 发表于 2011-2-12 04:09:52

PLM51 可移植性强和可读性也不错。。

avrfans1 发表于 2011-2-26 18:01:40

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

cc6868 发表于 2011-2-26 23:20:19

看看呢!

bwhaisinile 发表于 2011-2-26 23:40:34

留着慢慢消化

GZLJZ 发表于 2011-2-26 23:50:53

mark

ssaweee 发表于 2011-2-26 23:52:23

汇编比c快多少?有没有研究?

liangtao 发表于 2011-2-27 00:02:29

mark

cxbbb 发表于 2011-2-27 00:02:41

学习学习

tyqhaha 发表于 2011-2-27 00:57:27

mark

ndust 发表于 2011-2-27 08:56:47

jh

nop_linyh 发表于 2011-2-27 09:21:40

Mark c和汇编

davidd 发表于 2011-2-27 09:29:01

mark

llh1234 发表于 2011-2-27 14:02:41

谢谢分享……

caisanlong 发表于 2011-2-27 15:21:08

mark

cc6868 发表于 2011-2-27 21:21:33

学习一下,最近有在考虑这个问题

z421868436 发表于 2011-2-28 11:07:31

mark

wangxb330226 发表于 2011-2-28 13:18:53

mark

hoho34 发表于 2011-2-28 13:28:46

mark先

wuyiduan 发表于 2011-3-15 21:47:11

不错

okliujie 发表于 2011-3-16 12:28:43

学习中

qunianjinri 发表于 2011-3-16 12:55:36

好贴子,受教了

CSU_David 发表于 2011-3-16 13:17:48

受益匪浅~

XXLXXL 发表于 2011-3-17 01:11:39

mak

TimCheng 发表于 2011-3-17 09:31:43

理解这个混合编程的原理,对学ARM的启动代码,和UCOS移植是有帮助的。

w492901074 发表于 2011-3-17 10:08:11

mark 标题:汇编和C混编

xiaobenyi 发表于 2011-3-17 12:33:17

回复【70楼】avrfans1
-----------------------------------------------------------------------

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

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

lzz2009 发表于 2011-3-18 10:30:22

学习。。。

xxp1943 发表于 2011-3-19 01:59:49

mark

myhonour 发表于 2011-3-19 05:21:12

mark

agency 发表于 2011-3-19 08:35:24

留着慢慢消化

newbie 发表于 2011-3-19 09:49:50

eryueniao 发表于 2011-3-28 21:19:49

回复【楼主位】ybcomm
-----------------------------------------------------------------------

厉害
页: [1] 2
查看完整版本: C语言有可移植性强和可读性好等优点,而汇编语言的高效、快速等优点又是C语言所难以达