Keil C51与汇编的接口
1.模块内接口
可以通过预编译指令“asm”在C代码中插入汇编代码,用C语言编写主程序,用汇编语言编写如对硬件进行操作或一些对时钟要求很严格的代码段并将其嵌入C语言主程序中。方法是用#pragma语句,具体结构如下:
#pragrama asm
汇编语句
#pragrama endasm
次方法通过asm与endasm告诉C51编译器,中间行不用进行编译。例如:
2.模块间接口
在C51中调用汇编程序,C模块与汇编模块的接口较简单,分别用C51与A51对源程序进行编译,然后用L51将obj文件连接即可,关键问题在于C函数与汇编函数之间的参数传递和得到正确的返回值,以保证模块间的数据交换。C51中有两种参数传递方法。
通过寄存器传递函数参数。汇编函数要得到参数值时就访问这些寄存器,如果这些值正被使用并保存在其他地方或者已经不再需要了,则寄存器可用作其他用途。通过内部RAM传递参数的函数将使用规定的寄存器,汇编函数将使用这些寄存器接收参数。对于要传递多于3个参数的函数,剩余的参数将在默认的存储器段中传递。
【例9-9】C程序与汇编程序接口。
//C程序中汇编函数的声明
//汇编代码
函数:DEVWAIT
功能描述:等待定时器0溢出,向外部期间表明P1中的数据是有效的。如果定时器尚未溢出,将被写如XDATA的指定地址中。
参数:R7—存放要等待的定时长度;R4|R5—存放要写入的XDATA区地址
返回值:读数成功返回1,时间到返回0。
在以上代码中函数返回一个位变量,如果时间到则返回0,如果输入字节被写入指定的地址中,则返回1。当从函数中返回值时,C51通过转换使用内部存储区,编译器将使用当前寄存器组来传递返回参数。参数返回值与寄存器间对照见本章第一节表9-4。
通过固定存储区传递参数。这种方法将bit型参数传到一个存储段中:
?function_name?BIT
将其他类型参数均传给下面的段且按照顺序存放,至于这个固定存储区本身的位置由存储模式默认指定:
?function_name?BYTE
3.C51中调用汇编程序的实现方法
(1)先用C语言程序编写出程序框架,如文件名为a1.c(注意参数)。
(2)在Keil C51的Project窗口中右击该C语言文件,在弹出的快捷菜单中选择Options for…,右边的Generate Assembler SRC File和Assemble SRC File,使检查框由灰色变成黑色(有效)状态。
(3)根据选择的编译模式,把相应的库文件(如Small模式时,是Keil\C51\Lib\C51S.Lib)加入工程中,该文件必须作为工程的最后文件。
(4)编译后将会产生一个SRC的文件,将这个文件扩展名改为ASM。这样就形成了可供C51程序调用的汇编程序。随后可在该文件的代码段中加入所需的指令代码。
(5)将该汇编程序与调用它的主程序一起加到工程文件中,这时工程文件中不再需要原来的C语言文件和库文件,主程序只需要在程序开始处用EXTERN对所调用的汇编程序中的函数作声明,在主程序中就可调用汇编程序中的函数了。