29
微微微微微微微微微 第第第 ARM 第第第第第第第第第第第 第第第第 第第第第第第第第第第

微机原理与接口技术 第三章  ARM 寻址方式与指令系统

Embed Size (px)

DESCRIPTION

微机原理与接口技术 第三章  ARM 寻址方式与指令系统. 主讲人:鞠 雷 山东大学 计算机科学与技术学院.   内容提要. ARM 编程模型. ARM 指令格式和寻址方式. ARM 指令集. Thumb 指令集. 思考题. 3.1 ARM 编程模型. 3.1.1 处理器模式. 3.1.2 处理器工作状态. 3.1.3 寄存器组织. 3.1.4 异常中断.   内容提要. ARM 编程模型(第二章已讲 ). ARM 指令格式和寻址方式. ARM 指令集. Thumb 指令集. 思考题. ISAs. - PowerPoint PPT Presentation

Citation preview

微机原理与接口技术第三章  ARM 寻址方式与指令系统微机原理与接口技术

第三章  ARM 寻址方式与指令系统

主讲人:鞠 雷

山东大学 计算机科学与技术学院

2

  内容提要  内容提要

思考题

Thumb 指令集

ARM 指令集

ARM 指令格式和寻址方式

ARM 编程模型

3

3.1 ARM编程模型 3.1 ARM编程模型

3.1.2 处理器工作状态

3.1.3 寄存器组织

3.1.4 异常中断

3.1.1 处理器模式

4

  内容提要  内容提要

思考题

Thumb 指令集

ARM 指令集

ARM 指令格式和寻址方式

ARM 编程模型 ( 第二章已讲 )

ISAsISAs

CISC = complex instruction set computing/computer ( 复杂指令集计算机 ) Memory was expensive small program reduce number of

instructions per program multiple operations within a single instruction many types of instructions instruction length variable and execution time unpredictable

Complex hardware support (intuition: design hardware is easier than build compiler)

Example: x86

RISC = reduced instruction set computing/computer ( 精简指令集计算机 ) emerged around early 80s, commercial success after late 90s Examples : MIPS, SPARC, PowerPC, ARM

RICSRICS

Motivation: reduce the instruction set architecture (ISA) Having fewer simpler instructions at the same length Allow memory access only with explicit load/store instructions

Each instruction performs less work, execution time among different instructions is consistent

The complexity is moved from the ISA into the domain of the assembly programmer/compiler

Requires a larger number of registers

RISC vs. CISCRISC vs. CISC

CISCMULT 2:3, 5:2

RISCLOAD A, 2:3LOAD B, 5:2PROD A, A, BSTORE 2:3, A

ARM 指令集体系结构ARM 指令集体系结构 32 位精简指令集计算 (RISC) 体系结构

包括 16 位 Thumb 指令集 Load/store architecture

Data processing instructions act only on registers Three operand format Combined ALU and shifter for high speed bit manipulation

Most instructions execute in a single cycle Every instruction can be conditionally executed

9

3.2 ARM 指令格式和寻址方式3.2 ARM 指令格式和寻址方式

3.2.1 ARM 指令的一般格式

3.2.2 条件域 <cond>

3.2.3 寻址方式

10

3.2.1 ARM 指令的一般格式3.2.1 ARM 指令的一般格式 ARM 指令的编码格式

首先来看一条实际的指令,其语法结构(助记符)为

ADDEQS R0,R1,R2

31 ~ 28 27 ~25

24 ~ 21 20 19 ~ 16 15 ~ 12 11~0

cond   opcode S Rn Rd op2

0000 001 0100 1 0001 0000 000000000010

该指令的编码格式为:

机器指令编码格式 分为 7 个部分:条件域,类别,操作码, S 域,目的操作数,第一源操作数,第二源操作数。

11

ARM 指令的一般格式ARM 指令的一般格式

ARM 指令的助记符 ARM 指令在汇编程序中用助记符表示,一般 ARM 指令的助

记符格式为:

<opcode>{<cond>} {S} <Rd>,<Rn>,<op2>

例: ADDEQS R1,R2,#5操作码

决定指令执行的条件域

带S保存条件标志

至CP

SR

第一个操作数,为寄存器

目的寄存

器第二个操作

数其中操作码 opcode 为 ADD ,条件域 cond 为 EQ ,表示该指令只有当CPSR 中 Z 标志置位时才执行,目的寄存器 Rd 为 R1, 第一个操作数寄存器 Rn 为 R2 ,第二个操作数 op2 为 5 ;执行的结果为 R1=R2+5 , S表示将影响 CPSR 寄存器的值。

第二操作数,可以是寄存器或立即数 , 此操作数可以先移位,再参与相关操作。

Rd 、 Rn 为通用寄存器

程序状态寄存器程序状态寄存器

N Z C V — — I M0M1M2M3M4TF—. . .

31 30 29 28 27 26 8 7 6 5 4 3 2 1 0

条件代码标志 保留 控制位

溢出标志 oVerflow进位或借位扩展 Carry

零 Zero

负或小于 Negative IRQ 禁止 Interrupt

FIQ 禁止 Fast

状态位 Thumb

模式位 Mode

N Z C V I M0M1M2M3M4TF

CPSR/SPSR 寄存器的格式

条件代码的改变条件代码的改变 S 置位的指令 , 如 ADDS, SUBS 等 N=1 表示运算的结果为负数; N=0 表示运算的结果为正数或

零 Z=1 表示运算的结果为零; Z=0 表示运算的结果为非零; C

加法运算(包括比较指令 CMN ):当运算结果产生了进位时(无符号数溢出), C=1 ,否则 C=0 。

减法运算(包括比较指令 CMP ):当运算时产生了借位, C=0 ,否则 C=1 。

对于包含移位操作的非加 / 减运算指令, C 为移出值的最后一位 对于其他的非加 / 减运算指令, C 的值通常不改变。

V 对于加 / 减法运算指令,当操作数和运算结果为二进制的补码表

示的带符号数时, V=1 表示符号位溢出。 对于其他的非加 / 减运算指令, V 的值通常不改变

14

3.2.2 条件域 <cond> 3.2.2 条件域 <cond>

溢出V 置位VS(v set)

正数或零N 清零PL(possitive)

负数N 置位MI(minus)

无符号数小于C 清零CC(carry clear)

无符号数大于或等于C 置位CS(carry set)

不相等Z 清零NE(not equal)

相等Z 置位EQ(equal)

含义CPSR 中标志位cond

15

条件域 <cond> 条件域 <cond> 含义CPSR 中标志位cond

无条件执行忽略 AL

带符号数小于或等于Z 置位或( N 不等于V )

LE(less equal)

带符号数大于Z 清零且( N 等于 V )GT(great than)

带符号数小于N 不等于 VLT(less than)

带符号数大于或等于N 等于 VGE(great equal)

无符号数小于或等于C 清零 Z 置位LS(less)

无符号数大于C 置位 Z 清零HI(high)

未溢出V 清零VC(v clear)

16

3.2.3 寻址方式 3.2.3 寻址方式

立即数寻址 寄存器寻址 寄存器移位寻址 寄存器间接寻址 基址变址寻址

相对寻址 多寄存器寻址 块拷贝寻址 堆栈寻址

所谓寻址方式,就是根据指令中操作数的信息寻找操作数实际物理 ( 有效 ) 地址的方式。依据指令中给出的操作数的不同格式, ARM 指令系统具有以下几种常见的寻址方式。

17

立即数寻址立即数寻址

在立即数寻址中,操作数本身直接在指令中给出,取出指令也就获得了操作数,这个操作数也称为立即数。

例如 :

ADD R0 , R1 ,# 5 ; R0=R1 + 5

MOV R0 ,# 0x55 ; R0=0x55

其中:操作数 5 , 0x55 就是立即数,立即数在指令中要以“#”为前缀,后面跟实际数值。

0x00R0

MOV R0,#0x55

程序存储

MOV R0 ,# 0x55

0x55从代码中获得数据

立即数在指令中以“#”为前缀,后面跟进制和实际数值。#0x 16 进制 例: # 0x55

#0d 或缺省 10 进制 #0d25 / #25

2 到 9 进制数,形式为#n_XXX,n 的范围是 2 到 9 ,XXX 是具体数字。 例: #2_1010

18

寄存器寻址寄存器寻址

在寄存器寻址方式下,寄存器的值即为操作数。 ARM 指令普遍采用此种寻址方式。

例如:

ADD R0 , R1 , R2 ; R0=R1 + R2 MOV R0 , R1 ; R0=R10xAA

0x55

R1

R0 0xAA

MOV R0 , R1

寄存器移位寻址寄存器移位寻址

寄存器移位寻址的操作数由寄存器的数值做相应移位而得到;移位的方式在指令中以助记符的形式给出,而移位的位数可用立即数或寄存器寻址方式表示。

例如:

ADD R0 , R1 , R2 , ROR R3 ; R0=R1 + R2循环右移 R3 位 MOV R0 , R1 , LSL # 3 ; R0=R1逻辑左移 3 位

移位操作在 ARM 指令集中不作为单独的指令使用, ARM指令集共有 5 种位移操作。如下所示:

0x00000000R0

R1 0x00000001

MOV R0 , R1 , LSL # 3

0x00000008

逻辑左移 3 位

0x00000008

19

数据处理类指令中的第二个操作数在指令执行前可以先移位,移位的方式在指令中以助记符的形式给出,而移位的位数可用立即数或寄存器表示。

20

寄存器移位寻址 寄存器移位寻址

0 LSL逻辑左移 : Rx , LSL <op1> (Logical Shift Left) op1-- 为通用寄存器或立即数( 0 ~ 31 ) MOV R0 , R1 , LSL # 5;

R1 的值左移 5 位后,存入 R0 ; 相当于R1 的值 ×32 后,存入 R0 。

LSR逻辑右移 : Rx , LSR <op1> (Logical Shift Right)

MOV R0 , R1 , LSR # 5 ; 相当于 R1 的值除以 32 后,存入

R0 。

0

031

31

0

寄存器移位寻址 寄存器移位寻址 ASR 算术右移 : Rx , ASR <op1> (Arithmetic Shift Right)

MOV R0 , R1 , ASR # 5 ; R1 的值右移 5 位后,存入 R0 ;最左端用第

31 位的值来填充。

31 0

R1: 10000000 ( 2’s compliment/ 二补数: -128 )10000001 (R2 = -64)

1000001 (R3 = -32)1

MOV R2 , R1 , ASR # 1 ;MOV R3 , R1 , ASR # 2 ;

22

寄存器移位寻址 寄存器移位寻址

ROR循环右移 : Rx , ROR <op1> (Rotate Right)

MOV R0 , R0 , ROR # 5 ; R0 的值循环右移 5 位。

RRX 带扩展的 循环右移: Rx , RRX (Rotate Right with extend)

MOV R0 , R1 , RRX ; R1 的值右移 1 位,最左端由进位标志位 C填充,存入 R0 。

C

31

31

0

0

Shifted RegisterShifted Register

The amount by which the register is to be shifted is contained in either: the immediate 5-bit field in the instruction

NO OVERHEAD Shift is done for free - executes in single cycle.

the bottom byte of a register (not PC) Then takes extra cycle to execute ARM doesn’t have enough read ports to read 3 registers

at once. Then same as on other processors where shift is

separate instruction.

If no shift is specified then a default shift is applied: LSL #0 i.e. barrel shifter has no effect on value in register.

注意:将寄存器的值作为操作数的物理地址的寻址方式中,寄存器助记符放在“ []” 中。

24

寄存器间接寻址寄存器间接寻址

寄存器中的值为操作数的虚拟 / 物理地址 , 而实际的操作数存放在存储器中。

例如:

STR R0 , [R1] ; [R1]=R0 LDR R0 , [R1] ; R0=[R1]0x55R0

R1 0x40000000

0xAA0x40000000

0xAA

LDR R0 , [R1] ;

25

基址变址寻址基址变址寻址

将寄存器(称为基址寄存器)的值与指令中给出的偏移地址量相加,所得结果作为操作数的物理地址。

例如:

LDR R0 , [R1 ,# 5]; R0=[R1+5] LDR R0 , [R1,R2]; R0=[R1+R2]

0x55R0

R1 0x40000000

0xAA0x40000005

将 R1+5 作为地址装载数据 0xAA

LDR R0 , [R1 ,#5];

偏移地址量可以是立即数或寄存器的内容。

26

相对寻址相对寻址

相对寻址同基址变址寻址相似,区别只是将程序计数器PC 作为基址寄存器,指令中的标记作为地址 偏移量。

例如: BEQ process1 ……process1 : …… BEQ 指令采用了相对寻址方式,

它将程序跳转到 prscess1 处执行。 process1 是相对于当前 pc 的偏移量 .

27

多寄存器寻址多寄存器寻址

在多寄存器寻址方式中,一条指令可实现一组寄存器值的传送。连续的寄存器间用“-”连接,否则用“,”分隔。

例如 :

LDMIA R0! , {R1-R5} ; R1=[R0],R2=[R0+4],R3=[R0+8],

R4=[R0+12] , R5=[R0+16]

指令中 IA 表示在执行 完一次 Load 操作后, R0自增 4 。该指令将以 R0 为起始地址的 5 个字数据分别装入R1 , R2 , R3 , R4 , R5 中。 Increase after

0x40000000R0

R1 0x?? 0x01 0x40000000

0x??R2

R3 0x??

R4 0x??

0x02

0x03

0x04

0x40000004

0x40000008

0x4000000C

R5 0x?? 0x05 0x40000010

0x01

0x02

0x03

0x04

0x05

LDMIA R0! , {R1-R5} ;执行后 [R0]=0x40000014

0x40000014

数据 地址

28

块拷贝寻址块拷贝寻址

块拷贝寻址可实现连续地址数据从存储器的某一位置拷贝到另一位置。

例如 :

将取出的数据存入以 R1 的值为起始地址的存储单元中

LDMIA R0! , {R1-R5} ;

STMIA R0! , {R1-R5} ;

从以 R0 的值为起始地址的存储单元中取出 5 个字的数据

0x40000000R0

R1 0xAA 0x00 0x40000000

0xBBR2

R3 0xCC

R4 0xDD

0x00

0x00

0x00

0x40000004

0x40000008

0x4000000C

R5 0xEE 0x00 0x40000010

0xAA

0xBB

0xCC

0xDD

0xEE

STMIA R0! , {R1-R5} ;执行后[R0]=0x40000014

0x40000014

数据 地址

29

堆栈寻址堆栈寻址

堆栈寻址用于数据栈与寄存器组之间批量数据传输。堆栈是一种后进先出的数据结构。当数据写入和读出内存的顺序不同时,使用堆栈寻址可以很好的解决这 问题。

例如:

将数据出栈,恢复 R0- R4原先的值。

STMFD R13! , {R0,R1,R2,R3,R4} ;

LDMFD R13! , {R0,R1,R2,R3,R4} ;

将 R0- R4 中的数据压入堆栈,R13 为堆栈指针

FD满递减: SP总是指向第一个要读出的数据(满栈,同x86 ),堆栈随存储器地址的减小向下增长。入栈 sp 先减 4 ,再入栈;出栈时,先出栈,之后sp 加 4 。