基于Keil51汇编与C语言混合编程方法研究.docx

上传人:b****9 文档编号:25561752 上传时间:2023-06-09 格式:DOCX 页数:20 大小:23.40KB
下载 相关 举报
基于Keil51汇编与C语言混合编程方法研究.docx_第1页
第1页 / 共20页
基于Keil51汇编与C语言混合编程方法研究.docx_第2页
第2页 / 共20页
基于Keil51汇编与C语言混合编程方法研究.docx_第3页
第3页 / 共20页
基于Keil51汇编与C语言混合编程方法研究.docx_第4页
第4页 / 共20页
基于Keil51汇编与C语言混合编程方法研究.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

基于Keil51汇编与C语言混合编程方法研究.docx

《基于Keil51汇编与C语言混合编程方法研究.docx》由会员分享,可在线阅读,更多相关《基于Keil51汇编与C语言混合编程方法研究.docx(20页珍藏版)》请在冰豆网上搜索。

基于Keil51汇编与C语言混合编程方法研究.docx

基于Keil51汇编与C语言混合编程方法研究

2010年第lO期

计算机与现代化

JISUANJIYUXIANDAIHUA

总第182期

文章编号:

1006-2475(2010)104)043-04

基于Keil51汇编与C语言混合编程方法研究

张志科,王振喜

(忻州师范学院电子系,山西忻州034000)

摘要:

分析基于KeilSl汇编与C语言混合编程的基本方法,给出每种方法的具体操作步骤。

在应用实践中,为了充分发挥两种语言的优势,提高程序的执行效率,可根据问题的特殊性选择相应的编程方案,以期达到缩短程序设计过程的目标。

关键词:

Keil51;混合编程;参数传递中图分类号:

TP311

文献标识码:

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

引言

汇编与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()//在汇编文件中所要调用的延时函数

//C函数语句l

该方法主要用于无参数传递的情况,简单且易于掌握。

通过约定固定存储空间传递参数的

混合调用

在5l单片机内可在两种语言之间约定“用户

RAM区”作为参数传递空间。

3.1

C程序调用汇编(1)C文件格式。

#include<弛庐1.h>

extern

void

delay();

voidmain(void)

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];}

该方法简单且容易掌握,却有存储空间使用效率

低的缺点,但在项目对存储空间需求较低的情况下,

该方法是一个不错的选择。

通过系统编译分配的存储区传递参

数的混合调用

通过系统编译自动分配存储区地址进行传递参数

时,参数段首地址需用段名“?

蠡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节),因此该方法一般不单独使用。

通过寄存器传递参数的混合调用

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);}

结束语

在单片机程序设计中,能够很好地理解参数在两

种语言之间的传递过程,且能灵活地使用汇编与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

结束语

采用哈希函数分档的排序算法将任意分布的待排

序整数映射到数组相应位置,循环操作,直至所有待排

元素按照递增的次序排列。

但是,算法仅适用于任意

分布的整数,而对浮点数的排序有待进一步研究。

参考文献:

[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语言混合编程方法研究作者:

作者单位:

刊名:

英文刊名:

年,卷(期:

被引用次数:

张志科,王振喜,ZHANGZhi-ke,WANGZhen-xi忻州师范学院电子系,山西,忻州,034000计算机与现代化COMPUTERANDMODERNIZATION2010,(100次参考文献(14条1.杨加国单片机C语言与汇编语言混合编程2008(32.陈百良单片机C语言与汇编语言的混合编程2008(63.马忠梅单片机的C语言应用程序设计19974.王兰英.居锦武单片机C51与汇编语言混合调用的实现2008(35.李鸿单片机原理及应用20046.杨岸单片机应用系统软件编程效率的提高2003(37.梁航.王剑钢.张帅KeilC51中调用A51程序2006(58.靳达单片机应用系统开发实例导航20039.张培仁基于C语言编程MCS-51单片机原理与应用200210.赵亮.侯国锐单片机C语言编程与实例200311.李小洪KeilSoftware-Cx51编译器用户手册200112.杜波.李丽娜.吴川KeilC51与A51的混合编程2003(313.刘伏文单片机C和汇编语言混合编程2007(614.马忠梅.籍顺心.张凯单片机的C语言应用程序设计2007本文链接:

授权使用:

东南大学图书馆(wfdndx,授权号:

50c80bfd-daf9-4e1e-99bd-9e670182689d下载时间:

2011年1月10日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1