ARM程序和Thumb程序混合使用PPT演示文稿_第1页
ARM程序和Thumb程序混合使用PPT演示文稿_第2页
ARM程序和Thumb程序混合使用PPT演示文稿_第3页
ARM程序和Thumb程序混合使用PPT演示文稿_第4页
ARM程序和Thumb程序混合使用PPT演示文稿_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第7章 ARM程序和Thumb程序交互使用,2,交互需求,Thumb的代码密度和在窄存储器上性能 ,使得它用在很多有大量C代码的系统上比较理想. 然而在很多应用中还是需要在 ARM/Thumb 两种状态之间切换: 在宽的存储器上 ARM 代码能提供很好的性能 在一个应用中,速度关键的部分用ARM代码实现是不错的 一些函数只能用 ARM 指令实现, e.g. 存取 CPSR (使能/禁止中断和状态的改变) 操作协处理器 异常处理 异常处理时自动进入 ARM 状态,但系统要求主程序用 Thumb 代码实现 独立的 Thumb 程序也需要一个ARM 的汇编程序头来切换,并调用Thumb 程序,3,可

2、以实现程序状态切换的指令 BLX, BX LDR, LDM, POP,4,交互指令,交互的实现采用跳转交换指令(BX) 在Thumb状态 BX Rn 在ARM状态 (支持Thumb的内核) BX Rn 其中Rn可以是 (r0r15)中的任何一个. 这将通过拷贝 Rn 到 PC 来实现在 4GB 空间内的一个绝对跳转. 其中Rn 的 Bit-0 表明切换到何种状态,5,状态切换,BX,6,与程序状态切换相关的伪操作 CODE16伪操作 CODE32伪操作,7,分支交换示例,CODE32; Start off in ARM state ADR r0,Into_Thumb+1; Generate b

3、ranch target address and set ; bit 0, hence arrive in Thumb state. BX r0; Branch exchange to Thumb state. : CODE16; Assemble subsequent code as Thumb. Into_Thumb : ADR r5, Back_to_ARM ; Generate branch target to word aligned ; address - hence bit 0 is clear. BX r5; Branch exchange back to ARM state.

4、 : CODE32; Assemble subsequent code as ARM. Back_to_ARM,8,无交互子程序,实现一个通常的子程序调用需要如下两步: 保存返回地址到寄存器(LR) 跳转到对应的子程序地址 调用实现通常只需要一个指令: BL func2 返回实现通常只需从 LR 恢复 PC: MOV pc,lr,. BL func2 .,MOV pc,lr,func1,func2,void func1 (void) : func2(); :,9,混合的ARM/Thumb子程序,在使用 C / C+ 写程序时,可以自由的编译为 ARM ( 使用armcc/armcpp) 或 T

5、humb ( 使用tcc/tcpp). 需要一些编译方法来解决在一种状态下的函数调用另一种状态下的函数的问题. 涉及到的问题: BL 不能完成状态切换 需要使用 BX 切换 BX 不能自动保存返回地址到 LR 需要其它方法来解决这个问题, BLX指令的引入 (ARM7不支持) 从子程序返回,要使用 BX LR 以便返回先前的状态 BL 在 Thumb 状态下可能设置了 LR 的 lsb (bit-0) 不能使用 MOV PC,LR 返回,因为不能实现状态切换,10,交互子程序,任何包含使用交互调用函数的 C 模块的编译必须使用 -apcs /interwork 命令行选项. 编译器将使用 BX

6、 实现函数返回来替代 MOV PC,LR. 连接器生成一小段代码(veneers)来改变状态 当发现交互调用时自动加入目标文件 使用 armlink -info veneers 可以看到加入的“ veneers”的大小,BL,BX,BX,func1,func2,连接程序生成 veneer,compiled for interworking,11,ARM 4T架构对交互编译的影响,leaf function使用 BX 返回. Non_leaf function将被交互编译: 在入口处( 调用 BL 之前)压栈保护返回地址 在入口处保护所有函数使用的寄存器 使用 BX 实现返回操作 (替代弹出 P

7、C). C 源代码 armcc -apcs /interwork tcc -apcs /interwork void func(void) func func STMFD sp!,r4-r11,lr PUSH r4-r7,lr : : : sub(); BL sub BL sub : : : : LDMFD sp!,r4-r11,lr POP r4-r7 BX lr POP r3 BX r3,12,汇编程序交互工作和Veneers,连接程序将会自动加入ARM / Thumb交互 veneers到汇编源代码. 主调程序需要: 使用 armasm -apcs /interwork 汇编 导出自己的

8、符号, e.g. EXPORT ThumbSub 使用 BX 实现返回 主调程序使用 BL 指令调用子程序. Note: AREA 将包含:AREA Thumb,CODE,READONLY,INTERWORK 如果如此, armasm 将警告:INTERWORK area directive is obsolete.Continuing as if -apcs /inter selected,13,armasm arm.sAREAARM,CODE,READONLYIMPORT ThumbSubENTRYCODE32ARMProgMOVr0, #1BLThumbSub;call Thumb su

9、broutineMOVr0, #0 x18 LDRr1, =0 x20026 SWI 0 x123456;ARM semihosting SWI END ; armasm thumb.s -apcs /interwork AREAThumb,CODE,READONLY EXPORT ThumbSub CODE16 ThumbSub MOVr1, #2 BXlr;return to caller END,汇编程序交互工作 (1,14,汇编程序交互工作 (2,使用Debugger反汇编代码: ARMProg 0 x00008080: 0 xe3a00001 : mov r0,#1 0 x00008

10、084: 0 xeb000004 : bl 0 x809c ; ThumbSub+0 x4 0 x00008088: 0 xe3a00018 : mov r0,#0 x18 0 x0000808c: 0 xe59f1000 : ldr r1,0 x8094 ; =#0 x00020026 0 x00008090: 0 xef123456 : swi 0 x123456 0 x00008094: 0 x00020026 : Literal Pool Value ThumbSub 0 x00008098: 0 x2102 : mov r1,#2 0 x0000809a: 0 x4770 : bx lr 交互veeners在下一个字的边界 0 x0000809c: 0 xe59fc000 : ldr r12,0 x80a4 ; =#ThumbSub+0 x1 0 x000080a0: 0 xe12fff1c : bx r12 0 x000080a4: 0 x00008099 : Literal Pool Value,15,C / 汇编使用 Veneers交互工作,运行在一种状态下的 C 代码可能调用运行在另一种状态下的汇编程序,反之亦然。 这时的 veneers 由连接程序自动生成。 如果主调函数是 C 函数, 编译时使用 -apcs /inte

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论