ARM Thumb Thumb-2指令集

2020-08-22 08:29

  :32位的ARM指令集实施功用高,对ARM体例架构统统效用的完好支柱;16位的

  指令集是ARM指令集的子集并以优秀的代码密度著称。假如扔开预取指令时候不计,ARM指令相对Thumb指令将有更好的运转机能(预取指令时必要凭据指令所在偏移量来取指, ARM支柱更大的所在偏移量而较量耗时)。近来ARM公司推出的的

  /Thumb2指令集据称是上述两种特色的归纳,是ARM指令集的机能和Thumb指令集的代码密度的折中。号称抵达98%的ARM机能而又能下降代码密度达30%。正在目前的大大批ARM利用中还是采用ARM + Thumb代码的稠浊形式。ARM code对应的CPU(ARM惩罚器)事情状况称为ARM State,Thumb对应的称之为Thumb State,这两种状况的差别重要通过CPSR[bit 5]区别。CPSR(方今途序状况寄存器)保留了惩罚器确当前事情状况,[bit 5]也被称为T bit。对待统统带有J象征的惩罚器核,譬喻ARM926EJ-S和ARM1136J-S,J(Jazelle)代外ARM核中集成了Jazelle技 术。CPSR[bit24]则被成为J bit,假如这位为1,则代外方今CPU事情正在Java State下而CPU的取指息争码都是直接操作Java操作数栈。当然要天生Jazelle支柱的字节码必要独特的Java编译器和JVM,凡是由第三方 平台软件厂商供给,譬喻日本的Aplix公司。正在ARM惩罚器的运转历程中,

  BX以及BLX可能告竣ARM State和Thumb State之间的切换(BXJ和BLXJ告竣ARM/Thumb State和Java State之间的切换)。但假如法式有一局部事情正在ARM事情状况下,一局部事情正在Thumb事情状况下,而这两段代码却有交互移用,则正在编译C/C++和汇编源文献时要 加上 -apcs /interwork选项。ARM公司的ADS(ARM Developer Suite,-apcs /interwork)和RealView的RVDS(RealView Developer Suite,--apcs /interwork) 都支柱如许的编译选项,他们会正在链接时主动检测函数之间的移用合联和事情状况供给粘合剂(Veneers)以便法式可能正在差别的事情状况下切换。

  -linux-gcc编译器个体版本不支柱这个选项,因此正在开垦ARM + Linux平台下利用的法式时该当防卫到这个题目。末了较量了arm-linux-gcc编译器下ARM(armv7-a)、Thumb-1、Thumb-2指令集以及armv5te、Cortex-A9与Cortex-A8的tune选项功用机能和代码密度。

  ARM指令集为32位指令集,指令所在务必对齐正在4字节界限,可能完成ARM架构下统统效用。大大批ARM数据惩罚指令采用的是3所在式样(除了64位乘法指令外),即两个源操作数和一个结果操作数。

  正在 ARM 中有两种格式可能完成法式的跳转,一种是利用跳转指令直接跳转,另一种则是直接向 PC 寄存器赋值完成跳转.

  统统卓殊都邑使微惩罚器返回到ARM形式状况,并正在ARM的编程形式中惩罚。因为ARM微惩罚器字传送所在务必可被4整除(即字瞄准),半字传送所在务必可被2整除(即半字瞄准)。而Thumb指令是2个字节长,而不是4个字节,因此,由Thumb实施状况进入卓殊时其自然偏移与ARM差别。

  对待ARM指令来说,统统的指令长度都是32位,而且实施周期众人为单周期,指令都是有条目实施的。每条Thumb指令有相像惩罚器模子所对应的32位ARM指令。而THUMB 指令的特色如下:

  Thumb指令集是对32位ARM指令集的扩充,它的对象是为了完成更高的代码密度。Thumb指令集完成的效用只是32位ARM指令集的子集,它仅仅把常用的ARM指令压缩成16位的指令编码格式。正在指令的实施阶段,16位的指令被从头解码,告竣对等的32位指令所完成的效用。与统统用ARM指令集的格式比拟,利用Thumb指令可能正在代码密度方面革新大约30%。然则,这种校正是以代码的功用为价钱的。尽量每个Thumb指令都有相对应的ARM指令,然则,相像的效用必要更众的Thumb指令智力告竣。是以,当指令预取必要的时候没有区别时,ARM指令相对Thumb指令具有更好的机能。与ARM指令集比拟较,Thumb指令会集的数据惩罚指令的操作数还是是32位,指令所在也为32位,但Thumb指令集为完成16位的指令长度,舍弃了ARM指令集的少少特色,若利用32位的存储器,ARM代码比Thumb代码速约40%,若利用16位的存储器,Thumb代码比ARM代码速约40%~50%.明白,ARM指令集和Thumb指令集各有其甜头,若对编制的机能有较高请求,应利用32位的存储编制和ARM指令集,若对编制的本钱及功耗有较高请求,则应利用16位的存储编制和Thumb指令集。当然,若两者连合利用,充盈施展其各自的甜头,会赢得更好的效率。

  正在编写Thumb指令时,先要利用伪指令CODE16声明,编写ARM指令时,则可利用CODE32伪指令声明。Thumb 指令集没有协惩罚器指令,信号量指令以及访谒 CPSR 或 SPSR 的指令,没有乘加指令及 64 位乘法指令等,且指令的第二操作数受到局限;大大批 Thumb 数据惩罚指令采用2所在式样.Thumb指令集与 ARM 指令的区别凡是有如下几点:

  法式相对改变,出格是条目跳转与 ARM 代码下的跳转比拟,正在限度上有更众的局限,转向子法式是无条目的改变.

  数据惩罚指令是对通用寄存器实行操作,正在大大批环境下,操作的结果须放入此中一个操作数寄存器中,而不是第 3 个寄存器中.数据惩罚操作比 ARM 状况的更少,访谒寄存器 R8~R15 受到必然局限.除 MOV 和 ADD 指令访谒器 R8~R15 外,其它数据惩罚指令老是更新 CPSR 中的 ALU 状况象征.访谒寄存器 R8~R15 的 Thumb 数据惩罚指令不行更新 CPSR 中的 ALU 状况象征.

  正在 Thumb 状况下,单寄存器加载和存储指令只可访谒寄存器 R0~R7

  LDM 和 STM 指令可能将任何限度为 R0~R7 的寄存器子集加载或存储. PUSH 和 POP 指令利用货仓指令 R13 动作基址完成满递减货仓.除 R0~R7 外,PUSH 指令还可能存储链接寄存器 R14,而且 POP 指令可能加载法式指令PC

  THUMB-2指令集是先容ARM CPU中的THUMB的扩展,新指令对机能和代码密度的校正,从而供给低功耗,高机能的最优计划,更好的均衡代码机能和编制本钱,Thumb-2是羼杂的16-bit和32-bit指令式样,其16位指令正在运转时被转换为32-bit指令实施。Thumb-2指令集正在Thumb指令的底子上做了如下的扩充:增添了少少新的16位Thumb指令来悔改程序的实施流程,增添了少少新的32位Thumb指令以完成少少ARM指令的专有效用32位的ARM 指令也获得了扩充,增添了少少新的指令来革新代码机能和数据惩罚的功用给Thumb指令集增添32位指令就管理了之前Thumb指令集不行访谒协惩罚器、特权指令和独特效用指令的局部。新的Thumb指令集现正在可能完成统统的效用,如许就不必要正在ARM/Thumb状况之间再三切换了,代码密度和机能获得明显的提升。Thumb-2的崭露使开垦者只利用一套指令集就享有高机能、高代码密度,不再必要正在差别指令之间再三切换了。开垦者只必要合切对全部机能影响最大的那局部代码,其他的局部可能利用缺省的编译摆设就可能了。

  代码密度比现有的Thumb指令集更高:代码巨细均匀下降5%;代码速率均匀提升2-3%

  为了提升惩罚压缩数据构造的功用,新的ARM架构为Thumb-2指令集和ARM指令集增添了少少新的指令来完成比特位的插入和抽取。为了增添惩罚常数的活络性,新架构中为Thumb-2指令集和ARM指令集增添了两条新的指令。MOVW可能把一个16-bit常数加载到寄存器中,并用0填充高比特位;另一条指令MOVT可能把一个16-bit常数加载到寄存器高16比特中。这两条指令组合利用就可能把一个32-bit常数加载到寄存器中。大凡正在访谒外设寄存器之前会把外设的基址加载到寄存器中,这时就会必要把32-bit常数加载到寄存器中。正在之前的架构中必要通过literal pools来告竣如许的操作,对32位常量的访谒凡是通过PC相对寻址来完成。Literal pools可能保留常量并简化访谒这些常量的代码,然则,正在Harvard架构的惩罚器中会惹起特殊的开销。这些开销来自于必要特殊的时钟周期来使数据端 口可能对指令流实行访谒;这种访谒能够是必要把指令流加载的数据缓存中,或者从数据端口直接访谒指令存储器。将32位常量分成16比特的两个局部保留正在两条指令中,意味着数据直接正在指令流中,不再必要通过数据端口来访谒了。相对待literal pool格式,这种管理步骤可能清扫通过数据端口访谒指令流的特殊开销,进而提升机能,下降功耗。

  正在基于ARM 惩罚器的嵌入式开垦中,为了巩固编制的活络性以及提升编制的全部机能时常必要利用16 位的Thumb 指令,因此必要正在ARM 和Thumb 状况之间来切换(Interworking)微惩罚器状况。只消遵命ATPCS移用法例,Thumb子法式和ARM子法式就可能相互移用。起初先容切换(Interwoking)的根基观点及切换时的子函数移用。

  ARM惩罚器老是从ARM状况首先实施。于是,假如要正在调试器中运转Thumb法式,务必为该Thumb法式增加一个ARM法式头,然后再切换到Thumb状况,移用该Thumb法式。

  此中Rn可能是寄存器R0R15中的随便一个。指令可能通过将寄存器Rn的实质拷贝到法式计数器PC来告竣正在4Gbyte所在空间中的绝对跳转,而状况切换是由寄存器Rn的最低位来指定的,假如操作数寄存器的状况位Bit0=0,则进入ARM状况,假如Bit0=1,则进入Thumb状况。正在非Interworking函数移用中,移用函数利用BL(Branch with Link)指令,即将返回所在保留正在相联寄存器LR中,同时跳转到被移用的子函数法式入口。从子函数返回时实施指令 MOV PC, LR(当然也能够是其他体式的指令,如出栈指令)将LR值直接放入PC中,从而返回到移用函数中的下一条指令的所在,然后接续实施法式。正在Interworking函数的移用中,必要正在编译时对此函数所正在的源法式指定编译开合选项:-apcs / interwork ,即确保法式遵从ARM/Thumb法式羼杂利用的ATPCS法例。凡是来说,这时天生的对象代码会增添2%旁边。如许正在编译器(compiler)惩罚这个函数时就会用BX 指令庖代MOV PC,LR指令,况且相联器(linker)会主动的形成一小段代码(veneers)来蜕化惩罚器状况(ARM/Thumb),对待C/C++法式来说,当编译时假如增添 apcs/interwork 选项,那即是告诉相联器主动增添一小段代码(veneer)来完成函数移用时ARM/Thumb的状况切换。然则对待利用C法式中的Interwork选项,必要防卫的是:

  假如本代码是移用函数,那就只必要用BL指令来完成子函数的移用即可,也即是平常的惩罚。当然,用户也可能本人来编写这些状况切换法式,如许实施代码的功用会更高些。对待C/C++法式和汇编法式的互相移用同样必要遵从以上的法例。别的,正在本质利用中,假如要正在ARM/Thumb状况间来切换法式,最好的步骤是统统的函数正在编译时都增添 -apcs/interwork选项。合于汇编代码,也可正在法式中利用CODE32或CODE16夂箢明晰见知汇编法式下面的代码是ARM代码仍是Thumb代码,如许正在汇编时则无需利用-32、-16选项;当然也可正在单个汇编原文献中羼杂利用ARM以及Thumb代码,这是必要利用CODE32以及CODE16夂箢,而且必要防卫状况的切换,利用BX Rn,凭据Rn的Bit[0]来确定对象是ARM代码仍是Thumb代码。如AREA Init,CODE,READONLY CODE32;告诉编译器其后的指令为32位的ARM指令。

  前面所提到的实质是针对ARM微惩罚器内核为V4T架构时的切换环境,而对待V5TE架构的ARM内核,除了所有支柱V4T架构的代码(具有veneers)外,代码正在相联时不再增添veneers,而是利用新的指令BLX(Branch and Link with Exchang)来实近况况切换。这条指令告竣告竣的工作是:正在跳转时将返回的指令所在保留正在LR寄存器中,同时将PC中的最低位的值拷贝到CPSR寄存器中的T位,从而蜕化惩罚器状况(Exchange)。凡是来说,对待移用函数利用BLX指令即可,被移用函数则与V4T架构相像,也是利用BX指令来返回。

  前面提到Thumb代码所需的存储空间约为ARM代码的60%~70%;Thumb代码利用的指令数比ARM代码少约30%~40%;若利用32位的存储器,ARM代码比Thumb代码速约40%;若利用16位的存储器,Thumb代码比ARM代码速约40%~50%;与ARM代码比拟,利用Thumb代码,存储器的过耗会低浸约30%。下面是arm-linux-gcc编译器采用差别的编译拔取对armv7-a,、thumb-2 和thumb-1指令集编译CoreMark的测试结果,结果如下:

  32位RISC芯片ARM 体例构造支柱两种指令集:32位的ARM指令集实施功用高,对ARM体例架构统统效用的完好支柱;16位的Thumb指令集是ARM指令集的子集并以优秀的代码密度著称。假如扔开预取指令时候不计,ARM指令相对Thumb指令将有更好的运转机能(预取指令时必要凭据指令所在偏移量来取指, ARM支柱更大的所在偏移量而较量耗时)。近来ARM公司推出的的Thumb-2/Thumb2指令集据称是上述两种特色的归纳,是ARM指令集的机能和Thumb指令集的代码密度的折中。号称抵达98%的ARM机能而又能下降代码密度达30%。正在目前的大大批ARM利用中还是采用ARM + Thumb代码的稠浊形式。ARM code对应的CPU(ARM惩罚器)事情状况称为ARM State,Thumb对应的称之为Thumb State,这两种状况的差别重要通过CPSR[bit 5]区别。CPSR(方今途序状况寄存器)保留了惩罚器确当前事情状况,[bit 5]也被称为T bit。对待统统带有J象征的惩罚器核,譬喻ARM926EJ-S和ARM1136J-S,J(Jazelle)代外ARM核中集成了Jazelle技 术。CPSR[bit24]则被成为J bit,假如这位为1,则代外方今CPU事情正在Java State下而CPU的取指息争码都是直接操作Java操作数栈。当然要天生Jazelle支柱的字节码必要独特的Java编译器和JVM,凡是由第三方 平台软件厂商供给,譬喻日本的Aplix公司。正在ARM惩罚器的运转历程中,汇编指令BX以及BLX可能告竣ARM State和Thumb State之间的切换(BXJ和BLXJ告竣ARM/Thumb State和Java State之间的切换)。但假如法式有一局部事情正在ARM事情状况下,一局部事情正在Thumb事情状况下,而这两段代码却有交互移用,则正在编译C/C++和汇编源文献时要 加上 -apcs /interwork选项。ARM公司的ADS(ARM Developer Suite,-apcs /interwork)和RealView的RVDS(RealView Developer Suite,--apcs /interwork) 都支柱如许的编译选项,他们会正在链接时主动检测函数之间的移用合联和事情状况供给粘合剂(Veneers)以便法式可能正在差别的事情状况下切换。arm-linux-gcc编译器个体版本不支柱这个选项,因此正在开垦ARM + Linux平台下利用的法式时该当防卫到这个题目。末了较量了arm-linux-gcc编译器下ARM(armv7-a)、Thumb-1、Thumb-2指令集以及armv5te、Cortex-A9与Cortex-A8的tune选项功用机能和代码密度。

返回顶部