OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » KEILC51混合编程

共1条 1/1 1 跳转至

KEILC51混合编程

助工
2014-10-14 20:09:56    评分

KEILC51混合编程


1. 在C中调用汇编,在汇编中调用C


2. 汇编程序调用C定义变量,C调用汇编定义的变量


范例: 程序没有实际意义,只是为了说明如何使用


1. 新建一个C的工程,添加启动文件 STARTUP.A51 (系统自动生成)


2. 添加 MAIN.C 文件.内容如下


//--------------------------------------------------------------
#include <REGX52.H>


//---------------------------------------------------------------
// EXTERN variables  来源与汇编文件定义
//---------------------------------------------------------------
extern unsigned char UNCHARAA;
extern unsigned int UNINTBB;
//---------------------------------------------------------------
// variables     本文件定义
//---------------------------------------------------------------
unsigned char data ucTestaa;
unsigned int data uiTestbb;
//---------------------------------------------------------------
// EXTERN    来源与汇编文件
//---------------------------------------------------------------
extern unsigned int StMUX(unsigned long Val);


//---------------------------------------------------------------
void main(void)                            //  STARTUP.A51 之后文件入口


{
 unsigned int uicc;


 UNCHARAA = 0x01;                              // 给汇编文件定义的变量付值
 UNINTBB = 0x55aa;


 uicc = StMUX(0x12345678);                         // 调用汇编文件
 while(1)
 {
  
 }
 for(;;);
}


//---------------------------------------------------------------


void FunTest(void)                                 // 供汇编文件调用
{
    UNINTBB >>= 1;
}


3. 添加 A51.ASM, 内容如下


;-------------------------------------------------------------
; include file
;-------------------------------------------------------------
$nomod51
#include <REGX52.H>


;-------------------------------------------------------------
; extern variables                   来源与C程序定义,注意关键词DATA/IDATA/XDATA/BIT... 要与C定义一致
;-------------------------------------------------------------
 EXTRN DATA(ucTestaa)   ; data , idata , xdata
 EXTRN DATA(uiTestbb)


;-------------------------------------------------------------
; Public variables                       本文件定义,这里告诉编译器为公共变量
;-------------------------------------------------------------
 PUBLIC  UNCHARAA     ; unsigned char 
 PUBLIC  UNINTBB     ; unsigned int


;-------------------------------------------------------------
; variables SEG                  定义变量
;-------------------------------------------------------------
 ADDRAM  SEGMENT DATA
 RSEG  ADDRAM
 UNCHARAA: DS 1                           ; 占用1byte
 UNINTBB: DS 2                               ; 占用2byte
;-------------------------------------------------------------
; extern                         来源与C中定义
;-------------------------------------------------------------
 EXTRN CODE(_FunTest)  ; extern funciton


;-------------------------------------------------------------
; Public 
;-------------------------------------------------------------
 PUBLIC  _StMUX


;-------------------------------------------------------------
; ROM SEG
;-------------------------------------------------------------
 RMSEG  SEGMENT CODE
 RSEG  RMSEG



;-------------------------------------------------------------
_StMUX:
 MOV  A,UNCHARAA
 MOV  ucTestaa,A


 MOV  A,UNINTBB+0
 MOV  uiTestbb+0,A
 MOV  A,UNINTBB+1
 MOV  uiTestbb+1,A


 MOV  A,R4
 MOV  UNINTBB+0,A
 MOV  A,R5
 MOV  UNINTBB+1,A
 
 LCALL _FunTest                             //         这里没有调用 FunTest函数, 实际汇编为 LCALL 0 , 说明此方法 汇编中调用C,不可行


 MOV  A,R4
 CPL  A
 MOV  R4,A


 MOV  A,R5
 CPL  A
 MOV  R5,A


 MOV  A,R6
 CPL  A
 MOV  R6,A


 MOV  A,R7
 CPL  A
 MOV  R7,A


 RET



 END


// 补充:


// 如果汇编程序无参数输入时, 汇编程序不可以加下划线.


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]