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

 
					
				
 
			
			
			
						
			 我要赚赏金
 我要赚赏金 STM32
STM32 MCU
MCU 通讯及无线技术
通讯及无线技术 物联网技术
物联网技术 电子DIY
电子DIY 板卡试用
板卡试用 基础知识
基础知识 软件与操作系统
软件与操作系统 我爱生活
我爱生活 小e食堂
小e食堂

