




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
汇编与c的混合编程,在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,因为C语言的结构比较好,便于人的理解,而且有大量的支持库。汇编语言,例如开机时硬件系统的初始化,包括CPU状态的设定,中断的使能,主频的设定,以及RAM的控制参数及初始化,一些中断处理方面也可能涉及汇编。,C和汇编的混合编程,在c中嵌入汇编指令在汇编程序和c程序之间进行变量的互访在汇编程序,c程序之间的相互调用,1在C语言中内嵌汇编,在C中内嵌的汇编指令包含大部分的ARM和Thumb指令,存在一些限制,主要有下面几个方面:不能直接向PC寄存器赋值,程序跳转要使用B或者BL指令在使用物理寄存器时,不要使用过于复杂的C表达式,避免物理寄存器冲突R12和R13可能被编译器用来存放中间编译结果,计算表达式值时可能将R0到R3、R12及R14用于子程序调用,因此要避免直接使用这些物理寄存器,内嵌汇编使用的标记是_asm,用法如下:_asminstruction;instructioninstruction,voidenable_IRQ(void)inttmp;_asmMRStmp,CPSRBICtmp,tmp,#80MSRCPSR_c,tmp,voiddisable_IRQ(void)inttmp;_asmMRStmp,CPSRORRtmp,tmp,#80MSRCPSR_c,tmp,80=0 x50=0b1010000,#includevoidmy_strcpy(constchar*src,char*dest)charch;_asmloop:ldrbch,src,#1strbch,dest,#1cmpch,#0bneloop,intmain()char*a=forgetitandmoveon!;charb64;my_strcpy(a,b);printf(original:%s,a);printf(copyed:%s,b);return0;,在程序中定义一个变量,在编译时就给这个变量分配一个内存单元,同时根据变量的类型决定这个内存单元的大小。如:整型2字节,实型4字节。,内存中每一个字节都有一个编号,就是“地址”。,对每一个变量,它在内存中都有一个存储位置,这个位置就是该变量的地址,对变量值的存取是通过地址进行。在C语言中这个地址被形象化地称为“指针”。,指针:一个变量的地址。指针变量:存放地址的变量.,定义一个指针变量指针变量在使用前必须定义,使其指向特定类型的变量,指针变量存放地址,必须定义为“指针类型”。定义的一般形式:基类型*指针变量名;基类型:用来指定指针变量可以指向的变量的类型。将决定指针移动和运算时的移动量。构成:存储类型数据类型*:表示该变量为指针类型,注意:1、指针变量名是p1,p2,不是*p1,*p22、指针变量只能指向定义时所规定类型的变量3、指针变量定义后,变量值不确定,应用前必须先赋值,2在汇编中使用C定义的全局变量,汇编通过地址访问c的全局变量访问方法:使用INPORT/EXTERN伪操作引用该全局变量使用LDR伪指令读取全局变量的地址使用LDR指令读取全局变量使用STR指令存储该全局变量,范例:globvar的地址载入R1,将该地址中包含的值载入R0,并与2相加,结果保存在globvar中.,PRESERVE8AREAglobals,CODE,READONLYEXPORTasmsubroutineIMPORTglobvar;引入全局变量globvarasmsubroutineLDRR1,=globvarLDRR0,R1ADDR0,R0,#2STRR0,R1MOVpc,lrEND,2在汇编中使用C定义的全局变量,#includeintgVar_1=12;externasmDouble(void);intmain()printf(originalvalueofgVar_1is:%d,gVar_1);asmDouble();printf(modifiedvalueofgVar_1is:%d,gVar_1);return0;,AREAasmfile,CODE,READONLYEXPORTasmDoubleIMPORTgVar_1asmDoubleldrr0,=gVar_1ldrr1,r0movr2,#2mulr3,r1,r2strr3,r0movpc,lrEND,2.在c中访问汇编的程序数据,访问方法:在汇编中用EXPORT/GLOBAL伪操作声明该全局标号在c中定义相应的数据类型指针变量,将该指针变量赋值为汇编中的全局标号,用该指针访问汇编中的数据.,3.汇编与c的相互调用,1.在C中调用汇编的函数在C中调用汇编文件中的函数,主要工作有两个:一是在C中声明函数原型,并加extern关键字;二是在汇编中用EXPORT导出函数名,并用该函数名作为汇编代码段的标识,最后用movpc,lr返回。,范例:将一个字符串赋值给另一个字符串,#includeExternvoidstrcopy(char*d,constchar*s);Intmain()Constchar*srcstr=“Sourcestring”;Chardststr=“destinationstring”;Printf(“beforecopying:n”);Printf(“%sn%sn”,srcstr,dsttr);Strcopy(srcstr,dsttr);Printf(“aftercopying:n”);Printf(“%sn%sn”,srcstr,dsttr);Return(0);,PRESERVE8AREAScopy,CODE,READONLYEXPORTstrcopystrcopyLDRBR2,R1,#1STRBR2,R0,#1CMPR2,0BNEstrcopyMOVpc,lrEND,在汇编中调用C的函数,在汇编中调用C的函数,需要在汇编中IMPORT对应的C函数名,使用BL指令调用EXPORTasmfileAREAasmfile,CODE,READONLYIMPORTcFunENTRYmovr0,#11movr1,#22movr2,#33BLcFunEND/*Cfile,calledbyasmfile*/intcFun(inta,intb,intc)returna+b+c;,intg(inta,intb,intc,intd,inte,intf)printf(“e=%dn”,e);printf(“f=%dn”,f);return(a+b+c+d+e+f);汇编程序调用C程序g()计算6个整数i,2*i,3*i,4*i,5*i,6*i的和,假设R0中的内容为iEXPORTfAREAf,CODE,READONLYIMPORTgADDR1,R0,R0;R1存放第2个参数2*iADDR2,R1,R0;R2存放第3个参数3*iADDR3,R2,R0;R3存放第4个参数4*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工程总承包施工合同范本3篇
- 瑞阳安全培训中心课件
- 瑞丰银行吴光伟课件
- 农业碳汇:2025年市场驱动因素与潜力评估报告
- 理赔廉洁自律课件
- 农业碳汇项目碳排放权交易市场政策与区域发展战略研究
- 封闭工程竞标方案范本(3篇)
- 农业温室智能化设施在2025年的应用效果与市场推广策略研究
- 房屋工程监理投标方案(3篇)
- 微课辅助:让诗歌鉴赏教学更高效
- 80年血火淬炼此刻亮剑正当时:纪念中国人民抗日战争暨世界反法西斯战争胜利80周年阅兵仪式对初中生的启示-2025-2026学年初中主题班会
- 2025-2026学年西师大版(2024)小学数学一年级上册(全册)教学设计(附目录P227)
- 2025年大型集团财务审计外包服务合同风险防控条款规范
- 2025年国家保安员资格考试复习题库(附答案)
- 辅警考试真题(含答案)
- 新式茶饮基础知识培训课件
- 2025新疆天泽和达水务科技有限公司部分岗位社会招聘28人笔试模拟试题及答案解析
- 巧堆肥劳动课件
- 技术方案评审表-技术选型决策
- 万用表专业培训资料共23张课件
- 启闭机设备安装与调试施工方案
评论
0/150
提交评论