资源描述:
《汇编语言和C语言》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、*4。8汇编语言和C语言的混合编程本节介绍不同的模块,不同的语言相结合的编程方法。通常情况下以高级语言编写主程序,用汇编语言编写与硬件有关的子程序。不同的编译程序高级语言对汇编的调用方法不同,在FranklinC51中,是将不同的模块(包括不同语言的模块)分别汇编或编译,再通过连接生成一个可执行文件。C语言程序调用汇编语言程序要注意以下几点:1.被调函数要在主函数中说明,在汇编程序中,要使用伪指令使CODE选项有效并声明为可再定位段类型,并且根据不同情况对函数名作转换,见表4.6。说明符号名解
2、释voidfunc(void)FUNC无参数传递或不含寄存器参数的函数名不作改变转入目标文件中,名字只是简单的转为大写形式。voidfunc(char)_FUNC含寄存器参数的函数名加入“_”字符前缀以示区别,它表明这类函数包含寄存器内的参数传递。voidfunc(void)reentrant_?FUNC对于重入函数加上“_?”字符前缀以示区别,它表明这类函数包含栈内的参数传递。2.对为其他模块使用的符号进行PUBLIC声明,对外来符号进行EXTRN声明。3.参数的传递。在混合语言编程中,关键是入
3、口参数和出口参数的传递,FranklinC编译器可使用寄存器传递参数,也可以使用固定存贮器或使用堆栈,由于8XX51的堆栈深度有限,因此多用寄存器或存贮器传递。用寄存器传递最多只能传递三个参数,选择固定的寄存器,见表4.7。表4.7参数类型charintlong,float一般指针第一个参数第二个参数第三个参数R7R5R3R6,R7R4,R5R2,R3R4~R7R4~R7无R1,R2,R3R1,R2,R3R1,R2,R3例如func1(inta)“a”是第一个参数,在R6,R7传递,func2(i
4、ntb,intc,int*d)“b”在R6,R7中传递,“c”在R4,R5中传递,“d”在R1,R2,R3中传递。如果传递参数寄存器不够用,可以使用存贮器传送,通过指针取得参数。汇编语言通过寄存器或存贮器传递参数给C语言程序,汇编语言通过寄存器传递给C语言的返回值见表4.8。返回值寄存器说明bit(unsigned)char(unsigned)int(unsigned)longFloat指针CR7R6,R7R4~R7R4~R7R1,R2,R3进位标志高位在R6,低位在R7高位在R4,低位在R732
5、位IEEE格式,指数和符号位R7R3放存储器类型,高位在R2,低位R1下面通过两个实例说明混合编程的方法及参数传递过程.例4_10用P1.0产生周期为4ms的方波,同时用P1.1产生周期为8ms的方波。说明:设计三个模块模块一C语言编主程序,使P1.1产生周期为8ms的方波;模块二用C语言编程,使P1.0产生周期为4ms的方波;模块三用汇编语言编写延时1ms程序。模块一调用模块二获得8ms方波,模块二调模块三,向汇编程序传递字符型参数(x=2),延时2ms。各模块程序如下:模块一:P1.1产生周期为
6、8ms的方波#include#defineucharunsignedcharsbitP1-1=P1^1;voiddelay4ms(void);/*定义延时4ms函数(模块二)*/main(){uchari;for(;;){P1-1=0;delay4ms();/*调模块二延时4ms*/P1-1=1;delay4ms();/*调模块二延时4ms*/}}模块二(delay4ms):使P1.0产生周期为4ms的方波#include#defineuch
7、arunsignedcharsbitP1-0=P1^0;delaylms(ucharx);/*定义延时1ms函数(模块三)*/voiddelay4ms(void){P1-0=0;delaylms(2);/*调汇编函数(模块三)*/P1-0=1;delaylms(2);/*调汇编函数(模块三)*}模块三:PUBLIC-DELAY1MS;DELAY1MS为其他模块调用DESEGMENTCODE;定义DE段为再定位程序段RSEGDE;选择DE为当前段-DELAY1MS:NOPDELA
8、:MOVR1,#0F8H;延时LOP1:NOPNOPDJNZR1,LOP1DJNZR7,DELA;R7为C程序传递过来的参数(x=2)EXIT:RETEND上例可见汇编语言程序从R7中获取C程序传递参数(x=2)。例2.在汇编程序中比较两数大小,将大数放到指定的存储区,由C程序的主调函数取出。C语言程序模块一:#defineucharunsignedcharvoidmax(uchara,ucharb);/*定义汇编函数*/main()