批量数据加载/存储指令

```微机原理与接口技术

ARM编程模型
ARM指令格式和寻址方式
ARM指令集
Thumb指令集

2
3.3 ARM指令集
3.3.1 数据处理指令
3.3.2 跳转指令
3.3.4 程序状态寄存器指令
3.3.5 协处理器指令
3.3.6 异常中断指令
3
3.3.1 数据处理指令
1. MOV数据传送指令 (Move)
MOV{<cond>}{S} <Rd>,<op1>;
Rd—目的寄存器
op1－寄存器或立即数，若为寄存器可以先移位。

如果
R15 是目的寄存器，将修改程序计数器或标志。用于返

NOP 指令的效果，还可以专门移

R15:

MOV R0，＃5；
R0=5
MOV R0，R1；
R0=R1
MOV
MOV
PC,R0,
R14R0; ; ;退出到调用者 R0 = R0... NOP
MOV R0，R1，LSL＃5;
MOVS
MOV
PC,
R0,
R14
R0, LSL
;退出到调用者并回复标志位
#3 ;
R0 = R0 * 8
R0= R1左移5位
4
Move Immediate Value
 The data processing instruction format has 12 bits available
for operand2

If used directly this would only give a range of 4096
 Instead it is used to store 8 bit constants, giving a range of 0 255.
 These 8 bits can then be rotated right through an even
number of positions (i.e. RORs by 0, 2, 4,..30).


4 bits to control the 16 possible ROR rotation numbers
This gives a much larger range of constants that can be directly
from memory
Move Immediate Value
 This gives us:




0 - 255
[0 - 0xff]
256,260,264,..,1020
[0x100-0x3fc, step 4, 0x40-0xff
ROR 30]
1024,1040,1056,..,4080
[0x400-0xff0, step 16, 0x40-0xff ROR 28]
4096,4160, 4224,..,16320 [0x1000-0x3fc0, step 64, 0x40-0xff ROR 26]
 These can be loaded using, for example:

MOV r0, #0x40, ROR 26 ; => MOV r0, #0x1000
(i.e. 4096)
 To make this easier, the assembler will convert to this form for
us if simply given the required constant:

MOV r0, #4096
; => MOV r0, #0x1000
(i.e. 0x40 ROR 26)
MVN数据取反传送指令
2. MVN数据取反传送指令(Move Negative)
MVN{<cond>}{S} <Rd>,<op1>;

(logical negation)。
Rd = !op1

MVN R0, R2 ;
R0 = !(R2)
MVN R0, #0 ;
R0 = -1
?
7
Op2为寄存器或立即数，若为



ADD R0, R2, R3, LSL#1 ;
R0 = R1 + 5
R0 = R1 + R2
R0 = R2 + (R3 ) X 2
8
4.

Rd= Rn + op2 + carry
9
 下列例子实现两个 64位数的加法运算。
64 位结果:

10
SUB减法指令
5. SUB减法指令(Subtraction)
SUB{<cond>}{S} <Rd>,<Rn>,<op2>;
Op2为寄存器或立即数，若为
 功能：SUB 用操作数 Rn 减去操作数
op2，把结果放置

SUB R0, R1, #5;
R0 = R1 - 5
SUB R0, R1, R2;
R0 = R1 – R2
SUB R0, R1, R2,LSL#5 ;
R0 = R2 - (R2) X 32
11
RSB反向减法指令
6. RSB反向减法指令(Reverse Subtraction)
RSB{<cond>}{S} <Rd>,<Rn>,<op2>;
Op2为寄存器或立即数，若为

 功能：SUB 用操作数 op2 减去操作数
Rn，把结果放置



RSB R0, R1, R2 ;
R0 = R2 - R1
RSB R0, R1, #256 ;
R0 = 256 - R1
RSB R0, R2, R3,LSL#1 ;
R0 = (R3 << 1) - R2
12
SBC带借位减法指令
7. SBC带借位减法指令:(Subtraction with Carry)
SBC{<cond>}{S} <Rd>,<Rn>,<op2>;
 功能：用寄存器Rn的值减去操作数op2表示的值，再减去

Rd= Rn - op2 - !carry

13
SBC带借位减法指令
 该指令用于实现超过32位的数的减法。
 例如：

64位结果存放在R0，R1中。
SUBS R0，R2，R4； 低32位相减，S表示结果影响条件

SBC R1，R3，R5；

14
RSC带借位的反向减法指令
8. RSC带借位的反向减法指令(Reverse Subtraction with Carry)（

RSC{<cond>}{S} <Rd>,<Rn>,<op2>;
 功能：同于SBC，但倒换了两个操作数的前后位置。
Rd = op2 - Rn - !carry
例如：第一个64位操作数存放在寄存器R2，R3中；

64位结果存放在R0，R1中。低位在R2、R4、R0
SUBS R0，R2，R4；

RSC R1， R5，R3；

15
MUL32位乘法指令
9．MUL32位乘法指令(Multiplication)
MUL{<cond>}{S} <Rd>,<Rn>,<op2>;


Rn和op2的值为32位无符号数， op2 -必须为寄存器。
Rd = Rn * op2 仅保留最低32位

MULS R0，R1，R2；

R0＝R1×R2，结果影响寄存
16
 Using a multiplication instruction to multiply by a constant
waiting a number of internal cycles for the instruction to
complete.
 A more optimum solution can often be found by using some
combination of MOVs, ADDs, SUBs and RSBs with shifts.

Multiplications by a constant equal to a ((power of 2) ± 1) can
be done in one cycle.
 Example: r0 = r1 * 5
Example: r0 = r1 + (r1 * 4)
ADD r0, r1, r1, LSL #2
 Example: r2 = r3 * 105
Example: r2 = r3 * 15 * 7
Example: r2 = r3 * (16 - 1) * (8 - 1)
RSB r2, r3, r3, LSL #4
RSB r2, r2, r2, LSL #3
; r2 = r3 * 15
; r2 = r2 * 7
MLA 32位乘加指令
10．MLA
32位乘加指令 (Multiplication with Accumulate)
MLA{<cond>}{S} <Rd>,<Rn>,<op2>,<op3>;
 功能： MLA 的行为同于 MUL，但它把操作数 3 的值加到结

Rd =( Rn * op2) + op3，这在求总和时有用

Rn、op2和op3的值为32位的有符号数或无符号数。

MLA R0，R1，R2，R3；
R0＝R1×R2＋R3
18
ARM中除法的实现

1. offset=(Offset+increment)％buffer_size； （50cycle）
2. offset+=increment；
if(offset>=buffer_size) offset-=buffer_size；（3cycle）
ARM中除法的实现
 V7之前的ARM处理器：函数形式（如C库函数,20-100 cycles）
 ARM v7



Cortex-M系列，硬件除法器 （2-12 cycles）
Cortex-R系列，硬件除法器
Cortex-A系列，协处理器(VFP，NEON)
AND逻辑与指令
11．AND逻辑与指令(logical AND)
AND{<cond>}{S} <Rd>,<Rn>,<op2>;
 功能：AND 将在两个操作数上按位进行逻辑与，把结果放

AND R0, R0, #5 ;
R0 = 保持 R0 的位 ０ 和 2，其余位清0
ANDS R0, R0, #0x01 ;

21
ORR逻辑或指令
12．ORR逻辑或指令(logical OR)
ORR{<cond>}{S} <Rd>,<Rn>,<op2>;
 功能：OR 将在两个操作数上按位进行逻辑或，把结果放

ORR R0, R0, #5 ; R0 中的位 0 和 2置1 ,其余位不变
ORR R0, R0, #0x0F;
R0低四位置1
MOV R1,R2,LSR #8 ;
ORR R3,R1,R2,LSL#8; 注释有错
22
EOR逻辑异或指令
13. EOR逻辑异或指令(logical Exclusive OR)
EOR{<cond>}{S} <Rd>,<Rn>,<op2>;
 功能：EOR 将在两个操作数上按位进行逻辑异或，把结果放

EOR R0, R0, #5 ;
R0 中的位 0 和 2取反
EOR R1， R1， #x0F； 将R1的低4位取反
EOR R2， R1， R0；
EORS R0， R5， #0x01；
R0, 并影响标志位z.
R2=R1^R0
R5低位变反，结果保存到
23
BIC位清除指令
14．BIC位清除指令(Bit Clear)
BIC{<cond>}{S} <Rd>,<Rn>,<op2>;
 功能：BIC 是在一个字中清除位的一种方法，与 OR 位设

Rd = Rn AND (!op_2)
Rn中的此位。掩码中为0的位, Rn中此位保持不变。
BIC R0, R0, #0x5 ;

BIC R1, R1, #0x0F;

BIC R1， R2， R3； R1= R2 AND (!R3)
24
CMP比较指令
15．CMP比较指令 (Compare)
CMP{<cond>} <Rn>,<op1>;
 功能：将寄存器Rn的值和操作数op1所表示的值进行比较，

status = Rn – op1

CMP R0，＃5； 计算R0－5，根据结果设置条件标志位


TST位测试指令
16．TST位测试指令(Test bits)
TST{<cond>} <Rn>,<op1>;
 功能：将寄存器Rn的值和操作数op1所表示的值按位做逻

Status = Rn AND op1


TST
R0，＃5；
TST
R0， #0x01；

TST
R1， #0x0F；

BEQ

equal;
26
3.3.2 跳转指令
31
28 27
Cond
25 24 23
0
1 0 1 L
Offset
0 = Branch
Condition field


exit；

exit处
－32M～＋32M。
……
exit……
27
B跳转指令
0x0000 0000 ADD R0 R1 R2
0x0000 0004 B exit
0x0000 0008 SUB R0 R2 R3
0x0000 000c MOV R4 R0
…
0x0000 001c exit: ADD R0 R1 R4

What happens to the following
two instructions?
1. In DSP and older RISCs
(MIPS,SPARC…): branch
delay slot (executed,
automatic re-ordered by
assembler)
2. In ARM, PowerPC, Alpha:
pipeline refill with 3 cycle
penalty (not executed)

= 0x 0000 0010
exit = 0b 0000 0000 0000 0000 0000 0100 = 0x 000004

0x000004  0x000000040x00000010+PC(0x0000000b)
BL带返回的跳转指令
2.
BL带返回的跳转指令
PC-4
 功能：同B指令，但BL指令执行跳转操作的同时，还将PC
（寄存器R15）的值保存到LR寄存器（寄存器R14）中。该

BL func；

……
func
……
MOV R15，R14；

29

if (a != 5){
LDR r0 [a]
a = a + 1;
CMP r0 #5
LDR r0 [a]
CMP r0 #5
}
BEQ Bypass
MOV r0 #5
Bypass: a = 5;
Bypass: MOV r0 #5
1. 减少指令数量较小的内存占用
2.

when BEQ is executed)

if((a==b)&&(c==d)) e++;

CMP r0,r1
CMPEQ r2,r3

 R0,R1带符号数，R2,R3无符号数

R3>R2, 转去EXCEED


R1>R0, 转去EXCEED


CMP R1, R0; BGT EXCEED;
R2= 0，转去EXCEED


CMP R3 R2; BHI EXCEED;
CMP R2, #0; BEQ ZERO;
R0 = R1, 转去EQU

CMP R0, R1; BEQ EQU;
 总结：



CPSR中V位的设置
 以下4中情况V设为1 （以4位数字运算为例）





 乘法运算？








34
LDR字数据加载指令
[Rn +偏移/ Rm]所指数据装入后， Rn不变
1．LDR字数据加载指令:
LDR Rd，[Rn] ；

LDR{<cond>}

LDR Rd，[Rn，Rm] ;

LDR Rd，[Rn，＃index] ； 将内存中地址为
Rn+index的字数据装入寄存器Rd中；
LDR
Rd，[Rn，Rm，LSL＃5] ；将内存中地址为Rn＋
Rn表示基址寄存器，Rm表示变址寄存器，index表示偏
Rm×32的字数据装入寄存器Rd；

1、操作数地址为基址加变址，执行后基址不变。
((Rn)+(Rm))->(Rd);执行后Rn不变
35
LDR字数据加载指令
2、操作数地址为基址加变址，执行后基址改变
((Rn)+(Rm))->(Rd);

[Rn +偏移/ Rm]所指数据装入后， Rn= Rn+偏移/ Rm
LDR Rd，[Rn，Rm] ！；

LDR Rd，[Rn，＃index] ！；将内存中地址为Rn+index的字

LDR Rd，[Rn，Rm，LSL＃5]！；将内存中地址为Rn＋
Rm×32的字数据装入寄存器Rd，并将新地址Rn＋Rm×32写入
Rn
36
LDR字数据加载指令
3、操作数地址为基址，执行后基址改变
（（Rn））-> (Rd);执行后 (Rn)+(Rm)->(Rn);
[Rn]所指数据装入后， Rn= Rn+偏移/ Rm
LDR Rd，[Rn]，Rm ；将内存中地址为Rn的字数据装入寄

LDR Rd，[Rn]，＃index ；将内存中地址为Rn的字数据装入

LDR Rd，[Rn]，Rm，LSL＃5；将内存中地址为Rn的字数据

37
LDR字数据加载指令
LDR R0，[R1，R2，LSL＃5]!；
((R1)+(R2) X 32)->R0 ; (R1)+(R2) X 32)-> R1
LDR R1，[R0，#0x12]；
((R0)+(12)->R1 ; (R0)不变
LDR R1， [R0， -R2]；
((R0)-(R2)->R1 ; (R0)不变
LDR R1， [R0]
((R0）)->R1 ; (R0)不变
LDR R1， localdata；

（localdata）-> R1
LDR R0， [R1]， R2， LSL #2；
((R1))-> R0,执行后 (R1)+(R2) X 4-> R1
LDR R0， [R1]；将外设端口数据输入到R0
38
STR字数据存储指令
3. STR字数据存储指令:

STR
R0， [R1，＃5]！

STR R2，[R1， #16]

STR R0， [R7]， #-8
STR R2, [R9, #consta-struc]；consta-struc是一个常量表达式，

STR R0， [R1]； 将数据输出到外设端口寄存器中；
39
Effect of endianess
 The ARM can be set up to access its data in either little
or big endian format.
 Little endian:

Least significant byte of a word is stored in bits 0-7 of an
 Big endian:

Least significant byte of a word is stored in bits 24-31 of
 This has no real relevance unless data is stored as
words and then accessed in smaller sized quantities
(halfwords or bytes).

Which byte / halfword is accessed will depend on the
endianess of the system involved.
Endianess Example
r0 = 0x11223344
31
24 23
11
22
16 15
87
33
0
44
STR r0, [r1]
31
24 23
11
22
16 15
87
33
0
31
Memory
44
24 23
44
16 15
33
87
22
0
11
r1 = 0x100
r1 = 0x100
Little-endian
Big-endian
LDRB r2, [r1]
31
24 23
00
00
16 15
87
00
r2 = 0x44
0
44
31
24 23
00
16 15
00
87
00
r2 = 0x11
0
11
 应用举例：（1） 用ARM指令实现x=（a+b）-c：
LDR
R4， =a;
（R4）=a，a为内存变量地址
LDR R0， [R4];((R4))->R0, (a)-> R0
LDR
R5， =b；
LDR
R1， [R5] ; ((R5))->R1, (b)->R1
R3， R0， R1; (a)+(b)->R3
LDR
R4， =c
LDR R2， [R4] ; ((R4))->R2, (c)->R2
SUB
R3， R3， R2;
LDR
R4， =x
STR
R3， [R4]
a+b-c -> R3
;(R4)=x
; （a+b）- c存入x变量 42
（2） 用ARM指令实现x=a*（b+c）
LDR
R0， [R4] ;(b)->R0
LDR
; LDR R4,=c
R1， [R4] ; (c)->R1
LDR
;LDR R4,=a
R0， [R4] ; (a)->R0
MUL R2， R2，R0; (b+c)*a->R2
STR R2， [R4]
;LDR R4,=x
; (b+c)*a->x
43

5. LDM批量数据加载指令:

LDM{<cond>}{<type>} <Rn>{!}，<regs>{^}；
Rn：保存内存单元的起始地址。
 功能：从一片连续的内存单元读取数据到各个寄存器中，内
Regs：寄存器列表，由若干

 {!}：若选用了此后缀，则当指令执行完毕后，将最后的地

 ‘^’ 不带^表示用户和系统模式寄存器;

44

6. STM批量数据存储指令:
STM{<cond>}{<type>} <Rn>{!}，<regs>{^}；
 功能：将各个寄存器的值存入一片连续的内存单元中，

45

 指令中，type字段有以下几种：

4种类型的堆栈

Aaccumulate ）：入栈指针加4，出栈指针减
FD:满递减堆栈；Full
decrease
4。

R13!,{R0,R1}

R13!,{R2,R3}
FA:满递增堆栈；Full accumulate

ED:空递减堆栈；Empty decrease

EA:空递增堆栈；Empty accumulte

46

 指令中，type字段有以下几种：
4种内存操作
IA:STM/LDM每次传送后地址加4；Increase after
STMIA
R13!,{R0,R1}
LDMIA R13!,{R2,R3}
IB:STM/LDM每次传送前地址加4；Increase before
STMIB
R13!,{R0,R1}
LDMIB
R13!,{R2,R3}
DA:STM/LDM每次传送后地址减4；Decrease after
STMDA
R13!,{R0,R1}
LDMDA
R13!,{R2,R3}
DB：STM/LDM每次传送前地址减4；Decrease before
STMIDB
LDMDB
R13!,{R0,R1}
R13!,{R2,R3}
47

IA、IB、DA、DB指定了地址加还是减，是传送前还是传送

R13!，{R0-R1，R3}；各指令
STMIA/IB/DA/DB

LDMIA/IB/DA/DB 相同.
R13
0x12345684
0x123456a0
36338832
0x12345690
14543862
0x1234568c
15548545
0x12345688
54693645
0x12345684
66663333
0x12345680
00008888
0x1234567c
59595959
0x12345678
26262626
LDMIA:每次传送后地址加4；
LDMDB:每次传送前地址减4；
LDMIB:每次传送前地址加
4；
LDMDA:每次传送后地址减4；
15548545
14543862
R3
54693645
15548545
R1
00008888 R3
66663333
54693645
66663333
R0
59595959 R1
00008888
59595959
26262626

48
R0

 FD、ED、FA、和EA指定是满栈还是空栈，是升序栈还是降序

EA：空递增堆栈；
36338832 FA：满递增堆栈；
0x123456a0
0x123456a0
ED：空递减堆栈；
STM入栈
↑ LDM出栈 ↓
FD：满递减堆栈；
0x123456a0
14543862
0x12345690
STM STM入栈

LDM出栈 ↓↑
0x12345690
0x12345690

↓LDM出栈 ↑
15548545 STM入栈
0x1234568c
0x1234568c
0x1234568c
0x12345688
0x12345688
0x12345688
0x12345684
0x12345684
0x12345684
0x12345680
0x12345680
0x12345680
0x1234567c
0x1234567c
0x1234567c
0x12345678
0x12345678
0x12345678
54693645
54693645
66663333
66663333

00008888
59595959
26262626
49

 例如：使用LDM/STM进行现场寄存器保护，常在子程序中或异常处理使用：
SENDBYTE
STMFD SP!，{R0-R7， LR}；

......

1、STMEA
R13!，
{R0-R12，PC}；将寄存器R0～R12以及程序计数器PC的值
BL
DELAY；

2、使用LDM/STM进行数据复制：
DELAY
......
......
......
LDR R0，=SrcData； 设置源数据地址
LDMFD SP!，{R0-R7， PC}； 恢复寄存器，并返回
LDR R1，=DstData； 设置目标地址
LDMIA R0， {R2-R9}； 加载8字数据到寄存器R2~R9
STMIA R1， {R2-R9}； 存储寄存器R2~R9到目标地址
50
LDMIA/STMIA
 LDMIA/STMIA Rn!, {reglist}


Rn is the register containing the base address. Rn mustbe in the
range r0-r7.
reglist is a comma-separated list of low registers or low-register
ranges.
 Usage



Registers are loaded stored and in numerical order, with the
lowest numbered register at the address initially in Rn.
The value in Rn is incremented by 4 times the number of
registers in reglist.
If Rn is in reglist:


for an LDMIA instruction, the final value of Rn is the value loaded,
for an STMIA instruction, the value stored for Rn is:
– the initial value of Rn if Rn is the lowest-numbered register
in reglist
– unpredictable otherwise.
Incorrect examples
 LDMIA r3!,{r0,r9} ; high registers not allowed
 STMIA r5!, {} ; must be at least one register in list
 STMIA r5!,{r1-r6} ; value stored from r5 is unpredictable

pop
=LDM
push
=STM
FA

LDMFA
LDMDA
STMFA
STMIB
FD

LDMFD
LDMIA
STMFD
STMDB
EA

LDMEA
LDMDB
STMEA
STMIA
ED

LDMED
LDMIB
STMED
STMDA
ARM编译器默认

LDM/STM指令格式
LDM/STM指令格式
LDMFD R0! {R1, R5, R2}
LDR R1,[R0],#4
LDR R2,[R0],#4
LDR R5,[R0],#4
3.3.6 异常中断指令
ARM处理器支持两条异常中断指令：软件中断指令SWI和断

1． SWI软件中断指令：
SWI{条件} 24位的立即数（系统例程类型） ；

0X05； 该指令用于调用编号为05的系统例程
57
SWI软件中断指令

1、指令中24位的立即数（值为0~16777215之间的整数）

MOV
R0， #34；

SWI 12；

2、当24位的立即数被忽略时，系统例程类型由寄存器R0

MOV
R0， #12；

MOV
R1， #34；

SWI
0；

58
BKPT断点中断指令
2. BKPT断点中断指令：
BKPT 16位的立即数；
 功能：用于产生软件断点中断，以便软件调试时使用。
16位的立即数：额外的断点信息，可有可无。
59

ARM编程模型
ARM指令格式和寻址方式
ARM指令集
Thumb指令集

60

 例1：写出执行以下计算的指令序列，其中，X,Y,Z,R,W

(1) ZW-(X+6)-(R+9)
(2) Z(W*X)/16


61
```