导言
在前面的文章中提到过,许多情况下使用程序需求在ARM跟Thumb状况之间彼此切换,这部分就评论交互作业的完成办法和一些留意问题。
1需求交互的原因
前面提到过,Thumb指令在某些特殊情况下具有比ARM指令更为超卓的体现,主要是在代码长度和窄带宽存储器体系功用两方面。正是由于Thumb指令在特定环境下的优势,它在许多方面得到了广泛使用。可是由于下面一些原因,Thumb又不或许独登时组成一个使用体系。
◇ Thumb指令集在功用上仅仅ARM指令集的一个子 集,某些功用只能在ARM状况下履行,如CPSR和 协处理器的拜访。
◇ 进行反常响应时,处理器会主动进入ARM状况。
◇ 从体系优化考虑,在宽带存储器上不应该放置 Thumb代码,许多窄带体系具有宽带的内部存储器。
◇ 即使是一个单纯的Thumb使用体系,也有必要加一 个汇编的交互头程序,由于体系总是主动从ARM 开端发动。
所以,不可避免地会发生ARM与Thumb之间交互的问题。
2状况切换的完成
处理器在 ARM/Thumb之间的状况切换是经过一条专用的跳转交流指令BX来完成的。BX指令以通用寄存器(R0~R15)为操作数,经过复制Rn到PC来完成 4GB空间范围内的一个必定跳转。BX使用Rn寄存器中存储的方针地址值的最终一位来判别跳转后的状况。如图1所示,是用BX指令完成状况切换。
不管ARM仍是Thumb,其指令存储在存储器中都是鸿沟对齐的(4字节或2字节对齐)。因而,在履行跳转过程中,PC寄存器中的最低位必定被放弃,不起作用。在BX指令的履行过程中,最低位正好被用作状况判别的标识,不会形成存储器拜访不对齐的过错。
图 2 中是一段直接进行状况切换的例程:
下面是一段直接进行状况切换的例程。
;从ARM状况开端
CODE32 ;汇编关键字
ADR R0, Into_Thumb+1 ;得到方针地址,末方位1, ;转向Thumb
BX R0 ;履行 ? ;其它代码
CODE16 ;汇编关键字
Into_Thumb ;Thumb代码段开始地址
… ;Thumb代码
ADR R5, Back_to_ARM ;得到方针地址,末位缺 ;省为0,转向ARM
BX R5 ;履行
… ;其它代码
CODE32 ;汇编关键字
Back_to_ARM ;ARM代码段开始地址
咱们知道,在ARM的状况寄存器CPSR 中,bit-5是状况操控位T-bit,决议当时处理器的运转状况。假如直接修正CPSR的状况位,也可以到达改动处理器运转状况的意图。可是这样会带来一个问题,由于ARM选用多级流水线的结构,所以在程序履行过程中,指令流水线上会存在几条预取指令(详细数目视流水线级数而不同)。当修正CPSR的 T-bit后,状况的改变会形成流水线上预取指令的履行过错。而假如用BX指令,则履行后会进行流水线的改写动作,铲除流水线上的剩余指令,在新的状况下重新开端指令预取,然后确保状况改变时指令流的正确联接。