2017-06-28 51单片机混合编程小结
C语言与汇编混合编程(keil)时:1、首先要在Project 窗口中包含汇编代码的C 文件上右键,选择“Options for ...”
2、然后在Properties选项卡中激活“Generate Assembler SRC File”和“Assemble SRC File”
3、然后把相应的库文件C51S.Lib添加到工程,路径:在默认安装盘KEIL/C51/LIB/C51S.Lib。注意库文件必须是工程的最后一个文件。
4、在c语言中嵌入没有参数调用的汇编程序段用#program asm······#program endasm前后括起来就行。
嵌入有参数调用的程序段未尝试。
5、C语言调用汇编函数:
在c程序中用extern···声明
在汇编中:
?PR?···SEGMENT CODE //在程序存储区中定义段,?PR?表示段位于程序存储区内,转换规律如 下:CODE——?PR? XDATA——?XD
DATA——?DT BIT——?BI PDATA——?PD
···表示函数名,转换规律如下:
Viod func(void) FUNC无参数传递或不含寄存器的函数名不作转变转入目
标 文件中,名字只是简单地转为大写形式;
Void func(char) _FUNC 带寄存器参数的函数名,前面加“_”前缀,它表明
这类函数包含寄存器内的参数传递;
Void func(void) reentrant _?FUNC 对于重入函数,前面加“_?”前缀,它表
明该函数包含栈内才参数传递(未尝试);
PUBLIC ··· //声明函数为公共函数
RSEG ?PR?··· //表示函数可被连接器放置在任何地方,RSEG 是段名的属性
···: //程序开始
参数传递说明:
返回值传递说明:
全局变量的使用:不推荐在汇编中使用C中定义的全局变量,如果必须要使用,可用如下方法:
在C程序中声明全局变量
在汇编函数开始声明 EXTERN DATA(变量名)
直接使用变量
如全局变量为数组,则使用变量名+偏移量,以数组BUFF[5]为例,如要访问数组BUFF中的元素BUFF[3],在汇编中先声明EXTERN DATA(BUFF),在程序中使用MOV A,BUFF+03H
6、汇编调用C程序(未尝试)
总体来说混合编程比较复杂,容易产生问题,一般都是不得已的情况下才会使用。使用中还是尽量使程序模块化,尽量少使用全局变量;如使用C语言为主,则尽量少的使用汇编,尤其是大段的汇编程序,由于C是自动编译,使用内存地址不确定而汇编是人为指定内存地址,容易造成地址复用产生错误,若程序中再加入中断则情况会变得更复杂。