第九单元 ARM汇编语言程序设计基础.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第九单元 ARM汇编语言程序设计基础.ppt

内嵌汇编注意事项 不能直接向PC寄存器赋值,程序跳转只能使用B或BL指令实现 不要使用过于复杂的C表达式,因为将会需要较多的物理寄存器,这将导致与其他指令中用到的物理寄存器产生使用冲突。 编译器可能会使用R12或R13存放编译的中间结果,在计算表达式的值时可能会将寄存器R0~R3,R12和R14用于子程序调用。因此在内嵌的汇编指令中不要将这些寄存器同时指定为指令中的物理寄存器。 通常内嵌的汇编指令中不要指定物理寄存器,因为这可能会影响编译器分配寄存器,进而影响代码的效率。 ATPCS规范要点 寄存器的使用规则 堆栈使用规则 参数传递规则 子程序结果返回规则 从汇编程序中访问C程序变量 在C程序中声明的全局变量可以被汇编程序通过地址间接访问,具体访问方法如下: ① 使用IMPORT伪指令声明该全局变量。 ② 使用LDR指令读取该全局变量的内存地址,通常该全局变量的内存地址值存放在程序的数据缓冲区中。 ③ 根据该数据的类型,使用相应的LDR指令读取该全局变量的值,使用相应的STR指令修改该全局变量的值。 汇编程序中访问C程序变量举例 AREA global_exp, CODE, READONLY EXPORT asmsub IMPORT globv ;声明全局变量 asmsub LDR r1, = globv ;将内存地址读入到R1中 LDR r0, [r1] ;将数据读入到R0中 ADD r0, r0, #2 STR r0, [r1] ;修改 后再将值赋予变量 MOV pc, lr END 从汇编程序中访问C程序变量 各数据类型及其对应的LDR/STR指令如下: ① 对于无符号的char类型的变量通过指令LDRB/STRB来读写。 ② 对于无符号的short类型的变量通过指令LDRH/STRH读写。 ③ 对于int类型的变量通过指令LDR/STR来读写。 ④ 对于有符号的char类型的变量通过指令LDRSB来读取。 ⑤ 对于有符号的char类型的变量通过指令STRB来写入。 ⑥ 对于有符号的short类型的变量通过指令LDRSH来读取。 ⑦ 对于有符号的short类型的变量通过指令STRH来写入。 ⑧ 对于小于8个字的结构型变量,可以通过一条LDM/STM指令来读/写整个变量。 ⑨ 对于结构型变量的数据成员,可以使用相应的LDR/STR指令来访问,这时必须知道该数据成员相对于结构型变量开始地址的偏移量。 * * ARM汇编语言源程序中语句一般由指令、伪操作、宏指令和伪指令组成。 伪操作是ARM汇编语言程序里的一些特殊指令助记符,它的作用主要是为完成汇编程序做各种准备工作,在源程序进行汇编时由汇编程序处理,而不是在计算机运行期间由机器执行。 宏指令是一段独立的程序代码,可以插在源程序中,它通过伪操作来定义。宏在被使用之前必须提前定义好,宏之间可以互相调用,也可以自己递归调用。通过直接书写宏名来使用宏,并根据宏指令的格式设置相应的输入参数。宏定义本身不会产生代码,只是在调用它时把宏体插入到源程序中。 伪指令也是ARM汇编语言程序里的特殊指令助记符,也不在处理器运行期间由机器执行,它们在汇编时将被合适的机器指令代替成ARM或Thumb指令从而实现真正指令操作。 * 伪变量也简成为变量,这是编译器是用的变量。 LCLx定义的局部变量,是在宏中使用的。 * * CODE32 告诉汇编编译器后面的指令序列为32位的ARM指令。 name EQU expr{,type} 为数字常量、基于寄存器的值和程序中的标号(基于PC的值)定义一个字符名称。 AREA sectionname{,attr}{,attr}… 定义一个代码段或者数据段。P228 ENTRY 指定程序的入口点。 END 告诉编译器已经到了源程序结尾。 ALIGN {expr{,offset}} 通过添加补丁字节使当前位置满足一定的对齐方式。 EXPORT symbol {[WEAK]} 声明一个符号可以被其他文件引用,相当于声明了一个全局变量。 IMPORT symbol {[WEAK]} 告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号。 GET filename 将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编处理。 name RN expr 为一个特定的寄存器定义名称。 * * * * 这一页的内容比较重要 * * * * * CODE32 告诉汇编编译器后面的指令序列为32位的ARM指令。 name EQU expr{,type} 为数字常量、基于寄

文档评论(0)

panguoxiang + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档