arm 及 thumb 指令集

40
1 TM T H E A R C H I T E C T U R E F O R T H E D I G I T A L W O R L D ARM 及 Thumb 及及及

Upload: juan

Post on 17-Jan-2016

137 views

Category:

Documents


5 download

DESCRIPTION

ARM 及 Thumb 指令集. 课程安排. ARM 指令集 Thumb 指令集 v5TE 体系结构扩展. ARM 指令编码格式. 31 28 27 25 24 21 20 19 16 15 12 11 8 7 0. 说明 Cond 指令执行的条件编码 Opcode 指令操作符编码 S 决定指令的操作是否影响 CPSR 的值 Rd 操作目标寄存器编码 Rn 包含第一操作数的寄存器编码 Shifter_operand 表示第二操作数. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: ARM 及 Thumb 指令集

1TMT H E A R C H I T E C T U R E F O R T H E D I G I T A L W O R L D

ARM 及 Thumb 指令集

Page 2: ARM 及 Thumb 指令集

2TM 2ARM 及 Thumb 指令集

课程安排

ARM 指令集

Thumb 指令集

v5TE 体系结构扩展

Page 3: ARM 及 Thumb 指令集

3TM 3ARM 及 Thumb 指令集

ARM 指令编码格式

说明 Cond

指令执行的条件编码 Opcode

指令操作符编码 S

决定指令的操作是否影响 CPSR 的值 Rd

操作目标寄存器编码 Rn

包含第一操作数的寄存器编码 Shifter_operand

表示第二操作数

cond 001 opcode s Rn Rd Shifter_operand

31 28 27 25 24 21 20 19 16 15 12 11 8 7 0

Page 4: ARM 及 Thumb 指令集

4TM 4ARM 及 Thumb 指令集

ARM 指令可以通过添加适当的条件码后缀来达到条件执行的目的。 这样可以提高代码密度,减少分支跳转指令数目,提高性能。 CMP r3,#0 CMP r3,#0

BEQ skip ADDNE r0,r1,r2 ADD r0,r1,r2skip

默认情况下,数据处理指令不影响条件码标志位,但可以选择通过添加“ S” 来影响标志位 。 CMP 不需要增加 “ S” 就可改变相应的标志位。

loop … SUBS r1,r1,#1 BNE loop

条件执行及标志位

如果 Z 标志清零则跳转

R1 减 1 ,并设置标志位

Page 5: ARM 及 Thumb 指令集

5TM 5ARM 及 Thumb 指令集

Condition Codes

不等于( Not equal )无符号的大于或等于无符号的小于负数( Minus )

等于( Equal )

溢出( Overflow )没溢出无符号的大于无符号的小于或大于

正数或零

小于( Less Than )大于( Greater Than )小于等于总是执行( Always )

大于等于

EQNECS/HSCC/LO

PLVS

HILSGELTGTLEAL

MI

VC

Suffix 描述

Z=0C=1C=0

Z=1测试的标志位

N=1N=0V=1V=0C=1 & Z=0C=0 or Z=1N=VN!=VZ=0 & N=VZ=1 or N=!V

下表为所有可能的条件码: 注意 :AL 为默认状态,不需要单独指出

Page 6: ARM 及 Thumb 指令集

6TM 6ARM 及 Thumb 指令集

条件执行示例

一系列的指令都使用条件指令if (a==0) func(1);

CMP r0,#0MOVEQ r0,#1BLEQ func

置标志位,再使用不同的条件码if (a==0) x=0;if (a>0) x=1;

CMP r0,#0MOVEQ r1,#0MOVGT r1,#1

使用条件比较指令if (a==4 || a==10) x=0;

CMP r0,#4CMPNE r0,#10MOVEQ r1,#0

Page 7: ARM 及 Thumb 指令集

7TM 7ARM 及 Thumb 指令集

Branch : B{<cond>} label

Branch with Link : BL{<cond>} subroutine_label

处理器把偏移量左移两位,进行符号扩展后再与 PC 相加 跳转范围: ± 32 Mbyte 如何执行长跳转?

2831 24 0

Cond 1 0 1 L 偏移量

条件码区域

Link bit 0 = Branch1 = Branch with link

232527

分支指令

Page 8: ARM 及 Thumb 指令集

8TM 8ARM 及 Thumb 指令集

数据处理指令 包括:

算术指令: ADD ADC SUB SBC RSBRSC

逻辑指令: AND ORR EOR BIC 比较指令: CMP CMN TST TEQ 数据搬移: MOV MVN

上述指令只能对寄存器操作,不能针对存储器。

语法:

< 操作 >{<cond>}{S} Rd, Rn, Operand2

只有比较指令影响标志位 - 不指定 Rd 数据搬移不指定 Rn

第二个操作数通过桶型移位器送到 ALU 中。

Page 9: ARM 及 Thumb 指令集

9TM 9ARM 及 Thumb 指令集

桶型移位器

DestinationCF 0 Destination CF

LSL : Logical Left Shift ASR: Arithmetic Right Shift

(无符号数)乘 2 除 2 ,并保留符号位

Destination CF...0 Destination CF

LSR : Logical Shift Right ROR: Rotate Right

(无符号数)除 2 位循环

Destination

RRX: Rotate Right Extended

位轮换,从 CF 到 MSB 都参与操作

CF

Page 10: ARM 及 Thumb 指令集

10TM 10ARM 及 Thumb 指令集

寄存器 , 可选择是否增加移位操作 . 移位值可以是:

5 bit 无符号整数 放在另一个寄存器的低字节

用于常数乘法

立即数 8 bit ,大小范围 0-255 。

右移偶数位 允许直接加载 32-bit 常数到寄存器中。

结果

操作数 1

BarrelShifter

操作数 2

ALU

桶型移位器 :第二个操作数

Page 11: ARM 及 Thumb 指令集

11TM 11ARM 及 Thumb 指令集

没有任何一条 ARM 指令可包括一个 32 bit 的立即数 所有的 ARM 指令都是 32 bits 固定长度

数据处理指令格式中,第二个操作数有 12 位

4 bit 移位值 (0-15) 乘于 2 ,得到一个范围在 0-30 ,步长为 2 的移位值。 记住一条准则: “最后 8 位一定要移动偶数位” .

0711 8

immed_8

ShifterROR

rot

x2

Quick Quiz: 0xe3a004ffMOV r0, #???

立即数 (1)

Page 12: ARM 及 Thumb 指令集

12TM 12ARM 及 Thumb 指令集

Examples:

下列命令中,汇编器把立即数转换为移位操作: MOV r0,#4096 ; uses 0x40 ror 26 ADD r1,r2,#0xFF0000 ; uses 0xFF ror 16

也可使用 MVN 来进行位反转 : MOV r0, #0xFFFFFFFF ; assembles to MVN r0,#0

使用无法用上述方法生成的数据,将产生错误 。

031

ror #0

range 0-0xff000000 step 0x01000000 ror #8

range 0-0x000000ff step 0x00000001

range 0-0x000003fc step 0x00000004 ror #30

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

立即数 (2)

Page 13: ARM 及 Thumb 指令集

13TM 13ARM 及 Thumb 指令集

为允许装载大常数,汇编器提供了一条伪指令 : LDR rd, =const

它可能汇编成下列指令: MOV or MVN 。

或 LDR 指令,从数据池( Literal pools )读取常数。

For example LDR r0,=0xFF => MOV r0,#0xFF LDR r0,=0x55555555 => LDR r0,[PC,#Imm12]

……DCD 0x55555555

推荐使用这种方法把常数装入寄存器 。

装载 32 bit 常数

Page 14: ARM 及 Thumb 指令集

14TM 14ARM 及 Thumb 指令集

Quiz #1

1. 写一条 ARM 指令,分别完成下列操作:a) r0 = 16b) r0 = r1 / 16 ( 带符号的数字 )c) r1 = r2 * 3d) r0 = -r0

2. 下面哪些立即数是数据处理指令中有效的数据 ?

a) 0x00AB0000 b) 0x0000FFFF c) 0xF000000Fd) 0x08000012 e) 0x00001f80 f) 0xFFFFFFFF

3. BIC 指令做什么用?

4. 为什么 ARM 处理器增加了一条 RSB 指令 ?

Page 15: ARM 及 Thumb 指令集

15TM 15ARM 及 Thumb 指令集

Start

Stopr0 = r1?

r0 > r1?

r0 = r0 - r1 r1 = r1 - r0

Yes

No Yes

No

你只需要使用 CMP 、 SUB 和 B 指令。充分使用条件执行!

大家可以尝试计算 2109 和 4161 的 GCD

AREA myarea, CODEENTRY

MOV r0, #9MOV r1, #15

start; your code here

stopB stopEND

Quiz #2 - GCD

新建一个 ‘ ARM Executable Image’ 项目

新建一个 text 文件 另存为 “ gcd.s”

加入到项目中 Build 并执行

Page 16: ARM 及 Thumb 指令集

16TM 16ARM 及 Thumb 指令集

乘法

语法: MUL{<cond>}{S} Rd, Rm, Rs Rd = Rm * Rs MLA{<cond>}{S} Rd,Rm,Rs,Rn Rd = (Rm * Rs) + Rn [U|S]MULL{<cond>}{S} RdLo, RdHi, Rm, Rs RdHi,RdLo := Rm*Rs [U|S]MLAL{<cond>}{S} RdLo, RdHi, Rm, Rs RdHi,RdLo := (Rm*Rs)+RdHi,RdLo

占用的周期数 基本 MUL 指令

ARM7TDMI 上为 2-5 周期 StrongARM/XScale 上为 1-3 周期 ARM9E/ARM102xE 上为 2 周期

ARM9TDMI 比 ARM7TDMI 多 1 周期 累加再多 1 周期 ( 不针对 9E ,尽管结果延迟多于 1 周期 ) 对于“ long” 型数据,多 1 周期

以上均为一般规则,确切细节查看相应手册。

Page 17: ARM 及 Thumb 指令集

17TM 17ARM 及 Thumb 指令集

单寄存器数据传送

LDR STR Word LDRB STRB Byte LDRH STRH Halfword LDRSB 带符号的 byte load LDRSH 带符号的 halfword load

存储器系统必须支持所有访问宽度

语法: LDR{<cond>}{<size>} Rd, <address> STR{<cond>}{<size>} Rd, <address>

e.g. LDREQB

Page 18: ARM 及 Thumb 指令集

18TM 18ARM 及 Thumb 指令集

地址访问

LDR/STR 访问的地址由基址寄存器加上偏移量来产生。 针对 word 和无符号 byte 的访问 , 偏移量可以是:

一个无符号 12-bit 立即数 ( 如 0 - 4095 bytes).LDR r0,[r1,#8]

一个寄存器,或再加上移位(由立即数指定)LDR r0,[r1,r2]LDR r0,[r1,r2,LSL#2]

可以是从基址寄存器上加或减去偏移量 :LDR r0,[r1,#-8]LDR r0,[r1,-r2]LDR r0,[r1,-r2,LSL#2]

对于 halfword 和带符号的 halfword / byte, 偏移量可以是 : 一个无符号 8 bit 立即数 ( 如 0-255 bytes). 一个寄存器 ( 不能偏移 ) 。

可选择采用 pre-indexed 或 post-indexed 方式寻址

Page 19: ARM 及 Thumb 指令集

19TM 19ARM 及 Thumb 指令集

0x5

0x5

r1

0x200基址

寄存器 0x200

r0

0x5源寄存器for STR

偏移量12 0x20c

r1

0x200

原基址寄存器 0x200

r0

0x5源寄存器for STR

偏移量12 0x20c

r1

0x20c更新

基址寄存器

通过 STR r0,[r1,#12]! 来自动更新基址寄存器

Pre or Post Indexed 寻址 ?

Pre-indexed: STR r0,[r1,#12]

Post-indexed: STR r0,[r1],#12

Page 20: ARM 及 Thumb 指令集

20TM 20ARM 及 Thumb 指令集

编写一个 ARM 汇编程序,累加一个队列中的所有元素,碰上 0 时停止。结果放入 r4 。

在源文件末尾按如下方式声明队列:

myarrayDCD 0x11DCD 0x22DCD 0

用 r0 指向队列的入口

ADR r0,myarray

使用 LDR r1,[r0],#4 从队列中装载数据 累加并放入 r4 循环,直到 r1 为 0 停止,进入死循环

Quiz #3 - Total of array

0x22

0

0x11r0地址增加

Page 21: ARM 及 Thumb 指令集

21TM 21ARM 及 Thumb 指令集

LDM / STM 指令允许一次传送 1 到 16 个寄存器到 / 从存储器中。 寄存器传送顺序不能被指定• 最小数字的寄存器总是被传送到 / 从存储器的最低地址上。

LDMIA r10,{r0,r1,r4}

基址寄存器指定存储器访问开始的地址

快传送指令针对下列情况很有效:• 从存储器中搬运一块数据• 保存或恢复堆栈中的内容

• 如果是慢速存储器,会影响中断响应时间

块数据传送

r1

r4

r0r10 地址增加

Page 22: ARM 及 Thumb 指令集

22TM 22ARM 及 Thumb 指令集

LDM / STM 操作

语法:<LDM|STM>{<cond>}<addressing_mode> Rb{!}, < 寄存器 list>

4 中寻址操作 : LDMIA / STMIA Increment After (先操作,后增加) LDMIB / STMIB Increment Before (先增加,后操作) LDMDA / STMDA Decrement After (先操作,后递减) LDMDB / STMDB Decrement Before (先递减,后操作)

IA

r1 地址

增加

r4

r0

r1

r4

r0

r1

r4

r0 r1

r4

r0

r10

IB DA DBLDMxx r10, {r0,r1,r4}STMxx r10, {r0,r1,r4}

基址寄存器 (Rb)

Page 23: ARM 及 Thumb 指令集

23TM 23ARM 及 Thumb 指令集

存储器块拷贝

可选项“ ! ” 将导致 LDM / STM 指令去自动更新基址寄存器 后缀为 IA, IB 时,加上 4 乘以 用于传送的寄存器的数目的值 后缀为 DA, DB 时,减去 4 乘以用于传送的寄存器的数目的值

示例 :

; r12 指向源数据起始地址

; r14 指向源数据尾地址

; r13 指向目的数据起始地址

loop LDMIA r12!, {r0-r11} ; 装载 48 bytes

STMIA r13!, {r0-r11} ; 和存储 them

CMP r12, r14 ; check for the end

BNE loop ;和 loop until done

• 此循环传送 48 bytes 占用了 31 周期• 时钟为 33 MHz 时传输速率超过 50 Mbytes/sec

存储器增加

r13

r14

r12

Page 24: ARM 及 Thumb 指令集

24TM 24ARM 及 Thumb 指令集

LDMFD sp!,{r4-r7,pc}

SP 100FF

1234AOBE80341010123484209753

r4 1r5 14544r6 0r7 12

lr 9048pc 9020

r4 100100FF r5 FF

1234 r6 1234A0BE r7 A0BE8034

pc 8034

堆栈

r4 100r5 FFr6 1234r7 A0BE

lr 8034

ABCD8765102E16FFFF1010123484209753

存储器顶

SP SP

100FF

1234A0BE8034

SP

Old SP

100FF

1234A0BE8034

ARM堆栈操作通过块传送指令来完成 :• STMFD (Push) 块存储 - Full Descending stack [STMDB]• LDMFD (Pop) 块装载 - Full Descending stack [LDMIA]

STMFD sp!,{r4-r7,lr}

Page 25: ARM 及 Thumb 指令集

25TM 25ARM 及 Thumb 指令集

在寄存器和存储器之间,由一次存储器读和一次存储器写组成的原子操作。完成一个字节或字的交换。

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

可用作信号量 不能由 armcc 编译产生,必须使用汇编器。

Rm Rd

32

1temp

存储器

Rn

SWP

Page 26: ARM 及 Thumb 指令集

26TM 26ARM 及 Thumb 指令集

软件中断 (SWI)

产生一个异常陷阱,跳转到 SWI 硬件向量。 SWI 处理程序可以检测 SWI 号,从而决定采取何种操作。 通过 SWI机制,运行在用户模式下的应用程序,可请求操作系统执行一系列特权操作。

语法: SWI{<cond>} <SWI number>

2831 2427 0

Cond 1 1 1 1 SWI number (ignored by processor)

23

条件域

Page 27: ARM 及 Thumb 指令集

27TM 27ARM 及 Thumb 指令集

PSR 传送指令

MRS 和 MSR 允许传送 CPSR / SPSR 中的内容到 / 从一个通用寄存器中。 语法:

MRS{<cond>} Rd,<psr> ; Rd = <psr> MSR{<cond>} <psr[_fields]>,Rm ; <psr[_fields]> = Rm

在这里: <psr> = CPSR or SPSR [_fields] = ‘fsxc’ 的任意组合

也允许送一个立即数到 psr_fields MSR{<cond>} <psr_fields>,#Immediate

用户模式下,所有位均可以被读取,但只有条件标志位 (_f) 可被写。

2731

N Z C V Q

28 67

I F T mode

1623

815

5 4 024

f s x c

U n d e f i n e dJ

Page 28: ARM 及 Thumb 指令集

28TM 28ARM 及 Thumb 指令集

协处理器指令

ARM体系支持 16 个协处理器 针对每个协处理器的指令占用 ARM 指令集中的固定部分

如果相应的协处理器不存在, 将发生一个未定义指令异常。 这有三种协处理器指令

协处理器数据处理指令 CDP :初始化协处理器数据处理操作

协处理器寄存器传送指令 MRC : 从 ARM 寄存器移到协处理器寄存器 MCR :从协处理器寄存器移到 ARM 寄存器

协处理器存储器传送指令 LDC :从存储器装载到协处理器寄存器 STC :从协处理器寄存器存储到存储器

Page 29: ARM 及 Thumb 指令集

29TM 29ARM 及 Thumb 指令集

Quiz #4

1. 写几条 ARM 指令,使能 IRQ 中断

2. 下列 ARM 指令将做什么 ?a) LDRH r0,[r1,#6]b) LDR r0, =0x999

3. 在装载或存储指令中, “ !” 表示什么 ?

4. 当 执行 SWI 指令时,会发生什么 ?

5. SWP 指令的优势是什么 ?

Page 30: ARM 及 Thumb 指令集

30TM 30ARM 及 Thumb 指令集

Agenda

ARM 指令集 Thumb 指令集

v5TE 体系结构扩展

Page 31: ARM 及 Thumb 指令集

31TM 31ARM 及 Thumb 指令集

015

31

0

ADDS r2,r2,#1

ADD r2,#1

32-bit ARM 指令

16-bit Thumb 指令

对于由编译器产生的大部分指令:没有条件执行源、目的寄存器必须相同仅能使用低寄存器常数大小有限制不能使用在线移位器

Thumb

Thumb 是 16-bit 指令集 代码密度优化 (总代码大小约为 ARM 指令的 65% ) 使用窄总线存储器时可以大大提高性能。 是 ARM 指令集的一个子集。

核存在一个执行状态 – Thumb状态 ARM 和 Thumb之间切换使用 BX 指令

Page 32: ARM 及 Thumb 指令集

32TM 32ARM 及 Thumb 指令集

使用 Branch Exchange 指令来完成 Interworking BX Rn ; Thumb 状态下的 Bx 指令 BX<condition> Rn ; ARM状态下的 Bx 指令

也可以只是执行一个绝对跳转,无须状态更换。

ARM / Thumb Interworking

Rn

BX 跳转的地址31 01

31 01

ARM / Thumb 选择0 - ARM 状态

1 - Thumb 状态

0

Page 33: ARM 及 Thumb 指令集

33TM 33ARM 及 Thumb 指令集

写 Thumb 汇编程序

Thumb 不是一个“好” 指令集! 最好用编译器来产生 约束并不一致

手动编码使用 ARM 指令集比较好

更多细节,参看: ARM “Architecture Reference Manual” Chapters A6 和 A7

Page 34: ARM 及 Thumb 指令集

34TM 34ARM 及 Thumb 指令集

Agenda

ARM 指令集

Thumb 指令集 v5TE体系结构扩展

Page 35: ARM 及 Thumb 指令集

35TM 35ARM 及 Thumb 指令集

v5TE 结构

v5TE体系包括全部的 v4T ARM 和 Thumb 指令集,还有:

增强的 interworking 同时支持 ARM / Thumb 状态

Breakpoint 指令 (ARM 和 Thumb) CLZ ( Count Leading Zeros )指令 扩展协处理器指令 - MCR2 等等 支持饱和处理 封装的带符号的半字乘法指令 双字装载 / 存储指令 Cache预装载指令 双字协处理器 传送指令 - MCRR/MRRC

Page 36: ARM 及 Thumb 指令集

36TM 36ARM 及 Thumb 指令集

你采用的处理器是哪种结构 ?

处理器核 结构体系

7TDMI & 9TDMI v4T

9E-S rev1 v5TE

926EJ-S/1026EJ-S v5TEJ

1020E v5TE

StrongARM v4

XScale Microarchitecturev5TE

Page 37: ARM 及 Thumb 指令集

37TM 37ARM 及 Thumb 指令集

Count Leading Zeros

CLZ{cond} Rd, Rm 计算寄存器中的前导 0 (第一个 1 以前的 0 )

源寄存器从最高位开始计算。

1 个周期完成(ARM9E-S/ARM102x)

如果没有任何一位被置位,结果是 32;如果 bit 31 被置位,结果为 0 。

Rm 左移 Rd 位即可标准化 Rm

带符号的标准化需要额外的 1 个周期

0000 0010 1110 1101...0R0 =

CLZ R1, R0

0x6R1 =

1011 1011 0100 0000...0Rm =

MOV R0, R0 LSL R1

EOR R1, R0, R0, LSL#1CLZ R1, R1MOV R0, R0, LSL R1

Page 38: ARM 及 Thumb 指令集

38TM 38ARM 及 Thumb 指令集

扩展协处理器指令

CDP2, LDC2, STC2, MCR2, MRC2 新格式的标准协处理器指令为协处理器设计人员提供了附加的操作码空间。 同样是无条件执行的

Page 39: ARM 及 Thumb 指令集

39TM 39ARM 及 Thumb 指令集

参考材料

ARM “Architecture Reference Manual” - 2nd editionedited by David Seal

ARM DDI 0100E is latest, covering v5TE DSP extensions ISBN 0-201-737191 (Addison-Wesley) PDF on ADS和‘ Technical Documentation’ CDs

Steve Furber “ARM 系统 -on-chip architecture” - 2nd edition ISBN 0-201-67519-6 (Addison-Wesley)

Quick Reference Card ARM QRC 0001E comes with ADS 1.2

ADS 1.2 Assembler Guide refers to ADS Examples directory

Page 40: ARM 及 Thumb 指令集