欢迎来到学术参考网

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

发布时间:2015-12-14 13:52

摘 要:C51语言克服了汇编语言可读性、可移植性差的缺点,现已成为开发单片机应用程序的主要手段。但一些特殊的应用场合仍然需要用汇编语言编写程序,这就必然涉及到C51语言与汇编的相互调用,即混合编程的问题。本文介绍了C51语言与汇编语言混合编程的两种基本方式,以及在keil C51编译器中的具体处理方法。

关键词:混合编程;嵌入汇编;参数传递
  C51是广泛应用于8051系列单片机编程的高级语言,具有C语言的开发效率高、可读性强、可移植好等诸多优点。keil C51编译器提供了大量功能丰富的库函数,能够对C51源程序编译生成高效的目标代码,从而提高了程序的开发与维护效率,因此采用C51语言开发8051系列单片机应用程序是开发人员的首选。
  大多数情况下采用C51语言即可完成预期的任务,但是采用C51语言编程还是存在着效率不如汇编高、对底层硬件控制不如汇编方便、对代码执行速度有特殊要求(如精确延时)情况时无法实现等缺点。因而,编写高速、高效率、可移植性好的单片机应用程序,必须结合C51语言与汇编语言各自的优点,即C51语言与汇编语言混合编程。混合编程通常的做法是,程序的框架、复杂的数学运算、多任务管理等用C51语言编写,对于那些要求执行效率高、精确延时、直接控制底层硬件等部分则由汇编语言来完成。
  编程实践证明,混合编程有机结合了C51的强可读性与汇编的高实时性,比单独使用C51语言编程效率要高。但在实际开发中,不少初学者对混合编程无法下手,下面就作者本人的经验,探讨混合编程的一些基本方法。
  一、C51中嵌入汇编程序
  在C51中嵌入汇编程序通常用在汇编代码量少、内部无复杂的跳转的情况下,可生成精简的代码、减少运行时间。在keil C51编译器中,C51中嵌入汇编程序是通过#pragma asm/endasm预处理语句来实现,其格式如下:
  #pragma asm
   ;汇编程序
  #pragma endasm
  通过#pragma asm/endasm语句告知编译器,中间的语句行不用编译为汇编程序代码。在keil C51编译器中,需设置嵌入汇编代码的源文件中的“Options for ...” 选项,激活其中“Generate Assembler SRC File”和“Assemble SRC File”两个选项,然后根据选择的编译模式,把相应的库文件添加到工程中,编译即可生成目标代码。使用该方法可以在C51源代码的任何位置嵌入汇编代码,主要用于延时和中断处理。下例即是一个在C51程序中嵌入汇编代码的实例。
  二、C51的参数传递规则与命名规则
  C51程序中调用汇编程序是通过函数调用形式来实现的,汇编程序中各种段的命名、安排、参数传递和返回,必须严格遵守keil C51编译器的参数传递规则和命名规则,才能保证正确的调用。
  (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  
  如果传递的参数较多,部分参数可在固定的存储区域内传送。传递参数所使用的存储器空间取决于选择的存储模式,这种参数传递方式代码效率不高、速度较慢,一般尽量不要使用。
  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)命名规则
  为了使C51程序能够正确调用汇编程序,汇编程序必须遵循C51中函数名的转换规则,否则无法实现程序的调用,其规则如表3所示。
表3 函数名的转换规则
C51函数声明转换函数名说明void func(void)FUNC  无参数传递或不含寄存器参数的函数名不做改变地传入目标文件中,名字只是简单地转换为大写形式void func(char)_FUNC  带寄存器参数的函数在其名字前加上前缀“_”以示区别,表明这类函数包含寄存器内的参数传递void func(void) reentrant_?FUNC对于再入函数在其名字前加上前缀“_?”以示区别,表明这类函数包含堆栈内的参数传递  三、C51中调用汇编程序
  编写被C51调用的汇编程序,除了参数必须按照相应的规则外,程序的格式也有相应的规则,这些规则比较繁琐,实际处理中可查阅有关资料。以下给出一个简单的示例。
  C51代码中的void delay(char)函数是在另一汇编文件中实现的。将C51源文件与汇编源文件一同添加到keil C51编译器的工程文件中,编译即可生成目标代码。
  四、总结
  C51语言与汇编语言混合编程可以实现两种语言的优势互补,即可提高程序的开发效率、增强程序的可读性,又能够方便、精确地控制硬件,具体应用中主要注意相应的使用方法及参数传递。适当的用好C51语言与汇编语言混合编程技术,可以简化设计过程,开发出性能较好的单片机应用程序。  
  参考文献
  [1]马忠梅,单片机的C语言应用程序设计,北京航空航天大学出版社,2007年
  [2]杜树春,单片机C语言和汇编语言混合编程实例详解,北京航空航天大学出版社,2006年
  [3]单片机原理及应用—基于Proteus和Keil C,电子工业出版社,2009年

上一篇:沙盘模拟应用于岩土工程专业的研究

下一篇:兴趣,让信息技术课堂更有效