第3章Thumb-2指令系统4H解析
合集下载
B45-4.5.2.Thum-2指令集详解

例如: ADDS R0, #1 ;汇编器将为了节省空间而使用16 位指令 ADDS.N R0, #1 ;指定使用16 位指令(N=Narrow) ADDS.W R0, #1 ;指定使用32 位指令(W=Wide)
.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
.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。
用户文件与库文件通过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)

;到保存到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]
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指令系统

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指令。
比较指令
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指令。
- 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