ARM程序和Thumb程序混合使用.ppt

上传人:小飞机 文档编号:6501712 上传时间:2023-11-07 格式:PPT 页数:23 大小:227.99KB
返回 下载 相关 举报
ARM程序和Thumb程序混合使用.ppt_第1页
第1页 / 共23页
ARM程序和Thumb程序混合使用.ppt_第2页
第2页 / 共23页
ARM程序和Thumb程序混合使用.ppt_第3页
第3页 / 共23页
ARM程序和Thumb程序混合使用.ppt_第4页
第4页 / 共23页
ARM程序和Thumb程序混合使用.ppt_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《ARM程序和Thumb程序混合使用.ppt》由会员分享,可在线阅读,更多相关《ARM程序和Thumb程序混合使用.ppt(23页珍藏版)》请在三一办公上搜索。

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

2、BLX,BXLDR,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 branch target address and set

3、;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.:CODE32;Assemble subsequent code as ARM.Back_to_

4、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)或 Thumb(使用tcc/tcpp).需要一些编译方法来解决在一种状态下的函数调用另一种状态下的函数的问题.涉及到的问题:BL 不能完成状态

5、切换需要使用 BX 切换 BX 不能自动保存返回地址到 LR需要其它方法来解决这个问题,BLX指令的引入(ARM7不支持)从子程序返回,要使用 BX LR 以便返回先前的状态BL 在 Thumb 状态下可能设置了 LR 的 lsb(bit-0)不能使用 MOV PC,LR 返回,因为不能实现状态切换,10,交互子程序,任何包含使用交互调用函数的 C 模块的编译必须使用-apcs/interwork 命令行选项.编译器将使用 BX 实现函数返回来替代 MOV PC,LR.连接器生成一小段代码(veneers)来改变状态当发现交互调用时自动加入目标文件使用 armlink-info veneers

6、 可以看到加入的“veneers”的大小。,:BL:,:BX,:BX,func1,func2,连接程序生成 veneer,(compiled for interworking),11,ARM 4T架构对交互编译的影响,leaf function使用 BX 返回.Non_leaf function将被交互编译:在入口处(调用 BL 之前)压栈保护返回地址在入口处保护所有函数使用的寄存器使用 BX 实现返回操作(替代弹出 PC).C 源代码 armcc-apcs/interwork tcc-apcs/interworkvoid func(void)func func STMFD sp!,r4-r1

7、1,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 汇编 导出自己的符号,e.g.EXPORT ThumbSub使用 BX 实现返回主调程序使用 BL 指令调用子程序.Note:AREA 将包含:AREA Thumb,CODE,READONLY,INTERWORK如果如此,armasm 将警告:IN

8、TERWORK area directive is obsolete.Continuing as if-apcs/inter selected.,13,;armasm arm.sAREAARM,CODE,READONLYIMPORT ThumbSubENTRYCODE32ARMProgMOVr0,#1BLThumbSub;call Thumb subroutineMOVr0,#0 x18LDRr1,=0 x20026SWI 0 x123456;ARM semihosting SWIEND;armasm thumb.s-apcs/interworkAREAThumb,CODE,READONLYE

9、XPORT ThumbSubCODE16ThumbSubMOVr1,#2BXlr;return to callerEND,汇编程序交互工作(1),14,汇编程序交互工作(2),使用Debugger反汇编代码:ARMProg0 x00008080:0 xe3a00001:mov r0,#10 x00008084:0 xeb000004:bl 0 x809c;ThumbSub+0 x40 x00008088:0 xe3a00018:mov r0,#0 x180 x0000808c:0 xe59f1000:ldr r1,0 x8094;=#0 x000200260 x00008090:0 xef12

10、3456:swi 0 x1234560 x00008094:0 x00020026:Literal Pool ValueThumbSub0 x00008098:0 x2102:mov r1,#20 x0000809a:0 x4770:bx lr交互veeners在下一个字的边界0 x0000809c:0 xe59fc000:ldr r12,0 x80a4;=#ThumbSub+0 x10 x000080a0:0 xe12fff1c:bx r120 x000080a4:0 x00008099:Literal Pool Value,15,C/汇编使用 Veneers交互工作,运行在一种状态下的 C

11、 代码可能调用运行在另一种状态下的汇编程序,反之亦然。这时的 veneers 由连接程序自动生成。如果主调函数是 C 函数,编译时使用-apcs/interwork 如果主调函数是汇编函数,汇编时使用-apcs/interwork 且返回使用 BX LR任何使用这些的汇编程序必须符合 ATPCS 标准,(e.g.函数参数传递使用 r0-r3&r12 不受保护的),16,非交互的 Thumb 代码,允许Thumb-Thumb调用,交互的Thumb 代码,非交互的 ARM 代码,交互的ARM 代码,允许非交互的调用交互的,不可调用,允许ARM/Thumb 调用,交互调用,最好使用交互选项build

12、所有的程序,17,连接交互工作的目标代码,为了顺利连接:必须使用统一的 APCS 标准“built”所有的 C/C+/Asm 文件.要使用相应的交互工作库连接程序发现任何的不协调就会给出一个错误:Invalid call from THUMB code in thumbmain.o(.text)to ARM symbol arm_function.修正编译器/汇编器的配置(e.g.加上-apcs/interwork),然后重新连编。连接时使用-info veneers来得到增加的veneers的概况,e.g.:Adding AT veneer(12 bytes)for call to _pri

13、ntffrom Thumb_to_ARM.o(.text)Adding TA veneer(12 bytes)for call to arm_functionfrom thumbmain.o(.text)小心非法的间接调用(e.g.函数指针,动态跳转表)连接器对这种情况在连接时是不会给出警告的。,18,使用 CodeWarrior 交互工作,使用 Thumb/ARM 交互工作工程模板向 ARMDebugRel 目标加入ARM C,C+&Asm 模块编译 C 模块使用 armcc-apcs/interwork编译 C+模块使用armcpp-apcs/interwork编译 ASM 模块使用arm

14、asm-32-apcs/interwork向 ThumbDebugRel 目标加入Thumb C,C+&Asm 模块编译 C 模块使用 tcc-apcs/interwork编译 C+模块使用tcpp-apcs/interwork编译 ASM 模块使用armasm-16-apcs/interworkARMDebugRel 将会被编译连接(部分连接)成 ThumbDebugRel的一个子目标,19,Architecture 5T Interworking,ARM 5T 架构增加了对交互工作的支持消除了对veneers的需求兼容ARM 4T 架构的代码改良内容包括新的 BLX 指令修正了加载 PC

15、的动作,20,ARM调用Thumb子程序通常切换到 Thumb 状态32 MB 分支范围返回地址保存在 LR 中使用 BX LR 从子程序返回无条件指令Thumb调用ARM子程序转化为两个16-bit 指令偏移范围同 Thumb 的 BL 指令i.e.+/-4MB 范围返回地址保存在LR(同时设置LSB),BLX,21,BLX Rm,和标准的 BX指令相同,除了保存返回地址到LR中ARM 版本下可条件执行Thumb 版本下单一的 16-bit 指令LR 的 LSB 将被设置使用 BX LR 从子程序返回,22,LDM cond Rn,PC增加了对交互的支持表 v4T behaviour wit

16、h extra support for interworking如果 PC 是一个加载寄存器那么加载值的bit0将被写入CPSR 的 T-bit(这将可能导致一状态切换)用作恢复寄存器同时从子程序返回用来替换 LDMFD sp!,.,LR+BX LR Thumb POP,PC 有同样的功能LDR PC,Rn,.同样依据加载值的0-bit来设置CPSR 的 T-bit可以用作跳转表没有相当的 Thumb 指令,送数到 PC,23,ARM 5T 架构对交互编译的影响,叶函数简单使用 BX 来返回.非叶函数被编译成交互格式:在入口处(调用 BL 之前)压栈保护返回地址在入口处保护所有函数使用的寄存器弹出 PC来实现返回(可能导致状态切换).C source code armcc-cpu 5T-apcs/inter tcc-cpu 5T-apcs/intervoid func(void)func func STMFD sp!,r4-r11,lr PUSH r4-r7,lr:sub();BL sub BL sub:LDMFD sp!,r4-r11,pc POP r4-r7,pc连接程序将根据需要修正BX为BLX,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号