基于Keil51汇编与C语言混合编程方法研究.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2010年第lO期
计算机与现代化
JISUANJIYUXIANDAIHUA
总第182期
文章编号:1006-2475(2010)104)043-04
基于Keil51汇编与C语言混合编程方法研究
张志科,王振喜
(忻州师范学院电子系,山西忻州034000)
摘要:分析基于KeilSl汇编与C语言混合编程的基本方法,给出每种方法的具体操作步骤。
在应用实践中,为了充分发挥两种语言的优势,提高程序的执行效率,可根据问题的特殊性选择相应的编程方案,以期达到缩短程序设计过程的目标。
关键词:Keil51;混合编程;参数传递中图分类号:TP311
文献标识码:A
doi:10.3969/j.issn.1006-2475.2010.10.011
Research
on
MixedProgrammingMethod
ofCLanguageandAssembleLanguageBased
on
Keil51
ZHANGZhi—ke,WANGZhen—xi
(Departmentof
Electronics,XinzhouTeachersCollege,Xinzhou
034000,China)
Abstract:Thispaperanalyzes
thebasicmethodofmixedprogrammingofClanguageandassemblelanguagebasedon
Keil51.
givesthespecificstepsofeach
method.Intheapplicationpractice,forgivingfullplay
to
theadvantagesofboth
languagesand
improvingtheexecutedefficiencyofprograms,it
can
selecttheappropriateprogrammingschemeaccordingtO
thespecialissue.
Soit
can
achievethegoalofshorteningtheprocessofprogramming.
Keywords:Keil51;mixedprogramming;parametertransfer
O
引言
汇编与C语言优点各异,前者对硬件控制方便、程序代码简练、执行效率高,后者功能丰富、可移植性好、可读性强。
为了充分发挥两种语言的优点,使程
序更加优化,在单片机程序设计中常会涉及到汇编与C语言混合编程问题。
汇编与C语言混合编程的方法可分为两类,一类是在C程序中嵌入汇编代码,另一类是两种程序以函数的形式相互调用。
C程序调
用汇编和汇编调用C函数是两种基本的调用方式,具体采用何种方式主要取决于工程对程序的要求。
根据应用实践的具体情况,可将混合编程的基本方法
分为以下5种情况。
1在C语言程序段中内嵌汇编代码
在C51中嵌入汇编代码主要是用于实现延时或
中断处理,通常是在汇编程序简练,且内部没有复杂
跳转时采用,它是通过使用C51中的一组预处理指令来实现的,具体方法如下:
(1)格式要求…。
#pragma
#pragnm
(2)工程选项设置旧J。
在Project窗口中,右键点击包含汇编代码的C文件,选择“Optionsfor…”,然后在弹出的窗口中选
中“Generate
AssemblerSRC
File”和“Assemble
SRC
File”两项,使检查框由灰色变成黑色。
选中这两项
Keil才会将“asm”与“endasm”中的代码复制到输出的SRC文件中,SRC文件为C文件中对应的汇编文件。
也可通过分析SRC文件了解函数的封装规则。
(3)内嵌汇编代码C文件实例。
#include<艇,sSl.h>
void
main(void)
{
收稿日期:2010-06.18
基金项目:山西省教育厅普通高等学校大学生创新性实验基金资助项目(2008[105])
作者简介:张志科(1962一),男,山西翼城人,忻州师范学院电子系副教授,本科,研究方向:自动控制技术。
万方数据
计算机与现代化
2010年第10期
p2=l;
#pragmaasm
;汇编延时程序
静pm鲫a
endasm
p2=O:
}
对于在C程序中通过撑pragmaasITl和#pragmaendasm嵌入的汇编程序,Keil在编译时不做其它处理,因此不存在参数传递和返回值问题。
2无参数传递的混合调用
在Keil集成开发环境中进行混合编程时,需要
在工程中建立两类文件,C文件和汇编文件,其中汇编文件中的函数作为被调用函数时,只要使得该函数遵循C51函数的转换规则,就可以实现相互调用。
2.1
C程序调用汇编(1)C文件格式[21。
C程序在调用汇编函数之前必须先用extem对
函数加以声明。
实例main.c如下:
#include<呼1.h>
extemvoiddemy();//声明此函数为外部函数
void
mmn(void)
{
P2=0xff;
dehy();//所调用的汇编函数
P2=0;
I(2)汇编文件格式‘21。
首先在程序存储区中定义段,接着利用PUBLIC把函数声明为公共函数,RSEG为汇编函数起始标志
符,之后紧接汇编程序。
为了实现程序的相互调用,
要求汇编程序必须遵循C51函数名的转换规则,函将无法实现程序的相互调用。
实例delay.asm如下:
NAME
ONE;定义模块名
?PB?DELAY?ONESEGMENTCODE;在程序存储区中
定义段
PUBLIC
DELAY;声明为公共函数
RSEC?PR?DELAY?ONE;函数起始位置
DELAY:
:汇编程序
RETEND
2.2汇编调用C函数
(1)汇编文件格式。
此时只需要在汇编文件开头用“EXTRNCODE(函
数名)”语句来声明所调用的C函数即可。
实例如下:
EXTRN
CODE(DELAY);声明所要调用的C函数
ORC0000HMOVP2,#00HCALL
DELAY;调用C函数
MOVP2,#FFH
END
(2)C文件格式。
在该文件中只需写出所要调用的C函数即可。
#include<res51.h>
viod
delay()//在汇编文件中所要调用的延时函数l
//C函数语句l
该方法主要用于无参数传递的情况,简单且易于掌握。
3
通过约定固定存储空间传递参数的
混合调用
在5l单片机内可在两种语言之间约定“用户
RAM区”作为参数传递空间。
3.1
C程序调用汇编(1)C文件格式。
#include<弛庐1.h>
extern
void
delay();
voidmain(void)
l
DBYTE[0x30]=O】【FF;DBYTE[0x31]=OxFF;
P2=0;
dehy();
1>2=1;
(2)汇编文件格式。
汇编文件通过约定存储区接收C文件传递过来
的参数,对参数进行处理。
NAMETWO
?PR?DELAY?TWOSEGMENTCODE
PUBUCDEL^Y
碰;EG?PR?DELAY?’rWO
DELAY:
MOVR7,#30HDEL:MOV
R6.#31H
DJNZR6.¥DJNZR7。
DEL
R明.
万方数据
2010年第lO期
张志科等:基于Keil51汇编与C语言混合编程方法研究
45
END
3.2汇编调用C函数
(1)汇编文件格式。
EXTRNCODE(function);声明所要调用的C函数ORG0000H
MOV30H.舾MOV31H.拍
CALL
funcfion;调用C函数
MOVP2,32HEND
(2)C文件格式‘31。
#include<reSSl.h>
#include<absacc.h>//在用绝对地址访问时,必须添加该头文件
voidfunction(void)}
DBYTE[07.32]=DBYTE[0x30]+DBYTE[0x31];}
该方法简单且容易掌握,却有存储空间使用效率
低的缺点,但在项目对存储空间需求较低的情况下,
该方法是一个不错的选择。
4
通过系统编译分配的存储区传递参
数的混合调用
通过系统编译自动分配存储区地址进行传递参数
时,参数段首地址需用段名“?蠡unnanle?BYTE”和“?
funname?BIT”表示,funname为函数名,其中,“?fun-name?BIT”传递位参数的段首地址,“?funname?
BYTE”传递其它参数的段首地址,参数将在这些段中分
配空间,按声明的先后在每个段中顺序保存¨】。
该方法多用于C调用汇编的情况。
以下是该方法的—个实例:
(1)C文件格式。
#include<res51.h>
卸ragmaNOREGPARMS//该语句把参数传递约束在固定存储区传递
extemvoiddelay(unsignedint
i);
voidmain(void)
{
delay(1000);}
(2)汇编文件格式。
?PR?DELAY?DELAYMODSEGMENTCODE;函数代
码段声明
?DT?DELAY?DELAYMOD
SEGMENTDATA
OVER-
LAYABLE;自变量数据段声明
PUBHCDELAY,?DELAY?BYTE;程序段及数据段开始
地址
RSEG?DT?DELAY?DELAYMOD?DELAY?BYTE:
VAR_I:DS2
RSEG?PR?DELAY?DELAYMOD;//函数可被连接器
放置在任何地方
DELAY:MOV
R7.?DELAY?BYTE+0;//delay函数中变量i的
高字节
DELO:MOV
R6.?DELAY?BYTE+l
DJNZR6.¥DJNZR7,DEL0
RETEND
该方法比较复杂,同样有存储空间使用效率低的
缺点,当寄存器不够用时,部分参数必须通过这种方式进行传递(见第5节),因此该方法一般不单独使用。
5
通过寄存器传递参数的混合调用
C51规定调用函数最多可通过51单片机的工作
寄存器传递3个参数,余下的参数通过固定存储区传递。
可以用“NOREGPARMS”命令约束为固定存储区传递,如果用固定存储区传递或参数太多,参数通过固定存储区传递,用寄存器传递参数的函数在生成代码时,被C51编译器
在函数名前加上一个下划线“一”的前缀,在固定存储区传递参数的函数则没有下划线。
不同
的参数用到的寄存器不一样,不同的数据类型用到的寄
存器也不同。
通过寄存器传递的参数如表l所示。
表1传递参数用到的寄存器‘心・41
参数类型
参数charint
1.orIg/float通用指针
第1个R7R6、R7
R4一R7Rl、B2、R3第2个B5R4、P,3
R4~R7
Rl、B2、R3第3个
R3
R2、R3无
Rl、R2、B3
表l中int型和long型数据传递时,高位数据在低位寄存器中,低位数据在高位寄存器中;float型数
据满足32位的IEEE格式,指数和符号位在R7中;
通用指针存储类型在R3中,高位在R2中函数参数传递举例情况如表2所示。
表2
函数参数传递举例‘11
声明
说明
funcl(inta)参数a在寄存器R6和R7中传递。
func2(intb,第一个参数b在寄存器R6和R7中传递,第二个参数c在寄存器R4和R5中传递,第三个参数d在寄存器intc,intd)Rl、R2和R3中传递。
func3(10ng
e,
第一个参数e在寄存器R4、R5.R6和R7中传递,第二个参数f不能用寄存器。
因为long类型可用的寄存器longf)已被第一个参数所用,这个参数用固定存储区传递。
fun04(floatg,
第—个参数g在寄存器R4、R5、f{6和fr7中传递,第二个charh)
参数h不能用寄存器传递。
只能用固定存储区传递。
万方数据
计算机与现代化2010年第10期
函数返回值通常用寄存器传递,表3列出了可能的返回值和所用的寄存器。
表3函数返回值用到的寄存器‘¨1
返回值类型
寄存器
说明
Bit
C由位运算器C返回(unsigned)charR7在R7返回单个字节(unsigned)intR6、R7高位在R6。
低位在R7(unsigned)long
R4一R7
高位在R4,低位在R7float
R4一耵
32位IEEE格式
通用指针
Rl、112、1t3
存储类型在R3,高位在R2,低位在R1
为了能够在C语言中调用汇编程序,要求汇编
程序的编写必须符合C语言的相关命名规则。
C51
程序在调用汇编程序时,除了前面参数传递的相关规
则外,函数及其相关段也需要满足一定的规则。
一个C51源程序模块被编译后,其中的每一个函数以“?
PR?函数名?模块名”为名的命名规则被分配到一个独立的CODE段。
例如:如果模块“FUN”内包含一个名为“func”的函数,则其CODE段的名字是“?PR?FUNC?FUN”,如果函数中还包含有data和bjt对象的局部变量,编译器将按“?函数名?BYTE”和“?函数名?BIT”命令规则建立一个data和bit段,它们代表所要传递参数的起始位置,其偏移值为零。
段内代码与数据定义也遵循一定的规则。
这些段是公开的,它们的地址可被其他模块访问。
另外,这些段被编译器赋予“OVERLAYABLE”的属性,其可被
C51连接定位器做覆盖分析…。
5.1
C程序调用汇编(1)C文件格式。
#include<mssl.h>
unsignedintadd(unsignedinta,unsignedintb);
void
main(void)
{
unsignedint
c;
c=add(100,tooo);I
(2)汇编文件格式。
?PR?一ADD?ADDMODSEGMENTCODE;函数代码段
声明
PUBLIC_ADD;程序段及数据段开始地址
RSEG?PR?ADD?ADDMOD_ADD:MOVA.R5ADDA,R7MOVR7,AMOVA。
R4
ADDCA.R6MOVR6,ARETEND
当通过寄存器传递参数时在汇编里定义函数要用“一函数名”来定义函数。
5.2汇编调用C函数
(1)汇编文件格式。
EXTRN
CODE(_function);声明所要调用的C函数,通过
寄存器则函数为_function
ORG0000H
MOVR7。
并5;把所要传送的值放入相应寄存器单元MOV
R5.柏
CALL_function;调用C函数
MOVA,耵;所调用的c函数返回值可从R7中读取
END
(2)C文件格式。
#include<呼1.h>
unsignedcharfunction(unsignedchara,unsignedcharb)
{
return(a+b);}
6
结束语
在单片机程序设计中,能够很好地理解参数在两
种语言之间的传递过程,且能灵活地使用汇编与C语言混合编程的各种方法,这样既能提高程序的可读性,又能保证对硬件控制的精确性,更重要的是能够提升程序的执行效率。
参考文献:
[1】杨加国.单片机C语言与汇编语言混合编程[J].成都
大学学报:自然科学版,2008,27(3):208-211.
[2]陈百良.单片机C语言与汇编语言的混合编程[J].科
技信息,2008(6):60-61.
[3】马忠梅.单片机的C语言应用程序设计[M].北京:北
京航空航天大学出版社,1997.
[4]王兰英,居锦武.单片机C51与汇编语言混合调用的实现[J].四川理工学院学报:自然科学版,2008,21(3):
57-59.
[5]李鸿.单片机原理及应用[M].长沙:湖南大学出版
社。
2004.
[6]杨岸.单片机应用系统软件编程效率的提高[J].淮南
师范学院学报,2003,5(3):60-61.
[7]梁航,王剑钢,张帅.KeilC51中调用A51程序[J].电子测量技术,2006,29(5):100-102.
[8]靳达.单片机应用系统开发实例导航[M].北京:人1冕1t¥
电出版社,2003.
(下转第49页)
万方数据
2010年第10期王秋芬等:一种新的基于哈希函数的排序算法
49
下,取△M=2“一l,贝0
x=Llog。
△Mj+I=Ltog。
(264一I)J+I
=【警】+l
㈩
由式(1)可以看出,x与l092n成反比例关系,当
n一∞时,x-+O。
因此,常数x的取值范围为0—64,
且随着待排元素规模的递增而递减。
故:
T=(4x+I)O(n)+0(x)=0(n)
50000
2.4061
2.4203
2.4843
5
结束语
采用哈希函数分档的排序算法将任意分布的待排
序整数映射到数组相应位置,循环操作,直至所有待排
元素按照递增的次序排列。
但是,算法仅适用于任意
分布的整数,而对浮点数的排序有待进一步研究。
参考文献:
[1]严蔚敏,吴伟民.数据结构(第2版)[M].北京:清华大
学出版社,2007:288.289.[2]
王向阳.均匀分布数据的分“档”统计插入排序算法研究[J].数值计算与计算机应用,2000,21(3):187.193.[3]杨红颖,王向阳.分“档”快速排序算法研究[J].计算机
工程与应用,2001,37(13):110-112.
[4]江华,谭新星.一种非比较分段排序算法的研究[J].计
算机应用与软件,2003,20(4):4648.
[5]杨红颖,王向阳.一种新的按位块分段快速排序算法
[J].微电子学与计算机,2006,23(8):136.139,143.[6]
何文明.针对任意分布数据的高效分档混合排序算法[J].计算机工程与应用,2003,39(22):116・118,167.[7]毕秀丽,等.一种基于Hash变换的循环散列分档排序算
法分析[J].计算机工程与应用,2006,42(14):50-51.
[8]
张慧成,刘章山,等.B——快速排序算法的研究与应用
[J].计算机工程,2004,30(13):54-55,74.
[9]谢琪,沈光星.按位链接快速排序算法[J].计算机工
程。
2002,28(5):30-32.
[10]汪维清,罗先文,汪维华.分组排序算法[J].计算机工程
与应用,2008,44(33):53-56.
[11】范时平,汪林林.一种基于数据分块的快速原地归并算
法[J].计算机科学,2004,31(8):204-208.
[12]周建钦.超快速排序算法[J].计算机工程与应用,2006,
42(29):4142。
86.
[13]杨红颖,王向阳.任意分布数据的二次分“档”链接排序
算法研究[J].小型微型计算机系统,2000,21(9):993-996.[14]李德启,王雄.一种新型快速的排序算法[J].计算机工
程,2001,27(3):192.
[15]王岁花,王川,魏淑桃.一种新型快速排序算法的设计与
实现[J].河南师范大学学报:自然科学版,2002,30
(2):25-27.
[16]吴江,张德同.二次分“档”链接排序算法分析[J].计算
机研究与发展,2001,3s(8):927-930.
国印品眄日田岛明朗印日a印石曰印品明丘目印品丘曰丘日丘日印酗丘曰品印印酣品品田啊印6日酮巨百印石己石日圈团印丘口日a囝丽e记】
(上接第46页)[9]
张培仁,等.基于C语言编程MCS-51单片机原理与应用[M].北京:清华大学出版社,2002.
[10]赵亮,侯国锐,等.单片机c语言编程与实例[M].北京:
人民邮电出版社,2003.
[11]李小洪.KeilSoftware.Cx51编译器用户手册[z].Keil
Software。
2001.
[12]杜波,李丽娜,吴川.KeilC51与ASl的混合编程[J].长
春工业大学学报:自然科学版,2003,24(3):65-67.[13]刘伏文.单片机c和汇编语言混合编程[J].电子制作,
2007(6、:58-59.
[14]马忠梅,籍顺一t5,张凯,等.单片机的c语言应用程序设
计[M].北京:北京航空航天大学出版社,2007.
万方数据
基于Keil51汇编与C语言混合编程方法研究作者:作者单位:刊名:英文刊名:年,卷(期:被引用次数:张志科,王振喜, ZHANG Zhi-ke, WANG Zhen-xi 忻州师范学院电子系,山西,忻州,034000 计算机与现代化 COMPUTER AND MODERNIZATION 2010,(10 0次参考文献(14条 1.杨加国单片机C语言与汇编语言混合编程 2008(3 2.陈百良单片机C语言与汇编语言的混合编程 2008(6 3.马忠梅单片机的C语言应用程序设计 1997 4.王兰英.居锦武单片机C51与汇编语言混合调用的实现 2008(3 5.李鸿单片机原理及应用 2004 6.杨岸单片机应用系统软件编程效率的提高 2003(3 7.梁航.王剑钢.张帅 Keil C51中调用A51程序 2006(5 8.靳达单片机应用系统开发实例导航 2003 9.张培仁基于C语言编程MCS-51单片机原理与应用 2002 10.赵亮.侯国锐单片机C语言编程与实例 2003 11.李小洪 Keil Software-Cx51编译器用户手册 2001 12.杜波.李丽娜.吴川 Keil C51与A51的混合编程 2003(3 13.刘伏文单片机C和汇编语言混合编程 2007(6 14.马忠梅.籍顺心.张凯单片机的C语言应用程序设计 2007 本文链接:
/Periodical_jsjyxdh201010011.aspx 授权使用:东南大学图书馆(wfdndx,授权号:50c80bfd-daf9-4e1e-99bd-9e670182689d 下载时间:2011年1月10日。