51单片机c语言与汇编语言混合编程浅析

51单片机c语言与汇编语言混合编程浅析

ID:22871336

大小:52.50 KB

页数:5页

时间:2018-11-01

51单片机c语言与汇编语言混合编程浅析_第1页
51单片机c语言与汇编语言混合编程浅析_第2页
51单片机c语言与汇编语言混合编程浅析_第3页
51单片机c语言与汇编语言混合编程浅析_第4页
51单片机c语言与汇编语言混合编程浅析_第5页
资源描述:

《51单片机c语言与汇编语言混合编程浅析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、51单片机C语言与汇编语言混合编程浅析C51语言克服了汇编语言可读性、可移植性差的缺点,现已成为开发单片机应用程序的主要手段。但一些特殊的应用场合仍然需要用汇编语言编写程序,这就必然涉及到C51语言与汇编的相互调用,即混合编程的问题。本文介绍了C51语言与汇编语言混合编程的两种基本方式,以及在keilC51编译器中的具体处理方法。关键词:混合编程;嵌入汇编;参数传递  C51是广泛应用于8051系列单片机编程的高级语言,具有C语言的开发效率高、可读性强、可移植好等诸多优点。keilC51编译器提供了大量功能丰富的库函数,能够对C51源程序编译生

2、成高效的目标代码,从而提高了程序的开发与维护效率,因此采用C51语言开发8051系列单片机应用程序是开发人员的首选。  大多数情况下采用C51语言即可完成预期的任务,但是采用C51语言编程还是存在着效率不如汇编高、对底层硬件控制不如汇编方便、对代码执行速度有特殊要求(如精确延时)情况时无法实现等缺点。因而,编写高速、高效率、可移植性好的单片机应用程序,必须结合C51语言与汇编语言各自的优点,即C51语言与汇编语言混合编程。混合编程通常的做法是,程序的框架、复杂的数学运算、多任务管理等用C51语言编写,对于那些要求执行效率高、精确延时、直接控制底

3、层硬件等部分则由汇编语言来完成。  编程实践证明,混合编程有机结合了C51的强可读性与汇编的高实时性,比单独使用C51语言编程效率要高。但在实际开发中,不少初学者对混合编程无法下手,下面就本人的经验,探讨混合编程的一些基本方法。  一、C51中嵌入汇编程序  在C51中嵌入汇编程序通常用在汇编代码量少、内部无复杂的跳转的情况下,可生成精简的代码、减少运行时间。在keilC51编译器中,C51中嵌入汇编程序是通过#pragmaasm/endasm预处理语句来实现,其格式如下:  #pragmaasm  ;汇编程序  #pragmaendasm  

4、通过#pragmaasm/endasm语句告知编译器,中间的语句行不用编译为汇编程序代码。在keilC51编译器中,需设置嵌入汇编代码的源文件中的“Optionsfor...”选项,激活其中“GenerateAssemblerSRCFile”和“AssembleSRCFile”两个选项,然后根据选择的编译模式,把相应的库文件添加到工程中,编译即可生成目标代码。使用该方法可以在C51源代码的任何位置嵌入汇编代码,主要用于延时和中断处理。下例即是一个在C51程序中嵌入汇编代码的实例。  二、C51的参数传递规则与命名规则  C51程序中调用汇编程序

5、是通过函数调用形式来实现的,汇编程序中各种段的命名、安排、参数传递和返回,必须严格遵守keilC51编译器的参数传递规则和命名规则,才能保证正确的调用。  (1)参数传递规则  参数传递的简单办法是使用寄存器,这样做能够产生高效的代码,其传递规则如表1所示。表1参数传递规则参数类型char,一字节指针int,二字节指针long,float一般指针第1个参数R7R6,R7R4~R7R1,R2,R3第2个参数R5R4,R5R4~R7R1,R2,R3第3个参数R3R2,R3无R1,R2,R3    如果传递的参数较多,部分参数可在固定的存储区域内传送

6、。传递参数所使用的存储器空间取决于选择的存储模式,这种参数传递方式代码效率不高、速度较慢,一般尽量不要使用。  C51程序调用汇编程序过程中若存在返回值,汇编语言通过寄存器传递参数给C51程序,其传递规则如表2所示。表2返回值传递规则返回值类型使用寄存器说明bitC进位标志(unsigned)charR7 (unsigned)intR6,R7高位在R6,低位在R7(unsigned)longR4~R7高位在R4,低位在R7floatR4~R7高位在R4,低位在R7指针R1,R2,R3存储类型在R3,高位在R2,低位在R1  (2)命名规则  为

7、了使C51程序能够正确调用汇编程序,汇编程序必须遵循C51中函数名的转换规则,否则无法实现程序的调用,其规则如表3所示。表3函数名的转换规则C51函数声明转换函数名说明voidfunc(void)FUNC无参数传递或不含寄存器参数的函数名不做改变地传入目标文件中,名字只是简单地转换为大写形式voidfunc(char)_FUNC带寄存器参数的函数在其名字前加上前缀“_”以示区别,表明这类函数包含寄存器内的参数传递voidfunc(void)reentrant_?FUNC对于再入函数在其名字前加上前缀“_?”以示区别,表明这类函数包含堆栈内的参数

8、传递  三、C51中调用汇编程序  编写被C51调用的汇编程序,除了参数必须按照相应的规则外,程序的格式也有相应的规则,这些规则比较繁琐,实际处理中可

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。