单片机C语言与汇编语言混合编程.pdf
《单片机C语言与汇编语言混合编程.pdf》由会员分享,可在线阅读,更多相关《单片机C语言与汇编语言混合编程.pdf(4页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、文章编号:1004-5422(2008)03-0208-04单片机C语言与汇编语言混合编程杨加国(成都大学 电子信息工程学院,四川 成都 610106)摘 要:介绍了单片机C语言与汇编语言混合编程的两种基本方式,C语言程序中嵌入汇编程序和调用汇编程序的参数传递方法,以及在keil C51中的具体处理方法.关键词:混合编程;嵌入汇编;编译;参数传递中图分类号:TP314 文献标识码:A0 引 言在单片机应用系统设计中,过去主要采用汇编语言开发程序.汇编语言编写的程序对单片机硬件操作很方便,编写的程序代码短,效率高,但系统设计的周期长,可读性和可移植性都很差.C语言程序开发是近年来单片机系统开发应
2、用所采用的主要开发方式之一,C语言功能丰富、表达能力强、使用灵活方便、开发周期短、可读性强、可移植性好.但是,采用C语言编程还是存在着如对硬件没有汇编方便、效率没有汇编高、编写延时程序精确度不高等缺点,因而现在单片机系统开发中经常用到C语言与汇编语言混合编程技术.混合编程技术可以把C语言和汇编语言的优点结合起来,编写出性能优良的程序.单片机混合编程技术通常是,程序的框架或主体部分用C语言编写,对那些使用频率高、要求执行效率高、延时精确的部分用汇编语言编写,这样既保证了整个程序的可读性,又保证了单片机应用系统的性能1,2.1 混合编程的基本方式C语言与汇编语言混合编程通常有两种基本方法:在C语言
3、中嵌入汇编程序和在C语言中调用汇编程序.1.1 在C51中嵌入汇编程序在C51中嵌入汇编程序主要用于实现延时或中断处理,以便生成精练的代码,减少运行时间.嵌入式汇编通常用在当汇编函数不大,且内部没有复杂的跳转的时候.在单片机C语言程序中嵌入汇编程序是通过C51中的预处理指令#pragmaasmendasm语句实现,格式如下:#pragma ASM;汇编程序代码#pragma ENDASM通过#pragma asm和#pragma endasm告诉C51编译器它们之间的语句行不用编译成汇编程序代码.1.2 在C51中调用汇编程序在C51中调用汇编程序的方法应用较多,C模块与汇编模块的接口较简单,
4、分别用C51与A51对源程序进行编译,然后用L51将obj文件连接即可,关键问题在于C函数与汇编函数之间的参数传递和得到正确返回值,以保证模块间的数据交换.2C51与汇编程序的参数传递在C51中嵌入汇编程序或调用汇编程序,其参数传递的过程是不一样的.2.1 在C51中嵌入汇编程序的参数传递对于在C语言程序中通过#pragma asm和#pragma endasm嵌入的汇编程序,C51编译器在编译时只是将当中的汇编程序不编译,而不做其他任何处理,因此不存在函数调用时的参数传递和返回值问题.如果要在C程序中和汇编程序中实现数据传递,可以通过变量或特殊功能寄存器来实现,例如,在C程序的变量定义部分定
5、义Z变量,在C语言程序和汇编程序中共同访问Z变量,这收稿日期:2008-05-08.作者简介:杨加国(1972),男,硕士,讲师,从事单片机应用技术研究 1样,C语言程序可以通过Z变量把参数传递给汇编程序,汇编程序可以通过Z变量把参数返回给C语言程序.2.2 在C51中调用汇编程序的参数传递在C51中调用汇编程序是通过函数调用的形式来实现的.由于C51程序函数有明确的参数和返回值约定,因此在C51中调用汇编程序进行参数传递时都必须严格遵守C51函数的参数和返回值相关约定.在C51中调用汇编程序进行参数传递关键在于要弄清C51函数的参数传递规则.在C51中调用汇编程序进行参数传递的方式有两种:一
6、种是通过寄存器传递参数;一种是通过固定存储区传递3,4.2.2.1 通过寄存器传递参数.Franklin C51规定调用函数最多可通过51单片机的工作寄存器传递3个参数,余下的通过固定存储区传递.可以用“NOREGPARMS”命令取消用寄存器传递参数,如果用寄存器传递参数取消或参数太多,参数通过固定存储区传递.用寄存器传递参数的函数在生成代码时被Cx51编译器在函数名前加上一个下划线“-”的前缀,在固定存储区传递参数的函数则没有下划线.不同的参数用到的寄存器不一样,不同的数据类型用到的寄存器也不同.通过寄存器传递的参数如表1所示.表1 传递参数用到的寄存器参数类型charintlongfloa
7、t通用指针第1个R7R6、R7R4R7R1、R2、R3第2个R5R4、R5R4R7R1、R2、R3第3个R3R2、R3无R1、R2、R3 表1中,int型和long型数据传递时高位数据在低位寄存器中,低位数据在高位寄存器中;float型数据满足32位的IEEE格式,指数和符号位在R7中;通用指针存储类型在R3中,高位在R2中.函数参数传递举例情况如表2所示.2.2.2 通过固定存储区传递.用固定存储区传递参数给汇编程序,参数段首地址用段名“?function-name?BYTE”和“?function-name?BIT”保存,function-name为函数的名称,其中,“?function-
8、name?BIT”保存位参数表2 函数参数传递举例声 明说 明func1(int a)惟一一个参数a在寄存器R6中和R7中传递.func2(int b,int c,int3d)第一个参数b在寄存器R6中和R7中传递,第二个参数c在寄存器R4中和R5中,传递第三个参数d在寄存器R1中、R2中和R3中传递.func3(long e,long f)第一个参数e在寄存器R4中、R5中,R6中和R7中传递,第二个参数f不能用寄存器,因为long类型可用的寄存器已被第一个参数所用,这个参数用固定存储区传递.func4(float g,char h)第一个参数g在寄存器R4中、R5中、R6中和R7中传递,第
9、二个参数h不能用寄存器传递,只能用固定存储区传递.段首地址,“?function-name?BYTE”保存别的参数段首地址,即使通过寄存器传递参数,参数也将在这些段中分配空间,参数按声明的先后在每个段中顺序保存.用做参数传递的固定存储区可在内部数据区或外部数据区,这由存储模式决定.Small模式的参数段用内部数据区,Compact和Large模式用外部数据区.2.2.3 函数返回值.函数返回值通常用寄存器传递,表3列出了可能的返回值和所用的寄存器.表3 函数返回值用到的寄存器返回值类型寄存器说 明BitC由位运算器C返回(unsigned)charR7在R7返回单个字节(unsigned)in
10、tR6、R7高位在R6,低位在R7(unsigned)longR4R7高位在R4,低位在R7floatR4R732位IEEE格式通用指针R1、R2、R3存储类型在R3,高位在R2,低位在R13C51中嵌入汇编程序的实现方法通常,在C51程序中嵌入汇编程序的处理方法如下:第一步,在C文件中以如下方式嵌入汇编程序.#pragma ASM;汇编程序#pragma ENDASM第二步,在keil C51软件的Project窗口右键单击嵌入汇编程序的C文件,选择“Options for”,点902第3期 杨加国:单片机C语言与汇编语言混合编程击右边的“Generate Assembler SRC Fil
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 语言 汇编语言 混合 编程
限制150内