版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第7章章 ARM程序和程序和Thumb程序交互使程序交互使用用第1页/共23页2交互需求 Thumb的代码密度和在窄存储器上性能 ,使得它用在很多有大量C代码的系统上比较理想. 然而在很多应用中还是需要在 ARM/Thumb 两种状态之间切换: 在宽的存储器上 ARM 代码能提供很好的性能 在一个应用中,速度关键的部分用ARM代码实现是不错的 一些函数只能用 ARM 指令实现, e.g. 存取 CPSR (使能/禁止中断和状态的改变) 操作协处理器 异常处理 异常处理时自动进入 ARM 状态,但系统要求主程序用 Thumb 代码实现 独立的 Thumb 程序也需要一个ARM 的汇编程序头来切
2、换,并调用Thumb 程序第2页/共23页3 可以实现程序状态切换的指令 BLX, BX LDR, LDM, POP第3页/共23页4交互指令 交互的实现采用跳转交换指令(BX) 在Thumb状态BX Rn 在ARM状态 (支持Thumb的内核)BX Rn 其中Rn可以是 (r0r15)中的任何一个. 这将通过拷贝 Rn 到 PC 来实现在 4GB 空间内的一个绝对跳转. 其中Rn 的 Bit-0 表明切换到何种状态. 第4页/共23页5状态切换Rn31010/1ARM / Thumb 选择位0 - ARM state1 - Thumb state目的地址BX3101PC第5页/共23页6 与
3、程序状态切换相关的伪操作 CODE16伪操作 CODE32伪操作第6页/共23页7分支交换示例CODE32; Start off in ARM state ADR r0,Into_Thumb+1 ; Generate branch 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
4、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_ARM :第7页/共23页8无交互子程序 实现一个通常的子程序调用需要如下两步: 保存返回地址到寄存器(LR) 跳转到对应的子程序地址 调用实现通常只需要一个指令: BL func2 返回实现通常只需从 LR 恢复 PC: MOV pc,lr.BL func2.:MOV pc,lrfunc1
5、func2void func1 (void):func2();:第8页/共23页9混合的ARM/Thumb子程序 在使用 C / C+ 写程序时,可以自由的编译为 ARM ( 使用armcc/armcpp) 或 Thumb ( 使用tcc/tcpp). 需要一些编译方法来解决在一种状态下的函数调用另一种状态下的函数的问题. 涉及到的问题: BL 不能完成状态切换 需要使用 BX 切换 BX 不能自动保存返回地址到 LR 需要其它方法来解决这个问题, BLX指令的引入 (ARM7不支持) 从子程序返回,要使用 BX LR 以便返回先前的状态 BL 在 Thumb 状态下可能设置了 LR 的 ls
6、b (bit-0) 不能使用 MOV PC,LR 返回,因为不能实现状态切换第9页/共23页10交互子程序 任何包含使用交互调用函数的 C 模块的编译必须使用 -apcs /interwork 命令行选项. 编译器将使用 BX 实现函数返回来替代 MOV PC,LR. 连接器生成一小段代码(veneers)来改变状态 当发现交互调用时自动加入目标文件 使用 armlink -info veneers 可以看到加入的“ veneers”的大小。:BL:BX:BXfunc1func2连接程序生成 veneer(compiled for interworking)第10页/共23页11ARM 4T架
7、构对交互编译的影响 leaf function使用 BX 返回. Non_leaf function将被交互编译: 在入口处( 调用 BL 之前)压栈保护返回地址 在入口处保护所有函数使用的寄存器 使用 BX 实现返回操作 (替代弹出 PC).C 源代码 armcc -apcs /interwork tcc -apcs /interworkvoid 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 l
8、r POP r3 BX r3第11页/共23页12汇编程序交互工作和Veneers 连接程序将会自动加入ARM / Thumb交互 veneers到汇编源代码. 主调程序需要: 使用 armasm -apcs /interwork 汇编 导出自己的符号, e.g. EXPORT ThumbSub 使用 BX 实现返回 主调程序使用 BL 指令调用子程序. Note: AREA 将包含:AREA Thumb,CODE,READONLY,INTERWORK如果如此, armasm 将警告:INTERWORK area directive is obsolete.Continuing as if -
9、apcs /inter selected.第12页/共23页13; armasm arm.sAREA ARM,CODE,READONLYIMPORT ThumbSubENTRYCODE32ARMProgMOVr0, #1BLThumbSub;call Thumb subroutineMOVr0, #0 x18LDRr1, =0 x20026SWI 0 x123456;ARM semihosting SWIEND; armasm thumb.s -apcs /interworkAREA Thumb,CODE,READONLYEXPORT ThumbSubCODE16ThumbSubMOVr1,
10、#2BXlr;return to callerEND汇编程序交互工作 (1)第13页/共23页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 xef123456 : sw
11、i 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第14页/共23页15C / 汇编使用
12、Veneers交互工作 运行在一种状态下的 C 代码可能调用运行在另一种状态下的汇编程序,反之亦然。 这时的 veneers 由连接程序自动生成。 如果主调函数是 C 函数, 编译时使用 -apcs /interwork 如果主调函数是汇编函数, 汇编时使用 -apcs /interwork 且返回使用 BX LR 任何使用这些的汇编程序必须符合 ATPCS 标准 ,( e.g. 函数参数传递使用 r0-r3 & r12 不受保护的)第15页/共23页16非交互的 Thumb 代码允许Thumb-Thumb调用交互的Thumb 代码非交互的 ARM 代码允许ARM-ARM调用交互的AR
13、M 代码允许非交互的调用交互的不可调用 允许ARM/Thumb 调用交互调用 最好使用交互选项build所有的程序第16页/共23页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 vene
14、ers来得到增加的veneers的概况, e.g.:Adding AT veneer (12 bytes) for call to _printffrom Thumb_to_ARM.o(.text)Adding TA veneer (12 bytes) for call to arm_functionfrom thumbmain.o(.text) 小心非法的间接调用 (e.g. 函数指针, 动态跳转表) 连接器对这种情况在连接时是不会给出警告的。第17页/共23页18使用 CodeWarrior 交互工作 使用 Thumb /ARM 交互工作工程模板向 ARMDebugRel 目标加入ARM
15、C, C+ & Asm 模块 编译 C 模块使用 armcc -apcs /interwork 编译 C+ 模块使用armcpp -apcs /interwork 编译 ASM 模块使用armasm -32 -apcs /interwork 向 ThumbDebugRel 目标加入Thumb C, C+ & Asm 模块 编译 C 模块使用 tcc -apcs /interwork 编译 C+ 模块使用tcpp -apcs /interwork 编译 ASM 模块使用armasm -16 -apcs /interwork ARMDebugRel 将会被编译连接 (部分连接)成
16、ThumbDebugRel的一个子目标第18页/共23页19Architecture 5T Interworking ARM 5T 架构增加了对交互工作的支持 消除了对veneers的需求 兼容ARM 4T 架构的代码 改良内容包括 新的 BLX 指令 修正了加载 PC 的动作第19页/共23页20 ARM 调用Thumb子程序 通常切换到 Thumb 状态 32 MB 分支范围 返回地址保存在 LR 中 使用 BX LR 从子程序返回 无条件指令 Thumb 调用ARM子程序 转化为两个16-bit 指令 偏移范围同 Thumb 的 BL 指令 i.e. +/- 4MB 范围 返回地址保存在
17、LR (同时设置LSB)BLX :BLX offset:BX lrARMThumbCPSR T bit = 1第20页/共23页21BLX Rm 和标准的 BX指令相同,除了保存返回地址到LR中 ARM 版本下可条件执行 Thumb 版本下 单一的 16-bit 指令 LR 的 LSB 将被设置 使用 BX LR 从子程序返回ARM / Thumb选择位0 - ARM state1 - Thumb stateRm目的地址310131010/10BLX RmPC第21页/共23页22 LDM cond Rn, ,PC 增加了对交互的支持表 v4T behaviour with extra support for interworking 如果 PC 是一个加载寄存器那么 加载值的bit
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 看护锅炉劳务合同范本
- 烟囱设备销售合同范本
- 监理劳务合同范本样本
- 物业泳池转租合同范本
- 眉山屋顶换瓦合同范本
- 监控系统维护合同范本
- 辩护聘请律师合同范本
- 编制项目委托合同范本
- 直播软件销售合同范本
- 第5课《建立良好的公共秩序》第1课时(教学设计)-部编版道德与法治五年级下册
- GB/T 42044-2022空间站应用有效载荷通用设计要求
- GB/T 36198-2018土壤质量土壤气体采样指南
- GB/T 35230-2017地面气象观测规范蒸发
- GB/T 12970.4-2009电工软铜绞线第4部分:铜电刷线
- GB/T 11361-2008同步带传动梯形齿带轮
- 公益事业捐赠预评估表
- 江苏开放大学组织行为学期末复习题
- 监狱消防安全知识讲座课件
- 科学社会学的研究对象
- 去极端化学习材料课件
- 中国文化概论(第三版)全套课件
评论
0/150
提交评论