《现代电子技术》2006年第24期摘录:2006年第24期总第2393
-
如发现有乱码,请点击下面链接浏览原文
正文摘录:
2006年第24期总第2393在KeilC51中调用汇编函数C51程序调用汇编程序,汇编程序中各种段的命名和安排、参数传递和返回,必须符合C51编译器的命名规则和参数传递规则,这样才能做到正确调用。表2函数返回值存放规律设主调用模块函数为maincall(),被调用的另一外部模块函数为externcharafunc(charva,intvb),要求函数afunc()采用汇编语言编写。对于模块问的small编译下的C语言调用汇编语言函数,可以采用如下的方法来正确地编写汇编程序。(1)采用一般的写C51程序方法,建立工程,在里面导入main.C文件和afunc.C文件。假设main.C文件和afunc.C具有如下格式://maincall.C模块文件…//文件包含和其他定义externcharafunc(charva,intvb);//对外部被调函数说明voidmaincall()(//主调函数…//变量定义和其他语句a—afunc(charva,intvb);//函数调用//afunc.C文件charafunc(charva,intvb){chara,retval;intb;a—va;b—vb;return(retval);}//文件包含和其他定义//被调用函数(2)对afunc.C文件设置SRC编译控制命令SRC是一个十分有用的编译控制命令,他可令C51编译器将一个C源文件编译成一个相应的汇编源文件。在Keilc51中,对Project窗口中包含汇编代码的C文件上点击右键,选择“Optionsforfile…”选项,选中“GenerateAssemblerSRCFile”和“AssembleSRCFile”选项,使之有效,重新编译项目后就可生成a{unc.src文件,对src文件也可另存为asm或a51文件。在文件中加入pragmasrc(afunc.a51)控制命令,可直接生成afunc.a51文件。SRC文件中包含了汇编程序中所需的所有接口信息,afunc.src主要内容如下:入式NAMEAFUNC/7函数钰?PR?afunc?AFUNCSEGMENTCODE/j定义程序代码段?DT?一afunc?AFUNCSEGMENTDATAOVERLAYABLE//定义可覆盖局部数据段PUBI—IC—afunc//共公符号定义RSEG?DT?一afunc?AFUNC//N覆盖局部数据段?一afunc?BYTE://起始地址a?042:DS1//定义其他局部变量b?043:DS2retval?044:DS1RSEG?PR?一afunc?AFUNC//程序代码段一afunc://汇编程序起始地址USING0//工作寄存器0组MOVa?042,R7//第一参数传递MOVb?043,R4//第二参数传递高位MOVb?043+01H,R5//第二参数传递低位MOVR7,retval?044+01H//函数返回值?C0001:RETEND(3)将afunc.src文件另存为afunc.asm(或afunc.a51)文件,在工程中移去afunc.c文件,添加afunc.asm(或afunc.a51)文件,再次编译工程可得到汇编函数的主体,根据需要修改函数里面的汇编代码就得到所需的汇编函数了。应注意局部变量的使用:局部变量按照C51的格式定义后,才能进行优化分析。(4)对C51中调用的汇编程序,如果不想使用以上的方式建立接口,则可以依据Cx51规则,按照自己的想法来建立接口,使得汇编程序显得简洁、易读。下列程序是上例程序中建立汇编程序接口实例,使用寄存器进行参数传递,并定义一局部变量MMP。PUBLICAFUNC//定义共公符号,“”表示有参数传递LI。LSEGMENTCoDE//定义程序代码段,LLL为标识符,可任意PUBLIC//定义共公符号,为局部变量的共公符号LI。TSEGMENTDATA0VERLAYABLE//定义可覆盖局部数据段RSEGLLT//可覆盖局部数据段PPP://定义局部变量MMP:DS2//定义局部变量字节,MMP为局部变量,两字节RSEGLLL//程序代码段afunc://程序代码段起始地址MOVOOH,R7//汇编程序行MOVMMP+1,R4//局部变量使用MOVMMP.R5MOVR7.02HRETEND4模块内C程序与汇编程序接口方法这种方法是在C函数内部通过使用关键字#pragmaasm/endasm来直接嵌入汇编语言程序。方法是用#pragma语句,具体结构是:#pragmaasm汇编行#pragmaendasm
阅读此文(图):
点击此处在线翻阅