- 1、本文档共69页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long C程序中嵌入汇编代码 ARM体系结构支持C、C++以及汇编语言的混合使用,内嵌汇编器还允许在C程序中嵌入汇编代码,以提高程序的效率。 在ARM C语言程序中使用关键词_asm来标识一段汇编指令程序,其格式如下: _asm { instruction [; instruction] …… [instruction] } 如果一行有多个汇编指令,则指令之间用分号隔开; 如果一条指令占多行,则要使用续行符号(\); 在汇编指令段中可以使用C语言的注释语句。 内嵌汇编中使用物理寄存器的注意事项1 一般不要直接指定物理寄存器存放数据,而应该使用C变量,让编译器自动分配寄存器。 _asm /*错误 { MOV R0, x ADD y, R0, x/y } int cvar; _asm /*正确 { MOV cvar, x ADD y, cvar, x/y } C编译器计算x/y值时会破坏R2,R3,R12和LR的值;更新N,Z,C和V条件标志位;并在R0中返回商,R1中返回余数。因此左边代码段中R0存放的数据在执行ADD指令前已被修改。 建议也不要使用复杂的C表达式,因为编译器在计算汇编代码中的C表达式时,可能会使用物理寄存器(如R0~R3、 R12、SP、LR ) ,并修改CPSR中的标志位。如果编译器无法分配使用合适的寄存器,将会报告寄存器冲突错误。 不要使用物理寄存器代替变量。尽管有时寄存器明显对应某个变量,但也不能直接使用寄存器代替变量。 */52 内嵌汇编中使用物理寄存器的注意事项2 int example1(int x) /*错误 { _asm { ADD R0, R0, #1 } return x; } int example1(int x) /*正确 { _asm { ADD x, x, #1 } return x; } 进入子程序example1后,参数x的值的确保存在寄存器R0中,但编译器认为内嵌汇编发生了寄存器冲突,可能使用其他寄存器存放x。因此左边代码段并不能完成对x的加1操作。 内嵌汇编语言中其他的注意事项 内嵌汇编指令可以使用C表达式,编译器会计算表达式的值并为其分配寄存器。但其值被视为无符号数;若为带符号数则用户需要自己处理与符号有关的操作; 若内嵌汇编指令中的C表达式包含有逗号,则该表达式应该包含在括号中; 如: _asm{ADD x, y, (f(), z)} ; (f(), z)为C表达式 内嵌汇编指令中常量前面的“#”可以省略,并使用“0x”代替“” 表示十六进制数; 不支持内存分配伪指令,可通过定义变量由编译器自动完成分配; 不支持BX指令,并且只有B指令可以使用C程序标号,而BL不行; 不能向PC赋值,程序跳转只能使用B或BL指令; 内嵌的SWI和BL指令除了正常的操作数外,可增加几个可选的寄存器列表用于参数传送; …… 内嵌汇编指令的应用举例:两个数相加 #include stdio.h int add(int i, int j) { int res; /*定义中间变量res*/ __asm { ADD res, i, j // ;实现res=i+j } return res; } void main( ) { int a; a = add(2,3); printf(addition result is : %d\n,a); } 求和子程序 调用子程序(注意书上漏印) 例9.10所示程序在RVDS上的运行结果 作业 必做:9.2-9.5、 9.8、 9.15-9.18 选做:9.6、9.7、9.12、9.14
您可能关注的文档
- 微电子演示文档.ppt
- 微电子专业-2011.11.26单元.ppt
- 读书莫放拦路虎教程.ppt
- 微积分1-2单元.ppt
- 读书要有选择教程.ppt
- 诫子书16诫子书1单元.ppt
- 微积分的创立教程.ppt
- 谏太宗十思疏上课教程.ppt
- 微积分的历史教程.ppt
- 微积分发展史教程.ppt
- 生成式人工智能对小学生数学思维发展的影响研究教学研究课题报告.docx
- 2025至2030全球及中国()甲基碘荷包牡丹碱行业市场深度研究及发展前景投资可行性分析报告.docx
- 初中历史:校园植物变迁与文化传承的研究教学研究课题报告.docx
- 高等数学(第五版)课件 3.6反常积分.pdf
- 2025至2030全球及中国()盐酸喹吡罗行业市场深度研究及发展前景投资可行性分析报告.docx
- 待人之礼主题班会课件.pptx
- 城乡接合型小学低段课堂管理存在的问题及对策以重庆市潼南区大佛小学为例.docx
- 《文化产业与数字旅游产业的融合创新与生态构建研究》教学研究课题报告.docx
- 待岗人员管理课件模板PPT.pptx
- 《基于云计算的物联网设备远程管理与故障诊断平台设计研究》教学研究课题报告.docx
最近下载
- VEICHI伟创 AC310系列变频调速器使用手册2021.06.pdf VIP
- 隧道施工课件.ppt VIP
- 第五届国家级新区经开区高新区班组长管理技能大赛备赛试题库-下(判断题汇总).docx VIP
- DB 6108T 53-2023 煤基固废调理剂修复沙化土地技术规范.docx VIP
- DB6108_T 52-2023 煤基固废调理剂修复盐碱地技术规范.docx VIP
- 行政人事部年终工作总结.pdf VIP
- 行政人事部年终工作总结.pptx VIP
- 第五届国家级新区经开区高新区班组长管理技能大赛备赛试题库-中(多选题汇总).docx VIP
- 化工厂物资明细表.xls VIP
- 第五届国家级新区经开区高新区班组长管理技能大赛试题库(浓缩500题).docx VIP
文档评论(0)