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

相关文档
最新文档