第3章 Thumb-2指令系统

合集下载

第三章第二节thumb2指令集及汇编格式资料

第三章第二节thumb2指令集及汇编格式资料
该文件也包含了所有寄存器的声明
用户文件与库文件通过stm32f10x_lib.h建立关系,该文件中 定义了所有外设头文件的头文件,用于声明头文件,因此需 要include在用户的文件中
而文件stm32f10x_conf.h则指定具体的参数,用户可以对此 文件进行修改
外设的操作步骤
PPP代表任意外设 1. 在主应用文件中,声明一个结构
程序入口,而是作为主堆栈的标志 可以在设置中修改,但一般不做修改 9 .code16和code32 作为16位指令和32位指令开始的标志 等同于THUMB和ARM
10 END
END指示符告诉编译器已经到了源程序结尾。
语法格式:
END 使用说明:
每一个汇编源程序都包含END指示符,以告诉本源程 序的结束。
}
IAR的固件库
由ST公司开发,包括驱动程序和应用函数的 函数库
版本:3.4 优点:
入手快 便于开发,节约时间
缺点:
结构复杂繁琐 原理不够清晰
PPP:某一外设名称
说明
每一个外设都有一个对应的源文件: stm32f10x_ppp.c和一个对应的头文件: stm32f10x_ppp.h
硬件资源分配:
PC6----PC9分别连到4个LED,定义为 LED1~4
跑马灯实验
控制过程
点亮LED
相应管脚输出高电平 即相应管脚置1
管脚如何控制?
特殊寄e:GPIO控制
GPIO寄存器结构
GPIO寄存器结构,GPIO_TypeDef和AFIO_TypeDef,在文件
Example:GPIO控制
一、什么是GPIO?
GPIO,英文全称为General-Purpose IO ports,也就是通 用IO口。嵌入式系统中常常有数量众多,但是结构却比较 简单的外部设备/电路,对这些设备/电路有的需要CPU为 之提供控制手段,有的则需要被CPU用作输入信号。而且, 许多这样的设备/电路只要求一位,即只要有开/关两种状 态就够了,比如灯亮与灭。对这些设备/电路的控制,使 用传统的串行口或并行口都不合适。所以在微控制器芯片 上一般都会提供一个“通用可编程IO接口”,即GPIO。

B45-4.2.ARM-Thumb-Thumb2指令指令基础(2019)

B45-4.2.ARM-Thumb-Thumb2指令指令基础(2019)
;到保存到R0指定的存储单元
LDR R2,[R3,#0x0C]
• 6) 多寄存器寻址
多寄存器寻址一次可传送几个寄存器值,允许一条指令
传送16个寄存器的任何子集或所有寄存器。多寄存器寻址
指令举R6例0如x下?04?:
0x04 0x4000000C
LDMIRA4R10!x,?0{3?R2-R7,R12} 0;;x将R02R3~1指R7向0、的xR41单02元中0中0(R0的10自数0动据8 加读1出)到 STMIRA3R00!x,?0{2?R2-R7,R12} 0;x将0寄2 存器0Rx24~0R070、0R0102的4 值保
• 9) 相对寻址
相对寻址是基址寻址的一种变通。由程序计数器
PC提供基准地址,指令中的地址码字段作为偏移量,
两者相加后得到的地址即为操作数的有效地址。相
对寻址指令举例如下:
BL SUBR1
;调用到SUBR1子程序
BEQ LOOP
;条件跳转到LOOP标号处
...
LOOP MOV R6,#1
...
SUBR1...
R2 0x?01? R1 0x40000000
0;;x存(0R1到0自R0存动指0储加x向器14的)0存00储0;00单0元中
LDMIA R1!,{R2-R4,R6}
• 7 )堆栈寻址
堆栈是一个按特定顺序进行存取的存储区,操作 顺序为“后进先出” 。堆栈寻址是隐含的,它使用 一个专门的寄存器(堆栈指针)指向一块存储区域(堆 栈),指针所指向的存储单元即是堆栈的栈顶。存储 器堆栈可分为两种:
地址的存储单元中,即寄存器为操作数的地址指针。 寄存器间接寻0址x4指00令00举00例00如x下AA:
LDR R1,[R2]

第3章Thumb-2指令系统4H解析

第3章Thumb-2指令系统4H解析

3.1 Thumb-2指令集简介


Cortex-M3处理器使用的是Thumb-2指令集的子集,它的指 令工作状态只有Thumb-2状态。 Thumb-2继承了传统的Thumb指令集和ARM指令集的各自优 点,并不是Thumb的升级,包含16-bit指令集和32-bit指 令集两种长度的指令子集。 Thumb-2指令集体系架构,无需处理器进行工作状态的显 示切换,就可运行16位与32位混合代码,并由同一汇编器 对其进行汇编。

ASR算术右移(Arithmetic Shift Right):移位过程中保 持符号位不变,即若源操作数为正数,则数据位的高端空 出的位补0,否则补1;
可采用的移位操作

ROR循环右移(Rtate Right):由数据位的低端移出的位填 入数据位的高端空出的位;

RRX带扩展的循环右移(Rotate Right eXtended by 1 place):操作数右移一位,高端空出的位用原C标志值填 充。
R2 R1
0xAA 0xAA 0x55

MOV R1,R2
SUB
R0,R1,R2
;将R1的值减去R2的值,结果存R0
2、立即寻址
• 地址码字段(第一或第二操作数)直接给出是一整数 (称立即数),例: SUBS R0,R0,#1 ;R0减1结果放入R0,影响标志位
MOV R0,#0xFF000 ;将立即数0xFF000装入R0 程序存储 MOV R0,#0xFF00
条件码 EQ NE CS/HS CC/LO MI PL VS VC HI LS GE LT GT LE AL
指令执行条件码




在 Cortex-M3中,只有分支转移指令(B指令)才可以随 意使用条件码。例: BEQ label ;当 Z = = 1 时,程序转移到label 对于其它指令,只有在IF-THEN(IT)指令块中(最多4条) 才能加条件码,且必须加条件码。 IT已经带了一个T,最多再带3个T或E(与T相反的条件),T 、E排列无顺序。例: … CMP R0, R1 ; 比较R0和R1的值,影响标志位 ITTEE GT ; 下带4条指令,如R0>R1既GT成立,否则LE成立 MOVGT R2, R0 ; GT成立,则 R2 = R0 MOVGT R3, R1 ; GT成立,则 R3 = R1 MOVLE R2, R1 ; LE成立,则 R2 = R1 MOVLE R3, R0 ; LE成立,则 R3 = R0 …

第三章 ARM Thumb微处理器结构及指令系统 (2)

第三章 ARM Thumb微处理器结构及指令系统 (2)

SWP指令应用示例: SWP R1,R1,[R0] ;将R1的内容与R0指向的存储单元的内 容进行交换
SWPB R1,R2,[R0] ;将R0指向的存储单元内的容读取一字 ;节数据到R1中 (高24位清零),并将R2 ;的内容写入到该内存单元中(最低字节 ;有效)
3.2.8 协处理器指令
助记符 CDP coproc,opcode1,CRd,CRn, CRm{,opcode2} LDC{L} coproc, CRd,<地址> STC{L} coproc, CRd,<地址> 说明 操作 条件码位置 协处理器数据 取决于协 CDP{cond} 操作指令 处理器 协处理器数据 取决于协 LDC{cond}{L} 读取指令 处理器 协处理器数据 取决于协 STC{cond}{L} 写入指令 处理器 ARM寄存器到协 处理器寄存器 取决于协 MCR{cond} 的 数 据 传 送 指 处理器 令 协处理器寄存 器到ARM寄存器 取 决 于 协 MCR{cond} 到 的 数 据 传 送 处理器 指令
指令格式中,寄存器Rn为基址寄存器,装有传送数据 的初始地址,Rn不允许为R15。 后缀“!”表示最后的地址写回到Rn中。 寄存器列表reglist可包含多于一个寄存器或包含寄存器 范围,使用“,”分开,如{R1,R2,R6~R9},寄存器按 由小到大排列。 后缀“^”不允许在用户模式或系统模式下使用。若 在LDM指令且寄存器列表中包含有PC时使用,那么除了正 常的多寄存器传送外,将SPSR也拷贝到CPSR中,这可用于 异常处理返回。 使用后缀“^”进行数据传送且寄存器列表不包含PC时, 加载/存储的是用户模式的寄存器,而不是当前模式的寄 存器。
LDM和STM的主要用途是现场保护、数据复制、常数传递等

第2章 Cortex-M3 内核原理3--Thumb-2指令系统

第2章  Cortex-M3 内核原理3--Thumb-2指令系统

3. 统一的汇编语言
• ARM指令集体系架构下,ARM指令与Thumb 指令分属不同的程序模块,由不同的汇编 器对其分别进行汇编。
• Thumb-2指令集体系架构下, 16bit指令与 32bit指令可以在同一程序模块出现,并由 同一汇编器对其进行汇编。
Toolchain flow with ARM7
ARM7TDMI
r0
r1
r2
r3
State Change
r4 r5
eg. ISR entry/exit
r6
r7
r8
r8
r9
r9
r10
r10
r11
r11
rr1134r1((2slpr))rr1134r1((2slrrpr11))34
(spr)13 (lrr)14
r13 r(1s3p)(srp1)4 r(1l4r)(lr)
2. Thumb-2指令集分类(续)
• 基于Thumb-2指令体系架构编写的代码在执 行 过 程 中 , 处 理 器 不 存 在 ARM 工 作 状 态 和 Thumb工作状态之间的切换。
• 那么,处理器必须能够自动识别当前指令长 度,是16-bit还是32-bit,以正确地执行Thumb2指令代码,它是如何识别呢?
4. Cortex-M3常用的Thumb-2指令集(续)
(1)数据传送指令(续)
MRS/MSR 指令中的Sreg寄存器:
符号 IPSR EPSR APSR IEPSR IAPSR EAPSR PSR MSP PSP PRIMASK BASEPRI BASEPRI_MAX FAULTMASK CONTROL
当前服务中断号寄存器
功能
执行状态寄存器。它里面含T 位,在CM3 中T 位必须是1。 上条指令结果的标志

thumb指令系统

thumb指令系统
13
比较指令
CMP和CMN 格式:CMP Rn, Rm
CMP Rn, #expr CMN Rn, Rm 对于CMP Rn, #expr和CMN指令,Rm和Rn 必须在R0-R7之间,对于CMP Rn,Rm指令,Rm和 Rn可以是R0-R15之间 expr 立即数 为0-255 条件码标志:指令会更新N、Z、C和V标志
21
PUSH和POP 和
寄存器入栈出栈指令,实现低寄存器和可选的 LR寄存器入栈,低寄存器和可选的PC寄存器出栈操 作,堆栈地址由SP设置。 格式:PUSH {Reglist,[LR]} POP {Reglist,[PC]} 其中:Reglist入栈出栈低寄存器列表,必须在R0-R7 例:PUSH {R0-R7,LR} POP {R0-R7,PC}
22
软件中断指令
SWI
用于产生软件中断,从而实现在用户模式变换到管 理模式。CPSR保存到管理模式的SPSR,执行转移到 SWI向量。 SWI 格式为:SWI imm_8 其中imm_8 是一个8位立即数,其值为0-255
23
Thumb数据处理指令与等价的 ARM指令
ARM指令
CMP CMN TST ADDS ADDS ADDS ADCS SUBS SUBS Rn,Rm Rn,Rm Rn,Km Rd,Rn,#<#Imm3> Rd,Rd,#<#lmm8> Rd,Rn,Rm Rd,Rd,Rm Rd, Rn,#<#imm3> Rd,Rd,#<#imm8>
BX Rn
16
数据存取指令
Thumb指令集的LDR和STR可以将任何范围为 R0-R7的寄存器子集加载或存储。 批量存储器存储和加载指令只有LDMIA和 STMIA,即每次传送先存储或加载数据,然后地 址加4; 对堆栈处理只能使用PUSH和POP指令。

第3章 Thumb-2指令系统

第3章 Thumb-2指令系统
MRS <Rd>, <SReg> MSR <SReg>, <Rn>
功能描述
将8位立即数传到目标寄存器 将寄存器值传给低目标寄存器 寄存器值取反后传给目标寄存器
将12位立即数传送到寄存器中
将移位后的寄存器值传到寄存器 将16位立即数传送到寄存器的高 半字[31:16] 16位立即数传到寄存器的低半字 [15:0],将高半字[31:16]清零 读特殊功能寄存器SReg 写特殊功能寄存器SReg
LDR R2,[R3,#0x0C]
6、多寄存器寻址
多寄存器寻址一次可传送几个寄存器值,允许一条指令 传送16个寄存器的任何子集或所有寄存器。例:
LDMIA R1!,{R2-R4,R6} ;将R1指向单元中的数据存到 ;R2~R4、R6中(R1自动加4)
R6 0x0??4 R4 0x0??3 R3 0x0??2 R2 0x0??1 R1 0x400000010
存储器访问指令
LDR LDRH LDRB LDRSH LDRSB LDRD LDM<IA/FD
/DB/EA> STR STRH STRB STRD STM<IA/EA
1、数据传送指令
指令
MOV <Rd>, #<immed_8> MOV <Rd>, <Rn> MVN <Rd>, <Rm>
MOV{S}.W <Rd>, #<immed_12> MOV{S}.W <Rd>, <Rm>{,<shift>}
MOVT.W <Rd>, #<immed_16>
MOVW.W <Rd>, #<immed_16>

Thumb2指令表(中文)

Thumb2指令表(中文)

6 <prefix>ASX Rd, Rn, Rm
Rd[31:16] := Rn[31:16] + Rm[15:0], Rd[15:0] := Rn[15:0] – Rm[31:16]
G
6 <prefix>SAX Rd, Rn, Rm
Rd[31:16] := Rn[31:16] – Rm[15:0], Rd[15:0] := Rn[15:0] + Rm[31:16]
G
6 USAD8 Rd, Rm, Rs
Rd := Abs(Rm[31:24] – Rs[31:24]) + Abs(Rm[23:16] – Rs[23:16]) + Abs(Rm[15:8] – Rs[15:8]) + Abs(Rm[7:0] – Rs[7:0])
6 USADA8 Rd, Rm, Rs, Rn
并累加
Saturate 饱和
有符号饱和字的右移 有符号饱和字的左移 有符号的两个半字饱和
无符号饱和字的右移 无符号饱和字的左移 无符号的两个半字饱和
§ 指令格式
S更新位
作用
备注
ADD{S} Rd, Rn, <Operand2>
N Z C V Rd := Rn + Operand2
N
ADC{S} Rd, Rn, <Operand2>
Rd := SAT(Rm + SAT(Rn * 2))
Q
SUB{S} Rd, Rn, <Operand2>
N Z C V Rd := Rn – Operand2
N
SBC{S} Rd, Rn, <Operand2>

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

2019最新Thumb-2指令集

2019最新Thumb-2指令集

ARM ® 和 Thumb ®-2 指令集 快速参考卡进位相对于当前指令的范围为 0-4095加倍:(进位)(进位)的范围为 0-4095,Rd[15:0加倍:(当前模式),Rd[23:16,Rd[7:0] := R ,Rd[15:0],Rd[23:1,Rd[7:0] := R ,Rd[15:0],Rd[15:0]。

<sat> 的,。

<sat> 的。

<sat 。

<sat>,。

<sat>。

<sat>(如果 Rm 请参阅移位为 S不受影响,imm16,imm16 范围为与 MOV{S 与 MOV{S}与 MOV{S}与 MOV{S 与 MOV{S}标记标记CPSR 标记CPSR 标记复制 ( Rn[width+复制 ( 0 )sh 的范围为 0-3。

,。

sh 的范围为 0-3。

sh 的范围为 1-sh 的范围为 0-3。

,的范围为 0-3。

的范围为 0-3。

sh 的范围为的范围为 0-3。

的范围为 0-3。

,。

sh 的范围为。

sh 的范围为,。

sh 的范围为。

sh 的范围为。

sh 的范围为,Rd[,R ±32MB (T2: ±16MB Rm[0] 为 0,目标T ,则后续指,T: -252 - +256B )的选择方法与 GE + 4-130)。

为 1,更改为 Th 。

跳转范围为 4-。

跳转范围为 4-512。

BE (大端)或 LE (小5T :当 [address][0] 为CPSR := SPSR 。

仅Rd 、Rn 不中。

仅限特权模式。

Rd1、Rd2[Rn] := Rm[7:0],清除独,清除独占标记Rd := 0。

否则,否则,为 -255 到的范围为 0 到 3的倍数。

0 到 1020 范围16 位的位域。

,Rd := temp 0 到 1020 范围SMI 。

SWI 。

NOP 。

NOP 。

第3章2 Thumb指令集

第3章2 Thumb指令集

Thumb指令集没有协处理器指令、单寄存器交换
指令、乘加指令、64位乘法指令以及程序状态寄 存器处理指令,而且指令的第2操作数受到限制。 除了转移指令B有条件执行功能外,其他指令均 为无条件执行。 Thumb是一个不完整的体系结构,不能指望处理 器只执行Thumb代码而不支持ARM指令集。
(二)状态切换 1、ARM状态进入Thumb状态的方法
4)ADD– PC或SP相对移位
格式:ADD Rd, Rp, #expr; Rd取低寄存器;Rp是PC或SP; expr汇编时 取0—1020范围内4的整数倍。 用法:把expr值加到Rp的值中,结果放到 Rd。指令运行不影响条件码标志。若Rp是 PC,则使用值是(当前指令地址+4)。 例: ADD R6, SP, #64; ADD R2, PC, #980;



2. 多寄存器读取和存储指令
Thumb多寄存器传送类指令和ARM有相同的指 令格式 块拷贝指令只有LDMIA和STMIA寻址模式。 寄存器是R0—R7. 例: LDMIA R3!, {R0,R4}; LDMIA R5!, {R0-R7}; STMIA R0!, {R6,R7}; STMIA R3!, {R3,R5,R7};
PC,LR ;当返回地址保存在LR时 STMFD SP!,{<registers>,LR} ;当返回地址保存在堆栈时,
MOV
…… ……
;进入异常后将R14入栈, ;假设异常前执行的是Thumb指令,PC保存于LR中
LDMFD SP!,{<registers>,PC}
;返回指令

2、 Thumb状态进入ARM状态的方法
八、软件中断指令SWI

Thumb-2指令集

Thumb-2指令集

Thumb-2指令集Thumb-2真不愧是一个突破性的指令集。

它强大,它易用,它轻佻,它高效。

Thumb-2是16位Thumb指令集的一个超集,在Thumb-2中,16位指令首次与32位指令并存,结果在Thumb状态下可以做的事情一下子丰富了许多,同样工作需要的指令周期数也明显下降。

从图中可见,Cortex-M3勇敢地拒绝了32位ARM指令集,却把自己的处理能力以身相许般地全托给Thumb-2指令集。

这可能有些令人意外,但事实上这却见证了Cortex-M3的用情专一:在内核水平上,就已经为适应单片机和小内存器件而抉择、取舍过了。

但她没有嫁错郎,因为Thumb-2完全胜任在这个领域挑大梁。

不过,这也意味着Cortex-M3作为新生代处理器,不是向后兼容的。

因此,为ARM7写的ARM汇编语言程序不能直接移植到CM3上来。

不过,CM3支持绝大多数传统的Thumb指令,因此用Thumb指令写的汇编程序就从善如流了。

在支持了both 16位和32位指令之后,就无需烦心地把处理器状态在Thumb和ARM之间来回的切换了。

这种事在ARM7和ARM9是司空见惯的,尤其是在使用大型条件嵌套,以及执行复杂运算的时候,能精妙地移形换影于不同状态之间,那可是当年要成为大虾的基本功。

Cortex-M3是ARMv7架构的掌上明珠。

和曾经红透整个业界的老一辈ARM7相比,Cortex-M3则是新生代的偶像,处处闪耀着青春的光芒活力。

比如,硬件除法器被带到CM3中;乘法方面,也有好几条新指令闪亮登场,用于提升data-crunching的性能。

CM3的出现,还在ARM处理器中破天荒地支持了“非对齐数据访问支持”。

[摘要]主要是介绍ARM CPU中的THUMB-2功能,相对于THUMB的比较THUMB-2指令集的扩展,THUMB-2的新指令带来的好处,新指令对性能和代码密度的改进。

如今的嵌入式系统开发者要面对各种复杂的挑战,其中就包括了如何在代码性能和系统成本之间进行平衡。

第3章 Thumb2指令系统

第3章 Thumb2指令系统
• 按照指令的长度分类,Thumb-2指令集可分 为两种:
(1)16-bit指令集; (2)32-bit指令集。
2. Thumb-2指令集分类(续)
• 按功能和寻址方式分类
(1)数据传送指令 (2)Load/Store指令 (3)批量Load/Store指令 (4)算术四则运算指令 (5)逻辑操作指令 (6)移位和循环指令 (7)符号扩展指令 (8)字节调序指令REV, REVH,REV16,REVSH (9)位域处理指令 (10)子程序调用与无条件转移指令 (11)隔离(barrier)指令 (12)饱和运算指令 (13) If‐Then指令 (15)比较跳转指令等
User
Register File
Optimized
Code which operates on the visible Register file
C/C++ Files
•指令长度的确定
PC寄存器指向的半字中,Bits<15:11>决定该半字是16bit指令,还是属于32-bit指令的一部分。图3-1说明了 Bits<15:11>确定指令长度的功能。
2. Thumb-2指令集分类(续)
• 不同指令长度的Bits<15:11>编码格式
Halfword1 Bits<15:11> 0b11100
• Thumb-2指令集体系架构下, 16bit指令与 32bit指令可以在同一程序模块出现,并由 同一汇编器对其进行汇编。
Toolchain flow with ARM7
ARM7TDMI
r0
r1
r2
r3

State Change
r4 r5

Thumb-2汇编伪操作命令集

Thumb-2汇编伪操作命令集

Thumb-2汇编伪操作命令集1.符号定义伪操作(定义变量,变量赋值,寄存器取别名相关)操作符功能语法格式LCLA定义一个局部的算术变量并初始化为0LCLA变量名(定义的)LCLL定义一个局部的逻辑变量并初始化为FALSE(false)LCLL变量名(定义的)LCLS定义一个局部的字符串变量并初始化为空串LCLS变量名(定义的)GBLA定义一个全局的算术变量并初始化为0GBLA变量名(定义的)GBLL定义一个全局的逻辑变量并初始化为FALSE(false)GBLL变量名(定义的)GBLS定义一个全局的字符串变量并初始化为空串GBLS变量名(定义的)SETA给一个算术变量(全局或局部)赋值变量名SETA变量值SETL给一个逻辑变量(全局或局部)赋值变量名SETL变量值SETS给一个字符串变量(全局或局部)赋值变量名SETS变量值RLIST给一个通用寄存器列表定义名称(定义的)名称RLIST{寄存器列表}VFP矢量浮点预算SN给一个单精度VFP寄存器定义名称(定义的)名称SN VFP寄存器编号DN给一个双精度VFP寄存器定义名称(定义的)名称DN VFP寄存器编号FN FPA给一个FPA浮点寄存器定义名称(定义的)名称FN FPA浮点寄存器编号CP给一个协处理器定义名称(定义的)名称CP协处理器编号CN给一个协处理器的寄存器定义名称(定义的)名称CN协处理器寄存器编号注意:1.(与RLIST相关)在LDM/STM指令中,寄存器列表中的寄存器访问次序总是先访问编号低的寄存器再访问编号高的寄存器。

2.(与SN,DN相关)VFP寄存器编号:单精度寄存器编号范围0-31,双精度寄存器编号范围0-15。

(D0-D15),(S0-S15)不能再用,因为汇编器已经预先定义了。

3.(与FN相关)FPA否点寄存器编号范围0-7。

(F0-F7)不能再用,因为汇编器已经预先定义了。

4.(与CP相关)协处理器编号范围0-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
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

• PC寄存器所指向半字的Bits<15:11>的编码格式决定了 CPU所处理指令的长度。 • Thumb-2指令集空间被划分为16-bit 和32-bit 两个子集。 其中,x原则上可以为“0”、“1”任意值,但x 的取值 不能使得0b111xx=0b11100,以及0bxxxxx=0b111xx或者 0bxxxxx=0b11100。
ARM Cortex-M3 Toolchain Flow
ARM Cortex-M3
r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 (psp) r13(msp) r14 (lr) r14 (lr) r15 (pc) cpsr spsr
No State Change: Automated by NVIC
指令 MOV <Rd>, #<immed_8> MOV <Rd>, <Rn> MOV <Rd>, <Rm> MVN <Rd>, <Rm> MOV{S}.W #<modify_constant(immed_12)> MOV{S}.W <Rd>, <Rm>{, <shift>} MOVT.W <Rd>, #<immed_16>
功能描述
从地址 Rn+offset 处读取一个字节到Rd 从地址Rn+offset 处读取一个半字到Rd 从地址Rn+offset 处读取一个字到Rd 从地址Rn+offset 处读取一个双字(64 位整数) 到Rd1(低32 位)和Rd2(高32 位)中。 把Rd 中的低字节存储到地址Rn+offset 处 把Rd 中的低半字存储到地址Rn+offset 处 把Rd 中的低字存储到地址Rn+offset 处 把Rd1(低32 位)和Rd2(高32 位)表达的 双字存储到地址Rn+offset 处
(1)16-bit指令集; (2)32-bit指令集。
2. Thumb-2指令集分类(续)
• 按功能和寻址方式分类
(1)数据传送指令 (2)Load/Store指令 (3)批量Load/Store指令 (4)算术四则运算指令 (5)逻辑操作指令 (6)移位和循环指令 (7)符号扩展指令 (8)字节调序指令REV, REVH,REV16,REVSH (9)位域处理指令 (10)子程序调用与无条件转移指令 (11)隔离(barrier)指令 (12)饱和运算指令 (13) If‐Then指令 (15)比较跳转指令等
ARM7TDMI
r0 r1 r2 r3 r4 r5 r6 r7 r8 r8 r9 r9 r10 r10 r11 r13 (sp) r11 r13 r13 (sp)(sp) r12 r13 (sp) r12 r14 (lr) r13 (sp) r14 r14 (lr)(lr) r13 (sp) r14 (lr) r14 (lr) r14 (lr) r15 (pc) spsr spsr spsr spsr spsr cpsr
Halfword1 Bits<15:11> 0b11100 (xx≠00) (xxxxx≠111xx) 功能 16-bit 无条件分支Thumb-2指 令, 在所有Thumb-2体系结构 中定义 32-bit Thumb-2 指令, 在 Thumb-2中定义 16-bit Thumb -2指令
0b111xx 0bxxxxx
4. Cortex-M3常用的Thumb-2指令集(续)
(1)数据传送指令(续)
MRS/MSR 用于特权级别条件下访问特殊功能寄 存器。指令语法如下:
MRS <Rn>, <SReg> ; 加载特殊功能寄存器的值到Rn MSR <Sreg>,<Rn> ; 存储Rn 的值到特殊功能寄存器
其中,SReg 可以是下表中的一个。
1. 概述(续)
• Cortex-M3处理器使用的指令集是Thumb-2 指令集的子集,它的(指令)工作状态只 有一个,那就是Thumb-2状态。
• Cortex-M3处理器的两种工作状态:
① Thumb-2状态 ② 调试状态
2. Thumb-2指令集分类
• 按照指令的长度分类, Thumb-2 指令集可 分为两种:
2. Thumb-2指令集分类(续)
• 指令长度的确定
PC寄存器指向的半字中,Bits<15:11>决定该半字是16bit指令,还是属于32-bit指令的一部分。图3-1说明了 Bits<15:11>确定指令长度的功能。
2. Thumb-2指令集分类(续)
• 不同指令长度的Bits<15:11>编码格式
Thumb-2指令系统 (Thumb-2指令体系架构)
主要内容
1. 2. 3. 4. 5. 概述 Thumb-2指令集分类 统一的汇编语言 Cortex-M3常用的Thumb-2指令集 小结
1. 概述
• 对于确定的微处理器而言,编写紧凑的代 码以降低消耗显得至关重要。
• 通常,存储器的大小是固定的,而产品的 功能特性却各异,选择恰当的处理器并精 心调整代码是明智的。
(Hand Optimized Code / Previously Written 32-Bit ARM Assembler Files)
User/System Register File
Unified Assembler Language
ASM (UAL)
Unified Assembler Thumb(2) C/C++ Compiler
⑥ Thumb代码和标准ARM代码不能混杂使用,必须显 式地在两种工作状态间进行切换,这迫使程序员必须 将所有的16位代码与32位代码分开并隔离到独立的模 块中。
1. 概述(续)
对于ARM体系架构的来说(续):
⑦ 其次,两种工作状态之间来回切换需要消耗时间, 导致代码运行速度降低大约15%,不仅要增加代码, 而且还需要几十个前导(preamble)以及后同步指令 (postamble)来组织指针并清空CPU的流水线。
3. 统一的汇编语言
• ARM指令集体系架构下,ARM指令与Thumb 指令分属不同的程序模块,由不同的汇编 器对其分别进行汇编。 • Thumb-2指令集体系架构下, 16bit指令与 32bit指令可以在同一程序模块出现,并由 同一汇编器对其进行汇编。
Toolchain flow with ARM7
Code which operates on the visible Register file
C/C++ Files
4. Cortex-M3常用的Thumb-2指令集
(1)数据传送指令
Cortex-M3 中的数据传送类型包括:
① 两个寄存器间传送数据 ② 寄存器与特殊功能寄存器间传送数据 ③ 把一个立即数加载到寄存器
State Change eg. ISR entry/exit
ASM
NB: Most compilers automatically provide the Assembler code stubs shown here, allowing majority of code in High Level ‘C’ language Assembler
4. Cortex-M3常用的Thumb-2指令集(续)
(2)Load/Store指令
指令
LDRB Rd, [Rn, #offset] LDRH Rd, [Rn, #offset] LDR Rd, [Rn, #offset] LDRD Rd1, Rd2, [Rn, #offset] STRB Rd, [Rn, #offset] STRH Rd, [Rn, #offset] STR Rd, [Rn, #offset] LDRD Rd1, Rd2, [Rn, #offset]
2. Thumb-2指令集分类(续)
• 基于 Thumb-2 指令体系架构编写的代码在执 行 过 程 中 , 处 理 器 不 存 在 ARM 工 作 状 态 和 Thumb工作状态之间的切换。
• 那么,处理器必须能够自动识别当前指令长 度,是16-bit还是32-bit,以正确地执行Thumb2指令代码,它是如何识别呢?
1. 概述(续)
对于ARM体系架构的来说(续):
⑤ 但是,有限的Thumb指令仅对基本的算术和逻辑操 作有用:
Thumb状态下,处理器将仅可使用有限数量的寄存器, R8-R12的使用受到限制, 无法完成诸如处理中断、长跳转、原子存储器(atomic memory)操作,或协处理器操作等等复杂任务, 也无法像ARM模式那样进行条件执行和移位或循环移 位等操作。
1. 概述(续)
对于ARM体系架构的来说:
① 微处理器有两种工作状态:
ARM工作状态 Thumb工作状态
② Thumb指令集是添加到ARM的标准RISC指令集之上 的独立指令集;
③ Thumb指令集包括了基本的加法、减法、循环移位 以及跳转等大约36条16位指令; ④ Thumb指令集作为ARM指令集的压缩方案,简洁、 有效,应用广泛并得到很好的支持,通过Thumb指 令替换ARM指令,可以将某些代码的规模减小大约 20%到30%。
MOVW.W <Rd>, #<immed_16> MRS<c> <Rd>, <psr> MSR<c> <psr>_<fields>,<Rn>
功能描述 将8 位立即数传送到目标寄存器 将低寄存器值传送给低目标寄存器 将高或低寄存器值传送给高或低目标寄存器 将寄存器值取反后传送给目标寄存器
相关文档
最新文档