第四章 Thumb 指令集
第四章(3) ARM及Thumb指令集(练习)
MOV LDR
loop LDR SUBS SMLABB SMLATT BGT stop B
r4, #0 r0, =x
r1, [r0], #4 r2, r2, #1 r4, r1, r1, r4 r4, r1, r1, r4 loop
6)改用 LDR,一次 加载两个数据。
stop
AREA dspdata, DATA x DCW DCW DCW ... END
地址增加
r0 指向队列头 ADR r0,myarray
使用命令 LDR r1,[r0],#4来装载 累加至 r4 循环,直到r1为0 用死循环来停止
TM
6
6
Test 2 – Solution
AREA total, CODE ENTRY MOV ADR loop LDR ADD CMP BNE stop B array DCD DCD DCD END
练习:求 2109和4161的 GCD
57 (0x39)
TM
5
5
Test 2 - Total of array
写一段 ARM汇编程序:循环累加队列中的所有元素,直到碰上零值元素,结 果放在r4.
源程序末尾处声明队列:
myarray DCD 0x11 DCD 0x22 DCD 0
0 0x22 r0 0x11
使用 LDRH 来装载数值。 使用SMLABB来求平方和。
3) 是否存在interlocks? 4) 在AXD中检查Q标志, (修改cpsr 为 E-PSR) 5) 循环末尾增加一个 BL来调用qtest,并检测返回值。 6)高手可尝试:改用 LDR,一次 加载两个数据。 7)高手可尝试: 修改代码,使用一个64-bit累加器。
Thumb 指令集
❖ expr3 :表达式,为取值在-7~+7范围内的整数。(3位立即数)
❖ expr8 :表达式,为取值在-255~+255范围内的整数。(8位立 即数)
(2)ADD—高或低寄存器 将寄存器中的值相加,结果送回第一操作数寄存器。 指令格式:
ADD Rd,Rm 其中: ❖ Rd :目的寄存器,也是第一操作数寄存器。 ❖ Rm :第二操作数寄存器。 (3)ADD和SUB—SP SP加上或减去立即数常量。 指令格式:
CMP Rn, #expr
CMP Rn, Rm
CMN Rn, Rm
其中:
❖ Rn :第一操作数寄存器。 ❖ expr :表达式,其值(在汇编时)为在0~255范围内的整数 ❖ Rm :第二操作数寄存器。 (9)传送、传送非和取负(MOV、MVN和NEG) 指令格式:
MOV Rd, # expr
MOV Rd, Rm
(4)PUSH和POP 低寄存器和可选的LR进栈以及低寄存器和可选的PC出栈。 指令格式:
PUSH{reglist} POP{reglist} PUSH{reglist, LR} POP{reglist,PC} 其中:reglist:低寄存器的全部或其子集。 (5)LDMIA和STMIA 加载和存储多个寄存器。 指令格式:
❖ Thumb指令集合没有包含进行异常处理时需要的一些指令, 因此,在异常中断时还是需要使用ARM指令。
Thumb 寄存器和ARM寄存器之间的关系
1.Thumb 状态寄存器集是ARM状态寄存器的子集 程序员可以直接访问8个通用寄存器R0~R7、PC、 堆栈指针SP、链接寄存器LR和CPSR。 每个特权模式都有分组的SP 、LR和 SPSR。
Thumb 指令分类介绍
THUMB指令集
© 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 为寄存器中减去。
04第四章 Thumb 指令集
R0 R1 R2 R3 R4 R5 R6 R7
AR M 状态
R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R10 R11 R11 R12 R12
低寄存器
高寄存器
堆栈指针(SP) 连接寄存器(LR) 程序计数器(PC) 当前程序状态寄存器 (C P SR ) 被保存程序状态寄存器 ( SP SR )
4.2.1 数据处理指令
按照数据处理指令的功能,可以将其分为以下几类: 算术运算指令, 移位和循环移位操作(ASR,LSL,LSR和ROR) 比较指令(CMP和CMN) 传送和取负指令(MOV,MVN和NEG) 测试指令(TST)
4.2.2 Thumb转移指令
助记符 说明 操作
条件码位 置 B{cond}
堆栈指针(R13) 堆栈指针 (R13) 连接寄存器(R14) 连接寄存器 (R14) 程序计数器(R15) 程序计数器 (R15) 当前程序状态寄存器 (C P SR ) 被保存程序状态寄存器 (SP SR )
4.2 Thumb指令集详细介绍
16位Thumb指令集是从32位ARM指令集提取指令格 式的,每条Thumb指令有相同处理器模型所对应的32 位ARM指令。 4.2.1 数据处理指令; 4.2.2 转移指令; 4.2.3 Load/Store指令; 4.2.4异常中断指令。
<op> = LDR| STR
;
多寄存器数据存取指令
汇编格式如下:
LDMIA STMIA POP PUSH Rn!,{<reg list>} Rn!,{<reg list>} {<reg list>{,PC}} {<reg list>{,LR}} Reg :R0~R7
ARM Thumb 指令集
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 作为基址实现满递减堆栈。
thumb指令系统
该指令中,Rd,Rm可以是R0-R15中任何一 个;若Rd和Rm是低寄存器,则更新条件标志码 标志N、Z、C和V。
③SP操作的ADD或SUB指令格式如下: op SP, #expr 其中,SP目标寄存器;也是第一个操作寄存器; #expr立即数,在-508-+508之间的4的整数倍的数 条件码标志:不影响条件码标志。
15
跳转指令
格 式 功 能
PC=label; 若有cond,则label必须在当前指令的-256~ +256字节范围内; 否则,label必须在当前指令的-2K~+2K字节 label 2K 2K 范围内
B{cond} label
BL label
R14=PC+4,PC=label; label必须在当前指令的-4M~+4M字 节范围内 PC=Rn,且切换处理器状态
数据处理指令是对通用寄存器进行操作。在大 多数情况下,操作的结果须放入其中一个操作 数寄存器中,而不是第3个寄存器中。 数据处理操作比ARM状态的更少。 访问寄存器R8~R15受到一定限制。 除MOV和ADD指令访问器R8~R15外,其它数据 处理指令总是更新CPSR中的状态标志。 访问寄存器R8~R15的Thumb数据处理指令不能 更新CPSR中的状态标志。
移位和循环移位作为独立的指令,对寄存器的内容进 行操作。这些指令可使用寄存器中的值或立即数来表示 移位量。 格式:OP Rd, Rs OP Rd, Rm,#expr 其中:Rd,Rm,Rs 必须在R0-R7中;
expr 若op是LSL,则为0-31,否则为1-32
条件码标志:指令会更新N、Z和C标志(若移位量为0, 则不影响C标志)。
SUBS SBCS RSBS MOVS MOVS MOVS MOVS MOVS MOVS
04-Thumb指令集
转移链接产生两条格式3指令 格式3指令必须 指令必须成对 转移链接产生两条格式 指令;格式 指令必须成对 两条格式 指令; 出现而不能单独使用 同样BLX产生一条格式 指令和 而不能单独使用。 产生一条格式3指令和 出现而不能单独使用。同样 产生一条格式 一条格式3a指令 指令。 一条格式 指令。 汇编器根据当前指令地址、 汇编器根据当前指令地址、目标指令标识符的地址 以及对流水线行为的微调计算出应插入指令中相应的偏 移量。若转移目标不在寻址范围内则给出错误信息。 移量。若转移目标不在寻址范围内则给出错误信息。
② 编程模型
R0
Thumb指令集是 指令集是 ARM指令集的一个子 指令集的一个子 集,并只能对限定的 ARM寄存器进行操作。 寄存器进行操作。 寄存器进行操作 其编程模型如图示: 其编程模型如图示:
R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 SP(R13) ( ) LR(R14) ( ) PC(R15) ( ) 有阴影的寄存器 访问时受到限制
① 指令集特点
Thumb指令继承了ARM指令集的许多特点 指令继承了 指令继承了 指令集的许多特点 Thumb指令也是采用 指令也是采用Load/Store结构,有数据处 结构, 指令也是采用 结构 数据传送及流控制指令等。 理、数据传送及流控制指令等。 Thumb指令集丢弃了 指令集丢弃了 指令集丢弃了ARM指令集一些特性 指令集一些特性 大多数Thumb指令是无条件执行的,许多 指令是无条件执行的, 大多数 指令是无条件执行的 许多Thumb 数据处理指令采用2地址格式 地址格式, 数据处理指令采用 地址格式,即目的寄存器与一个源 寄存器相同; 寄存器相同; Thumb异常中断时表现的一些特点 异常中断时表现的一些特点 异常中断时 所有异常都会使微处理器返回到ARM模式状态, 模式状态, 所有异常都会使微处理器返回到 模式状态 并在ARM的编程模式中处理。 的编程模式中处理。 并在 的编程模式中处理 由于ARM微处理器字传送地址必须字对齐,半字 微处理器字传送地址必须字对齐, 由于 微处理器字传送地址必须字对齐 传送地址必须可被2整除 即半字对准); 整除( );而 传送地址必须可被 整除(即半字对准);而Thumb 指令是2个字节长 所以, 个字节长, 指令是 个字节长,所以,由Thumb执行状态进入异 执行状态进入异 常时其自然偏移与ARM不同。 不同。 常时其自然偏移与 不同
第4章 Thumb 指令集
第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指令集分为:分支指令、数据传送指令、单寄存器加载和存储指令以及多寄存器加载和存储指令。
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:加载寄存器,无符号字节。
ARM及THUMB指令集
; assembles to MVN r0,#0
使用无法用上述方法生成的数据,将产生错误 。
TM
ARM及Thumb指令集
12
12
装载32 bit常数
为允许装载大常数,汇编器提供了一条伪指令: LDR rd, =const 它可能汇编成下列指令: MOV or MVN。 或
LDR 指令,从数据池(Literal pools)读取常数。
11
11
立即数 (2)
Examples:
31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ror #0 ror #8 ror #30
range 0-0x000000ff step 0x00000001 range 0-0xff000000 step 0x01000000 range 0-0x000003fc step 0x00000004
CF
ASR: Arithmetic Right Shift
0
Destination
(无符号数)乘2
Destination
除2,并保留符号位
CF
LSR : Logical Shift Right
...0
ROR: Rotate Right
Destination
位循环
CF
Destination
(无符号数)除2
ARM及Thumb指令集
T
H
E
A
R
C
H
I
T
E
C
T
U
R
E
F
O
R
T TM
Thumb指令
3.3 Thumb指令系统 指令系统
特点
与ARM指令集相比,Thumb指令集有如下特点:
● Thumb指令集没有协处理器指令,信号量指令,乘加指令,
64位乘法指令以及访问CPSR或SPSR的指令,而且指令的第2操作 数受到限制。
● 除了分支指令B有条件指令功能外,其他指令均为无条件指令 除了分支指令B有条件指令功能外,其他指令均为无条件指令。
<MTSE1.0>
3.3 Thumb指令系统 指令系统
Thumb状态切换
当系统复位后,ARM启动并执行ARM指令。进入Thumb指 令模式有2中方法。
● 一种是执行一条交换转移指令BX,将指令中的目标地址寄存
器的最低位置1,并将其他位的值放入程序计数器PC,则可进入 Thumb指令。
● 另一种是利用异常返回,也可把微处理器从ARM模式转换为
指令执行的条件码:
00b:LDR/STR指令; 01b:LDRH/STRH指令; 10b:LDRB/STRB指令;
Rd:源或目标寄存器 Rn:基址寄存器 Rm:偏移量寄存器
说 明 : 当 opcode 位 为 11b 时,L位为0代表指令 “LDRSB“,L位为1代表指 令“LDRSH”
<MTSE1.0>
● 大多数Thumb数据处理指令采用2地址格式。
<MTSE1.0>
3.3 Thumb指令系统 指令系统
Thumb指令集较ARM指令集有如下限制: 只有B指令可以条件执行,其它指令都不能条件执行; 分支指令的跳转范围有更多限制; 数据处理指令的操作结果必须放入其中一个; 单寄存器访问指令,只能操作R0~R7; LDM和STM指令可以对R0~R7的任何子集进行操作;
chapter_4
4.1 ARM处理器寻址方式
• 寻址方式分类——寄存器移位寻址
寄存器移位寻址是ARM指令集特有的寻址方式。 当第2个操作数是寄存器移位方式时,第2个寄存器 操作数在与第1个操作数结合之前,选择进行移位操 逻辑左移3位 作。寄存器移位寻址指令举例如下: MOV R0,R2,LSL #3 R2 0x01 ;R2的值左移3位,结果放入R0, 0x08
向上生长:向高地址方向生长,称为递增堆栈
向下生长:向低地址方向生长,称为递减堆栈
周立功单片机
4.1 ARM处理器寻址方式
• 寻址方式分类——堆栈寻址
堆栈压栈 SP栈顶 0x12345678 栈底
栈区
向上 增长
堆栈存 储区
向下 增长
栈区
栈底 0x12345678 堆栈压栈
栈顶SP
周立功单片机
LDR R1,[R2] ;将R2指向的存储单元的数据读出
SWP
R1,R1,[R2]
R2 0x40000000 ;保存在R1中 R0 0xAA 0x55
;单元的内容交换
;将寄存器R1的值和R2指定的存储
LDR
R1,[R2]
周立功单片机
4.1 ARM处理器寻址方式
• 寻址方式分类——基址寻址
基址寻址就是将基址寄存器的内容与指令中给 出的偏移量相加,形成操作数的有效地址。基址寻 址用于访问基址附近的存储单元,常用于查表、数 0x4000000C 0xAA 组操作、功能部件寄存器访问等。基址寻址指令举 例如下: 将R3+0x0C作 R3 0x40000000 LDR 为地址装载数 R2,[R3,#0x0C] ;读取R3+0x0C地址上的存储单元 R2 0xAA 0x55 据 ;的内容,放入R2
ARM及THUMB指令集
loop
… SUBS r1,r1,#1
R1减1,并设置标志位
BNE loop
如果 Z标志清零则跳转
ARM及Thumb指令集
TM
4
4
Condition Codes
下表为所有可能的条件码:
注意:AL为默认状态,不需要单独指出
Suffix
EQ NE CS/HS CC/LO MI PL VS VC HI LS GE LT GT LE AL
位循环
RRX: Rotate Right Extended
Destination
CF
位轮换,从 CF到MSB都参与操作
ARM及Thumb指令集
TM
9
9
寄存器, 可选择是否增加移位操作. 移位值可以是:
5 bit 无符号整数 放在另一个寄存器的低字节
用于常数乘法
立即数 8 bit ,大小范围0-255。
ARM及Thumb指令集
TM
0
0x22
地址增加
r0
0x11
20
20
块数据传送
LDM / STM指令允许一次传送1到16个寄存器到/从存储器中。 寄存器传送顺序不能被指定 • 最小数字的寄存器总是被传送到/从存储器的最低地址上。 LDMIA r10,{r0,r1,r4}
新建一个 text文件 另存为 “gcd.s” 加入到项目中
Build 并执行
AREA myarea, CODE ENTRY
start
MOV r0, #9 MOV r1, #15
; your code here
stop
B stop END
ARM及Thumb指令集
Quiz #2 - GCD
Thumb指令集之: Thumb跳转指令
Thumb 指令集之:Thumb 跳转指令
11.3Thumb跳转指令Thumb指令集中的跳转指令分以下6种类型。
①无条件跳转,其跳转空间为±2KB。
②条件跳转,其跳转空间为±256B。
③带返回的跳转指令,其跳转空间为±4MB。
④带状态切换的跳转指令(是否进行状态切换可以在程序中设定选择)。
⑤带返回和状态切换的跳转指令(是否进行状态切换可以在程序中设定选择)。
⑥第二种形式的带返回和状态切换的跳转指令。
下面详细介绍各指令的特点及用途。
11.3.1跳转指令BThumb中有两个分支跳转指令的变体,第一个变体与ARM 版本指令相似,可条件执行,跳转被限制在有符号8位立即数所表示的范围内,或者是±256B。
第二个变体不可条件执行(没有条件码部分),但扩展了有效跳转范围,跳转范围为有符号11位立即数表示的范围,即
±2048B。
条件分支指令是Thumb指令中惟一可以条件执行的指令。
首先来介绍可条件执行的跳转指令B(1)。
(1)编码格式
可条件执行的跳转指令的编码格式如图11.1所示。
图11.1B(1)指令编码格式
(2)指令的语法格式
Bcondtarget_address。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据处理指令
ARM指令与Thumb指令低寄存器比较:
MOVS MVNS CMP CMP CMN TST ADDS ADDS ADDS ADCS SUBS SUBS SUBS SBCS RSBS MOVS MOVS MOVS MOVS MOVS MOVS MOVS ANDS EORS ORRS BICS MULS Rd, Rd, RN, Rn, Rn, Rn, Rd, Rd, Rd, Rd Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, ARM指令 #<#imm8> Rm #<#imm8> Rm Rm Rm Rn, Rn, Rn, Rn Rn, Rn, Rn, Rn, Rn, Rn, Rm, Rd, Rm, Rd, Rm, Rd, Rd, Rd, Rd, Rd, Rd, Rm, MOV MVN CMP CMP CMN TST ADD ADD ADD ADC SUB SUB SUB SBC NEG LSL LSL LSR LSR ASR ASR ROR AND EOR ORR BIC MUL Rd, Rd, Rn, Rn, Rn, Rn, Rd, Rd, Rd, Rd Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Thumb指令 #<#imm8> Rm #<#imm8> Rm Rm Rm Rn, #<#imm8> Rn, Rn Rm Rn, #<#imm8> Rn, Rm Rn Rm, Rs Rm, Rs Rm, Rs Rs Rm Rm Rm Rm Rm
4.1.1 4.1.2 4.1.3 4.1.4
Thumb指令集编码 Thumb状态切换 编程模型 Thumb指令集特性
4.1.1Thumb指令集编码
Thumb指令集编码如下:
4.1.2Thumb状态切换
在任何时刻,CPSR的第5位(位T)决定了ARM微处理器执行的是 ARM指令流还是Thumb指令流.当T置1,则认为是16位的Thumb指令 流;当T置0,则认为是32位的ARM指令流. 进入Thumb模式 进入Thumb指令模式有两种方法:一种是执行一条交换转移指令 BX,另一种方法是利用异常返回,也可以把微处理器从ARM模式转 换为Thumb模式. 退出Thumb模式 退出Thumb指令模式也有两种方法:一种是执行Thumb指令中的交 换转移BX指令可以显式的返回到ARM指令流.另一种是利用异常 进入ARM指令流 .
Thumb软件中断指令的二进制编码如下:
Thumb软件中断指令的汇编格式如下: SWI <8位立即数>;<8位立即数>为数字表达式,其取 值为0~255范围内的整数.
异常中断指令
Thumb断点指令
Thumb断点指令的二进制编码如下:
Thumb断点指令的汇编格式如下: BKPT immed_8
�
转移链接产生两条格式3指令.格式3指令必须成对出现而 不能单独使用.同样BLX产生一条格式3指令和一条格式 3a指令.汇编器根据当前指令地址,目标指令标识符的地 址以及对流水线行为的微调计算出应插入指令中相应的偏 移量.若转移目标不在寻址范围内则给出错误信息.
转移指令
转移指令分类如下: B-分支指令,Thumb指令集惟一可条件执行的指令. BL-带链接的长分支. BX-分支指令,并可选择地切换指令集. BLX-带链接分支,并可选地交换指令集.
4.2.3数据存取指令
Thumb的数据存取指令又可以分为: 单寄存器数据存取指令(LDR和STR) 多寄存器数据存取指令 (LDM和STM)
单寄存器数据存取指令(LDR和STR)
二进制编码如下:
单寄存器数据存取指令(LDR和STR)
汇编格式如下: <op> Rd,[Rn,#<#off5>] ;<op> = LDR|LDRB|STR|STRB <op> Rd,[Rn,#<#off5>] ;<op> = LDRH| STRH <op> Rd,[Rn,Rm] ;<op> =LDR|LDRH|LDRSH|LDRB|LDRSB|STR|STRH| STRB <op> Rd,[PC,#<#off8>] <op> Rd,[SP,#<#off8>] ;<op> = LDR| STR//该两条指令偏移量为8位
多寄存器数据存取指令
二进制编码如下:
多寄存器数据存取指令 汇编格式如下: LDMIA Rn!,{<reg list>} STMIA Rn!,{<reg list>} POP {<reg list>{,pc}} PUSH {<reg list>{,lr}}
4.2.4异常中断指令
Thumb软件中断指令
数据处理指令
数据处理指令的二进制编码如下图:
数据处理指令
按照数据处理指令的功能,可以将其分为以下几类: 算术运算指令,它又分为以下几类:
ADD与SUB—低寄存器加法和减法 ADD—高或低寄存器 ADD与SUB—SP ADD—PC或SP相对偏移 ADC,SBC和MUL
移位和循环移位操作(ASR,LSL,LSR和ROR) 比较指令(CMP和CMN) 传送和取负指令(MOV,MVN和NEG) 测试指令(TST)
数据处理指令
ARM指令与Thumb指令高寄存器比较:
ARM指令 ADD CMP ADD ADD ADD SUB Rd, Rn, Rd Rd, Rd, SP, SP, Rd, Rm PC PC, SP, SP, SP, #<#imm8> #<#imm8> #<#imm7> #<#imm7> Rm ADD CMP ADD ADD ADD SUB Rd, Rn, Rd Rd, Rd, SP, SP, Thumb指令 Rm (1/2 Hi regs) Rm (1/2 Hi regs) PC PC, SP, SP, SP, #<#imm8> #<#imm8> #<#imm7> #<#imm7>
Thumb数据处理指令包括一组高度优化且相当复杂的指 令,范围涵盖编译器通常需要的大多数操作.ARM指 令支持在单条指令中完成一个操作数的移位及一个ALU 操作,但Thumb指令集将移位操作和ALU操作分离为不 同的指令.本部分从以下几个方面介绍: 数据处理指令的二进制编码 数据处理指令的分类 ARM指令与Thumb指令比较
转移指令
转移指令的汇编格式如下:
B <cond> <label> B <label> BL <label> Bபைடு நூலகம்X<label> B{L}X Rm ;格式1 目标为Thumb代码 ;格式2 目标为Thumb代码 ;格式3 目标为Thumb代码 ;格式3a 目标为ARM代码 ;格式4 目标为ARM或Thumb代码
4.1.3编程模型
Thumb指令集是ARM指令集的一个子集,并只能对限定的 ARM寄存器进行操作.其编程模型如下图所示:
r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 SP(r13) LR(r14) PC(r15) Hi寄存器 CPSR Lo Lo寄存器 有阴影的寄存器 访问时受到限制
#<#imm3> #<#imm8> Rm Rm #<#imm3> #<#imm8> Rm Rm #0 LSL #<#sh> LSL Rs LSR #<#sh> LSR Rs ASR #<#sh> ROR Rs ROR Rs Rm Rm Rm Rm Rd
#<#imm3> Rm #<#imm3> Rm
#<#sh> #<#sh> #<#sh>
4.1.4Thumb指令集特点
Thumb指令继承了ARM指令集的许多特点
Thumb指令也是采用Load/Store结构,有数据处理,数据传送及流 控制指令等.
Thumb指令集丢弃了ARM指令集一些特性
大多数Thumb指令是无条件执行的(除了转移指令B),而所有 ARM ARM指令都是条件执行的.许多Thumb数据处理指令采用2地址格 式,即目的寄存器与一个源寄存器相同,而大多数ARM数据处理指 令采用的是3地址格式(除了64位乘法指令外).
4.2.2Thumb转移指令
ARM指令有一个大的(24位)偏移域(offset field), 这不可能在16位Thumb指令格式中表示.为此Thumb指 令集有多种方法实现其子功能.本部分从以下几个方面 介绍: 转移指令的二进制编码 转移指令的汇编格式 转移指令的分类
转移指令
转移指令的二进制编码如下:
Thumb异常时表现的一些特点
所有异常都会使微处理器返回到ARM模式状态,并在ARM的编程 模式中处理.由于ARM微处理器字传送地址必须可被4整除(即字 对准),半字传送地址必须可被2整除(即半字对准).而Thumb 指令是2个字节长,而不是4个字节,所以,由Thumb执行状态进入 异常时其自然偏移与ARM不同.
4.2 Thumb指令集详细介绍
16位Thumb指令集是从32位ARM指令集提取指令格式 的,每条Thumb指令有相同处理器模型所对应的32位 ARM指令. 4.2.1 数据处理指令; 4.2.2 转移指令; 4.2.3 Load/Store指令; 4.2.4异常中断指令.
4.2.1Thumb数据处理指令
第四章 Thumb 指令集