Thumb指令集和ARM指令集的对比

合集下载

Thumb 指令集

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 指令分类介绍

基于Android的ARM汇编语言系列之五:ARM指令集与Thumb指令集

基于Android的ARM汇编语言系列之五:ARM指令集与Thumb指令集

基于Android的ARM汇编语言系列之五:ARM指令集
与Thumb指令集
章节列表之一:ARM 汇编语言开篇之二:C/C++程序生成ARM 汇编程序
的过程分析之三:ARM 汇编语言程序结构之四:ARM 处理器的寻址方式之五:ARM 指令集与Thumb 指令集之六:NEON 指令集与VFP 指令集
写在前面:本篇文章旨在大致介绍下ARM 指令集的相关内容,这里也同时
提供一个有详细解释和用例的待书签的PDF 版本,方便大家查阅。

ARM 指令集详解
指令集是处理器的核心,ARM 指令的基本格式如下所示:
opcode {cond}{S}{.W\.N}Rd, Rn{.operand2}S:指定是否影响CPSR 寄存器的值,如ADDS,SUBS 等。

.W.N:指令宽度说明符。

Rd:目的寄存器。

Rn:第一个操作数寄存器。

operand2:第二个操作数,第二个操作数可以是立即数、
寄存器或寄存器位操作,cond:执行条件,它的取值如下图所示:
一跳转指令
1.1 B
跳转指令。

1.2 BL
带链接的跳转指令。

1.3 BX
带状态切换的跳转指令。

二存储器访问指令
2.1 LDR
从存储器中加载数据到寄存器。

ARM Thumb指令集详解-9页word资料

ARM Thumb指令集详解-9页word资料

ARM Thumb指令集详解ARM Thumb指令集详解2019-04-27 12:30来源:MCU嵌入式领域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指令集和ARM指令集的对比

Thumb指令集和ARM指令集的对比

Thumb指令集和ARM指令集的对比Thumb指令Thumb指令可以看做是ARM指令压缩形式的子集,是针对代码密度的问题而提出的,它具有16位的代码密度。

Thumb不是一个完整的体系结构,不能指望处理程序只执行Thumb指令而不支持ARM指令集。

因此,Thumb指令只需要支持通用功能,必要时,可借助完善的ARM指令集,例如:所有异常自动进入ARM状态。

在编写Thumb指令时,先要使用伪指令CODE16声明,而且在ARM指令中要使用BX指令跳转到Thumb指令,以切换处理器状态。

编写ARM指令时,可使用伪指令CODE32声明。

代码密度:单位存储空间中包含的指令的个数。

例如ARM指令是32位的,而Thumb指令时16位的,如果在1K的存储空间中,可以放32条ARM指令,就可以放64条Thumb指令,因此在存放Thunb 指令时,代码密度高。

Thumb指令集与ARM指令集的区别Thumb指令集不是完整的指令集,它是ARM指令集的子集。

但是Thumb 指令具有更高的代码密度,即占用存储空间小,仅为ARM代码规格的65%,但其性能却下降的很少。

所以,Thumb指令集使ARM处理器能应用到有限的存储带宽,并且,代码密度要求很高的嵌入式系统中去。

Thumb指令集没有协处理器指令、信号量指令以及访问CPSR或SPSR的指令,没有乘加指令及64位乘法指令等,且指令的第二操作数受到限制;除了跳转指令B有条件执行功能外,其他指令均为无条件执行;大多数Thumb数据处理指令采用2地址格式。

Thumb指令集与ARM指令集的区别一般有如下几点:1. 跳转指令程序相对转移,特别是条件跳转与ARM代码下的跳转相比,在范围上有更多的限制,转向子程序是无条件的转移。

2. 数据处理指令数据处理指令是对通用寄存器进行操作,在大多数情况下,操作的结果须放入其中一个操作数寄存器中,而不是第三个寄存器中。

数据处理操作比ARM状态的更少,访问寄存器R8—R15受到一定限制。

thumb与arm状态的区别

thumb与arm状态的区别

thumb与arm状态的区别ARM指令和THUMB指令有什么区别1推荐AREA ThumbSub, CODE, READONLY ; Name this block of code ENTRY ; Mark first instruction to execute CODE32 ; Subsequent instructions are ARM header ADR r0, start + 1 ; Processor starts in ARM state, BX r0 ; so small ARM code header used ; to call Thumb main program.CODE16 ; Subsequent instructions are Thumb. start MOV r0, #10 ; Set up parameters MOV r1, #3 BL doadd ; Call subroutine stop MOV r0, #0x18 ; angel_SWIreason_ReportException LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SWI 0xAB ; Thumb semihosting SWIdoadd ADD r0, r0, r1 ; Subroutine code MOV pc, lr ; Return from subroutine.END ; Mark end of file3、CODE16、CODE32 语法格式: CODE16(或CODE32) CODE16伪指令通知编译器,其后的指令序列为16位的Thumb指令。

CODE32伪指令通知编译器,其后的指令序列为32位的ARM指令。

若在汇编源程序中同时包含ARM指令和Thumb指令时,可用CODE16伪指令通知编译器其后的指令序列为16位的Thumb指令,CODE32伪指令通知编译器其后的指令序列为32位的ARM指令。

04第四章 Thumb 指令集

04第四章 Thumb 指令集
T humb 状态
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架构及ARM指令集、Thumb指令集你了解多少?

ARM架构及ARM指令集、Thumb指令集你了解多少?

ARM架构及ARM指令集、Thumb指令集你了解多少?1991 年ARM 公司成⽴于英国剑桥,在成⽴后的那⼏年,ARM业绩平平,⼯程师们也⼈⼼惶惶,害怕随时都会失业。

在这个情况下,ARM 决定改变他们的产品策略——他们不再⽣产芯⽚,转⽽以授权的⽅式,将芯⽚设计⽅案转让给其他公司,即“Partnership”开放模式。

没想到正是这种模式,开创了属于ARM的全新时代。

ARM所采取的是IP(Intellectual Property,知识产权)授权的商业模式,收取⼀次性技术授权费⽤和版税提成。

具体来说,ARM有三种授权⽅式:处理器、POP以及架构授权。

处理器授权是指授权合作⼚商使⽤ARM设计好的处理器,对⽅不能改变原有设计,但可以根据⾃⼰的需要调整产品的频率、功耗等。

POP(processor optimization pack,处理器优化包)授权是处理器授权的⾼级形式, ARM出售优化后的处理器给授权合作⼚商,⽅便其在特定⼯艺下设计、⽣产出性能有保证的处理器。

架构授权是ARM会授权合作⼚商使⽤⾃⼰的架构,⽅便其根据⾃⼰的需要来设计处理器(例如后来⾼通的Krait架构和苹果的Swift架构,就是在取得ARM的授权后设计完成的)。

所以,授权费和版税就成了ARM的主要收⼊来源。

除此之外,就是软件⼯具和技术⽀持服务的收⼊。

⼀、ARM 微处理器的应⽤领域及特点ARM处理器市场覆盖率最⾼、发展趋势⼴阔,基于ARM技术的32位微处理器,市场的占有率⽬前已达到80%。

绝⼤多数IC制造商都推出了⾃⼰的ARM结构芯⽚。

我国的中兴集成电路、⼤唐电讯、华为海思、中芯国际和上海华虹,以及国外的⼀些公司如德州仪器、意法半导体、Philips、Intel、Samsung等都推出了⾃⼰设计的基于ARM核的处理器。

⼯业控制领域:作为32 的RISC 架构,基于ARM 核的微控制器芯⽚不但占据了⾼端微控制器市场的⼤部分市场份额,同时也逐渐向低端微控制器应⽤领域扩展,ARM 微控制器的低功耗、⾼性价⽐,向传统的8 位/16 位微控制器提出了挑战。

thumb指令集是什么

thumb指令集是什么

thumb指令集是什么
thumb指令集是arm指令集的一个子集,是针对代码密度问题而提出的,它具有16位的代码宽度。

与等价的32位代码相比较,thumb指令集在保留32位代码优势的同时,大大的节省了系统的存储空间。

thumb不是一个完整的体系结构,不能指望处理器只执行thumb指令集而不支持arm指令集。

thumb指令集分为:分支指令、数据传送指令、单寄存器加载和存储指令以及多寄存器加载和存储指令。

thumb指令集没有协处理器指令、信号量(semaphore)指令以及访问cpsr或spsr的指令。

thumb指令集与arm指令集的区别
1、thumb指令继承了arm指令集的许多特点
thumb指令也是采用load/store结构,有数据处理、数据传送及流控制指令等。

ARM指令集、Thumb指令集、Thumb-2指令集

ARM指令集、Thumb指令集、Thumb-2指令集

ARM指令集、Thumb指令集、Thumb-2指令集
MCU使⽤什么指令集主要由内核决定的,⽐如Cortex-M3使⽤的是Thumb-2指令集
ARM指令集:
编代码全部是 32bits 的,每条指令能承载更多的信息,因此使⽤最少的指令完成功能,所以在相同频率下运⾏速度也是最快的,但也因为每条指令是32bits 的⽽占⽤了最多的程序空间。

Thumb指令集:
编代码全部是 16bits 的,每条指令所能承载的信息少,因此它需要使⽤更多的指令才能完成功能,因此运⾏速度慢,但它也占⽤了最少的程序空间
Thumb-2指令集:
在前⾯两者之间取了⼀个平衡,兼有⼆者的优势,当⼀个操作可以使⽤⼀条 32bits指令完成时就使⽤ 32bits 的指令,加快运⾏速度,⽽当⼀次操作只需要⼀条16bits 指令完成时就使⽤16bits 的指令,节约存储空间。

Thumb指令

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的任何子集进行操作;

常用arm指令集

常用arm指令集

常用ARM指令集一、ARM架构简介ARM(Advanced RISC Machine)是一种精简指令集计算机(Reduced Instruction Set Computer,RISC)架构,广泛应用于移动设备、嵌入式系统和主流服务器等领域。

ARM架构的优点包括高效能、高能效、低成本和高可伸缩性,适用于各种应用场景。

二、ARM指令集分类ARM指令集根据其特点和功能可以分为三大类:基本指令集、乘累加指令集和浮点指令集。

1. 基本指令集(ARM和Thumb指令集)基本指令集是ARM架构最基础的指令集,包含大部分常用的数据处理指令、控制指令和访存指令等。

ARM指令集的指令长度为32位。

Thumb指令集是ARM架构的一个变种,指令长度为16位。

Thumb指令集在ARMv4架构引入,用于提高代码密度,适用于存储空间有限的设备。

2. 乘累加指令集(ARM和Thumb-2指令集)乘累加指令集是基于基本指令集的扩展,加入了乘法和累加指令等。

乘累加指令集可以提高乘法和累加运算的效率,适用于需要大量复杂计算的应用。

Thumb-2指令集是Thumb指令集的进一步扩展,兼容Thumb指令集,并增加了32位指令。

Thumb-2指令集使得ARM架构在相同存储空间下能够提供更高的性能。

3. 浮点指令集(VFP和NEON指令集)浮点指令集主要用于进行浮点数运算。

VFP(Vector Floating Point)指令集是ARM架构最早引入的浮点技术,支持单精度和双精度浮点数运算。

NEON指令集是ARM架构后续引入的SIMD(Single Instruction, Multiple Data)指令集,用于提高并行处理能力和多媒体应用性能。

三、常用ARM指令以下是常用的ARM指令及其功能:1.数据处理指令–加法指令:ADD、ADC(带进位的加法指令)–减法指令:SUB、SBC(带借位的减法指令)–乘法指令:MUL、SMULL(有符号乘法指令)、UMULL(无符号乘法指令)–除法指令:SDIV(有符号除法指令)、UDIV(无符号除法指令)–移位指令:LSL(逻辑左移)、LSR(逻辑右移)、ASR(算术右移)、ROR(循环右移)2.控制指令–条件分支指令:B(无条件分支指令)、BEQ(等于零条件分支指令)、BNE(不等于零条件分支指令)等–无条件分支指令:BX(无条件跳转指令,用于实现函数调用)–跳转指令:BL(带链接跳转指令,用于实现函数调用,并将返回地址保存在链接寄存器中)3.访存指令–数据传送指令:LDR(加载指令,用于将数据从内存中加载到寄存器中)、STR(存储指令,用于将数据从寄存器中存储到内存中)–堆栈指令:PUSH(将数据压入堆栈)、POP(将数据从堆栈中弹出)–字节和半字操作指令:LDRB(加载字节指令)、LDRH(加载半字指令)、STRB(存储字节指令)、STRH(存储半字指令)4.特殊指令–中断指令:SWI(软中断指令,用于触发软件中断)–协处理器指令:CDP(协处理器数据处理指令)、MCR、MRC(协处理器寄存器传递指令)四、ARM指令优化技巧为了提高ARM指令执行效率和代码性能,可以采取以下优化技巧:1.使用适当的数据处理指令,避免不必要的指令执行和数据拷贝。

ARM及THUMB指令集

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指令
第5章 Thumb指令
5 Thumb指令
• Thumb指令
Thumb指令集可以看作是ARM指令压缩形式的 子集,它是为减小代码量而提出的,具有16位的代 码密度。Thumb指令体系不完整,只支持通用功能。 必要时仍需要使用ARM指令,如进入异常时。
说明:Thumb指令的格式与使用方式与ARM指令集类似,而且 使用并不是很频繁,建议这部分内容选修。
LDRH/STRH Rd,addressing
LDRB/STRB Rd,addressing
LDRSH Rd,addressing
加载/存储无符号字 节数据
加载有符号半字数据
Rd←[Rn,#immed_5×1] , Rd、Rn为R0~R7
Rd←[Rn,Rm],Rd、Rn、 Rm为R0~R7 Rd←[Rn,Rm],Rd、Rn、 Rm为R0~R7
其中:Rd 表示加载或存储的寄存器。必须为R0~R7。 Rn 表示基址寄存器。必须为R0~R7。 immed_5×N 表示立即数偏移量,其取值范围为(0~31)×N。
• 单寄存器访问指令——立即数偏移指令编码
L用于区别加载(L为1) 或存储(L为0)
指令执行的条件码:
0110b:LDR/STR指令; 1000b:LDRH/STRH指令; 0111b:LDRB/STRB指令;
在Thumb中, 高寄存器不 是标准寄存 器。汇编语 言程序员对 它们的访问 受到限制。 可以使用 MOV、 CMP和 ADD指令对 高寄存器操 作。
R0 R1 R2 R3 R4 R5 R6 R7
低 寄 存 器
高 寄 存 器
Thumb指令小节目录
1.Thumb指令集与ARM指令集的区别 2.存储器访问指令 3.数据处理指令 4.分支指令 5.杂项指令 6.Thumb指令功能码段分析

第5章 Thumb指令

第5章 Thumb指令
opcode Rd, Rs
TM
22
22
例:
EOR R3,R4
ROR R1,R0
MUL R0,R7
NEG R5,R3
CMP R2,R6
TM
23
23
5.1.4 带高位寄存器操作的Thumb指令


这类指令的汇编语法格式为
opcode Rd, Hs opcode Hd, Rs opcode Hd, Hs
opcode 0 0 1 0 1 0
TM
15
15
例:
ASR R3,R5 LSR R0,R2,#16
;将R2的内容逻辑右移16次后,结果 放入R0中
LSR R2,R5,#10 LSL R0,R3,#8 ASR R1,R2,#3
TM
16
16
5.1.2 低位寄存器算术运算指令




1.加法与减法运算指令(对R0~R7操作)
Rd:目标寄存器 R0~R7
Hd:目标寄存器R8~R15
Rs:源操作数寄存器 R0~R7 Hs:源操作数寄存器 R8~R15
TM
24
24
例: ADD PC,R1
MOV R13,R14
CMP R4,R12
CMP PC,R12
TM
25
25
5.1.5 带SP/PC的算术运算指令


1.SP/PC加法运算指令 这类指令的汇编语法格式为
39
例: LDR R2,[PC,#0x10]
LDR R0,[R15,#0x40]
TM
40
40

SP作为基址寄存器的加载/存储指令 LDR Rd, [SP,# immed_8×4] STR Rd, [SP,# immed_8×4]

ARM指令集

ARM指令集
“红领巾”真好
ARM指令集
厦门市松柏第二小学 吴小蔚
5.1 引言--ARM指令与Thumb指令
ARM处理器是基于精简指令集计算机(RISC)原理 设计的,指令集和相关译码机制较为简单。一些 ARM核具有32位ARM指令集和16位Thumb指令集。
ARM指令集效率高,但是代码密度低; 而Thumb指令集具有较高的代码密度,却仍然保持ARM
SUBS PC,R14_fiq ,#4 该指令将寄存器R14_fiq的值减去4后,复制到程序计数器PC 中,从而实现从异常处理程序中的返回,同时将SPSR_mode 寄存器的内容复制到当前程序状态寄存器CPSR中。
13
IRQ(Interrupt Request)
IRQ异常属于正常的中断请求,可通过对处理器的nIRQ引脚 输入低电平产生,IRQ的优先级低于FIQ,当程序执行进入 FIQ异常时,IRQ可能被屏蔽。
Thumb指令集 具有灵活、小 巧的特点
3
5.1 引言—数据类型
ARM微处理器的指令长度可以是32位(在 ARM状态下),也可以为16位(在Thumb状 态下)。
ARM微处理器中支持三种数据类型:
字节(8位有符号和无符号字节) 半字(16位有符号和无符号半字) 字(32位有符号和无符号字) 其中,字需要4字节对齐(地址的低两位为0)、
2、将CPSR复制到相应的SPSR中。 3、根据异常类型,强制设置CPSR的运行模式位。 4、强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相
应的异常处理程序处。
还可以设置中断禁止位,以禁止中断发生。
如果异常发生时,处理器处于Thumb状态,则当异常向量地 址加载入PC时,处理器自动切换到ARM状态。
15

第3章 ARM微处理器的指令系统5-Thumb指令

第3章 ARM微处理器的指令系统5-Thumb指令

指令格式: B 语句标号
语句标号通常在同一程序段内,地址范围不超过±2048 字节; 以PC为基址的相对偏移跳转,跳转方向可以向前,也可 以向后; 语句标号处的地址必须是半字对齐的。
16
3.6.4.2 条件分支指令
条件分支指令B能够使程序产生一次有条件跳转。
指令格式: B{cond} 语句标号
语句标号通常在同一程序段内,地址范围不超过±254 字节; cond是条件后缀,共14种; 指令满足条件时分支跳转,否则不分支; 以PC为基址的相对偏移跳转,跳转方向可以向前,也可 以向后; 语句标号处的地址必须是半字对齐的。
17
3.6.4.3 带链接的长分支指令
指令格式: BL 语句标号
11
12


3.6.3.7栈操作指令 指令:PUSH, POP
用于在寄存器和存储器之间进行成组的数据传送,其地址表达式是隐含的 堆栈指针。
指令格式: PUSH/POP PUSH POP

LR是链接寄存器; PC是程序计数器; 寄存器列表是从R0~R7的任意组合,寄存器分隔使用逗号; 堆栈指针是隐含的地址基址,Thumb指令中的堆栈是满栈递减的,堆栈 向下增长,堆栈指针总是指向最后入栈的数据; 寄存器在列表中是从小到大排列,无论加载还是存储,最小寄存器总是指 向最初的基址地址; 但使用POP指令且PC出现在列表中时,从栈区赋给PC的数据将引起程序 的跳转,这只能用在子程序的返回。
Opcode是操作指令; Rd是Thumb指令集的通用寄存器R0~R7,保存操作结 果; Rs是源寄存器R0~R7,其中的数值是Rd移位的位数; 会刷新程序状态寄存器的条件标志。
28

13ARM指令集与Thumb指令集

13ARM指令集与Thumb指令集

13ARM指令集与Thumb指令集指令格式ARM基本格式<opcode>{<cond>}{S}{.W|.N}<Rd>,<Rn>{,<operand2>}opecode:指令助记符cond:执⾏条件助记符标志含义EQ Z=1相等NE Z=0不相等CS/HS C=1⽆符号数⼤于或等于CC/LO C=0⽆符号数⼩于MI N=1负数PL N=0正数或0VS V=1溢出VC V=0没有溢出HI C=1,Z=0⽆符号数⼤于LS C=0,Z=1⽆符号数⼩于或等于GE N=V有符号数⼤于或等于LT N!=V有符号数⼩于GT Z=0,N=V有符号数⼤于LE Z=1,N!=V有符号数⼩于或等于AL任何⽆条件执⾏(指令默认条件)S:指令是否影响CPSR寄存器.W和.N:宽度说明符,默认16位,32位使⽤ .W说明符。

ARM和Thumb都可以使⽤1。

跳转指令,4条1。

B跳转:B{cond} label2。

BL带链接跳转(类似单步步⼊)将当前指令下⼀条指令地址存⼊R14寄存器,常⽤来调⽤⼦程序:BL{cond} label3。

BX带状态切换跳转(在ARM与Thumb之间切换)处理器判断Rm的位[0]为1,是则将CPSR寄存器标志T置位,切换⾄Thumb,反之切换为ARM:RX{cond} Rm4。

BLX带链接和状态切换的跳转:BLX{cond} Rm2。

存储器访问指令:LDR:寄存器←存储器格式:LDR{type}{cond} Rd,label LDRD{cond} Rd,Rd2,labelType取值:B:⽆符号字节(加载时0扩展为32位)SB:有符号字节(加载时符号扩展为32位)H:⽆符号半字节(加载时0扩展为32位)SH:有符号半字节(加载时符号扩展为32位)Rd:加载寄存器Label:读取的内存地址LDRD:⼀次加载双字的数据STR:寄存器→内存STR{type}{cond} Rd,labelSTRD{cond} Rd,Rd2,labelType中的SB和HS对STR⽆效LDM可以指定多个存储单元:寄存器←内存LDM{addr_mode}{cond} Rn{!} reglistaddr_mode:IA:Increase After,基址寄存器在执⾏指令后增加,默认IB:Increase Before,基址寄存器在执⾏指令前增加(仅ARM)DA:Decrease After,基址寄存器在执⾏指令后减少(仅ARM)DB:Decrease Before,基址寄存器在执⾏指令之前减少FD:满递减堆栈,堆栈向低地址⽣长,堆栈指针指向最后⼀个⼊栈的有效数据项 FA:满递增堆栈,堆栈向⾼地址⽣长,堆栈指针指向下⼀个要放⼊的空地址ED:空递减堆栈,堆栈向低地址⽣长EA:孔递增堆栈,堆栈向⾼地址⽣长Rn:基地址寄存器,存储初始地址!:可选后缀,有则最终地址将写回到Rn寄存器reglist:存储数据的寄存器列表,多个连续寄存器可⽤“-”链接,不连续⽤“,”分隔 STM:寄存器列表数据→内存 STM{addr_mode}{cond} Rn{!} reglistPUSH:将寄存器推⼊满递减堆栈PUSH{cond} reglistPOP:从满递减堆栈弹出寄存器信息POP{cond} reglistSWP:寄存器←→内存SWP{B}{cond} Rd,Rm,[Rn]B:可选字节,有B则交换字节否则交换32位的字cond:执⾏条件Rd:从内存中加载数据的寄存器Rm:写⼊数据的到内存的寄存器Rn:需要交换数据的存储器地址。

第6章(Thumb指令集及其伪指令)

第6章(Thumb指令集及其伪指令)
b.高或低寄存器的ADD指令(可以使用R8-R15) • 格式:ADD Rd, Rm
• 说明:
a.参数限制:Rd和Rm均为R0~R15 b.对条件标志位的影响:Rd和Rm均为R0~R7时更新N、Z、 C和V,其他情况不影响 • 举例:ADD R3,R8
第6章 Thumb指令集及其伪指令
c.PC或SP相对偏移的ADD指令
第6章 Thumb指令集及其伪指令
2.4.3.3 LSR • 格式: LSR Rd,Rs LSR Rd,Rm,#expr • 说明: a.参数限制:Rd、Rs和Rm均为R0~R7,#expr为1~32 b.对条件标志位的影响:更新N、Z和C(若位移量为零则不影 响C) c.若位移量为32,则Rd清零,最后移出的位保留在C中;若位 移量大于32,则Rd和C均被清零 • 举例: LSR R3,R0 LSR R5,R2,#2
1.1 Thumb的特点
为了兼容数据总线宽度为16位的应用系统,ARM体系结构支 持Thumb指令集。 它是ARM指令集的一个子集,自身不是一个完整的体系结构, 不能指望处理器只执行Thumb指令而不支持ARM指令集。
一般而言,Thumb指令用来实现通用功能,必要时借助完善的
ARM指令集。
第6章 Thumb指令集及其伪指令
第6章 Thumb指令集及其伪指令
• 举例(实现64位加法):
ADD R0,R2
ADC R1,R3 2.4.2.3 SUB a.低寄存器的SUB指令 • 格式:
SUB Rd,Rn,Rm
SUB Rd,Rn,#expre3
SUB Rd,#expre8
第6章 Thumb指令集及其伪指令
• 说明:
a.参数限制:
b.Thumb状态下数据处理指令访问R8-R15会受到一定限制
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Thumb指令集和ARM指令集的对比
Thumb指令
Thumb指令可以看做是ARM指令压缩形式的子集,是针对代码密度的问题而提出的,它具有16位的代码密度。

Thumb不是一个完整的体系结构,不能指望处理程序只执行Thumb指令而不支持ARM指令集。

因此,Thumb指令只需要支持通用功能,必要时,可借助完善的ARM指令集,例如:所有异常自动进入ARM状态。

在编写Thumb指令时,先要使用伪指令CODE16声明,而且在ARM指令中要使用BX指令跳转到Thumb指令,以切换处理器状态。

编写ARM指令时,可使用伪指令CODE32声明。

代码密度:单位存储空间中包含的指令的个数。

例如
ARM指令是32位的,而Thumb指令时16位的,如果在1K的存储空间中,可以放32条ARM指令,就可以放64条Thumb指令,因此在存放Thunb 指令时,代码密度高。

Thumb指令集与ARM指令集的区别
Thumb指令集不是完整的指令集,它是ARM指令集的子集。

但是Thumb 指令具有更高的代码密度,即占用存储空间小,仅为ARM代码规格的65%,但其性能却下降的很少。

所以,Thumb指令集使ARM处理器能应用到有限的存储带宽,并且,代码密度要求很高的嵌入式系统中去。

Thumb指令集没有协处理器指令、信号量指令以及访问CPSR或SPSR的指令,没有乘加指令及64位乘法指令等,且指令的第二操作数受到限制;除了跳转指令B有条件执行功能外,其他指令均为无条件执行;大多数Thumb数据处理指令采用2地址格式。

Thumb指令集与ARM指令集的区别一般有如下几点:
1. 跳转指令
程序相对转移,特别是条件跳转与ARM代码下的跳转相比,在范围上有更多的限制,转向子程序是无条件的转移。

2. 数据处理指令
数据处理指令是对通用寄存器进行操作,在大多数情况下,操作的结果须放入其中一个操作数寄存器中,而不是第三个寄存器中。

数据处理操作比ARM状态的更少,访问寄存器R8—R15受到一定限制。

(除MOV和ADD指令访问寄存器R8—R15外,其他数据处理指令总是更新CPSR中ALU状态标志)访问寄存器R8—R15的Thumb数据处理指令不能更新CPSR中的ALU状态标志。

3. 单寄存器加载和存储指令
在Thumb状态下,单寄存器加载和存储指令只能访问寄存器R0—R7
4. 批量寄存器加载和存储指令
LDM和STM指令可以将任何范围为R0——R7的寄存器子集加载或存
储。

PUSH 和POP 指令使用堆栈指令R13 作为基址实现满递减堆栈.除
R0~R7 外,PUSH 指令还可以存储链接寄存器R14,并且POP 指令可以加载
程序指令PC
Thumb指令集与ARM指令集效用分析
在ARM处理器中,内核同时支持32位的ARM指令和16位的Thumb令。

对于ARM指令来说,所有的指令长度都是32位,并且执行周期大多为单周期,指令都是有条件执行的。

而thumb指令的特点如下:
1.指令执行条件经常不会使用;
2.源寄存器与目标寄存器经常是相同的;
3.使用的寄存器数量比较少;
4.常数的值比较小;
5.内核中的桶式移位器(barrel shifter)经常是不使用的;
一.目标代码大小(密度)
16位的Thumb指令一般可以完成和32位ARM相同的任务。

当用户使用C程序来处理应用时,如果编译为Thumb指令,那么它的目标代码大小只有编译为ARM指令时的65%左右,这样就增加了指令密度。

一般认为:
Thumb代码所需的存储空间约为ARM代码的60%~70%。

Thumb代码使用的指令数比ARM代码多约30%~40%。

二.性能
1、在存储器是32位的情况下,ARM性能略好
这是因为同样的代码编译的结果Thumb指令将会比ARM多30%-40%,Thumb 指令仍旧花费同样指令周期来从32-bit块内存预取。

2、在16-bit内存上,即使有比ARM多的代码,这时Thumb性能也较好
这是因为Thumb每一条指令预取需要一个周期而每条ARM指令需要两个周期,因此尽管thumb指令比arm指令要多,但是依然比arm要快。

另外,在16-bit内存上,Thumb的性能降低了;这是因为数据去操作和特殊的堆栈操作,即使在Thumb下,堆栈操作仍是32-bit操作,导致低的性能
在 16-bit内存架构上。

一个改进的方法是提供32-bit的内存来放置堆栈。

在这种情况下的性能提高到了32-bit内存架构的水平。

主要的差别是因为使用的整型的(32-bit)全局数据将仍被存储在16-bit内存上。

另外,与ARM代码相比较,使用Thumb代码,存储器的功耗会降低约30%。

相关文档
最新文档