第3章Thumb-2指令系统4H解析
B45-4.5.2.Thum-2指令集详解
.W后缀指定32 位指令,使用“.N”指定16位指令。
如果没有给出后缀,汇编器会先试着用16 位指令以缩小代码体积,如果不 行再使用32 位指令。因此,使用“.N”其实是多此一举,不过汇编器可能仍然 允许这样的语法。
对于艺高胆大的玩家来说,使用以PC 为目的寄存器 的MOV 和LDR 指令也可以实现转移,并且往往能借此实 现很多常人想不到的绝活,常见形式有:
MOV PC, R0 ;转移地址由R0 给出 LDR PC, [R0] ;转移地址存储在R0 所指向的存储器中 POP {…,PC} ;把返回地址以弹出堆栈的风格送给PC,
BEQ.W label
这些条件组合还可以用在If‐Then 语句块中,比如:
CMP R0, R1
;比较R0,R1
ITTET GT
;If R0>R1 Then(T代表Then,E代表Else)
MOVGT R2, R0
MOVGT R3, R1
MOVLE R2, R0
MOVGT R3, R1
在CM3 中,下列指令可以更新PSR 中的标志: •������ 16 位算术逻辑指令 •������ 32 位带S 后缀的算术逻辑指令 •������ 比较指令(如,CMP/CMN)和测试指令(如TST/TEQ) •������ 直接写 PSR/APSR (MSR 指令)
LDR R0, =address1 ; R0= 0x4000
…
address1
0x4000: DCD 0x0
第三章第二节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。
第3章 Thumb-2指令系统
⑥ Thumb代码和标准ARM代码不能混杂使用,必须显 式地在两种工作状态间进行切换,这迫使程序员必须 将所有的16位代码与32位代码分开并隔离到独立的模 块中。
1. 概述(续)
对于ARM体系架构的来说(续):
⑦ 其次,两种工作状态之间来回切换需要消耗时间, 导致代码运行速度降低大约15%,不仅要增加代码, 而且还需要几十个前导(preamble)以及后同步指令 (postamble)来组织指针并清空CPU的流水线。
4. Cortex-M3常用的Thumb-2指令集(续)
(1)数据传送指令(续)
MRS/MSR 用于特权级别条件下访问特殊功能寄 存器。指令语法如下:
MRS <Rn>, <SReg> ; 加载特殊功能寄存器的值到Rn MSR <Sreg>,<Rn> ; 存储Rn 的值到特殊功能寄存器
其中,SReg 可以是下表中的一个。
2. Thumb-2指令集分类(续)
• 基于 Thumb-2 指令体系架构编写的代码在执 行 过 程 中 , 处 理 器 不 存 在 ARM 工 作 状 态 和 Thumb工作状态之间的切换。
• 那么,处理器必须能够自动识别当前指令长 度,是16-bit还是32-bit,以正确地执行Thumb2指令代码,它是如何识别呢?
⑧ 虽然Thumb指令能够实现较高密度的代码,缓存使 用效率更高,但实现ARM指令代码的功能往往需要较多 的Thumb指令代码,相比较而言,ARM指令使用起来更 灵活。
1. 概述(续)
• Thumb-2并不是Thumb的升级 • 它是另起炉灶,继承并集成了传统的Thumb指 令集和ARM指令集的各自优点,可以完全代 替Thumb和原先的ARM指令集, • 是Thumb指令集和ARM指令集的一个超集。 • Thumb-2指令集体系架构,无需处理器进行工 作状态的显示切换,就可运行16位与32位混合 代码。 • 与ARM体系架构相比,速度提高大约15%到 20%。
第3章 Thumb-2指令系统4H
LDR R1,[R2]
5、基址寻址
• 就是将基址寄存器的内容与给出的偏移量相加,形成 操作数的有效地址。用于查表、数组操作、功能部件 寄存器访问等。例: LDR R2,[R3,#0x0C];读R3+0x0C地址上的存储单元的值存R2
0x4000000C
0xAA
将R3+0x0C作为 R3 0x40000000 地址装载数据 R2 0xAA 0x55 LDR R2,[R3,#0x0C]
堆栈寻址
所以可以组合出四种类型的堆栈方 式: 向上生长的满栈、向上生长的空栈、 向下生长的满栈、向下生长的空栈。
Cortex-M3向下生长的满栈模型。
例: STMDB SP!, {R1-R7, LR} ; 将R1~R7、LR 入栈 LDMIA SP!, {R1-R7, PC} ; 出栈,到R1~R7、LR 寄存器
<指令码><目标寄存器>,<第一操作数>[,<第二操作数>]
Cortex-M3处理器支持8种基本寻址方式: –1、寄存器寻址 –2、立即寻址 –3、寄存器移位寻址 –4、寄存器间接寻址 –5、基址寻址 –6、多寄存器寻址 –7、堆栈寻址 –8、相对寻址
1、寄存器寻址
• 指令中的地址码字段(第一或第二操作数)给出的 是寄存器编号,操作数的值在寄存器中,指令执行 时直接取出寄存器值来操作。例: MOV R1,R2 ;将R2的值存入R1
3.1 Thumb-2指令集简介
Cortex-M3处理器使用的是Thumb-2指令集的子集,它的指 令工作状态只有Thumb-2状态。 Thumb-2继承了传统的Thumb指令集和ARM指令集的各自优 点,并不是Thumb的升级,包含16-bit指令集和32-bit指 令集两种长度的指令子集。 Thumb-2指令集体系架构,无需处理器进行工作状态的显 示切换,就可运行16位与32位混合代码,并由同一汇编器 对其进行汇编。
B45-4.2.ARM-Thumb-Thumb2指令指令基础(2019)
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]
第三章 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指令系统
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指令系统
比较指令
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指令。
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
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>
ARM指令集、Thumb指令集、Thumb-2指令集
ARM指令集、Thumb指令集、Thumb-2指令集
MCU使⽤什么指令集主要由内核决定的,⽐如Cortex-M3使⽤的是Thumb-2指令集
ARM指令集:
编代码全部是 32bits 的,每条指令能承载更多的信息,因此使⽤最少的指令完成功能,所以在相同频率下运⾏速度也是最快的,但也因为每条指令是32bits 的⽽占⽤了最多的程序空间。
Thumb指令集:
编代码全部是 16bits 的,每条指令所能承载的信息少,因此它需要使⽤更多的指令才能完成功能,因此运⾏速度慢,但它也占⽤了最少的程序空间
Thumb-2指令集:
在前⾯两者之间取了⼀个平衡,兼有⼆者的优势,当⼀个操作可以使⽤⼀条 32bits指令完成时就使⽤ 32bits 的指令,加快运⾏速度,⽽当⼀次操作只需要⼀条16bits 指令完成时就使⽤16bits 的指令,节约存储空间。
第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是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的新指令带来的好处,新指令对性能和代码密度的改进。
如今的嵌入式系统开发者要面对各种复杂的挑战,其中就包括了如何在代码性能和系统成本之间进行平衡。
cortex-a7 thumb2指令
Cortex-A7 Thumb-2指令是ARM架构中一个非常重要的部分,它对于提高处理器的性能和效率起着至关重要的作用。
在本篇文章中,我将会从浅入深地探讨cortex-a7 thumb2指令的相关知识,并共享我个人对这一主题的理解和观点。
1. Cortex-A7 Thumb-2指令简介让我们对Cortex-A7 Thumb-2指令进行一个简要的介绍。
Thumb-2指令集是ARM架构中的一种指令集,它被设计用来取代之前的Thumb指令集,并且在处理器的性能和代码密度方面有着显著的优势。
作为Cortex-A7处理器的一部分,Thumb-2指令集在执行速度和功耗方面都有着非常出色的表现。
2. Cortex-A7 Thumb-2指令的特性接下来,让我们来详细了解一下Cortex-A7 Thumb-2指令的特性。
Thumb-2指令集采用了16位和32位指令的混合编码方式,这样既能够保持较高的代码密度,又能够提高指令的执行效率。
Thumb-2指令集还引入了一些新的指令,使得处理器能够更加高效地执行各种复杂的操作。
3. Cortex-A7 Thumb-2指令的应用Cortex-A7 Thumb-2指令在各种应用中都有着广泛的应用。
无论是在移动设备、嵌入式系统还是物联网设备中,Cortex-A7处理器都能够通过Thumb-2指令集提供出色的性能和效率。
而且,在一些对功耗和性能有着严格要求的场合,Cortex-A7 Thumb-2指令更是表现出了独特的优势。
4. 个人观点和总结就我个人来说,我认为Cortex-A7 Thumb-2指令集的出现和应用对于ARM架构的发展起到了至关重要的作用。
它不仅使得处理器的性能得到了大幅提升,还使得处理器在功耗和代码密度方面能够有着更好的表现。
Cortex-A7 Thumb-2指令集无疑是ARM架构中的一大利器,它将继续在各个领域发挥着重要作用。
Cortex-A7 Thumb-2指令集作为ARM架构中的重要组成部分,它的出现和应用对于提高处理器的性能和效率有着非常重要的意义。
三、Thumb指令
注意:进行字数据访问时,必须保证传送地址为32位对 齐。进行半字数据访问时,必须保证传送地址为16位对 齐。
• 单寄存器访问指令——相对偏移寻址
这种寻址方式是以PC或SP寄存器的内容为基址,以 一个立即数为偏移量,两者相加作为存储器的地址。指 令格式如下:
LDR LDR LDR STR Rd,[PC,#immed_8×4] Rd,label Rd,[SP,#immed_8×4] Rd,[SP,#immed_8×4]
伪指令thumb存储器访问指令助记符说明操作影响标志ldrstrrdaddressing加载存储字数据rdrnimmed54ldrhstrhrdaddressing加载存储无符号半字数据rdrnimmed52ldrbstrbrdaddressing加载存储无符号字节数据rdrnimmed51ldrshrdaddressing加载有符号半字数据rdrnrmrdrnrm为r0r7ldrsbrdaddressing加载有符号字节数据rdrnrmrdrnrm为r0r7thumb存储器访问指令?ldr和str加载存储指令根据指令的寻址方式不同可以分为以下三类
其中:Rd 表示加载或存储的寄存器。必须为R0~R7。 Rn 表示基址寄存器。必须为R0~R7。
Rm 表示内含数偏移量的寄存器,必须为R0~R7 。
• 单寄存器访问指令——寄存器偏移指令编码
L 用于区别加载( L 为1) 或存储(L为0)
指令执行的条件码:
00b:LDR/STR指令; 01b:LDRH/STRH指令; 10b:LDRB/STRB指令;
LR
PC
入栈时的可选寄存器。
出栈时的可选寄存器。
应用示例: PUSH {R0-R7,LR} ;将低寄存器R0~R7全部入栈,
4.Thumb 指令集
数据处理指令
• 数据处理指令的二进制编码如下图:
数据处理指令
•按照数据处理指令的功能,可以将其分为以下几类: 算术运算指令,它又分为以下几类:
ADD与SUB—低寄存器加法和减法 ADD—高或低寄存器 ADD与SUB—SP ADD—PC或SP相对偏移 ADC,SBC和MUL
移位和循环移位操作(ASR,LSL,LSR和ROR) 比较指令(CMP和CMN) 传送和取负指令(MOV,MVN和NEG) 测试指令(TST)
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位
•Thumb软件中断指令
•Thumb软件中断指令的二进制编码如下:
•Thumb软件中断指令的汇编格式如下: •SWI <8位立即数>;<8位立即数>为数字表达式,其取值为 0~255范围内的整数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 …
第3章 Thumb-2指令系统
3.1 Thumb-2指令集简介 3.2 Cortex-M3八种寻址方式 3.3 简单的Thumb 汇编程序 3.4 Thumb-2指令基本格式
3.3 简单的Thumb 汇编程序
;文件名:TEST1.S 使用“;”进行注释 AREA |test1.s|,CODE,READONLY;声明只读代码段 THUMB DCD __Vectors DCD Reset_Handler EXPORT __Vectors EXPORT Reset_Handler __Vectors Reset_Handler PROC ; PROC/ENDP函数起始 START MOV R0,#15 ;R0 = 15 MOV R1,#8 ; R1 =8 实际代码段 标号顶格写 ADDS R0,R0,R1; R0 = R0 + R1 B START ENDP ;此处函数起始标记可省 END 声明文件结束
0x03 0x02 0x01
0x40000008 0x40000004 0x40000000
存储器
LDMIA R1!,{R2-R4,R6} STMIA R0!,{R2-R7,R12} ;将寄存器R2~R7、R12的值 ;存到R0指向的存储单元中 ;(R0自动加4)
7、堆栈寻址
堆栈是一个按特定顺序进行存取的存储区,后进先出。 堆栈寻址是隐含的,使用一个专门的寄存器--堆栈指针SP, 指向堆栈的存储单元即栈顶,2 种堆栈方式:向上生长与 向下生长的堆栈: 0x12345678 压栈 栈顶 0x12345678 SP 向上 增长 堆栈 存储 区 向下 增长 栈底
堆栈寻址
所以可以组合出四种类型的堆栈方 式: 向上生长的满栈、向上生长的空栈、 向下生长的满栈、向下生长的空栈。
Cortex-M3向下生长的满栈模型。
例: STMDB SP!, {R1-R7, LR} ; 将R1~R7、LR 入栈 LDMIA SP!, {R1-R7, PC} ; 出栈,到R1~R7、LR 寄存器
ANDS R1,R1,R2,LSL R3 ;R2的值左移R3位,再和 R1相“与”操作,结果放入R1
可采用的移位操作
LSL逻辑左移(Logical Shift Left):寄存器中数据位低 端空出的位补0; LSR逻辑右移(Logical Shift Right):寄存器中数据位高 端空出的位补0;
嵌入式系统与应用
Embedded System Development 聊城大学 理工学院
曹银杰 caoyinjie@
第3章 Thumb-2指令系统
– 3.1 Thumb-2指令集简介 –3.2 Cortex-M3八种寻址方式 –3.3 简单的Thumb 汇编程序 –3.4 Thumb-2指令基本格式 –3.5 Cortex-M3常用的Thumb-2指令集
3、影响标志位的指令
在Cortex-M3中,下列指令将会更新 APSR 中的标志位: 16 位算术逻辑指令; 32 位带 S 后缀的算术逻辑指令; 比较指令(如CMP/CMN)和测试指令(如TST/TEQ); 直接操作 PSR/APSR 指令( MRS读和MSR写指令)。
4、第2个操作数的格式
2、指令执行条件码
使用指令条件码可以实现高效的逻辑操作,提高代码的 执行效率。不选为AL。
标志 Z==1 Z==0 C==1 C==0 N==1 N==0 V==1 V==0 C = = 1 && Z = = 0 C = = 0 || Z = = 1 N==V N!=V Z = = 0 && N = = V Z = = 1 || N ! = V — 含义 相等 不相等,与EQ相反 进位(无符号数大于或等于) 未进位(无符号数小于) 负数 非负数 溢出 没有溢出 无符号数大于 无符号数小于或等于 有符号数大于或等于 有符号数小于 有符号数大于 有符号数小于或等于 无条件执行
LDR R1,[R2]
5、基址寻址
• 就是将基址寄存器的内容与给出的偏移量相加,形成 操作数的有效地址。用于查表、数组操作、功能部件 寄存器访问等。例: LDR R2,[R3,#0x0C];读R3+0x0C地址上的存储单元的值存R2
0x4000000C
0xAA
将R3+0x0C作为 R3 0x40000000 地址装载数据 R2 0xAA 0x55 LDR R2,[R3,#0x0C]
第3章 Thumb-2指令系统
3.1 Thumb-2指令集简介 3.2 Cortex-M3八种寻址方式 3.3 简单的Thumb 汇编程序 3.4 Thumb-2指令基本格式
3.2 Cortex-M3八种寻址方式
寻址方式是根据指令中给出的地址码字段来实现寻找 真实操作数地址的方式。指令的简单格式: <opcode> <Rd>,<Rn>[,<Operand2>]
从代码中获得数据 R0 0xFF00 0x55
3、寄存器移位寻址
地址码字段(第一或第二操作数)在操作之前,先 进行移位操作。例: MOV R0,R2,LSL #3 ;R2 的值左移 3 位,结果存 R0 , ;即是R0=R2×8
逻辑左移3位
R2 R0 0x01 0x55 0x08 0x08
MOV R0,R2,LSL #3
8、相对寻址
相对寻址是基址寻址的一种变通。由程序计数器 PC提供 基准地址,指令中的地址码字段作为偏移量,两者相加 后得到的地址即为操作数的有效地址。 例: B WAITA ; 跳转到WAITA标号处,跳转范围+16MB BL SUBR1 ; 调用到SUBR1子程序,并存储返回地 ;址到LR中,其跳转范围为+16MB … SUBR1 … WAITA …
<指令码><目标寄存器>,<第一操作数>[,<第二操作数>]
Cortex-M3处理器支持8种基本寻址方式: –1、寄存器寻址 –2、立即寻址 –3、寄存器移位寻址 –4、寄存器间接寻址 –5、基址寻址 –6、多寄存器寻址 –7、堆栈寻址 –8、相对寻址
1、寄存器寻址
• 指令中的地址码字段(第一或第二操作数)给出的 是寄存器编号,操作数的值在寄存器中,指令执行 时直接取出寄存器值来操作。例: MOV R1,R2 ;将R2的值存入R1
6、多寄存器寻址
多寄存器寻址一次可传送几个寄存器值,允许一条指令 传送16个寄存器的任何子集或所有寄存器。例: LDMIA R1!,{R2-R4,R6} ; 将 R1 指向单元中的数据存到 ;R2~R4、R6中(R1自动加4) R6 0x04 0x?? 0x04 0x4000000C
R4 0x03 0x?? R3 0x02 0x?? R2 0x01 0x?? R1 0x40000000 0x40000010
立即数:#immN, –3、5、8、12、16位长度的常数表达式,如: MOVW R1,#0x1234 ; 操作数为#imm16,范围为0~65535 –由一个8 位数左移任意位而形成的常数,如: 0x3FC(0xFF<<2); –重复半字形式0x00XY00XY、0xXY00XY00、0xXYXYXYXY; Rm寄存器方式:操作数即为寄存器的数值,例: –SUB R1,R1,R2 ; R1减R2,保存到R1中 寄存器移位方式:Rm,Shift,将寄存器的移位结果作为操 作数,例移位方法如下: –ASR #n 算术右移n位(1<<n<<32); 例: –ADD R1, R1, R1, LSL #3 ;逻辑左移R1 = R1+R1×8