logo资料库

Keil C51与汇编使用的详细说明.pdf

第1页 / 共1页
资料共1页,全文预览结束
科技资讯 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
分享到:
收藏