8 汇编程序设计以及混合汇编.ppt

  1. 1、本文档共52页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
8 汇编程序设计以及混合汇编

汇编程序设计及混合汇编 ARM汇编语言设计 汇编程序设计规范 IAR汇编器支持的伪指令 简单汇编语言程序设计 汇编程序设计 特别说明: 开发工具不同, 所以的汇编语言伪指令不同 如: ADS vs IAR 汇编语言程序设计规范-段 段:相对独立的指令或数据序列,具有特定的名称 段: 多个段在程序编译链接时最终形成一个可执行的代码段 段的设置规则 一个或多个代码段,代码段的属性为只读 0个或多个包含初始化数据的数据段,数据段的属性为可读/写 0个或多个不包含初始化数据的数据段,数据段的属性为可读/写 源文件中,段之间的相对位置与可执行的映像文件中段的相对位置可能不相同 简单的ARM汇编程序 PROGRAM ASM_EXAMPL……………………..;第1行 RSEG CODE:CODE:ROOT(2)………………….;第2行 CODE32 ORG 0x1000 start: LDR R0,=0x3FF5000 LDR R1,=0xFF STR R1,[R0] MOV R0,#0x10 MOV R1,#0x03 ADD R0,R0,R1 stop: B STOP ENDMOD END 伪指令语法格式 汇编语言格式 符号 常量 汇编语言程序设计 汇编程序设计规范 IAR汇编器支持的伪指令 简单汇编语言程序设计 IAR汇编器支持的伪指令 模块控制伪指令 符号控制伪指令 模式控制伪指令 段定义伪指令 赋值伪指令 条件汇编伪指令 宏处理伪指令 数据定义伪指令 汇编控制伪指令 C语言风格预处理伪指令 模块控制伪指令 符号控制伪指令 模式控制伪操作 段定义伪指令 赋值伪指令 条件汇编伪操作 GBLL Test ……… IF TEST=TRUE 指令序列1 ELSE 指令序列2 ENDIF 宏处理伪指令 数据定义伪指令 汇编控制伪指令 混合使用C/C++/汇编 内联汇编和嵌入型汇编的使用 从汇编代码访问 C 全局变量 在C++中使用C头文件 C、C++ 和 ARM 汇编语言之间的调用 什么地方会用到汇编 开机时硬件系统的初始化,包括CPU 状态的设定,中断的使能,主频的设定,以及RAM 的控制参数及初始化,中断处理方面也可能涉及汇编。 一些对性能非常敏感的代码块,这是不能依靠C 编译器的生成代码,而要手工编写汇编,达到优化的目的。 操作系统移植 何时使用内联汇编和嵌入型汇编 程序中使用饱和算术运算(Saturating arithmetic),如SSAT16 和 USAT16指令。 程序中需要对协处理器进行操作。 在C或C++程序中完成对程序状态寄存器的操作 注:使用内联汇编编写的程序代码效率也比较高 相互调用必须遵循ATPCS 在C程序中调用汇编 内联汇编的特点1 由于内联汇编嵌入在C或C++程序中,所有在用法上有其自身的一些特点。 ① 如果同一行中包含多条指令,则用分号隔开。 ② 如果一条指令不能在一行中完成,使用反斜杠“/”将其连接。 ③ 内联汇编中的注释语句可以使用C或C++风格的。 ④ 汇编语言中使用逗号“,”作为指令操作数的分隔符,所以如果在C语言中使用逗号必须用圆括号括起来。如,__asm {ADD x, y, (f(), z)}。 ⑤ 内联汇编语言中的寄存器名被编译器视为C或C++语言中的变量,所以内联汇编中出现的寄存器名不一定和同名的物理寄存器相对应。而且这些寄存器名在使用前必须声明,否则编译器将提示警告信息。 ⑥ 内联汇编中的寄存器(除程序状态寄存器CPSR和SPSR外)在读取前必须先赋值,否则编译器将产生错误信息。 内联汇编与汇编之间的区别 错误的内联汇编函数如下所示。 int f(int x) { __asm { STMFD sp!, {r0} // 保存r0 – 不合法,因为在读之前没有对寄存器寄存器写操作 ADD r0, x, 1 EOR x, r0, x LDMFD sp!, {r0} // 不需要恢复寄存器. } return x; } 将其进行改写,是它符合内联汇编的语法规则。 int f(int x) { int r0; __asm { ADD r0, x, 1 EOR x, r0, x } retur

文档评论(0)

yan698698 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档