Keil C51中调用汇编语言的研究与实现
106科技资讯
科技资讯 SCIENCE & TECHNOLOGY INFORMATION
2007 NO.31
SCIENCE & TECHNOLOGY INFORMATION
I T 技 术
随着国内单片机开发工具技术水平的提高,现在的单片机仿真器普遍支持C语言程序的调试,C51正成为8051单片机应用系统最为流行的程序设计语言。然而,在实际的软件设计过程中我们发现虽然C语言在程序设计时会带来诸多的好处,亦能生成高效简洁的代码,但有时在特定的情况下,使用汇编语言来编写部分程序会更方便,效率更高。本文以Keil C51开发平台为例,介绍几种在C51中嵌入汇编语言、实现混合编程的方法。
1 通过调用汇编函数实现嵌入汇编
C程序是由函数构成的,函数是C程序的基本单位,因此用汇编语言编写一个函数(子程序)供C51调用是实现嵌入汇编的最为通用的方法。
例如,下面一个程序调用了名为AFUNC的汇编函数:
//main.c文件
#include < reg51.h >
#define uchar unsigned char#define uint unsigned int
extern uint AFUNC(uchar v_achr,bit v_bflag);
void main(){
bit BFLAG;uchar mav_chr;uint mvintrslt;
mav_chr=0xd4; BFLAG=1;
mvintrslt=AFUNC(mav_chr,BFLAG);}
这个外部函数的入口参数是一个字符型变量v_achr和一个位变量v_bflag,返回值是一个整型变量mvintrslt。
为了得到我们所要的汇编函数,先用c51写出这个函数的主体模块,其中函数功能几乎是空的:
//CFUNC.c文件
#define uchar unsigned char#define uint unsigned int
uint AFUNC(uchar v_achr,bit v_bflag){
uchar tmp_vchr;uint tp_vint;
tmp_vchr=v_achr;tp_vint=(uint)v_bflag;
return tmp_vchr+(tp_vint<<8);}
当然,很多时候可以把上述程序以哑函数的方式给出。
之后,可按照以下步骤进行
①按编写普通c51程序方法,建立工程,在里面导入main.c文件和CFUNC.c文件。
②用SRC控制指令编译。在Project 窗口中包含汇编代码的C文件上单击右键,选择“Options for……”,点击右边的“Generate Assembler SRC File”和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态;
③根据选择的编译模式,把相应的库文件(如Small模式时,是 KeilC51LibC51S.Lib)加入工程中,该文件必须作为工程的最后文件,目的是了能对汇编进行封装。
④build这个工程后将会产生一个CFUNC.SRC的文件,将这个文件改名为CFUNC.A51(也可以通过编译选项直接产生CFUNC.A51文件),然后在工程里去掉库文件(如C51S.Lib)和CFUNC.c,而将CFUNC.A51添加到工程里。
⑤检查main.c的“Generate Assem-bler SRC File”和“Assemble SRC File”是否有效,若是有效则点击使检查框变成无效状态;再次build这个工程,到此已经得到汇编函数的主体,修改函数里面的汇编代码就得到所需的汇编函数。2 在 KEIL C51 中直接插入汇编代码
对于只需要在C51程序中植入几条汇编语言指令,就能完成功能的场合,可以采用直接嵌入汇编的方式。其方式如下:
#pragma ASM汇编代码
#pragma ENDASM
在C文件中用#pragma asm和#pragma endasm把要嵌入汇编的地方分隔开来,目的是在编译时KEIL知道中间的一段是汇编代码。
其次,在有加入汇编的文件中,也要设置编译该文件时的选项,方法是在Project窗口中包含汇编代码的C文件上单击右键,选择“Options for……”,点击右边的“Generate Assembler SRC File”和“Assemble SRC File”,使检查框由灰色变成黑色状态。同时,也要根据选择的编译模式,把相应的库文件(如Small模式时,是KeilC51LibC51S.Lib)加入工程中,这两步和前面相同。
最后,编译该工程,即可生成目标代码。
3 将汇编代码定义成数组,然后使C51程序以代码方式运行数组
具体方法是这样的,因为汇编代码可
以认为是一个常数,一系列的汇编程序代码,在C51程序中就是一个unsigned char类型的数组。所以,我们可以把要嵌入的汇编代码在C51程序中定义成一个数组:
unsigned char code huibian[n]={……};而C语言中,无返回类型函数指针的定义为:
void (*name_of_function )( );
另外,C语言中强制类型转换的格式为:
(type)variable;
基于以上几点,我们就可以把huibian这个数组指针(数组名就是一指针)转化为函数指针:
(void(*)())huibian;
因此直接运行就达到嵌入的目的了。(*(void(*)())huibian)();
显然,这方法的缺点就是一开始得先把汇编代码译制成数组,也可能干扰寄存器优化安排,应当少用。
总之,在C51中嵌入汇编语言有多种途径,这里列举了三种方法,其中第一种方法最为常用。根据需要适当地在C51中嵌入汇编,不仅提供了更多的软件设计方法,也会使程序更为优化,效率更高。
参考文献
[1] Keil C51用户手册.2000.
[2] 徐爱钧.单片机高级语言C51windows环
境编程与应用,2002.
[3] 马中梅.单片机的C语言应用程序设计,
2007.
[4] 赵文博.单片机语言C51程序设计,2005.
Keil C51中调用汇编语言的研究与实现
肖献保 方龙
(解放军蚌埠坦克学院 安徽蚌埠 233013)
摘 要:在利用C51进行8051单片机应用系统程序设计时,特定的情况下使用汇编语言来编写部分程序会更为方便、高效。本文给出了在Keil C51中应用汇编语言的常用方法。关键词:Keil C51 调用 汇编语言中图分类号:I253.6文献标识码:A文章编号:1672-3791(2007)11(a)-0106-01