第四章 Thumb 指令集
- 格式:ppt
- 大小:577.50 KB
- 文档页数:26
© MY2410 版权所有 未经许可 不得传播详情请咨询:xuphone@ mikenoodle@THUMB 指令集THUMB 指令集格式THUMB 指令集是ARM 指令集(32位格式)的一个16位版本。
ARM 指令集减少到16位的THUMB 指令集,同时也减少了许多指令功能。
THUMB 指令可以通过嵌在ARM920T 内核里的decompressor 来转换成为ARM 指令。
作为ARM 指令的压缩形式,THUMB 指令只有16位,同时收到一些限制。
当用到THUMB 指令时,这些16位指令限制会体现出来。
格式概要THUMB 指令集格式如下图:操作码概述下表示THUMB指令集的一个概要。
您可以通过查看表中最右栏的章节来得到更多相关信息。
© MY2410 版权所有未经许可不得传播详情请咨询:xuphone@ mikenoodle@© MY2410 版权所有 未经许可 不得传播详情请咨询:xuphone@ mikenoodle@格式1:move shifted 寄存器15 14 13 12 11 10 6 5 3 2 00 0 0 Op Offset5 RsRd [2:0]目标寄存器 [5:3]源寄存器 [10:6]立即数 [12:11]操作码 0=LSL 1=LSR 2=ASR 操作这些指令可以在低位寄存器之间传送移位值。
THUMB 汇编语法如下表:注:这些指令全都设置CPSR 的条件码的条件码。
指令周期这种格式的所有THUMB 指令都有等价的ARM 指令(如上表)。
这些THUMB 指令的指令周期和其相应等价的ARM 指令的指令周期是一样的。
例如: LSR R2,R5,#27 ;把R5内容逻辑右移27位并且存储到R2中。
在结果中设置条件码。
格式2:加法/减法15 14 13 12 11 10 9 8 6 5 3 2 00 0 0 1 1 1 Op Rn/Offset3 Rs Rd [2:0]目标寄存器 [5:3]源寄存器 [8:6]寄存器/立即数 [9]操作码 0=ADD 1=SUB [10]立即数标志 0=寄存器操作数 1=立即数操作数 操作这条指令可以让地位寄存器值或者一个三位立即数加到一个低位寄存器或者从一个id 为寄存器中减去。
ARM Thumb 指令集Thumb 指令可以看作是ARM 指令压缩形式的子集,是针对代码密度的问题而提出的,它具有16 位的代码密度。
Thumb 不是一个完整的体系结构,不能指望处理只执行Thumb 指令而不支持ARM 指令集。
因此,Thumb 指令只需要支持通用功能,必要时可以借助于完善的ARM 指令集,比如,所有异常自动进入ARM 状态。
在编写Thumb 指令时,先要使用伪指令CODE16 声明,而且在ARM 指令中要使用BX指令跳转到Thumb 指令,以切换处理器状态。
编写ARM 指令时,则可使用伪指令CODE32声明。
1 Thumb 指令集与ARM 指令集的区别Thumb 指令集没有协处理器指令,信号量指令以及访问CPSR 或SPSR 的指令,没有乘加指令及64 位乘法指令等,且指令的第二操作数受到限制;除了跳转指令 B 有条件执行功能外,其它指令均为无条件执行;大多数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 作为基址实现满递减堆栈。
第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:加载寄存器,无符号字节。