四、Thumb指令
- 格式:pdf
- 大小:278.75 KB
- 文档页数:37
3.4 Thumb指令集Thumb指令集可以看做ARM指令集的一个子集,其用于支持存储系统数据总线为16位的应用系统。
Thumb指令长度为16位,这样,与32位的ARM指令集相比,有效地节省了系统的存储空间。
但Thumb指令集中的数据处理指令的操作数仍然是32位的,指令寻址地址也是32位的。
在实际应用中,若对系统的性能有较高要求,则选arm指令集和32位的memory;若对系统的功耗有较高要求时,则选Thumb指令集和16位的memory;一般将两者混合使用,根据系统不同部分的不同需求,选用合适的指令,发挥两者的优势。
Thumb指令集由数据处理指令、跳转指令、Load/Store指令和软件中断指令4大类构成。
数据处理指令格式功能MOV Rd,imm_8; Rd=imm_8;Rd为R0~R7,imm_8为8位立即数MOV Rd,Rn; Rd=Rn;Rd、Rn为R0~R15MVN Rd,Rn; Rd=~Rn;Rd、Rn为R0~R7NEG Rd,Rn; Rd=-Rn;Rd、Rn为R0~R7ADD Rd,Rn,imm; Rd=Rn+imm;Rd为R0~R7,Rn为R0~R7或PC或SP;Rn为PC或SP时,imm为10位立即数;否则,imm为3位立即数ADD Rd,Rn,Rm; Rd=Rn+Rm;Rd、Rn、Rm为R0~R7ADD Rd,imm; Rd=Rd+imm;Rd为R0~R7或SPRd为SP时,imm为-508~+508间的4整数倍的数否则,imm为8位立即数ADD Rd,Rn; Rd=Rd+Rn;Rd、Rn为R0~R15ADC Rd,Rn; Rd=Rd+Rn+carry;Rd、Rn为R0~R7,carry为进位标志值SUB Rd,Rn,imm_3; Rd=Rn-imm_3;Rd、Rn为R0~R7,imm_3为3位立即数SUB Rd,Rn,Rm; Rd=Rn-Rm;Rd、Rn、Rm为R0~R7,SUB Rd,imm; Rd=Rd-imm;Rd为R0~R7或SPRd为SP时,imm为-508~+508间的4整数倍的数否则,imm为8位立即数SBC Rd,Rn; Rd=Rd-Rn-!carry;Rd、Rn为R0~R7,carry为进位标志值MUL Rd,Rn; Rd=Rd×Rn;Rd、Rn为R0~R7AND Rd,Rn; Rd=Rd&Rn;Rd、Rn为R0~R7ORR Rd,Rn; Rd=Rd|Rn;Rd、Rn为R0~R7EOR Rd,Rn; Rd=Rd^Rn;Rd、Rn为R0~R7BIC Rd,Rn; Rd=Rd&(~Rn);Rd、Rn为R0~R7ASR Rd,Rn; Rd=Rd算术右移Rn位;Rd、Rn为R0~R7ASR Rd,Rn,imm_5; Rd=Rn算术右移imm_5位;Rd、Rn为R0~R7,imm_5为1~32间的数值LSL Rd,Rn; Rd=Rd逻辑左移Rn位;Rd、Rn为R0~R7 LSL Rd,Rn,imm_5; Rd=Rn逻辑左移imm_5位;Rd、Rn为R0~R7 LSR Rd,Rn; Rd=Rd逻辑右移Rn位;Rd、Rn为R0~R7 LSR Rd,Rn,imm_5; Rd=Rn逻辑右移imm_5位;Rd、Rn为R0~R7 ROR Rd,Rn; Rd=Rd循环右移Rn位;Rd、Rn为R0~R7CMP Rn,Rm; 根据Rn-Rm的值,修改CPSR的状态标志位;Rn、Rm为R0~R7CMP Rn,imm_8; 根据Rn-imm_8的值,修改CPSR的状态标志位;Rn为R0~R7CMN Rn,Rm; 根据Rn+Rm的值,修改CPSR的状态标志位;Rn、Rm为R0~R7TST Rn,Rm; 根据Rn&Rm的值,修改CPSR的状态标志位;Rn、Rm为R0~R7跳转指令格式功能B{cond} label PC=label;若有cond,则label必须在当前指令的-256~+256字节范围内;否则,label必须在当前指令的-2KB~+2KB范围内BL label R14=PC+4,PC=label;label必须在当前指令的-4MB~+4MB范围内BX Rn PC=Rn,且切换处理器状态Load/Store指令格式功能LDR Rd,[Rn,imm]; Rd=地址(Rn+imm)中的字数据;Rd为R0~R7,Rn为R0~R7或SP 或PC;若Rn为PC或SP,imm为5位立即数,否则imm为8位立即数LDR Rd,[Rn,Rm]; Rd=地址(Rn+Rm)中的字数据;Rd、Rn、Rm为R0~R7LDRH Rd,[Rn,imm_5]; Rd=地址(Rn+imm_5)中的无符号半字数据;Rd、Rn为R0~R7,imm_5为5位立即数LDRH Rd,[Rn,Rm]; Rd=地址(Rn+Rm)中的无符号半字数据;Rd,Rn,Rm为R0~R7 LDRB Rd,[Rn,imm_5]; Rd=地址(Rn+imm_5)中的无符号字节数据;Rd、Rn为R0~R7 LDRB Rd,[Rn,Rm]; Rd=地址(Rn+Rm)中的无符号字节数据;Rd,Rn,Rm为R0~R7 LDRSH Rd,[Rn,Rm]; Rd=地址(Rn+Rm)中的有符号半字数据;Rd,Rn,Rm为R0~R7 LDRSB Rd,[Rn,Rm]; Rd=地址(Rn+Rm)中的有符号字节数据;Rd,Rn,Rm为R0~R7 LDR Rd,label; Rd=地址(label)中的字数据;Rd为R0~R7STR Rd,[Rn,imm]; 地址(Rn+imm)处的字数据=Rd;Rd为R0~R7,Rn为R0~R7或SP 或PC;若Rn为PC或SP,imm为5位立即数,否则imm为8位立即数软件中断指令格式功能SWI 8位立即数8位立即数为中断号。
实践-Thumb指令实践指导实践指导1:ARM与Thumb的混合编程1.实验⽬的●使⽤Thumb汇编语⾔,体会ARM与Thumb的区别。
●使⽤伪指令,加深对伪操作的理解。
2.实验设备●硬件:PC机。
●软件:ADS集成开发环境,Windows2000/XP/2003。
3.实验原理ARM与Thumb的混合编程所有的ARM指令都是可以条件执⾏的,⽽Thumb指令仅有⼀条指令(B指令)具备条件执⾏功能。
所以很多应⽤程序需要两者的混合编程,因此存在ARM与Thumb状态之间相互切换,⽽且相互之间的状态切换的开销⼏乎为零。
由于ARM处理器总是从ARM状态开始执⾏,故Thumb指令的执⾏必须由ARM状态转向Thumb状态,通常BX指令完成。
另外在Thumb指令前必须有CODE16伪指令指⽰汇编器以下指令为Thumb指令。
4.实验内容下⾯是⼀段直接进⾏状态切换的代码。
AREA AddReg,CODE,READONL YENTRYCODE32;程序从ARM状态开始ADR R0,ThumbProg+1;跳转到ThumbProg。
这⾥为什么要加1呢?因为BX指令;跳转到指定的地址执⾏程序时,若(BX{cond}Rm)Rm;的位[0]为1,则跳转时⾃动将CPSR中的标志T置位即把;⽬标代码解释为Thunb代码。
BX R0;程序切换到Thumb状态CODE16;CODE16指⽰编译器后⾯为Thumb指令ThumbProg MOV R2,#2MOV R3,#3ADD R2,R2,R3ADR R0,ARMProgBX R0;跳转到ARMProg,程序切换到ARM状态CODE32;CODE32指⽰编译器后⾯为ARM指令ARMProg MOV R4,#4MOV R5,#5ADD R4,R4,R5Stop MOV R0,#0x18;软中断参数设置LDR R1,=0x20026;软中断参数设置SWI0x123456;将CPU的控制权交给调试器END5.操作步骤Step1建⽴⼯程⽂件,输⼊程序代码。
Thumb 指令集之:Thumb 编程模型
11.2Thumb编程模型所有的Thumb指令都是16位的。
它们都是ARM指
令重新编码得到的,所以继承了ARM指令集的许多特点。
①有数据处理、数据传送和流控制的指令结构。
②支持8位字节、16位半字和32位字数据类型,半字以两字节边界对齐,
字以4字节边界对齐。
③32位的无分段存储器(unsegmentedmemory)。
Thumb指令集除了继承了ARM指令集的一些特点外,与ARM指令集存在
以下一些差异。
①大多数Thumb指令为无条件执行指令(所有ARM指令都是条件执行的)。
②许多Thumb数据处理指令采用了2地址格式(目的寄存器与源寄存器相同)。
而ARM指令中除64位乘法指令外,其余指令均采用3地址模式。
③Thumb指令格式减少了很多ARM指令格式的限制,使Thumb指令编写的代码密度大大提高。
无论处理器处于什么状态,所有的异常都使处理器返回到ARM状态,并完
成异常处理。
但异常发生时,CPSR状态寄存器在进入异常时被保存到相应的SPSR中,当异常处理结束后,处理器将恢复到异常发生前的状态,并按照发
生异常时处理器的状态继续执行ARM或Thumb指令。
应该注意的是,ARM异常返回指令需要根据ARM流水线的行为对返回地址
进行调整。
由于Thumb指令是2字节长,而ARM指令是4字节长,所以由Thumb执行状态进入异常时其自然偏移量应与ARM不同(ARM状态下,拷
贝到链接寄存器的值PC-4)。
为了减少编程的复杂性,ARM体系结构中设置。
thumb指令集乘法指令在计算机体系结构中,thumb指令集是一种精简指令集(RISC)指令集体系结构,由ARM Holdings开发。
Thumb指令集的主要目标是提供更高的代码密度和较低的功耗,使得Thumb指令集在嵌入式系统和移动设备中得到广泛应用。
Thumb指令集中包含了一系列乘法指令,这些指令可以对寄存器中的值进行乘法操作,并将结果存储在其他寄存器中。
下面是一些常见的Thumb指令集中的乘法指令:1. MUL(Multiply)指令:MUL指令用于执行两个32位的有符号整数的乘法操作。
它的语法如下:```MUL Rd, Rm, Rs```其中Rd是目标寄存器,Rm和Rs是源寄存器。
该指令将寄存器Rm和Rs中的值相乘,并将结果存储在目标寄存器Rd中。
2. MLA(Multiply Accumulate)指令:MLA指令用于执行两个32位的有符号整数的乘法操作,并将结果与第三个寄存器中的值相加。
它的语法如下:```MLA Rd, Rm, Rs, Rt```其中Rd是目标寄存器,Rm和Rs是源寄存器,Rt是要与乘法结果相加的寄存器。
该指令将寄存器Rm和Rs中的值相乘,并将结果与寄存器Rt中的值相加,最后将结果存储在目标寄存器Rd中。
3. UMULL(Unsigned Multiply Long)指令:UMULL指令用于执行两个32位的无符号整数的乘法操作,并产生64位的结果。
该指令的语法如下:```UMULL RdLo, RdHi, Rm, Rs```其中RdLo和RdHi是目标寄存器,Rm和Rs是源寄存器。
该指令将寄存器Rm和Rs中的值相乘,并将结果的低32位存储在目标寄存器RdLo中,高32位存储在目标寄存器RdHi中。
这些乘法指令可以在Thumb指令集的上下文中使用,与其他指令结合使用,以执行复杂的计算操作。
由于Thumb指令集的特点是代码密度高,因此在嵌入式系统和移动设备的应用中,乘法指令的优化和性能对于提高系统性能和功耗效率非常重要。
4.2 Thumb指令集Thumb指令集可以看作ARM指令压缩形式的一个子集,用于支持存储系统数据总线为16位的应用系统。
Thumb指令长度为16位,与等价的32位代码相比较,Thumb指令集在保留32位代码优势的同时,有效地节省了系统的存储空间。
但Thumb指令集中的数据处理指令操作数仍然是32位的,指令寻址地址也是32位的。
Thumb指令集可分为以下5类:●数据处理指令;●存储器访问指令;●跳转指令;●软件中断指令;●伪指令。
4.2.1 Thumb指令集与ARM指令集的区别Thumb指令体系不完整,只支持通用功能。
必要时仍需要使用ARM指令,如进入异常时。
所有的Thumb指令都有对应的ARM指令,Thumb编程模型也对应于ARM编程模型。
在应用程序的编写过程中,只要遵循一定的调用规则,Thumb子程序和ARM子程序就可以互相调用。
当处理器在执行ARM程序段时,称ARM处理器处于ARM工作状态,当处理器在执行Thumb程序段时,称ARM处理器处于Thumb工作状态。
Thumb指令集较ARM指令集有如下限制:●只有B指令可以条件执行,其他指令都不能条件执行;●分支指令的跳转范围有更多限制;●数据处理指令的操作结果必须放入其中一个;●单寄存器访问指令,只能操作R0~R7;●LDM和STM指令可以对R0~R7的任何子集进行操作;4.2.2 Thumb数据处理指令Thumb数据处理指令涵盖了编译器需要的大多数操作。
大部分的Thumb数据处理指令采用2地址格式,不能在单指令中同时完成一个操作数的移位及一个ALU操作。
数据处理操作比ARM状态的更少,并且访问寄存器R8~R15受到限制。
数据处理指令分为数据传送指令和算术逻辑运算指令两类。
数据传送指令如表4-1所示。
表4-1 数据传送指令助记符操作影响标志MOV Rd, #expr Rd←expr,Rd为R0~R7 影响N、ZMOV Rd, Rm Rd←Rm,Rd、Rm均可为R0~R15 Rd和Rm均为R0~R7时,影响N、Z,清零C、V MVN Rd, Rm Rd←(~Rm),Rd、Rm均为R0~R7影响N、ZNEG Rd, Rm Rd←(-Rm),Rd、Rm均为R0~R7影响N、Z、C、V89。
第4章Thumb 指令集●Thumb 寄存器的使用●ARM-Thumb 交互●其它分支指令●数据处理指令●单寄存器load-store指令●多寄存器load-store 指令●堆栈指令●软件中断指令●总结本章介绍Thumb指令集。
Thumb把32位ARM指令集的一个子集进行编码,成为一个16位的指令集。
在16位外部数据总线宽度下,在ARM处理器上使用Thumb指令的性能要比使用ARM指令的性能更好;而在32位外部数据总线宽度下,使用Thumb指令的性能要比使用ARM指令的性能差。
因此,Thumb指令多用于存储器受限的一些系统中。
相对于ARM指令集,使用Thumb指令集可获得更高的代码密度—一个可执行的程序在内存中所占的空间。
在存储器受限的嵌人式系统中,比如移动电话、PDA等,代码密度是非常重要的;同时,成本压力也会限制存储器的大小、数据宽度和速度。
平均而言,对于同一个程序,使用Thumb指令实现所需的存储空间,要比等效的ARM 指令实现少30%左右,图4. 1显示了对于实现同样的除法运算,使用ARM指令和使用Thumb 指令的汇编代码。
虽然Thumb指令的实现使用了更多的指令,但是它所占的总的存储空间却比较小。
代码密度是Thumb指令集的一个主要优势。
由于Thumb指令集的设计是面向编译器的,而不是针对手写汇编的,所以推荐使用高级语言如C或者C++语言来编程,然后用编译器生成Thumb指令的目标代码。
图4.1 代码密度每一条Thump指令都和一条32位的ARM指令相关。
图4. 2显示了一条Thumb加法指令ADD译码成等效的ARM加法指令,表4. 1给出了在ARMv5TE架构,F的THUMBv2中所有的Thumb指令。
在ThumbISA 中,只有分支指令可被条件执行;同时由于16位空间的限制,桶形移位操作如ASR,LSL,LSR 和RQR,也变成单独的指令。
表4.1 Thumb指令集续表 4.14.1 Thumb 寄存器的使用在Thumb状态下,不能直接访问所有的寄存器,只有寄存器r0~r7是可以被任意访问的,如表4.2所列。
thumb指令集thumb指令集分为:分支指令、数据传送指令、单寄存器加载和存储指令以及多寄存器加载和存储指令。
thumb指令集没有协处理器指令、信号量(semaphore)指令以及访问cpsr或spsr的指令。
1. 存储器访问指令(1)dr和str--立即数偏移加载寄存器和存储寄存器。
存储器的地址以一个寄存器的立即数偏移(immediate offset)指明。
指令格式: op rd, n,#immed_5×4] oph rd, n,#immed_5×2] opb rd, n,#immed_5×1] 其中: op:为dr或str。
h:指明无符号半字传送的参数。
b:指明无符号字节传送的参数。
rd:加载和存储寄存器。
rd 必须在r0~r7范围内。
rn:基址寄存器。
rn 必须在r0~r7范围内。
immed_5×n:偏移量。
它是一个表达式,其取值(在汇编时)是n的倍数,在(0~31)*n范围内,n=4、2、1。
str:用于存储一个字、半字或字节到存储器中。
dr:用于从存储器加载一个字、半字或字节。
rn:rn中的基址加上偏移形成操作数的地址。
立即数偏移的半字和字节加载是无符号的。
数据加载到rd的最低有效字或字节,rd 的其余位补0。
字传送的地址必须可被4整除,半字传送的地址必须可被2整除。
指令示例:dr r3,5,#0] strb r0,3,#31] strh r7,3,#16] drb r2,4,#1abe-{pc}](2)dr和str--寄存器偏移加载寄存器和存储寄存器。
用一个寄存器的基于寄存器偏移指明存储器地址。
指令格式: op rd,n,rm] 其中,op 是下列情况之一: dr:加载寄存器,4字节字。
str:存储寄存器,4字节字。
drh:加载寄存器,2字节无符号半字。
drsh:加载寄存器,2字节带符号半字。
strh:存储寄存器,2字节半字。
drb:加载寄存器,无符号字节。