- 1、本文档共23页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第6章 ARM-Thumb交互工作 6.1 交互工作原理 T版本的ARM体系结构支持ARM程序和THUMB程序混合编程,所谓交互工作就是程序执行过程中,可以根据需要进行ARM状态和THUMB状态的切换。 交互工作的必要性 为一个Thumb兼容的ARM处理器编写代码时,ARM指令的程 序和THUMB指令的程序各有自己的优势,对于8位和16位的存 储系统来说,Thumb指令可以提供更好的代码密度和性能,对 于32位的存储系统来说,ARM指令则占有速度和性能上的优 势。除此之外,在许多场合,也使得arm和thumb之间的切换 变得必要。例如: 6.1 交互工作原理 6.1 交互工作原理 交互工作的切换指令 6.1 交互工作原理 交互工作的切换指令 6.1 交互工作原理 交互工作的切换指令 6.1 交互工作原理 与状态切换有关的伪指令 6.2 交互程序 下例为一个从ARM代码段跳转到Thumb代码段,又回到ARM代码段的简单的交互程序设计的示例. 6.2 交互程序 ARM指令头的例子 6.2 交互程序 交互子程序调用 6.2 交互程序 从ARM状态调用Thumb子程序 6.2 交互程序 从Thumb状态调用ARM子程序 6.2 交互程序 Thumb代码段中的数据 6.3 ARM v5T扩展 ARM的体系结构大致可以分为5个主要的版本:ARM v1T、 ARM v2T 、 ARM v3T 、 ARM v4T 、 ARM v5T .前面介绍的ARM7TDMI-S处理器内核使用的是ARM v4T 版本. ARM v5T版本的ARM体系结构中增加了额外的对交互工作的支持,除BX指令外,增加了BLX指令,另外LDR,LDM及POP指令也可以进行程序状态的切换. 6.3 ARM v5T扩展 ARM的体系结构大致可以分为5个主要的版本:ARM v1T、 ARM v2T 、 ARM v3T 、 ARM v4T 、 ARM v5T .前面介绍的ARM7TDMI-S处理器内核使用的是ARM v4T 版本. ARM v5T版本的ARM体系结构中增加了额外的对交互工作的支持,除BX指令外,增加了BLX指令,另外LDR,LDM及POP指令也可以进行程序状态的切换. 6.4 交互子程序和Veneer 前面介绍的交互工作中,调用者程序和被调用程序 均在一个源程序中,如若两种状态下的程序位于不同的 文件中,能否进行交互工作呢? 答案是肯定的,只要程序编写过程中遵守ARM和 Thumb过程调用标准ATPCS(ARM and Thumb Proccdure Call Standards),程序间就可以进行交互工 作.此时需要设置相应的编译选项,使编译器按照 ATPCS规则编译程序,ARM连接器在检测到ARM和 Thumb混和编程的时候,会自动产生并插入一个称为 伪装(veneer)的小代码段,用来根据程序需要完成 ARM - Thumb状态的切换。 6.4 交互子程序和Veneer 交互编译选项 这个编译选项就是-apcs/interwork。通过使用-apcs/interwork 编译项,可以强制在子程序返回时使用BX LR指令而非MOV PC, LR指令。 例:两个处于不同状态的汇编程序间的交互工作。 6.4 交互子程序和Veneer 我们可以通过下面的操作完成两文件间的交互工作: armasm arm.s armasm thumb.s –apcs/interwork armlink arm.o thumb.o 通常在编译程序时,我们应尽量选用-apcs/interwork选项。-apcs/interwork编译器选项可以保证所有的ARM和Thumb 、C或C++编译器编译的模块能够在各种处理器状态间相互调用: tcc -apcs /interwork armcc -apcs /interwork tcpp -apcs /interwork armcpp -apcs /interwork 在interwork选项下编译的代码模块会比原Thumb或ARM代码模块大一些,例如对Thumb程序,典型的会增加约2%的容量。因此没有必要对所有的程序进行交互编译,只对那些包含交互子程序调用的程序进行交互编译即可。 6.4 交互子程序和Veneer Veneer 所谓Veneer是由连接器自动生成并插入到汇编程序的一小段代码。通 常在下面两种情况下,连接器会生成Veneer: (1)被调用程序包含状态切换; (2)被调用程序的地址超出了调用指令的寻址范围。 连接时,连接器先找到veneer,再连接需调用的程序。根据被调用程 序的状态,以及其与调用者间距离的远近,Veneer包含
文档评论(0)