KEIL C51 A51混合编程_第1页
KEIL C51 A51混合编程_第2页
KEIL C51 A51混合编程_第3页
KEIL C51 A51混合编程_第4页
KEIL C51 A51混合编程_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第5章章 单片机单片机C语言与语言与汇编语言混合编程汇编语言混合编程内容提要:内容提要:5-1 混合编程概述混合编程概述5-2 混合编程的参数传递与实现混合编程的参数传递与实现5-1 混合编程概述混合编程概述v汇编语言特点:汇编语言特点:优点:执行速度快、效率高、实时性强、与硬件结优点:执行速度快、效率高、实时性强、与硬件结合紧密。合紧密。缺点:编程难度大、可读性差,不便于移植、开发缺点:编程难度大、可读性差,不便于移植、开发时间长。时间长。vC语言特点:语言特点:优点:编程容易、可移植性强、支持多种数据类型,优点:编程容易、可移植性强、支持多种数据类型,能直接对硬件进行操作,效率高。能直接

2、对硬件进行操作,效率高。缺点:实时处理弱于汇编语言,无法准确定时。缺点:实时处理弱于汇编语言,无法准确定时。v混合编程特点:混合编程特点:效率高、速度快、易于编程、可读性、可移植性好,效率高、速度快、易于编程、可读性、可移植性好,使用范围广使用范围广单片机混合编程的基本方式单片机混合编程的基本方式v汇编中调用汇编中调用C51函数函数vC51程序中引用汇编(常用)程序中引用汇编(常用)两种情况:两种情况: 1.汇编程序部分和汇编程序部分和C51程序部分为不同的模块或不程序部分为不同的模块或不 同的文件,由同的文件,由C51程序调用汇编程序模块中的变程序调用汇编程序模块中的变 量和子过程。量和子过

3、程。2.嵌入式汇编:在嵌入式汇编:在C51程序中嵌入一段汇编语言程程序中嵌入一段汇编语言程 序。序。两种方式:两种方式:1.汇编中调用汇编中调用C51程序程序在汇编程序中可以访问在汇编程序中可以访问C51程序中的变量和函数:程序中的变量和函数:v对于变量的访问:对于变量的访问:在汇编程序中,用在汇编程序中,用变量名前带下划线变量名前带下划线的的方式即可访问方式即可访问C程序中定义的变量,用程序中定义的变量,用数组名前带下划线数组名前带下划线后面加偏移量后面加偏移量的方式即可访问的方式即可访问C程序中定义的数组。程序中定义的数组。例如例如: 用用_XX可以访问可以访问C中的变量中的变量XX; 用

4、用_XX+3可访问数组元素可访问数组元素XX3。v对于函数的访问:对于函数的访问:1)C51函数函数没有参数传递没有参数传递,在汇编中直接用,在汇编中直接用C51程序中的程序中的函数名即可。函数名即可。2) C51函数函数有参数有参数,用函数名前带下划线的方式即可访,用函数名前带下划线的方式即可访问,但要注意,汇编程序在调用问,但要注意,汇编程序在调用C51函数前需准备好参数函数前需准备好参数 。注意注意:在:在C语言程序中的变量和函数必须加语言程序中的变量和函数必须加extern前缀,前缀,声明为外部变量,才能让汇编语言程序访问到。声明为外部变量,才能让汇编语言程序访问到。2.在在C51中嵌

5、入汇编程序中嵌入汇编程序v在在C语言程序中嵌入汇编程序是通过语言程序中嵌入汇编程序是通过C51中的预处理指令中的预处理指令#pragma asm/endasm 实现的。实现的。v格式:格式:#pragam ASM;汇编程序代码汇编程序代码#pragam ENDASM 此方法主要用于实现延时或中断处理,以便生成精炼的此方法主要用于实现延时或中断处理,以便生成精炼的代码,减少运行时间。并且嵌入汇编函数不能太大,且内代码,减少运行时间。并且嵌入汇编函数不能太大,且内部没有复杂跳转。部没有复杂跳转。v按模块用不同的编程语言编写源程序,最后通过编译按模块用不同的编程语言编写源程序,最后通过编译/连接器生

6、成一个可执行的完整程序。连接器生成一个可执行的完整程序。v关键问题:关键问题:C函数与汇编函数之间的参数传递和得到正函数与汇编函数之间的参数传递和得到正确的返回值,以保证数据交换。确的返回值,以保证数据交换。v不管用哪种方式,混合编程时,不管用哪种方式,混合编程时,汇编语言要按照汇编语言要按照C51语语言的规定来编写言的规定来编写(包括函数参数、返回值传送规则、段(包括函数参数、返回值传送规则、段的选用和命名等)。的选用和命名等)。3.在在C51中调用汇编程序中调用汇编程序5.2 混合汇编的参数传递与实现混合汇编的参数传递与实现1. 汇编程序调用汇编程序调用C51函数的参数传递函数的参数传递a

7、.在在C51程序中,被调用的程序中,被调用的C函数必须加函数必须加extern前缀;前缀;b.在汇编程序中,调用前要先准备好参数。要求被调在汇编程序中,调用前要先准备好参数。要求被调用的用的C函数最左边的参数由寄存器函数最左边的参数由寄存器A传递,其它参数按传递,其它参数按顺序通过堆栈给出。顺序通过堆栈给出。C51函数的返回值是返回到函数的返回值是返回到A寄寄存器或者由存器或者由A寄存器给出的地址中。寄存器给出的地址中。5.2.1 混合汇编的参数传递混合汇编的参数传递2. 在在C51中嵌入汇编程序的参数传递中嵌入汇编程序的参数传递不存在函数调用时参数传递和返回值问题。不存在函数调用时参数传递和

8、返回值问题。可通过变量或可通过变量或SFR实现数据传递。实现数据传递。 如:在如:在C51程序中定义程序中定义Z变量,在变量,在C程序和汇编程程序和汇编程 序中共同访问序中共同访问Z变量,即可实现数据传递。变量,即可实现数据传递。3. 在在C51中调用汇编程序的参数传递中调用汇编程序的参数传递C51有特定的参数传递规则。有特定的参数传递规则。两种参数传递方式:两种参数传递方式:1)通过寄存器传递)通过寄存器传递2)通过固定存储区传递)通过固定存储区传递1)通过寄存器传递参数)通过寄存器传递参数调用时参数的传递调用时参数的传递分三种情况:分三种情况:a.少于等于少于等于3个参数时通过寄存器传递;

9、个参数时通过寄存器传递;b.如用如用NOREGPARMS命令取消用寄存器传递参数或参数命令取消用寄存器传递参数或参数太多,通过固定存储区传递太多,通过固定存储区传递c.对于重入函数参数通过堆栈传递。对于重入函数参数通过堆栈传递。通过寄存器传递参数的函数在生成代码时被编译器在函数通过寄存器传递参数的函数在生成代码时被编译器在函数名前加了一个下划线前缀,而用固定存储区传递参数的函名前加了一个下划线前缀,而用固定存储区传递参数的函数没有下划线;数没有下划线;通过寄存器传递速度最快;通过寄存器传递速度最快;不同的参数用到的寄存器不一样;不同的参数用到的寄存器不一样;不同的数据类型用到的寄存器也不同;不

10、同的数据类型用到的寄存器也不同; 表表4-10 C51利用寄存器传递参数规则利用寄存器传递参数规则参数号参数号charintlong,float一般指针一般指针1R7R6,R7R4R7R1、R2、R32R5R4,R5R4R7R1、R2、R33R3R2,R3无无R1、R2、R3说明:说明:1)int型和型和long型数据传递时高位数据存在低位寄型数据传递时高位数据存在低位寄存器中,低位数据存在高位寄存器中;存器中,低位数据存在高位寄存器中;2)float型数据的指数和符号位在型数据的指数和符号位在R7中;中;3)通用指针存储区在)通用指针存储区在R3中,高位地址在中,高位地址在R2中,低中,低位

11、地址在位地址在R1中。中。通过寄存器传递参数通过寄存器传递参数 func1(int a) a是第一个参数,在是第一个参数,在R6,R7中传递。中传递。 func2 (int b, int c, int *d ) “b”是第一个参数,在是第一个参数,在R6,R7中传递;中传递;“c”是第二个参是第二个参数,在数,在R4,R5中传递;中传递;“d”是第三个参数,在是第三个参数,在R1,R2,R3中传递。中传递。 func3(long e , long f ) “e”是第一个参数,在是第一个参数,在R4R7中传递;中传递;“f”是第二个参数,是第二个参数,不能在寄存器中传递,只能在固定存储区中传递。

12、不能在寄存器中传递,只能在固定存储区中传递。 func4(float g , char h ) “g”是第一个参数,在是第一个参数,在R4R7中传递;中传递;“h”是第二个参数,是第二个参数,必须在固定存储区中传递。必须在固定存储区中传递。例题见课本例题见课本P122表表5.2v用固定存储区传递参数给汇编程序,用固定存储区传递参数给汇编程序,参数段首地址参数段首地址通过通过名为名为“?函数名?函数名?BYTE”的符号确定。当传递位值时,的符号确定。当传递位值时,使用名为使用名为“?函数名?函数名?BIT”的符号。所有传递的参数放的符号。所有传递的参数放在以首地址开始递增的存储区内,函数返回值放

13、入在以首地址开始递增的存储区内,函数返回值放入CPU寄存器。寄存器。v即使通过寄存器传递参数,参数也将在这些段中分配空即使通过寄存器传递参数,参数也将在这些段中分配空间,并按声明的先后在每个段中顺序保存。间,并按声明的先后在每个段中顺序保存。v用作参数传递的固定存储区可能在内部数据区或外部数用作参数传递的固定存储区可能在内部数据区或外部数据区,由存储模式决定。据区,由存储模式决定。2)通过固定存储区传递参数)通过固定存储区传递参数当函数有返回值时,通过寄存器传递。当函数有返回值时,通过寄存器传递。表表4-11 C51函数返回值传递规则函数返回值传递规则返回类型返回类型使用的寄存器使用的寄存器说

14、说 明明bitC(进位标志进位标志)由进位标志位返回由进位标志位返回char或或1字节指针字节指针R7由由R7返回返回int或或2字节指针字节指针R6,R7高字节在高字节在R6,低字节在,低字节在R7longR4R7高字节在高字节在R4,低字节在,低字节在R7floatR4R732位位IEEE格式格式通用指针通用指针R1R3R3为存储区,为存储区,R1为低地址为低地址3)函数返回值的传递)函数返回值的传递5.2.2 混合编程的实现混合编程的实现v第一步:在第一步:在C文件中嵌入汇编程序。文件中嵌入汇编程序。例如:例如:#include void main(void)P2=1;#pragma a

15、smMOV R7,#10DEL: MOV R6,#20DJNZ R6,$DJNZ R7,DEL#pragma endasmP2=0;在汇编程序中调用在汇编程序中调用C51程序使用较少,这里只介绍后两种。程序使用较少,这里只介绍后两种。1. C51中嵌入汇编程序的实现方法中嵌入汇编程序的实现方法v第二步:在第二步:在Keil C51软件的软件的Project窗口右击该窗口右击该C文件,在文件,在弹出的快捷菜单中选择弹出的快捷菜单中选择Options for命令,选中右边的命令,选中右边的Generate Assembler SRC File和和Assembler SRC File复选框,时检查框

16、由灰色变成黑色状态。复选框,时检查框由灰色变成黑色状态。v第三步:根据选择的编译模式,把相应的库文件(如第三步:根据选择的编译模式,把相应的库文件(如Small模式时,是模式时,是KeilC51LibC51S.Lib)加入到工程中,)加入到工程中,该文件必须作为工程的最后文件。该文件必须作为工程的最后文件。库文件与编译模式的关系如下:库文件与编译模式的关系如下: C51S.LIB_没有浮点运算的没有浮点运算的 Small modelC51C.LIB_没有浮点运算的没有浮点运算的 Compact modelC51L.LIB_没有浮点运算的没有浮点运算的 Large modelC51FPS.LIB

17、_带浮点运算的带浮点运算的 Small modelC51FPC.LIB_带浮点运算的带浮点运算的 Compact modelC51FPL.LIB_带浮点运算的带浮点运算的 Large model第四步:编译,生成目标代码。第四步:编译,生成目标代码。(补)(补)汇编语言文件及函数编写方法汇编语言文件及函数编写方法汇编语言文件的构成主要有:汇编语言文件的构成主要有:定义模块名、函数声明、定义模块名、函数声明、公共函数声明、引用函数声明、引用变量声明、函数定义公共函数声明、引用函数声明、引用变量声明、函数定义等部分。等部分。1) 定义模块定义模块对汇编语言文件定义模块名,一般一个文件为一个模对汇编

18、语言文件定义模块名,一般一个文件为一个模块,也可以多个文件为同一个模块名。块,也可以多个文件为同一个模块名。模块定义格式如下:模块定义格式如下:NAME 模块名模块名定义模块要放在文件的开始。定义模块要放在文件的开始。例如:例如:NAME A1 1. C51中调用汇编程序的实现方法中调用汇编程序的实现方法 为了能在为了能在C51程序中调用汇编程序,除了要满足前面参数程序中调用汇编程序,除了要满足前面参数传递的规则外,汇编程序的编写必须符合传递的规则外,汇编程序的编写必须符合C语言的语言的命名规则命名规则。 C51程序与汇编程序混合编程程序与汇编程序混合编程 C51程序与汇编程序混合编程程序与汇

19、编程序混合编程2) 函数声明函数声明即对本模块定义的函数作声明即对本模块定义的函数作声明,其格式为其格式为:?PR?函数名函数名?模块名模块名 SEGMENT CODE格式中的函数名规则如上面一所述。格式中的函数名规则如上面一所述。例如:例如:?PR?DISPLAY? A1 SEGMENT CODE?PR?_max? A1 SEGMENT CODE说明说明:函数的声明放在文件的前面,一般在模块定义之后,函数的声明放在文件的前面,一般在模块定义之后,并且紧接着模块定义。并且紧接着模块定义。 C51程序与汇编程序混合编程程序与汇编程序混合编程3)公共函数声明)公共函数声明如果函数在其它文件(模块)

20、中调用,必须作公共函如果函数在其它文件(模块)中调用,必须作公共函数声明。数声明。声明格式为:声明格式为:PUBLIC 函数名函数名例如:例如:PUBLICDISPLAYPUBLIC_max 声明公共函数应放在函数声明之后。声明公共函数应放在函数声明之后。 C51程序与汇编程序混合编程程序与汇编程序混合编程4)引用函数声明)引用函数声明如果在汇编程序中引用了其它文件中的函数,必须作如果在汇编程序中引用了其它文件中的函数,必须作引用声明。引用声明。声明格式为:声明格式为:EXTRN CODE(函数名)(函数名)例如:例如:EXTRNCODE(KEY)EXTRNCODE(_COUNT)函数引用声明

21、中的函数引用声明中的“KEY” 函数不传递参数;函数不传递参数;“_COUNT”函数通过寄存器传递参数。函数通过寄存器传递参数。 C51程序与汇编程序混合编程程序与汇编程序混合编程5)引用变量声明)引用变量声明如果在汇编程序中引用了其它文件中的变量,必须作如果在汇编程序中引用了其它文件中的变量,必须作引用声明。引用声明。声明格式为:声明格式为:EXTRN 存储区(变量名)存储区(变量名)其存储区域类型如表其存储区域类型如表4-2所示的所示的7种类型。种类型。例如:例如:EXTRNDATA(TIMER_SEC)EXTRNIDATA(DIS_BUF)ENTRNXDATA(SEND_BUF) 表表4

22、-2 C51存储区与存储空间的对应关系存储区与存储空间的对应关系关键字关键字对应的存储空间及范围对应的存储空间及范围codeROM空间,空间,64KB全空间全空间data片内片内RAM,直接寻址,低,直接寻址,低128字节字节bdata片内片内RAM,位寻址区,位寻址区0 x200 x2f,可字节访问,可字节访问idata 片内片内RAM,间接寻址,间接寻址,256字节,与字节,与 Ri 对应对应pdata片外片外RAM,分页寻址的,分页寻址的256字节字节(P2不变不变), P2改变可寻址改变可寻址64KB全空间,与全空间,与MOVX Ri 对应对应xdata片外片外RAM,64KB全空间全

23、空间bit片内片内RAM位寻找区位寻找区,位地址位地址0 x000 x7f,128位位 C51程序与汇编程序混合编程程序与汇编程序混合编程6)函数编写格式)函数编写格式汇编语言函数的格式如下:汇编语言函数的格式如下: RSEG ?PR?函数名函数名?模块名模块名函数名:函数名:RET(或或RETI) 可见,要编写可见,要编写C51调用的汇编程序,规则非常繁琐,为了便于调用的汇编程序,规则非常繁琐,为了便于处理,在实际中往往用处理,在实际中往往用C51先写出程序的主体,然后用先写出程序的主体,然后用SRC控控制指令编译产生制指令编译产生asm文件,进一步修改这个文件,进一步修改这个asm文件就可

24、得到文件就可得到我们需要的汇编函数。这样可以让编译器自动完成各种段的安我们需要的汇编函数。这样可以让编译器自动完成各种段的安排,提高了汇编程序的编写效率。排,提高了汇编程序的编写效率。v处理过程如下:处理过程如下:第一步:先用第一步:先用C语言程序编写出程序框架,如文件名为语言程序编写出程序框架,如文件名为a1.c。第二步:在第二步:在Keil C51软件的软件的Project窗口右击该窗口右击该C文件,在文件,在弹出的快捷菜单中选择弹出的快捷菜单中选择Options for命令,选中右边的命令,选中右边的Generate Assembler SRC File和和Assembler SRC F

25、ile复选框,时检查框由灰色变成黑色状态。复选框,时检查框由灰色变成黑色状态。 C51程序与汇编程序混合编程程序与汇编程序混合编程第三步:根据选择的编译模式,把相应的库文件(如第三步:根据选择的编译模式,把相应的库文件(如Small模式时,是模式时,是KeilC51LibC51S.Lib)加入到工程中,该文)加入到工程中,该文件必须作为工程的最后文件。件必须作为工程的最后文件。第四步:编译后将会产生一个第四步:编译后将会产生一个SRC文件,将这个文件扩展名文件,将这个文件扩展名改为改为ASM。随后可在该文件的代码段中加入所需的指令代。随后可在该文件的代码段中加入所需的指令代码。码。第五步:将该

26、汇编程序与调用它的主程序一起加到工程文件第五步:将该汇编程序与调用它的主程序一起加到工程文件中,这时,工程文件中不再需要原来的中,这时,工程文件中不再需要原来的C语言文件和库文件,语言文件和库文件,主程序只需要在程序开始处用主程序只需要在程序开始处用extern对所调用的汇编程序中对所调用的汇编程序中的函数作声明,在主程序中就可调用汇编程序中的函数了。的函数作声明,在主程序中就可调用汇编程序中的函数了。汇编语言文件编写举例汇编语言文件编写举例例例4-6 编写一个完整的汇编语言程序文件,文件包含三个编写一个完整的汇编语言程序文件,文件包含三个函数,分别是函数,分别是定时器定时器/计数器计数器T1

27、产生方波信号的中断函数产生方波信号的中断函数、循环右移多位函数循环右移多位函数和和循环左移多位函数循环左移多位函数;参数传递:参数传递:T1的计数初值通过全局变量的计数初值通过全局变量T1_H、T1_L传递。传递。左移、右移函数都有左移、右移函数都有两个入口参数两个入口参数(被移位的数、移(被移位的数、移位的位数)和位的位数)和返回值返回值(被移位后的数)(被移位后的数) ,要求,要求通过寄存器通过寄存器传递传递。所有参数都是无符号字符型数据。所有参数都是无符号字符型数据。程序如下:程序如下:NAME EXAMP;定义模块名定义模块名?PR?T1_INT?EXAMPSEGMENT CODE?P

28、R?_RIGHT?EXAMP SEGMENT CODE?PR?_LEFT?EXAMPSEGMENT CODEPUBLIC_RIGHT;公共函数声明公共函数声明PUBLIC_LEFTEXTRNDATA(T1_H) ;引用外部变量声明引用外部变量声明EXTRNDATA(T1_L)汇编语言文件编写举例汇编语言文件编写举例CSEGAT001BH;设置设置T1中断入口中断入口LJMPT1_INTRSEG ?PR?T1_INT?EXAMP;定义定义T1中断处理函数中断处理函数T1_INT:MOV TL1, T1_LMOV TH1, T1_HCPLP1.7RETI 汇编语言文件编写举例汇编语言文件编写举例RSEG ?PR?_RIGHT?EXAMP; 右移函数右移函数_RIGHT : ;R7中为第中为第1个参数,个参数,MOV A, R7;为将被移位的数为将被移位的数RIGHT_LP

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论