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