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
// 补充:
// 如果汇编程序无参数输入时, 汇编程序不可以加下划线.