找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4042|回复: 0
打印 上一主题 下一主题
收起左侧

Keil C51汇编混合编程详解

[复制链接]
跳转到指定楼层
楼主
ID:59306 发表于 2014-2-27 14:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、在C51中嵌入汇编

在这个例子里,阐述了编写c51程序调用汇编函数的一种方法,这个外部函数的入口参数是一个字符型变量和一个位变量,返回值是一个整型变量。例中,先用c51写出这个函数的主体,然后用SRC控制指令编译产生asm文件,进一步修改这个asm文件就得到我们所要的汇编函数。该方法让编译器自动完成各种段的安排,提高了汇编程序的编写效率。

step1. 按写普通c51程序方法,建立工程,在里面导入main.c文件和CFUNC.c文件。相关文件如下:

//main.c文件
#include < reg51.h >
#define uchar unsigned char
#define uint unsigned int
extern uint AFUNC(uchar v_achr,bitv_bflag);
void main()
{
   bit BFLAG;
   uchar mav_chr;
   uint    mvintrslt;
   mav_chr=0xd4; BFLAG=1;
   mvintrslt=AFUNC(mav_chr,BFLAG);
}
//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);
}

step2. Project 窗口中包含汇编代码的 C 文件上右键,选择“Optionsfor ...”,点击右边的“Generate Assembler SRC File”和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态;

step3. 根据选择的编译模式,把相应的库文件(如Small 模式时,是 Keil\C51\Lib\C51S.Lib)加入工程中,该文件必须作为工程的最后文件;

step4. build这个工程后将会产生一个CFUNC.SRC的文件,将这个文件改名为CFUNC.A51(也可以通过编译选项直接产生CFUNC.A51
      件),然后在工程里去掉库文件(如C51S.Lib)CFUNC.c,而将CFUNC.A51添加到工程里。

//CFUNC.SRC文件如下
.\CFUNC.SRC generated from: CFUNC.c
NAME CFUNC
?PR?_AFUNC?CFUNC     SEGMENT CODE
?BI?_AFUNC?CFUNC     SEGMENT BIT OVERLAYABLE
   PUBLIC    ?_AFUNC?BIT
   PUBLIC    _AFUNC
   RSEG  ?BI?_AFUNC?CFUNC
?_AFUNC?BIT:
   v_bflag?041:   DBIT   1
; #define uchar unsigned char
; #define uint unsigned int
;
; uint AFUNC(uchar v_achr,bit v_bflag)
   RSEG  ?PR?_AFUNC?CFUNC
_AFUNC:
   USING    0
           ; SOURCE LINE # 5
;---- Variable 'v_achr?040' assigned toRegister 'R7' ----
; {
           ; SOURCE LINE # 6
;    uchar tmp_vchr;
;    uint    tp_vint;
;
;    tmp_vchr=v_achr;
           ; SOURCE LINE # 10
;---- Variable 'tmp_vchr?042' assigned toRegister 'R5' ----
   MOV      R5,AR7
;    tp_vint=(uint)v_bflag;
           ; SOURCE LINE # 11
   MOV      C,v_bflag?041
   CLR      A
   RLC      A
;---- Variable 'tp_vint?043' assigned toRegister 'R6/R7' ----
;    return tmp_vchr+(tp_vint<<8);
           ; SOURCE LINE # 12
   MOV      R6,A
   MOV      R4,#00H
   CLR      A
   ADD      A,R5
   MOV      R7,A
   MOV      A,R4
   ADDC     A,R6
   MOV      R6,A
; }
           ; SOURCE LINE # 13
?C0001:
   RET
; END OF _AFUNC
   END

step5. 检查main.c的“GenerateAssembler SRC File”和“Assemble SRC File”是否有效,若是有效则点击使检查框变成无效状态;再次build这个工程,到此你已经得到汇编函数的主体,修改函数里面的汇编代码就得到你所需的汇编函数了。






二、 keil中直接嵌入汇编

step1、在C文件中要嵌入汇编代码片以如下方式加入汇编代码:
#pragma ASM
; Assembler Code Here
#pragma ENDASM

step2、在 Project 窗口中包含汇编代码的 C 文件上右键,选择“Optionsfor ...”,点击右边的“Generate Assembler SRC File”和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态;

step3、根据选择的编译模式,把相应的库文件( Small 模式时,是Keil\C51\Lib\C51S.Lib)加入工程中, 该文件必须作为工程的最后文件;

step4、编译,即可生成目标代码。




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表