Top Banner
1 TM 1 大大大大大大大大大大 大大 大大大 409 Tel 87571521 E_mail: [email protected] 大大大大ARM 大大大大 大大大大大 大大大大大大大 2009 大 3 大大大 ARM 嵌嵌嵌嵌 嵌嵌嵌嵌嵌
52

大连理工大学软件学院 邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

Feb 14, 2016

Download

Documents

marie

ARM 嵌入式系统结构与编程. 大连理工大学软件学院 邱铁 办公楼 409 Tel : 87571521 E_mail: [email protected] 参考教材: 《ARM 嵌入式系统结构与编程 》 清华大学出版社 2009 年 3 月出版. ARM 微处理器的指令集可以分为数据处理指令、跳转指令、程序状态寄存器( PSR )处理指令、加载 / 存储指令、协处理器指令和杂类指令六大类。 本章将分类介绍 ARM 指令语法格式、指令编码格式和 ARM 指令的详细功能。. 第 4 章 ARM 指令集系统. 内容提要. 4 . 1 数据处理指令 - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

1TM 1

大连理工大学软件学院 邱铁办公楼 409

Tel: 87571521E_mail: [email protected]

参考教材:《 ARM 嵌入式系统结构与编程 》 清华大学出版社 2009年 3 月出版

ARM 嵌入式系统结构与编程

Page 2: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

2TM

第 4 章 ARM 指令集系统ARM 微处理器的指令集可以分为数据处理指令、跳转指令、程序状态寄存器( PSR )处理指令、加载 / 存储指令、协处理器指令和杂类指令六大类。本章将分类介绍 ARM 指令语法格式、指令编码格式和 ARM 指令的详细功能。

Page 3: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

3TM 3

内容提要4. 1 数据处理指令4. 2 ARM 分支指令4. 3 加载 / 存储指令4. 4 批量加载 / 存储指令4. 5 交换指令4. 6 程序状态寄存器 PSR 访问指令4. 7 协处理器操作指令4. 8 异常产生指令

Page 4: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

4TM 4

4.3 加载 / 存储指令

用于操作 32 位的字类型数据以及 8 位无符号的字节类型数据;

用于操作 16 位半字类型数据和 8 位的有符号字节类型数据。

Page 5: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

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>

Page 6: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

6TM 6

Page 7: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

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>

Page 8: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

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

Page 9: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

9TM 9

4. 3. 2 半字、有符号字节访问指令 半字数据访问指令用于内存中的数据与寄存器低 16位数据进行操作,有符号字节访问指令可实现向寄存器加载 8 位的有符号字节数据。 对于向寄存器加载无符号半字数据,寄存器的高 16位 bits[31:16] 清零;

对于向寄存器加载有符号半字数据,寄存器的高 16位 bits[31:16] 用符号位扩展为 32 位;

对于向寄存器加载有符号字节数据,寄存器的高 24位 bits[31:8] 用符号位扩展为 32 位。

Page 10: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

10TM 10

LDR{cond}H Rd, <addressing >

STR{cond}H Rd, <addressing >

LDR{cond}SH Rd, <addressing >

LDR{cond}SB Rd, <addressing >

Page 11: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

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 >

Page 12: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

12TM 12

ARM 微处理器所支持批量数据加载 / 存储指令可以一次性实现一片连续的存储器单元和多个寄存器之间进行传送数据。

批量数据加载指令用于将一片连续的存储器中的数据传送到多个寄存器中,批量数据存储指令能够实现将多个寄存器中的内容一次性的存放到一片连续的存储器中。

Page 13: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

13TM 13

基本批量字数据加载 / 存储指令 批量加载: LDM {<cond>}<addr_mode> <Rn> {!},

<registers>

批量存储: STM {<cond>}<addr_mode> <Rn> {!},

<registers>

Page 14: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

14TM 14

操作执行操作执行

写操作不执行基地址寄存器回操作执行基地址寄存器回写

地址向下变化地址向上变化

表示地址变化的方向

后变址操作前变址操作

为指令执行的条件

StoreLoad

L

W

downwardsupwards

U

U

P

。cond

:0:1

:0:1

)(:0)(:1

:

:0:1

Page 15: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

15TM 15

注意事项: * Rn 不允许为程序计数器 PC( R15 ) * 指令中寄存器和连续内存地址单元的对应关系:编号低的寄存器对应内存低地址单元,编号高的寄存器对应内存高地址单元。 * 如果指令中基址寄存器 <Rn> 在寄存器列表

<registers> 中,而且指令中寻址方式指定指令执行后更新基址寄存器 <Rn> 的值,则指令执行会产生不可预知的结果。

Page 16: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

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}

Page 17: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

17TM 17

存储情况如下

Page 18: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

18TM 18

用户模式下的批量字数据加载 / 存储指令 用户模式下的批量字数据加载 / 存储指令操

作实现的操作是:即使处理器工作在特权模式下,存储系统也将访问看成是处理器在用户模式下,因此所加载 / 存储的寄存器组为用户模式下的寄存器。该指令寄存器列表中不包含程序计数器 PC ,不允许对基地址寄存器回写操作。

Page 19: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

19TM 19

用户模式下的批量字数据加载 / 存储指令汇编语法格式为

批量加载:LDM {<cond>}<addr_mode> <Rn> , <registers_without_pc>^

批量存储:STM {<cond>}<addr_mode> <Rn> , <registers_without_pc>^

Page 20: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

20TM 20

带 PSR 操作的批量字数据加载指令 在带 PSR 操作的批量字数据加载指令中,程

序计数器 PC 包含在指令寄存器列表中。 该指令将数据从连续的内存单元中读取到指

令中寄存器列表中的各寄存器中。它同时将目前处理器模式对应的 SPSR 寄存器内容复制到 CPSR 寄存器中。

Page 21: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

21TM 21

批量加载:LDM {<cond>}<addressing_mode> <Rn> {!}, <registers_with_pc>^

批量存储:STM {<cond>}<addressing_mode> <Rn> {!}, <registers_with_pc>^

Page 22: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

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}^

Page 23: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

23TM 23

4.5 交换指令

ARM 指令支持原子操作,主要是用来对信号量的操作,因为信号量操作的要求是作原子操作,即在一条指令中完成信号量的读取和修改操作。

Page 24: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

24TM 24

字数据交换指令 SWP 是对字数据操作指令,用于将一个寄存器 Rn 为地址的内存字数据单元的内容读取到一个寄存器 <Rd> 中,同时将另一个寄存器 Rm 的内容写入到该内存单元中。

SWP{<cond>} <Rd>, <Rm>, [<Rn>]

Page 25: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

25TM 25

字节数据交换指令 SWPB 是对字节操作指令,用于将一个寄存器 Rn

为内存地址的字节数据单元的内容读取到一个寄存器 Rd 中,寄存器 Rd 的高 24 设置为 0 ,同时将另一个寄存器 Rm 的低 8 位数值写入到该内存单元中

SWP{<cond>}{B} <Rd>, <Rm>,[<Rn>]

Page 26: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

26TM 26

4.6 程序状态寄存器 PSR 访问指令 程序状态寄存器 PSR 访问指令用来实现通用

寄存器与程序状态寄存器之间的数据传输,共有两条:读程序状态寄存器指令 MRS 和写程序状态寄存器指令 MSR 。

这类指令可以用来修改 CPSR ,通常是通过“读取 - 修改 - 写回”的操作序列来实现。

Page 27: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

27TM 27

存储器访问指令关于访问地址的合成与确定是应该重点掌握的内容 ,具本参考教材《 ARM 嵌入式系统结构与编程》第 4章4.3, 4.4 节

Page 28: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

28TM 28

读程序状态寄存器指令 MRS 指令用于将状态寄存器的内容传送到通

用寄存器中。这是程序获得程序状寄存器PSR 数据的唯一方法。

MRS {<cond>} <Rd>, CPSR

MRS {<cond>} <Rd>, SPSR

Page 29: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

29TM 29

写程序状态寄存器指令 MSR 指令用于将通用寄存器的内容或一个立即数传

送到程序状态寄存器中,实现对程序状态寄存器的修改。

MSR {<cond>} CPSR_<fields>, < operand2>

MSR {<cond>} SPSR_<fields>, < operand2>

Page 30: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

30TM 30

fields 设置状态寄存器中需要操作的位域。状态寄存器分为 4个 8 位的域:

bits[31:24] 为条件标志位域,用 f 表示;bits[23:16] 状态位域,用 s 表示; bits[15:8] 扩展位域,用 x 表示;bits[7:0]控制位域,用 c 表示;

Page 31: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

31TM 31

第二操作数 operand2 的构成形式有以下两种形式: <immediate> 为将要传送到状态寄存器中的立即

数; <Rm> 寄存器包含将要传送到状态寄存器中的数据。 R( bit[22] )为 0 时,写 CPSR; R( bit[22] )为 1 时,写 SPSR 。

Page 32: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

32TM 32

4.7 协处理器操作指令

协处理器操作是 ARM 处理器对协处器进行管理,也就是 ARM 处理器的相关操作通过发送指令给协处理器,让协处理器来完成。 ARM 微处理器最多可支持 16 个协处理器,用于各种协处理操作。

Page 33: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

33TM 33

协处理器数据操作指令 协处理器数据操作指令 CDP 用法: ARM 处理

器通知 ARM 协处理器执行特定的操作,若协处理器不能成功完成特定的操作,则产生未定义指令异常。

CDP{<cond>} <Cp_num>,<opcode_1>,<CRd>,<CRn>,<CRm>,

{<opcode_2>}

Page 34: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

34TM 34

cond 为指令执行的条件码。当 <cond>忽略时指令为无条件执行。 CRd 为目标寄存器的协处理器寄存器。 CRn 为存放第 1 个源操作数的协处理器寄存器。 CRm 为存放第 2 个源操作数的协处理器寄存器。 Cp_num 为协处理器的编码。 opcode1 为协处理器将执行操作的第一操作码。 opcode2 为协处理器将执行操作的第二操作码。(可选)

Page 35: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

35TM 35

协处理器加载 / 存储指令

协处理器的加载 / 存储指令可以用来实现ARM 处理器与协处理器之间的数据传输,共有两条:协处理器数据加载指令 LDC 和协处理器数据存储指令 STC 。

Page 36: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

36TM 36

协处理器的加载存储指令汇编语法格式如下:

LDC{<cond>}{L} <coproc>, <CRd>, <addressing_mode>

STC{<cond>}{L} <coproc>, <CRd>, <addressing_mode>

Page 37: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

37TM 37

Rn为 ARM 处理器的通用寄存器,它用作基地址寄存器。

需要注意的是,汇编语法格式中的 L 是表示传输的数据为长整数,其对应指令编码中的“ N” 。而指令二进制编码中的“ L” 是用来区别 LDC和 STC指令。

Page 38: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

38TM 38

1 .协处理器数据加载指令 LDC

LDC 指令用于将一系列连续的内存单元的数据读取到协处理器的寄存器中,并由协处理器来决定传输的字数。如果协处理器不能成功的执行该操作,将产生未定义的指令异常中断。

Page 39: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

39TM 39

2 .协处理器数据存储指令 STC

STC 指令将协处理器的寄存器中的数据写入到一系列连续的内存单元中,并由协处理器来决定传输的字数。如果协处理器不能成功的执行该操作,将产生未定义指令异常中断。

Page 40: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

40TM 40

ARM 寄存器与协处理器寄存器数据传输指令

ARM 寄存器与协处理器寄存器数据传输指令用来实现 ARM 通用寄存器与协处理器寄存器之间的数据传输,共有两条: ARM 寄存器到协处理器寄存器的数据传送指令 MCR和协处理器寄存器到 ARM 寄存器的数据传送指令 MRC 。

Page 41: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

41TM 41

ARM 寄存器与协处理器寄存器数据传输指令汇编语法格式如下:

MCR{<cond>} <Cp_num>,<opcode1>,<Rd>,<CRn>,<CRm>{,<opcode2>}

MRC{<cond>} <Cp_num>,<opcode1>,<Rd>,<CRn>,<CRm>{,<opcode2>}

Page 42: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

42TM 42

cond为指令执行的条件码。当<cond>忽略时指令为无条件执行。

操作执行操作执行

MCRMRC

L:0:1

Rd为 ARM处理器的通用寄存器,它用作源/目标寄存器。 CRn为存放第 1个操作数的协处理器寄存器。 CRm为存放第 2个操作数的协处理器寄存器。 Cp_num为协处理器的编码。 opcode1为协处理器将执行操作的第一操作码。 opcode2为协处理器将执行操作的第二操作码。(可选)

Page 43: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

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

Page 44: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

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

Page 45: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

45TM 45

4.8 异常产生指令

ARM 处理器所支持的异常产生指令有两条: 软中断指令 SWI

断点调试指令 BKPT (用于 ARM V5 及以上的版本)

Page 46: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

46TM 46

软中断指令 SWI(SoftWare Interrupt) 指令用于产生软件

中断,它将处理器置于监控模式 (SVC) ,从地址 0x08开始执行指令。

ARM 通过这种机制实现用户模式对操作系统中特权模式的程序调用,也就是使用户程序调用操作系统的系统程序成为可能。

Page 47: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

47TM 47

SWI{<cond>} <immed_24>,

操作系统在 SWI 的异常处理程序中提供相应的系统服务,指令中 24 位的立即数指定用户程序调用系统例程的类型,相关参数通过通用寄存器传递。

Page 48: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

48TM 48

执行过程: 将 SWI 后面指令地址保存到 R14_svc;

将 CPSR 保存到 SPSR_svc;

进入监控模式 ,将 CPSR[4:0] 设置为 0b10011 的将 CPSR[7] 设置为 [1],禁止 IRQ ;

将 PC 设置为 0x08, 并且开始执行那里的指令。 返回时: MOVS PC, R14

Page 49: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

49TM 49

断点中断指令

BKPT (BreakPoinT) 指令产生软件断点中断,可用于程序的调试。当 BKPT 指令执行时,处理器停止执行下面的指令并进入相应的BKPT 入口程序

Page 50: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

50TM 50

BKPT <immed_16>

immed_16为 16 位的立即数,此立即数被调试软件用来保存额外的断点信息。

Page 51: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

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

Page 52: 大连理工大学软件学院  邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut

52TM

第 4 章 ARM 指令集系统

The End