文档详情

4。8 汇编语言和C语言(不讲).ppt

发布:2017-04-27约字共19页下载文档
文本预览下载声明
*4.8 汇编语言和C语言的混合编程;; 在混合语言编程中,关键是入口参数和出口参数的传递,Franklin C编译器可使用寄存器传递参数,也可以使用固定存贮器或使用堆栈,由于8XX51的堆栈深度有限,因此多用寄存器 或存贮器传递。用寄存器传递最多只能传递三个参数,并选择固定的寄存器。;例如 func1(int a) “a”是第一个参数,在R6,R7传递,;下面通过实例说明混合编程的方法及参数传递过程. 例4_12 用P1.0产生周期为4ms的方波,同时用P1.1产生周期为8ms的方波。 说明:设计三个模块 模块一 C语言编主程序,使 P1.1产生周期为8ms的方波; 模块二 用C语言编程,使P1.0产生周期为4ms的方波; 模块三 用汇编语言编写延时1ms 程序。 模块一调用模块二获得8ms方波, 模块二调模块三 ,向汇编程序传递字符型参数(x=2),延时2ms。 各模块程序如下: ;模块一: P1.1产生周期为8ms的方波 #includereg51.h #define uchar unsigned char sbit P1-1=P1^1; void delay4ms(void); /* 定义延时4ms函数(模块二) * main( ) { for(; ;) {  P1-1=0; delay4ms(); /* 调模块二延时4ms */ P1-1=1; delay4ms(); /* 调模块二延时4ms*/ } } ; 模块三: PUBLIC -DELAY1MS ;DE LAY1MS为其他 模块调用 DE SEGMENT CODE ;定义DE段为再定位程序段 RSEG DE ;选择DE为当前段 - DELAY1MS: NOP DELA: MOV R1,#0F8H ;延时 LOP1: NOP  NOP DJNZ R1,LOP1 DJNZ R7,DELA ;R7为C程序传递 过来的参数(x=2)  EXIT: RET END 可见汇编语言程序从R7中获取C程序传递参数(x=2) 。 ;例2.在汇编程序中比较两数大小,将大数放到指定的存储区,由C程序的主调函数取出。 C语言程序 ;模块二:汇编语言程序 PUBLIC -MAX MAX为其 他模块调 DE SEGMENT CODE ;定义DE段为再定位程序段 RSEG DE ;选择DE为当前段 MAX: MOV A,R7 ;取模块一的参数a MOV 30H,R5 ;取模块一的参数b CJNE A,30H,TAG1 ;比较a,b的大小 TAG1: JC EXIT MOV 30H,R7 ;大数存于30H单元 EXIT: RET END C语言程序通过R7和R5传递字符型参数a和b到汇编语言程序,汇编语言程序将返回值 放在固定存贮单元,主调函数通过指针取出返回值。 ; C语言程序调用汇编程序最多只能传递三个参数,如果多于三个参数,可通过存贮区传递,在下例中C语言程序向汇编传递六个参数,汇编完成6个数的相加,结果返回C程序 ************C_CALL.C**************** #pragm
显示全部
相似文档