单片机C51与汇编语言的混合调用

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

软件开发与设计SOFTWAREDEVELOPMENTANDDESIGN单片机C51与汇编语言的混合调用沈洋,孙伟,钟殿生(空军航空大学,长春130022)摘要:对于单片机程序的编写,汇编语言具有速度快的优势,C51则具有高级语言的优点。文中介绍了C51函数的内部转换规则和参数传递规则,通过实例详细给出了实现C51与汇编语言混合调用的方法,包括C51内嵌汇编语言、C51调用汇编语言以及汇编语言调用C51。关键词:单片机;KEIL51;调用ImplementationofMixedCallingBetweenMCUC51andASMSHENYang,SUNWei,ZHONGDiansheng(BasicCourseDepartmentofAirForceAviationUniversity,Changchun130022)Abstract:WhenMCUisprogrammed,ASMisfeaturedbyitshighspeed,whileC51hastheadvantageofitsadvancedlanguage.ThepaperintroducestheinternaltransformingprincipleofC51anditsparametertransformingprinciple.AndtheapproachestomixedcallingbetweenC51andASMareconstruedwiththeexamples,includingtheinlineASMofC51,thecallingASMofC51andthecallingofC51inASM.Keywords:MCU;KEIL51;calling1引言在计算机工业控制领域,单片机作为一种微型化、低成本、高可靠性的微型计算机,有着重要的地位。随着单片机程序的大型化,及系统开发周期越来越短的要求,在对单片机进行程序设计时,采用高级语言C51来进行单片机的编程,已经成为一种必然的趋势。文中介绍了采用C51和汇编语言进行单片机程序设计时,C51函数和汇编子程序进行混合编程的实现方法。2C51的优点C语言是一种编译型程序设计语言,它具有多种高级语言的特点,并且可以调用汇编语言的子程序。KEIL51是针对8051系统单片机设计的c开发工具,提供了丰富的库函数,具有很强的数据处理能力,编程中对MCU内部寄存器和存储器的分配均由编译器自动管理。采用C51来编写单片机程序,能使系统的开发速度大大加快,并且可以采用与PC机编程类似的方式来编写单片机程序,使单片机程序也能具有高级语言的优点,可以处理复杂任务,甚至可以为单片机编写简单的实时操作系统来处理多任务。在一般的单片机系统设计通常采用C51编写系统主程序;对一些时序要求极严格的外设接口程序则采用汇编语言编写。而对于一些涉及复杂数学运算程序,往往要使用C51所提供的数学运算库。这就涉及到C51函数与汇编子程序之间的混合调用。3C51函数的内部转换规则3.1C51函数名的转换在C51函数与汇编语言子程序进行相互调用时,首先要了解C51函数名的内部转换规则。按照此规则来编写汇编子程序,这样才能实现C51函数与汇编语言子程序之间的混合调用。C51函数名的转换规则见表l。编译器对C51函数进行编译时,要将C51函数按以下规则自动转换函数名,然后才能与汇编子程序进行混合连接。表1函数名转换规则C51函数声明转换后函数名说明Voidfunc(void)FUNC无参或参数不经寄存器传递时Voidfunc1(char)_FUNC1参数经寄存器传递时Voidfunc2(void)reentrant_?FUNC1可重入函数采用堆栈传递参数3.2C51函数名及段的命名C51函数经编译器编译后,每个函数都将采用“?PR?函数名?模块名”的命名格式分配到独立的代码(CODE)段中。对于函数中的变量,也将采用类似的格式来建立数据段,并将变量分配其中。这些代码段和数据段都是公开的,可供其它模块访问,因此可被连接器进行覆盖分析,实现相互调用。段的命名依据所采用的存储器模式而有所变化,见表2。汇编语言子程序编写时也要按照此规则来建立段。表2段名命名规则段的内容段类型段名程序代码变量BIT变量CODEDATAPDATAXDATABIT?PR?函数名?模块名?DT?函数名?模块名(SMALL)模块?PD?函数名?模块名(COMPACT)模块?XD?函数名?模块名(LARGE)模块?BI?函数名?模块名电脑编程技巧与维护4C51函数的参数传递当C51函数与汇编语言子程序进行混合调用时,如果要相互传递参数,则必须按照C51函数的参数传递规则进行操作。一般情况下,C51函数可通过寄存器传递最多3个参数,其传递规则见表3。依据所传递参数的类型,C51自动决定采用哪些寄存器来传递参数。在函数或子程序返回时,所要返回的数据的传递与参数传递的规则不同,见表4。表3参数规则参数个数Char,1字节指针Int,2字节指针Long,float一般指针1R7R6,R7R4-R7R1,R2,R32R5R4,R5R4-R7R1,R2,R33R3R2,R3无R1,R2,R3表4返回值规则返回类型所用寄存器bit(Unsigned)char,1字节指针(Unsigned)int,2字节指针(Unsigned)longfloat一般指针C累加器R7R6,R7R4-R7R4-R7R1-R35混合编程实例5.1C51调用汇编语言在采用C51调用汇编语言子程序时,被调用的汇编语言子程序的名字,段名、参数读取方式,返回值的设置都要按相应的规则进行。否则将无法完成调用或是无法正常传递参数及返回值。以下代码为C51函数调用汇编语言子程序的例子。#includereg51.h//主程序MAIN.C清单,采用C51编写ExternSETADC(unsignedcharx);//声明SETADC函数,此函数采用汇编语言编写Voidmain(void)}C51主程序Unsignedcharcommand;//变量Command=0x01://设置初值SETADC(command)://调用汇编语言子程序SETADC……}以下为被调用的汇编语言子程序源代码0809.ASMNAME0809//定义模块名?PR?SETADC?0809SEGMENTCODE//声明SETADC子程序所属代码段PUBLIC_SETADC//声明子程序_SETADC为公用,以便C模块可以调用RSEG?PR?SETADC?0809_SETADC://声明_SETADC子程序MOVA,R7//自R7中读取C51传入的参数MOVDPTR,#2001HMOVX@DPTR,ARET//返回5.2汇编程序调用C51在汇编语言子程序中调用C51函数时,调用的规则基本与C51函数调用汇编程序类似。关键的一点是汇编语言程序所属段的名字应与C51函数的段名一致,否则无法正常调用。以下代码为汇编语言调用C51函数的实例。//setadc.c源代码,C51函数名为setadc()#includeABSACC.HVoidsetadc(unsignedcharX){//声明被汇编程序调用的C51函数,有一个参数传入,放在R7中XBYTE[0X200A]≈x;}//以下为调用C51函数setadc()的汇编代码0809.ASMEXTRNCODE(setadc)//外部函数setadc声明EXTRNDATA(?setadc?BYTE),//声明外部函数setadc变量所属数据段0809SEGMENTCODE//0809代码段声明VARSEGMENTDATA//局部变量段声明RSEGVAR//局部变量段x:ds1//x为setadc函数的参数RSEG0809//0809代码段START:MOVR7,#01H//根据C51参数传递规则,R7即为函数setadc的参数xLCALLsetadc//调用C51函数setadcEND6结语文中对单片机KEILC51开发平台的函数命名、段命名、参数传递规则、返回值传递规则进行了细致的分析,并研究了C51函数中内嵌汇编程序、C51函数中调用汇编子程序、汇编程序中调用C51函数的实现方法,给出了具体的源代码实现。文中所实现的方法基于KEILC51的单片机在线仿真系统的开发中得到使用,取得了良好的效果。本文介绍的方法对于单片机系统的程序设计开发具有实际的参考价值。参考文献马忠梅.单片机的C语言应用程序设计[M].北京航空航天大学出版社,1997.徐爱钧,彭秀华.单片机高级语言C51应用程序设计[M].电子工业出版社.1998.张玉峰.KeilC51中C51程序与汇编程序的接口方法[J].现代电子技术,2006,24:58—60.作者简介沈洋,男(1984-),本科。[1][2][3]

1 / 2
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功