26
第第第 Thumb 第第第 4.1 Thumb 第第第第第 4.2 Thumb 第第第第第第

第四章 Thumb 指令集

Embed Size (px)

DESCRIPTION

第四章 Thumb 指令集. 4.1 Thumb 指令集概述 4.2 Thumb 指令详细介绍. 4.1 Thumb 指令集概述. ARM 开发工具完全支持 Thumb 指令,应用程序可以灵活的将 ARM 和 Thumb 子程序混合编程以便在例程的基础上提高性能或代码密度。在编写 Thumb 指令时,先要用伪指令 CODE16 声明( ADS 的编译环境下),而且在 ARM 指令中要使用 BX 指令跳转到 Thumb 指令,以切换处理器状态。本节可以分为以下几个部分: 4.1.1 Thumb 指令集编码 4.1.2 Thumb 状态切换 - PowerPoint PPT Presentation

Citation preview

Page 1: 第四章   Thumb  指令集

第四章 Thumb 指令集

4.1 Thumb 指令集概述4.2 Thumb 指令详细介绍

Page 2: 第四章   Thumb  指令集

4.1 Thumb 指令集概述 ARM 开发工具完全支持 Thumb 指令,应用程序可以灵活的将 ARM 和 Thumb 子程序混合编程以便在例程的基础上提高性能或代码密度。在编写 Thumb 指令时,先要用伪指令 CODE16 声明( ADS 的编译环境下),而且在 ARM 指令中要使用 BX 指令跳转到 Thumb 指令,以切换处理器状态。本节可以分为以下几个部分:4.1.1 Thumb 指令集编码4.1.2 Thumb 状态切换 4.1.3 编程模型4.1.4 Thumb 指令集特性

Page 3: 第四章   Thumb  指令集

4.1.1Thumb 指令集编码Thumb 指令集编码如下:

Page 4: 第四章   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 指令流 。

Page 5: 第四章   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)

Lo 寄存器

Hi 寄存器

CPSR

有阴影的寄存器访问时受到限制

Page 6: 第四章   Thumb  指令集

4.1.4Thumb 指令集特点 Thumb 指令继承了 ARM 指令集的许多特点

Thumb 指令也是采用 Load/Store 结构,有数据处理、数据传送及流控制指令等。 Thumb 指令集丢弃了 ARM 指令集一些特性大多数 Thumb 指令是无条件执行的(除了转移指令 B ),而所有 A

RM 指令都是条件执行的。许多 Thumb 数据处理指令采用 2 地址格式,即目的寄存器与一个源寄存器相同,而大多数 ARM 数据处理指令采用的是 3 地址格式(除了 64 位乘法指令外)。 Thumb 异常时表现的一些特点 所有异常都会使微处理器返回到 ARM 模式状态,并在 ARM 的编程模式中处理。由于 ARM 微处理器字传送地址必须可被 4 整除(即字对准),半字传送地址必须可被 2 整除(即半字对准)。而 Thumb指令是 2 个字节长,而不是 4 个字节,所以,由 Thumb 执行状态进入异常时其自然偏移与 ARM 不同。

Page 7: 第四章   Thumb  指令集

4.2 Thumb 指令集详细介绍16 位 Thumb 指令集是从 32 位 ARM 指令集提取指令格式的,每条 Thumb 指令有相同处理器模型所对应的 32位 ARM 指令。4.2.1 数据处理指令;4.2.2 转移指令; 4.2.3 Load/Store 指令; 4.2.4 异常中断指令。

Page 8: 第四章   Thumb  指令集

4.2.1Thumb 数据处理指令Thumb 数据处理指令包括一组高度优化且相当复杂的指令,范围涵盖编译器通常需要的大多数操作。 ARM 指令支持在单条指令中完成一个操作数的移位及一个 ALU 操作,但 Thumb 指令集将移位操作和 ALU 操作分离为不同的指令。本部分从以下几个方面介绍:

数据处理指令的二进制编码 数据处理指令的分类 ARM 指令与 Thumb 指令比较

Page 9: 第四章   Thumb  指令集

数据处理指令数据处理指令的二进制编码如下图:

Page 10: 第四章   Thumb  指令集

数据处理指令按照数据处理指令的功能,可以将其分为以下几类:

算术运算指令,它又分为以下几类:

移位和循环移位操作( ASR , LSL , LSR 和 ROR )

比较指令( CMP 和 CMN ) 传送和取负指令( MOV , MVN 和 NEG ) 测试指令( TST )

ADD与 SUB—低寄存器加法和减法 ADD—高或低寄存器 ADD与 SUB—SP ADD—PC 或 SP 相对偏移 ADC , SBC 和 MUL

Page 11: 第四章   Thumb  指令集

数据处理指令ARM 指令与 Thumb 指令低寄存器比较:

ARM 指令 Thumb 指令MOVS Rd , #<#imm8> MOV Rd , #<#imm8> MVNS Rd , Rm MVN Rd , Rm CMP RN , #<#imm8> CMP Rn , #<#imm8> CMP Rn , Rm CMP Rn , Rm CMN Rn , Rm CMN Rn , Rm TST Rn , Rm TST Rn , Rm ADDS Rd , Rn , #<#imm3> ADD Rd , Rn , #<#imm3>ADDS Rd , Rn , #<#imm8> ADD Rd , #<#imm8> ADDS Rd , Rn , Rm ADD Rd , Rn , RmADCS Rd , Rn , Rm ADC Rd , Rm SUBS Rd , Rn , #<#imm3> SUB Rd , Rn , #<#imm3>SUBS Rd , Rn , #<#imm8> SUB Rd , #<#imm8> SUBS Rd , Rn , Rm SUB Rd , Rn , RmSBCS Rd , Rn , Rm SBC Rd , Rm RSBS Rd , Rn , #0 NEG Rd , Rn MOVS Rd , Rm , LSL #<#sh> LSL Rd , Rm , #<#sh>MOVS Rd , Rd , LSL Rs LSL Rd , Rs MOVS Rd , Rm , LSR #<#sh> LSR Rd , Rm , #<#sh>MOVS Rd , Rd , LSR Rs LSR Rd , Rs MOVS Rd , Rm , ASR #<#sh> ASR Rd , Rm , #<#sh>MOVS Rd , Rd , ROR Rs ASR Rd , Rs MOVS Rd , Rd , ROR Rs ROR Rd , Rs ANDS Rd , Rd , Rm AND Rd , Rm EORS Rd , Rd , Rm EOR Rd , Rm ORRS Rd , Rd , Rm ORR Rd , Rm BICS Rd , Rd , Rm BIC Rd , Rm MULS Rd , Rm , Rd MUL Rd , Rm

Page 12: 第四章   Thumb  指令集

数据处理指令ARM 指令与 Thumb 指令高寄存器比较:

ARM 指令 Thumb 指令ADD

Rd, Rd, Rm ADD Rd, Rm ( 1/2 Hi regs )

CMP Rn , Rm CMP Rn , Rm ( 1/2 Hi regs )

ADD Rd, PC, #<#imm8> ADD Rd, PC , #<#imm8>

ADD Rd, SP, #<#imm8> ADD Rd, SP , #<#imm8>

ADD SP, SP, #<#imm7> ADD SP, SP , #<#imm7>

SUB SP, SP, #<#imm7> SUB SP, SP , #<#imm7>

Page 13: 第四章   Thumb  指令集

4.2.2Thumb 转移指令ARM 指令有一个大的( 24 位)偏移域( offset field ),这不可能在 16 位 Thumb 指令格式中表示。为此 Thumb指令集有多种方法实现其子功能。本部分从以下几个方面介绍:

转移指令的二进制编码 转移指令的汇编格式 转移指令的分类

Page 14: 第四章   Thumb  指令集

转移指令转移指令的二进制编码如下:

Page 15: 第四章   Thumb  指令集

转移指令转移指令的汇编格式如下:

转移链接产生两条格式 3 指令。格式 3 指令必须成对出现而不能单独使用。同样 BLX产生一条格式 3 指令和一条格式 3a 指令。汇编器根据当前指令地址、目标指令标识符的地址以及对流水线行为的微调计算出应插入指令中相应的偏移量。若转移目标不在寻址范围内则给出错误信息。

B <cond> <label> ;格式 1 目标为 Thumb 代码B <label> ;格式 2目标为 Thumb 代码BL <label> ;格式 3目标为 Thumb 代码BLX<label> ;格式 3a 目标为 ARM 代码B{L}X Rm ;格式 4 目标为 ARM 或 Thumb 代码

Page 16: 第四章   Thumb  指令集

转移指令转移指令分类如下:

B-分支指令, Thumb 指令集惟一可条件执行的指令。 BL-带链接的长分支。 BX-分支指令,并可选择地切换指令集。 BLX-带链接分支,并可选地交换指令集。

Page 17: 第四章   Thumb  指令集

4.2.3 数据存取指令Thumb 的数据存取指令又可以分为:单寄存器数据存取指令( LDR 和 STR )多寄存器数据存取指令 (LDM 和 STM)

Page 18: 第四章   Thumb  指令集

单寄存器数据存取指令( LDR 和 STR )二进制编码如下:二进制编码如下:

Page 19: 第四章   Thumb  指令集

单寄存器数据存取指令( 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位

Page 20: 第四章   Thumb  指令集

多寄存器数据存取指令二进制编码如下:二进制编码如下:

Page 21: 第四章   Thumb  指令集

多寄存器数据存取指令汇编格式如下:LDMIA Rn! , {<reg list>} STMIA Rn! , {<reg list>}POP {<reg list>{ , pc}} PUSH {<reg list>{ , lr}}

Page 22: 第四章   Thumb  指令集
Page 23: 第四章   Thumb  指令集
Page 24: 第四章   Thumb  指令集
Page 25: 第四章   Thumb  指令集

4.2.4 异常中断指令Thumb软件中断指令Thumb软件中断指令的二进制编码如下:

Thumb软件中断指令的汇编格式如下:SWI <8 位立即数 > ; <8位立即数 >为数字表达式,其取值为 0~255 范围内的整数。

Page 26: 第四章   Thumb  指令集

异常中断指令Thumb 断点指令Thumb 断点指令的二进制编码如下:

Thumb 断点指令的汇编格式如下:BKPT immed_8