首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

KEILC51混合编程

KEILC51混合编程

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


// 补充:

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