1 TM 1 大大大大大大大大大大 大大 大大大 409 Tel : 87571521 E_mail: [email protected] 大大大大:《 ARM 大大大大 大大大大大 统 》 大大大大大大大 2009 大 3 大大大 ARM 嵌嵌嵌嵌 嵌嵌嵌嵌嵌 统
Feb 14, 2016
1TM 1
大连理工大学软件学院 邱铁办公楼 409
Tel: 87571521E_mail: [email protected]
参考教材:《 ARM 嵌入式系统结构与编程 》 清华大学出版社 2009年 3 月出版
ARM 嵌入式系统结构与编程
2TM
第 4 章 ARM 指令集系统ARM 微处理器的指令集可以分为数据处理指令、跳转指令、程序状态寄存器( PSR )处理指令、加载 / 存储指令、协处理器指令和杂类指令六大类。本章将分类介绍 ARM 指令语法格式、指令编码格式和 ARM 指令的详细功能。
3TM 3
内容提要4. 1 数据处理指令4. 2 ARM 分支指令4. 3 加载 / 存储指令4. 4 批量加载 / 存储指令4. 5 交换指令4. 6 程序状态寄存器 PSR 访问指令4. 7 协处理器操作指令4. 8 异常产生指令
4TM 4
4.3 加载 / 存储指令
用于操作 32 位的字类型数据以及 8 位无符号的字节类型数据;
用于操作 16 位半字类型数据和 8 位的有符号字节类型数据。
5TM 5
4. 3. 1 加载 / 存储字、无符号字节指令 1 . LDR/STR 指令 LDR{cond} Rd, <addressing>
STR{cond} Rd, <addressing>
LDR{cond}T Rd, <addressing>
STR{cond}T Rd, <addressing>
6TM 6
7TM 7
2 . LDRB/STRB 指令 LDR{cond}B Rd, <addressing>
STR{cond}B Rd, <addressing>
LDR{cond} BT Rd, <addressing>
STR{cond}BT Rd, <addressing>
8TM 8
015161924252631 28 27
cond I LW Rn0 1
21 20 12
Rd
11
addressing_mode1
2223
UP
操作执行操作执行
写操作不执行基地址寄存器回操作执行基地址寄存器回写
值减去地址偏移量为基址寄存器内存地址值加上地址偏移量为基址寄存器内存地址
后变址操作前变址操作
位立即数偏移量为式偏移量为寄存器移位形
为指令执行的条件
StoreLoad
L
W
RnaddressRnaddress
U
P
I
。cond
:0:1
:0:1
:0:1
:0:1
12:0:1
9TM 9
4. 3. 2 半字、有符号字节访问指令 半字数据访问指令用于内存中的数据与寄存器低 16位数据进行操作,有符号字节访问指令可实现向寄存器加载 8 位的有符号字节数据。 对于向寄存器加载无符号半字数据,寄存器的高 16位 bits[31:16] 清零;
对于向寄存器加载有符号半字数据,寄存器的高 16位 bits[31:16] 用符号位扩展为 32 位;
对于向寄存器加载有符号字节数据,寄存器的高 24位 bits[31:8] 用符号位扩展为 32 位。
10TM 10
LDR{cond}H Rd, <addressing >
STR{cond}H Rd, <addressing >
LDR{cond}SH Rd, <addressing >
LDR{cond}SB Rd, <addressing >
11TM 11
偏移量为立即数的指令编码类型S H 汇编语法格式 0 1 LDR{cond}H Rd,<addressing >
STR{cond}H Rd,<addressing > 1 0 LDR{cond}SB Rd, <addressing > 1 1 LDR{cond}SH Rd,<addressing >
12TM 12
ARM 微处理器所支持批量数据加载 / 存储指令可以一次性实现一片连续的存储器单元和多个寄存器之间进行传送数据。
批量数据加载指令用于将一片连续的存储器中的数据传送到多个寄存器中,批量数据存储指令能够实现将多个寄存器中的内容一次性的存放到一片连续的存储器中。
13TM 13
基本批量字数据加载 / 存储指令 批量加载: LDM {<cond>}<addr_mode> <Rn> {!},
<registers>
批量存储: STM {<cond>}<addr_mode> <Rn> {!},
<registers>
14TM 14
操作执行操作执行
写操作不执行基地址寄存器回操作执行基地址寄存器回写
地址向下变化地址向上变化
表示地址变化的方向
后变址操作前变址操作
为指令执行的条件
StoreLoad
L
W
downwardsupwards
U
U
P
。cond
:0:1
:0:1
)(:0)(:1
:
:0:1
15TM 15
注意事项: * Rn 不允许为程序计数器 PC( R15 ) * 指令中寄存器和连续内存地址单元的对应关系:编号低的寄存器对应内存低地址单元,编号高的寄存器对应内存高地址单元。 * 如果指令中基址寄存器 <Rn> 在寄存器列表
<registers> 中,而且指令中寻址方式指定指令执行后更新基址寄存器 <Rn> 的值,则指令执行会产生不可预知的结果。
16TM 16
示例解析 MOV R1, #0x9000
MOV R0, #0x11
MOV R2, #0x22
MOV R3, #0x33
MOV R4, #0x44
MOV R5, #0x55
STMDB R1! ,{R0,R2-R5}
17TM 17
存储情况如下
18TM 18
用户模式下的批量字数据加载 / 存储指令 用户模式下的批量字数据加载 / 存储指令操
作实现的操作是:即使处理器工作在特权模式下,存储系统也将访问看成是处理器在用户模式下,因此所加载 / 存储的寄存器组为用户模式下的寄存器。该指令寄存器列表中不包含程序计数器 PC ,不允许对基地址寄存器回写操作。
19TM 19
用户模式下的批量字数据加载 / 存储指令汇编语法格式为
批量加载:LDM {<cond>}<addr_mode> <Rn> , <registers_without_pc>^
批量存储:STM {<cond>}<addr_mode> <Rn> , <registers_without_pc>^
20TM 20
带 PSR 操作的批量字数据加载指令 在带 PSR 操作的批量字数据加载指令中,程
序计数器 PC 包含在指令寄存器列表中。 该指令将数据从连续的内存单元中读取到指
令中寄存器列表中的各寄存器中。它同时将目前处理器模式对应的 SPSR 寄存器内容复制到 CPSR 寄存器中。
21TM 21
批量加载:LDM {<cond>}<addressing_mode> <Rn> {!}, <registers_with_pc>^
批量存储:STM {<cond>}<addressing_mode> <Rn> {!}, <registers_with_pc>^
22TM 22
示例解析: 如何用带 PSR 操作的批量字数据加载指令实现 IRQ
中断的返回? 在进入 IRQ 中断处理程序时,首先计算返回地址,并保存相关的寄存器 SUB R14,R14,#4 ;
STMFD R13!, {R0-R3, R12, LR} 如果 IRQ 中断处理程序返回到被中断的进程则执行下面的指令。该指
令从数据栈中恢复寄存器 R0~R3及 R12 的值,将返回地址传送到 PC 中,并将 SPSR_irq 值复制到 CPSR 中
LDMFD R13!, {R0-R3, R12, PC}^
23TM 23
4.5 交换指令
ARM 指令支持原子操作,主要是用来对信号量的操作,因为信号量操作的要求是作原子操作,即在一条指令中完成信号量的读取和修改操作。
24TM 24
字数据交换指令 SWP 是对字数据操作指令,用于将一个寄存器 Rn 为地址的内存字数据单元的内容读取到一个寄存器 <Rd> 中,同时将另一个寄存器 Rm 的内容写入到该内存单元中。
SWP{<cond>} <Rd>, <Rm>, [<Rn>]
25TM 25
字节数据交换指令 SWPB 是对字节操作指令,用于将一个寄存器 Rn
为内存地址的字节数据单元的内容读取到一个寄存器 Rd 中,寄存器 Rd 的高 24 设置为 0 ,同时将另一个寄存器 Rm 的低 8 位数值写入到该内存单元中
SWP{<cond>}{B} <Rd>, <Rm>,[<Rn>]
26TM 26
4.6 程序状态寄存器 PSR 访问指令 程序状态寄存器 PSR 访问指令用来实现通用
寄存器与程序状态寄存器之间的数据传输,共有两条:读程序状态寄存器指令 MRS 和写程序状态寄存器指令 MSR 。
这类指令可以用来修改 CPSR ,通常是通过“读取 - 修改 - 写回”的操作序列来实现。
27TM 27
存储器访问指令关于访问地址的合成与确定是应该重点掌握的内容 ,具本参考教材《 ARM 嵌入式系统结构与编程》第 4章4.3, 4.4 节
28TM 28
读程序状态寄存器指令 MRS 指令用于将状态寄存器的内容传送到通
用寄存器中。这是程序获得程序状寄存器PSR 数据的唯一方法。
MRS {<cond>} <Rd>, CPSR
MRS {<cond>} <Rd>, SPSR
29TM 29
写程序状态寄存器指令 MSR 指令用于将通用寄存器的内容或一个立即数传
送到程序状态寄存器中,实现对程序状态寄存器的修改。
MSR {<cond>} CPSR_<fields>, < operand2>
MSR {<cond>} SPSR_<fields>, < operand2>
30TM 30
fields 设置状态寄存器中需要操作的位域。状态寄存器分为 4个 8 位的域:
bits[31:24] 为条件标志位域,用 f 表示;bits[23:16] 状态位域,用 s 表示; bits[15:8] 扩展位域,用 x 表示;bits[7:0]控制位域,用 c 表示;
31TM 31
第二操作数 operand2 的构成形式有以下两种形式: <immediate> 为将要传送到状态寄存器中的立即
数; <Rm> 寄存器包含将要传送到状态寄存器中的数据。 R( bit[22] )为 0 时,写 CPSR; R( bit[22] )为 1 时,写 SPSR 。
32TM 32
4.7 协处理器操作指令
协处理器操作是 ARM 处理器对协处器进行管理,也就是 ARM 处理器的相关操作通过发送指令给协处理器,让协处理器来完成。 ARM 微处理器最多可支持 16 个协处理器,用于各种协处理操作。
33TM 33
协处理器数据操作指令 协处理器数据操作指令 CDP 用法: ARM 处理
器通知 ARM 协处理器执行特定的操作,若协处理器不能成功完成特定的操作,则产生未定义指令异常。
CDP{<cond>} <Cp_num>,<opcode_1>,<CRd>,<CRn>,<CRm>,
{<opcode_2>}
34TM 34
cond 为指令执行的条件码。当 <cond>忽略时指令为无条件执行。 CRd 为目标寄存器的协处理器寄存器。 CRn 为存放第 1 个源操作数的协处理器寄存器。 CRm 为存放第 2 个源操作数的协处理器寄存器。 Cp_num 为协处理器的编码。 opcode1 为协处理器将执行操作的第一操作码。 opcode2 为协处理器将执行操作的第二操作码。(可选)
35TM 35
协处理器加载 / 存储指令
协处理器的加载 / 存储指令可以用来实现ARM 处理器与协处理器之间的数据传输,共有两条:协处理器数据加载指令 LDC 和协处理器数据存储指令 STC 。
36TM 36
协处理器的加载存储指令汇编语法格式如下:
LDC{<cond>}{L} <coproc>, <CRd>, <addressing_mode>
STC{<cond>}{L} <coproc>, <CRd>, <addressing_mode>
37TM 37
Rn为 ARM 处理器的通用寄存器,它用作基地址寄存器。
需要注意的是,汇编语法格式中的 L 是表示传输的数据为长整数,其对应指令编码中的“ N” 。而指令二进制编码中的“ L” 是用来区别 LDC和 STC指令。
38TM 38
1 .协处理器数据加载指令 LDC
LDC 指令用于将一系列连续的内存单元的数据读取到协处理器的寄存器中,并由协处理器来决定传输的字数。如果协处理器不能成功的执行该操作,将产生未定义的指令异常中断。
39TM 39
2 .协处理器数据存储指令 STC
STC 指令将协处理器的寄存器中的数据写入到一系列连续的内存单元中,并由协处理器来决定传输的字数。如果协处理器不能成功的执行该操作,将产生未定义指令异常中断。
40TM 40
ARM 寄存器与协处理器寄存器数据传输指令
ARM 寄存器与协处理器寄存器数据传输指令用来实现 ARM 通用寄存器与协处理器寄存器之间的数据传输,共有两条: ARM 寄存器到协处理器寄存器的数据传送指令 MCR和协处理器寄存器到 ARM 寄存器的数据传送指令 MRC 。
41TM 41
ARM 寄存器与协处理器寄存器数据传输指令汇编语法格式如下:
MCR{<cond>} <Cp_num>,<opcode1>,<Rd>,<CRn>,<CRm>{,<opcode2>}
MRC{<cond>} <Cp_num>,<opcode1>,<Rd>,<CRn>,<CRm>{,<opcode2>}
42TM 42
cond为指令执行的条件码。当<cond>忽略时指令为无条件执行。
操作执行操作执行
MCRMRC
L:0:1
Rd为 ARM处理器的通用寄存器,它用作源/目标寄存器。 CRn为存放第 1个操作数的协处理器寄存器。 CRm为存放第 2个操作数的协处理器寄存器。 Cp_num为协处理器的编码。 opcode1为协处理器将执行操作的第一操作码。 opcode2为协处理器将执行操作的第二操作码。(可选)
43TM 43
1. ARM 寄存器到协处理器寄存器的数据传送指令MCR
MCR 指令将 ARM 处理器的寄存器中的数据传送到协处理器的寄存器中。如果协处理器不能成功的执行该操作,将产生未定义的指令异常中断。 MCR p6, 2, R0, CR1, CR2, 4 ;指令将 ARM 寄存器 R0 中数据传送到协处理器 p6 的寄存器中,其中 R0 是存放源操作数的 ARM 寄存器, CR1和 CR2 是作为目标寄存器的协处理器寄存器,操作码 1为 2 ,操作码 2为 4
44TM 44
2 .协处理器寄存器到 ARM 寄存器的数据传送指令MRC
MRC 指令将协处理器的寄存器中的数据传送到ARM 处理器的寄存器中。如果协处理器不能成功的执行该操作,将产生未定义的指令异常中断
MRC p10, 3, R3, CR3, CR4, 6 ; 指令将协处理器 p10 寄存器中的数据传送到 ARM 寄存器 R3 中,其中 R3 是存放目标操作数的 ARM 寄存器, CR3和 CR4 是作为目标寄存器的协处理器寄存器,操作码 1为 3 ,操作码 2为 6
45TM 45
4.8 异常产生指令
ARM 处理器所支持的异常产生指令有两条: 软中断指令 SWI
断点调试指令 BKPT (用于 ARM V5 及以上的版本)
46TM 46
软中断指令 SWI(SoftWare Interrupt) 指令用于产生软件
中断,它将处理器置于监控模式 (SVC) ,从地址 0x08开始执行指令。
ARM 通过这种机制实现用户模式对操作系统中特权模式的程序调用,也就是使用户程序调用操作系统的系统程序成为可能。
47TM 47
SWI{<cond>} <immed_24>,
操作系统在 SWI 的异常处理程序中提供相应的系统服务,指令中 24 位的立即数指定用户程序调用系统例程的类型,相关参数通过通用寄存器传递。
48TM 48
执行过程: 将 SWI 后面指令地址保存到 R14_svc;
将 CPSR 保存到 SPSR_svc;
进入监控模式 ,将 CPSR[4:0] 设置为 0b10011 的将 CPSR[7] 设置为 [1],禁止 IRQ ;
将 PC 设置为 0x08, 并且开始执行那里的指令。 返回时: MOVS PC, R14
49TM 49
断点中断指令
BKPT (BreakPoinT) 指令产生软件断点中断,可用于程序的调试。当 BKPT 指令执行时,处理器停止执行下面的指令并进入相应的BKPT 入口程序
50TM 50
BKPT <immed_16>
immed_16为 16 位的立即数,此立即数被调试软件用来保存额外的断点信息。
51TM 51
思考与练习题 写出 LDRB 指令与 LDRSB 指令二进制编码格式,并指出它们之间的区别。 分析下列每条语句的功能,并确定程序段所实现的操作。 CMP R0, #0
MOVEQ R1, #0MOVGT R1, #1
请使用多种方法实现将字数据 0xFFFFFFFF 送入寄存器 R0 。 写一条 ARM 指令,分别完成下列操作: a) R0 = 16 b) R0 = r1 / 16 ( 带符号的数字 ) c) R1 = r2 * 3 d) R0 = -R0
52TM
第 4 章 ARM 指令集系统
The End