您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > ARM与嵌入式技术培训课件第6章
第6章ARM-Thumb交互工作6.1交互工作原理T版本的ARM体系结构支持ARM程序和THUMB程序混合编程,所谓交互工作就是程序执行过程中,可以根据需要进行ARM状态和THUMB状态的切换。交互工作的必要性为一个Thumb兼容的ARM处理器编写代码时,ARM指令的程序和THUMB指令的程序各有自己的优势,对于8位和16位的存储系统来说,Thumb指令可以提供更好的代码密度和性能,对于32位的存储系统来说,ARM指令则占有速度和性能上的优势。除此之外,在许多场合,也使得arm和thumb之间的切换变得必要。例如:6.1交互工作原理(1)速度:某些强调速度的场合下,应考虑在系统中包含一个32位的存储器,从而利用arm代码提供更好的性能,满足设计要求。(2)功能:Thumb指令没有ARM灵活,另外某些操作,例如直接读取PSR的值、使无效或有效中断以及改变工作模式、对协处理器的操作等等,只能通过ARM指令实现。(3)异常处理:当进入异常中断处理程序时,处理器会自动进入ARM状态,这就意味着异常处理程序的起始部分必须用ARM指令编写,若中断处理程序需要Thumb指令来完成,则需要在中断处理程序中切换到Thumb指令状态,在处理结束时,还必须切换回ARM状态来完成程序的返回。(4)单独的Thumb程序:Thumb兼容的ARM处理器总是从ARM状态开始执行指令的,因此即使对于简单的Thumb汇编语言程序,也必须在程序的开头添加一个ARM指令的程序头,使其从ARM状态切换到Thumb状态执行。6.1交互工作原理交互工作的切换指令使用分支跳转指令BX即可完成处理器Thumb状态和ARM状态的切换。语法格式如下:Thumb状态下的切换指令:BXRnARM状态下的切换指令:BX{cond}Rn其中,Rn可以为R0~R15中的任何一个寄存器,其值为分支地址。由于ARM指令都是字对齐的,在执行过程中,地址的最低两位忽略。Thumb指令是半字对齐的,在执行过程中,地址的最低位忽略。因此,可以根据BX指令分支到的地址的最低位确定处理器的状态是ARM状态还是Thumb状态:当最低位为0时,表示切换到ARM状态;为1时,表示切换到Thumb状态。Cond为条件码,只有ARM状态下的BX指令才允许条件执行。6.1交互工作原理交互工作的切换指令ARM/Thumb之间的状态切换是通过一条专用的转移交换指令BX来实现的.BXRn当前状态是Thumb时BX{cond}Rn当前状态是ARM时Rn310ARM/Thumb选择位0----ARM1-----ThumbPCBX6.1交互工作原理交互工作的切换指令绝对地址在4GB空间内的Thumb或ARM程序都可以通过这条指令完成跳转和状态的切换。注意:当不需要状态切换时也可以使用BX作为分支指令,尤其是当B和BL指令不能使用的情况下,因为BX指令可以寻址32位的存储空间,而B和BL指令则有如下限制:•ARM状态下,B和BL指令的寻址空间为32MB;•Thumb状态下,无条件B和BL指令的寻址空间为4MB;•Thumb状态下,有条件B指令的寻址空间为-128到+127个指令。6.1交互工作原理与状态切换有关的伪指令与状态切换有关的伪指令的有下面两条。指令形式:CODE16CODE32注意:CODE16和CODE32只是告知汇编器后面指令的形式是Thumb指令还是ARM指令,本身并不能进行程序状态的切换。当T版本的ARM处理器程序通过BX指令切换到Thumb状态时,同时需要在Thumb指令编写的代码段前用CODE16伪指令告知汇编器处理的是Thumb代码。由此可知,ARM和Thumb间的交互工作必须:(1)通过BX指令切换处理器的状态;(2)通过伪指令CODE32和CODE16指示汇编器根据处理器的状态生成合适的代码。6.2交互程序下例为一个从ARM代码段跳转到Thumb代码段,又回到ARM代码段的简单的交互程序设计的示例.CODE32;指示下面的指令为ARM指令ADRR0,Into_thumb+1;产生目标地址,并且设置目标地址的状;态为Thumb状态BXR0...CODE16;指示下面的指令为Thumb指令Into_thumb...ADRR5,Back_to_arm;产生目标地址,并且设置目标地址的状;态为ARM状态BXR5...CODE32;指示下面的指令为ARM指令Back_to_arm6.2交互程序ARM指令头的例子由于ARM处理器及汇编器总是从ARM状态开始执行和汇编指令的,因此对于单独的Thumb指令程序也必须添加一个ARM指令头。ARM指令的程序头主要完成如下两步操作:(1)通过ADR指令装载分支地址,并且设置地址最低位为1;(2)通过BX指令完成分支跳转并切换到Thumb状态。AREAThumbSub,CODE,READONLY;定义一个代码段ENTRY;程序入口CODE32;下面的指令为arm指令headerADRR0,start+1;处理器处于ARM状态BXR0;ARM指令头后,调用Thumb主程序CODE16;下面指令为Thumb指令startMOVR0,#10;设置参数MOVR1,#3BLdoadd;调用子程序stopMOVR0,#0x18;执行中止LDRR1,=0x20026SWI0xabdoaddADDR0,R0,R1;子程序代码MOVPC,LR;子程序返回END;程序结束程序主体以CODE16伪指令开始,通过ARM指令头中start+1,将分支目标地址的最低位置为1,然后通过BX指令切换处理器状态,start处的指令为Thumb指令。6.2交互程序交互子程序调用执行一个简单的汇编语言程序的调用,通常需要做两个工作:(1)存储返回地址到连接寄存器;(2)分支跳转到被调用的子程序。对于非交互的子程序调用,可以通过一条BL指令完成。交互工作的子程序调用则应使用BX指令,跳转的同时进行状态切换,同时注意返回时需要将状态切换回来。与BL指令不同,BX指令不能将返回地址存入连接寄存器中,因此在使用BX指令之前,必须先将返回地址写入连接寄存器。如果调用是从Thumb状态到ARM状态,还必须将连接寄存器的最低位置1,以保证从调用程序返回时工作在Thumb状态下。6.2交互程序从ARM状态调用Thumb子程序当执行ARM到Thumb的调用时,由于返回时的状态为ARM状态,所以不需要设置连接寄存器的最低位,因此可以简单的在BX指令前通过MOVlr,pc保存返回地址。AREAThumbAdd,CODE,READONLY;定义一个代码段ENTRYstartMOVr0,#2;寄存器赋值MOVr1,#3ADRr4,ThumbSub+1;生成分支地址并置最低位为1MOVlr,pc;存储返回地址BXr4;分支并切换到ThumbSubStopMOVr0,#0x18LDRr1,=0x20026SWI0x123456CODE16;后面代码为Thumb代码ThumbSubADDr0,r0,r1;r0=r0+r1BXLR;返回到ARM调用程序END6.2交互程序从Thumb状态调用ARM子程序最简单的执行Thumb到ARM程序调用的方法是采用一个间接调用的方式,先通过BL调用一个Thumb代码段,此段完成BX分支并切换的工作。这样,在BX指令执行之前,BL就把返回地址装入连接寄存器中了,另外Thumb下的BL指令同时保证了返回地址的最低位为1。这样当执行BXlr指令时,就可以正确地返回并进行状态切换。如果始终使用同一个寄存器存储ARM子程序的地址,则此间接调用的代码段可以通用.AREAArmAdd,CODE,READONLY;定义一个代码段ENTRY;程序入口,汇编器处于ARM模式start;ARM指令头ADRR2,ThumbProg+1BXR2CODE16;下面指令为Thumb指令ThumbProgMOVR0,#2;寄存器赋值MOVR1,#3ADRR4,ARMSubroutine;分支目的地址放入R4中,且bit0为0BL__call_via_R4;间接调用的代码段,保存返回地址到;LR寄存器,且目的地址的最低位为1Stop;执行中止MOVr0,#0x18LDRr1,=0x20026SWI0xAB__call_via_R4;Thumb代码段BXR4;分支并切换CODE32;下面指令为ARM指令ARMSubroutineADDR0,R0,R1;R0=R0+r1BXLR;返回到Thumb调用程序处;LR的bit0已经被Thumb状态下的BL指令置为1了END6.2交互程序Thumb代码段中的数据在Thumb代码段中定义数据时必须使用DATA伪指令,原因如下:当连接器定位Thumb指令程序中的标号时,它会假设标号为Thumb代码段的地址,因此会将标号的最低位置1,这样当使用BX指令进行程序调用时,处理器就会切换到Thumb状态,并寻址到正确的地址,但连接器区分不了数据和指令,若标号为数据区标号,连接器就会错误的将标号处的数据加1。DATA伪指令就是告知连接器此标号为数据标号,此时连接器不会将其增1。例如:Thumb_DataDATADCB1,3,4,...注意:DATA伪指令必须和标号位于同一行内。6.3ARMv5T扩展ARM的体系结构大致可以分为5个主要的版本:ARMv1T、ARMv2T、ARMv3T、ARMv4T、ARMv5T.前面介绍的ARM7TDMI-S处理器内核使用的是ARMv4T版本.ARMv5T版本的ARM体系结构中增加了额外的对交互工作的支持,除BX指令外,增加了BLX指令,另外LDR,LDM及POP指令也可以进行程序状态的切换.1.BLX指令指令形式:BLXRn;只能从ARM状态切换到Thumb状态,通过Rn的最低位决定目标地址的状态.与BX相比,BLX指令在进行跳转和状态切换的同时,还将PC寄存器的内容复制到了LR寄存器中.6.3ARMv5T扩展ARM的体系结构大致可以分为5个主要的版本:ARMv1T、ARMv2T、ARMv3T、ARMv4T、ARMv5T.前面介绍的ARM7TDMI-S处理器内核使用的是ARMv4T版本.ARMv5T版本的ARM体系结构中增加了额外的对交互工作的支持,除BX指令外,增加了BLX指令,另外LDR,LDM及POP指令也可以进行程序状态的切换.2.LDR,LDM,POP通过LDR,LDM及POP指令向PC寄存器赋值,完成程序的跳转,同时寄存器CPSR中的Thumb位被设置成PC寄存器的最低位bit0,由此决定目标地址处程序的状态.6.4交互子程序和Veneer前面介绍的交互工作中,调用者程序和被调用程序均在一个源程序中,如若两种状态下的程序位于不同的文件中,能否进行交互工作呢?答案是肯定的,只要程序编写过程中遵守ARM和Thumb过程调用标准ATPCS(ARMandThumbProccdureCallStandards),程序间就可以进行交互工作.此时需要设置相应的编译选项,使编译器按照ATPCS规则编译程序,ARM连接器在检测到ARM和Thumb混和编程的时候,会自动产生并插入一个称为伪装(veneer)的小代码段,用来根据程序需要完成ARM-Thumb状态的切换。6.4交互子程序和Veneer交互编译选项这个编译选项就是-apcs/interwork。通过使用-apcs/interwork编译项,可以强制在子程序返回时使用BXLR指令而非MOVPC,LR指令。例:两个处于不同状态的汇编程序间的交互工作。arm.s源文件:AREAARM,CODE,READONLYIMPORTTHUMBSubENTRYCODE32ARMPROGMOVR0,#1BLTHUMBSubADDR1,R1,R0ENDthumb.s源文件:AREATHUMB,CODE,READONLYEXPORTTHUMBSubENTRYCODE16THUMBSubMOVR1,#2BXLREND6.4交互子程序和Veneer我们可以通过下面的操作完成两文件间的交互工作:arma
本文标题:ARM与嵌入式技术培训课件第6章
链接地址:https://www.777doc.com/doc-2901799 .html