ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:22.47KB ,
资源ID:12210263      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12210263.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(关于C51与汇编的混合编译.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

关于C51与汇编的混合编译.docx

1、关于C51与汇编的混合编译请教:关于C51与汇编的混合编译作者:leonyang栏目:单片机请教:关于C51与汇编的混合编译在下第一次用C51,计划用汇编写底层,用C51写应用层。但是不知道C51跟汇编之间的结构应该是怎样的,才能顺利编译。汇编的程序是不是跟C51的分别在不同的文件还是同一文件下,两种我都试过,没有成。一下就是小弟的一段实验代码,请高人指点一二,不胜感激!#defineuint unsigned int#includeextern void getval(uint i);void main(void)uint data i=10;uint data j=0;getval(i);

2、PUBLIC_getvalgetvalp SEGMENT CODERSEGgetvalp_getval: NOPMOV A,R6MOV B,R7RETEND 报告有错如下:error C129: missing ;before _getval请英雄们赐教,谢谢了!2楼:参与讨论作者: gaozt 于 2005-5-3 17:16:00 发布: 不能这样简单的混合吧!看一下keil里的帮助文件!3楼:参与讨论作者: leonyang 于 2005-5-5 22:17:00 发布: 谢谢各位英雄小弟一直以来都是用汇编的,这是第一次用C51,还请各位英雄指教。在下对C51的一些技巧不太了解。见笑了。

3、C51的用户向导看过了。对寄存器等方面有了解啦,但是还是没有明白各个部分之间是怎样的一种结构。谢谢收看4楼:参与讨论作者: 2shift 于 2005-5-6 8:36:00 发布: 注意:1:汇编代码单独做一个asm文件。2:asm文件里面getval应大写5楼:参与讨论作者: studyboy_0 于 2005-5-6 9:15:00 发布: 汇编代码单独做一个asm文件,C51怎么去调用呢?请高手赐教6楼:参与讨论作者: leonyang 于 2005-5-6 10:05:00 发布: TO:2SHIFT谢谢英雄赐教。但是在下曾经将ASM ANDC51文件独立为两个不同的文件,但是同时置

4、于同一个工程文件目录之下的源码文件夹中。但是好像编译不了。不知道这其中还有什么要注意要点?还望英雄赐教一二。原来一直用汇编,现在要求用C51,只在是没有办法,只能求教各位大侠了。7楼:参与讨论作者: qjc.j 于 2005-5-6 10:34:00 发布: 其实并不难曾经有一个主题讨论过,主题名是,你看以下吧!8楼:参与讨论作者: 2shift 于 2005-5-6 13:54:00 发布: to:leonyang在同一个工程下面能够编译,调用的时候采用extern 注意:大写,大写+下划线的区别9楼:参与讨论作者: leonyang 于 2005-5-6 22:01:00 发布: 谢谢谢谢

5、各位英雄的赐教。小弟感激不禁。等我试一试先。有啦结果一定告诉大家。10楼:参与讨论作者: linwei1234 于 2005-5-7 21:57:00 发布: 好象不能放在一个文件里只能调用吧!11楼:参与讨论作者: tdsun33 于 2005-5-8 9:12:00 发布: 看看这样行不行#defineuint unsigned int#includeextern void getval(uint i);void main(void)uint data i=10;uint data j=0;getval(i);NAMETRANGE?PR?_getval?TRANGE SEGMENT COD

6、EPUBLIC_getvalRSEG?PR?_getval?TRANGE _getval: NOPMOV A,R6MOV B,R7RETEND 12楼:参与讨论作者: tdsun33 于 2005-5-8 9:14:00 发布: 看看最好把NAMETRANGE?PR?_getval?TRANGE SEGMENT CODEPUBLIC_getvalRSEG?PR?_getval?TRANGE _getval: NOPMOV A,R6MOV B,R7RETEND 做成一个单独的ASM文件,然后调用13楼:参与讨论作者: lhkjg 于 2005-5-8 10:24:00 发布: 我也一直在学混编,

7、我知道HT里面的混编非常的简单但是C51里面我也搞了好多次就是不能编译,不知道哪里有这样的书可以肯肯!还有就是汇编里面如何运用C里面定义的变量!如果是函数是不是还需要“进站”“出站”什么的?14楼:参与讨论作者: wsj0902 于 2005-5-8 10:42:00 发布: 刚学!未入门!一点愚见!是不是要设计一个哑函数(作参数传递之用)!我看书上有的例子在用寄存器传递参数时,用c设计了哑函数!可能是为了参数传递的正确性吧!如当用汇编编写某函数时,先用c写个哑函数,编译此哑函数!看看参数传递是否正确!ok的话!再用汇编编写,然后再注释掉此哑函数15楼:参与讨论作者: wsj0902 于 20

8、05-5-8 10:46:00 发布: c和汇编很重要的一点就是参数的传递!否则很容易出错!16楼:参与讨论作者: manu2 于 2005-5-8 13:51:00 发布: 你可以这样写先用c写一个空函数,在开头写上#pragma SRC (111.a51),写完后编译,然后再去编辑111.a51文件,把函数内容替换成你需要的就行了17楼:参与讨论作者: cyhwxm 于 2005-5-8 14:23:00 发布: 关键是参数的传递关键是参数的传递,即实参与返回值都是用寄存器传递的,搞清楚参数的传递原则就好办了,不知道我说的对否,请高人指点!18楼:参与讨论作者: duckcp 于 2005

9、-5-8 15:35:00 发布: 你用什么编译wave一定要汇编用单独ASM文件,你的汇编好险就是有问题,没定义变量长,wave网站有例程,下载了看看格式,keil不一样,我没用过19楼:参与讨论作者: netscaner 于 2005-5-8 16:30:00 发布: 在搜索引擎中输入C51 汇编 混合编译,就可以找到答案了20楼:参与讨论作者: leonyang 于 2005-5-8 22:17:00 发布: 谢谢各位了,总结一下。小弟已经攻克了现在将我的方法说明如下,供大家讨论。1)ASM文件一定要单独编写,但是应该与C51的文件处于同一工程文件下。2) C51中的注意事项:声明方法:

10、extern uCHAR ASM_NAME(1st,2ed,3rd);调用方法:uCHAR indata=ASM_NAME(.);3) 汇编的编写:PUBLIC _ASMNAMEASMNAMEP SEGMENT CODERSGEASMNAMEUSING 0_ASMNAME: MOV A,R7;ASM CODE HEREMOV R7,A;RESULE IN ACC,RETURN ITRETEND4)参数传递:CHARintfloatpointer1str7r6r7r4r7r1r2r32edr5r4r5r4r7r1233rdr3rr2r3nor123最后,感谢大家的回复。还是好人多啊,呵呵21楼:

11、参与讨论作者: thankw 于 2005-5-9 8:56:00 发布: 在A51文件最开始要加一句-NAME 模块名-声明一个ASM模块模块名就是文件名字22楼:参与讨论作者: enbed 于 2005-5-9 9:04:00 发布: 可是,你用汇编写驱动,不一定比KEIL厉害了.如果真的做东西,不推荐这么用了.1.需要学的东西,比你学C51的代价高.2.即使你调试通过,完成功能,以后升级,维护代价过高.3.KEIL的C不是标准C,跟汇编比,效力还可以的.所以没有必要这么麻烦,你又没有特别的要求哦.4.如果你实在要用,小心堆栈指针.23楼:参与讨论作者: sunny_dg 于 2005-5

12、-9 9:09:00 发布: 方法2有时在C51程序中需要嵌入一些汇编代码,这时当然可以用通常的作法:按照 C51 与汇编的接口写一个汇编函数,然后在 C51 程序中调用该函数。(此种方法正如楼主所列)下面介绍直接嵌入汇编代码的方法:1、在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码:#pragma ASM; Assembler Code Here#pragma ENDASM2、在 Project 窗口中包含汇编代码的 C 文件上右键,选择“Options for .”,点击右边的“Generate Assembler SRC File”和“Assemble SRC File”,使检查框

13、由灰色变成黑色(有效)状态;3、根据选择的编译模式,把相应的库文件(如 Small 模式时,是 KeilC51LibC51S.Lib)加入工程中,该文件必须作为工程的最后文件;4、编译,即可生成目标代码。24楼:参与讨论作者: leonyang 于 2005-5-9 20:15:00 发布: re大家的讨论在下均一一领教啦,谢了。主要是本人一直是用汇编的,(很久前用过TRUBO C)一时间要用C51,没有办法,只能采用这个办法,C51的一些技巧应该没有汇编熟悉,用起来反而不顺手。是的,混合编译要冒一定的风险,对堆栈和关键寄存器的保护十分关键。只能硬着头皮上啦。关于“方法”,本人有过尝试,要反复

14、编译,由此确定变量的地址,再修改嵌入的汇编语句,传出参数。25楼:参与讨论作者: o_wild 于 2005-5-11 17:53:00 发布: 试试看把汇编程序存为*.a51,连同*.c文件一起加入source GROUP.26楼:参与讨论作者: dengland 于 2005-5-12 21:35:00 发布: 这样能调用的吗?27楼:参与讨论作者: aoshi 于 2005-5-14 13:01:00 发布: 使用嵌入汇编或将两个分到两个文件中都可以但在同一个文件不行28楼:参与讨论作者: aoshi 于 2005-5-14 13:37:00 发布: re可以用嵌入汇编啊29楼:参与讨论

15、作者: fushaobing 于 2005-5-14 13:59:00 发布: TO leonyang;祝贺你!30楼:参与讨论作者: joypan 于 2005-5-14 14:14:00 发布: 高手快留言哪位高手有料,快发表呀,别做图书馆管理员。31楼:参与讨论作者: zhu1982lin 于 2005-5-14 18:03:00 发布: 这是我以前在网上下的文章,希望对你有用如何在 KEIL C51(v6.21) 中调用汇编函数的一个示例 ycong_kuang有关c51调用汇编的方法已经有很多帖子讲到,但是一般只讲要点,很少有对整个过程作详细描述,对于初学者是不够的,这里笔者通过一个

16、简单例子对这个过程进行描述,希望能对初学者有所帮助。几年来,在这个论坛里笔者得到很多热心人指导,因此也希望藉此尽一点绵薄之力。在这个例子里,阐述了编写c51程序调用汇编函数的一种方法,这个外部函数的入口参数是一个字符型变量和一个位变量,返回值是一个整型变量。例中,先用c51写出这个函数的主体,然后用SRC控制指令编译产生asm文件,进一步修改这个asm文件就得到我们所要的汇编函数。该方法让编译器自动完成各种段的安排,提高了汇编程序的编写效率。step1. 按写普通c51程序方法,建立工程,在里面导入main.c文件和CFUNC.c文件。相关文件如下:/main.c文件#include #def

17、ine uCHAR unsigned CHAR#define uint unsigned intextern uint AFUNC(uCHAR v_achr,bit v_bflag);void main()bit BFLAG;uCHAR mav_chr;uintmvintrslt;mav_chr=0xd4; BFLAG=1;mvintrslt=AFUNC(mav_chr,BFLAG);/CFUNC.c文件#define uCHAR unsigned CHAR#define uint unsigned intuint AFUNC(uCHAR v_achr,bit v_bflag)uCHAR tm

18、p_vchr;uinttp_vint;tmp_vchr=v_achr;tp_vint=(uint)v_bflag;return tmp_vchr+(tp_vint8);step2. 在 Project 窗口中包含汇编代码的 C 文件上右键,选择“Options for .”,点击右边的“Generate Assembler SRCFile”和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态;step3. 根据选择的编译模式,把相应的库文件(如 Small 模式时,是 KeilC51LibC51S.Lib)加入工程中,该文件必须作为工程的最后文件;step4. buil

19、d这个工程后将会产生一个CFUNC.SRC的文件,将这个文件改名为CFUNC.A51(也可以通过编译选项直接产生CFUNC.A51文件),然后在工程里去掉库文件(如C51S.Lib)和CFUNC.c,而将CFUNC.A51添加到工程里。/CFUNC.SRC文件如下.CFUNC.SRC generated from: CFUNC.cNAME CFUNC?PR?_AFUNC?CFUNCSEGMENT CODE?BI?_AFUNC?CFUNCSEGMENT BIT OVERLAYABLEPUBLIC?_AFUNC?BITPUBLIC_AFUNCRSEG?BI?_AFUNC?CFUNC?_AFUNC?

20、BIT:v_bflag?041:DBIT1; #define uCHAR unsigned CHAR; #define uint unsigned int; uint AFUNC(uCHAR v_achr,bit v_bflag)RSEG?PR?_AFUNC?CFUNC_AFUNC:USING0; SOURCE LINE # 5;- Variable v_achr?040 assigned to Register R7 -; ; SOURCE LINE # 6;uCHAR tmp_vchr;uinttp_vint;tmp_vchr=v_achr; SOURCE LINE # 10;- Vari

21、able tmp_vchr?042 assigned to Register R5 -MOVR5,AR7;tp_vint=(uint)v_bflag; SOURCE LINE # 11MOVC,v_bflag?041CLRARLCA;- Variable tp_vint?043 assigned to Register R6/R7 -;return tmp_vchr+(tp_vint8); SOURCE LINE # 12MOVR6,AMOVR4,#00HCLRAADDA,R5MOVR7,AMOVA,R4ADDCA,R6MOVR6,A; ; SOURCE LINE # 13?C0001:RET

22、; END OF _AFUNCENDstep5. 检查main.c的“Generate Assembler SRC File”和“Assemble SRC File”是否有效,若是有效则点击使检查框变成无效状态;再次build这个工程,到此你已经得到汇编函数的主体,修改函数里面的汇编代码就得到你所需的汇编函数了。参考文献:1.徐爱钧,彭秀华。单片机高级语言C51windows环境编程与应用,电子工业出版社,C51编程:关于在 KEIL C51 中直接嵌入汇编。帖子编号: 83838 发表用户:Youth.keil中汇编函数调用c51函数 ycong_kuang在keil的写法可参考89852帖

23、子,具体如下:与89852帖子相比,第一步在工程里多了一个被汇编调用的c51的函数文件(c51func.c),至于汇编函数还是先用c51编写出主体(a51func.c),这样汇编程序接口和段都交给编译器处理,你只管在编译成汇编代码后按你的要求改写汇编代码就行了。例程如下:/main.c#include #define uCHAR unsigned CHAR#define uint unsigned intextern uint AFUNC(uCHAR v_achr,bit v_bflag);void main()bit BFLAG;uCHAR mav_chr;uintmvintrslt;mav

24、_chr=0xd4; BFLAG=1;mvintrslt=AFUNC(mav_chr,BFLAG);/a51FUNC.c#define uCHAR unsigned CHAR#define uint unsigned intextern uint CFUNC(uint);uint AFUNC(uCHAR v_achr,bit v_bflag)/c51写的汇编函数,最终要变成汇编代码uCHAR tmp_vchr;uinttp_vint;tmp_vchr=v_achr;tp_vint=(uint)v_bflag;return CFUNC(tp_vint);/这里调用一个c51函数/c51FUNC.c#define uCHAR unsigned CHAR#define uint unsigned intuint CFUNC(uint v_int)/被汇编函数调用c51函数return v_int参与讨论作者: leonyang 于 2005-5-14 21:56:00 发布: 怪了,再总结先。我记得我回过一篇帖,总结了在下的成功经验,不见了。难道我

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1