标题:
ARM指令集 - 加载/存储指令
[打印本页]
作者:
look_w
时间:
2017-9-24 15:34
标题:
ARM指令集 - 加载/存储指令
3.3 ARM
指令集
本节对
ARM
指令集的七大类指令进行详细的描述。
3.3.1
加载
/
存储指令
ARM
处理器支持加载
/
存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。常用的加载存储指令如下:
1、LDR指令
LDR指令的格式为:
LDR{条件} 目的寄存器,<存储器地址>
LDR
指令用于从存储器中将一个
32
位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取
32
位的字数据到通用寄存器,然后对数据进行处理。当程序计数器
PC
作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指令在程序设计中比较常用,且寻址方式灵活多样,请读者认真掌握。
如:
LDR R0
,
[R1]
;将存储器地址为
R1
的字数据读入寄存器
R0
。
LDR R0
,
[R1
,
R2]
;将存储器地址为
R1+R2
的字数据读入寄存器
R0
。
LDR R0
,
[R1
,#
8]
;将存储器地址为
R1+8
的字数据读入寄存器
R0
。
LDR R0
,
[R1
,
R2]
!
;将存储器地址为
R1+R2
的字数据读入寄存器
R0
,并将
;新地址
R1
+
R2
写入
R1
。
LDR R0
,
[R1
,#
8]
!
;将存储器地址为
R1+8
的字数据读入寄存器
R0
,并将新
;地址
R1
+
8
写入
R1
。
LDR R0
,
[R1]
,
R2
;将存储器地址为
R1
的字数据读入寄存器
R0
,并将新地
;址
R1
+
R2
写入
R1
。
LDR R0
,
[R1
,
R2
,
LSL
#
2]
!
;将存储器地址为
R1
+
R2
×
4
的字数据读入寄存器
R0
,
;并将新地址
R1
+
R2
×
4
写入
R1
。
LDR R0
,
[R1]
,
R2
,
LSL
#
2
;将存储器地址为
R1
的字数据读入寄存器
R0
,并将新地
;址
R1
+
R2
×
4
写入
R1
。
2、STR指令
STR指令的格式为:
STR{条件} 源寄存器,<存储器地址>
STR
指令用于从源寄存器中将一个
32
位的字数据传送到存储器中。该指令在程序设计中比较常用,且寻址方式灵活多样,使用方式可参考指令
LDR
。
如:
STR R0
,
[R1]
,#
8
;将
R0
中的字数据写入以
R1
为地址的存储器中,并将新地址
R1
+
8
写入
R1
。
STR R0
,
[R1
,#
8]
;将
R0
中的字数据写入以
R1
+
8
为地址的存储器中。
LDR/STR
指令都可以加
B
、
H
、
SB
、
SH
的后缀,分别表示加载
/
存储字节、半字、带符号的字节、带符号的半字。如
LDRB
指令表示从存储器加载一个字节进寄存器。当使用这些后缀时,要注意所使用的存储器要支持访问的数据宽度。
3、LDM(或STM)批量数据加载/存储指令
LDM(或STM)指令的格式为:
LDM(或STM){条件}{类型} 基址寄存器{!},寄存器列表{∧}
LDM
(或
STM
)指令用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据,该指令的常见用途是将多个寄存器的内容入栈或出栈。其中,
{
类型
}
为以下几种情况:
IA
每次传送后地址加
1
;
IB
每次传送前地址加
1
;
DA
每次传送后地址减
1
;
DB
每次传送前地址减
1
;
FD 满递减堆栈;
ED 空递减堆栈;
FA 满递增堆栈;
EA 空递增堆栈;
{
!
}
为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。
基址寄存器不允许为
R15
,寄存器列表可以为
R0
~
R15
的任意组合。
{
∧
}
为可选后缀,当指令为
LDM
且寄存器列表中包含
R15
,选用该后缀时表示:除了正常的数据传送之外,还将
SPSR
复制到
CPSR
。同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。
如:
STMFD R13!,{R0
,
R4-R12
,
LR}
;将寄存器列表中的寄存器(
R0
,
R4
到
R12
,
LR
)存入堆栈。
LDMFD R13!,{R0
,
R4-R12
,
PC}
;将堆栈内容恢复到寄存器(
R0
,
R4
到
R12
,
LR
)。
4、SWP数据交换指令
SWP指令的格式为:
SWP{条件} 目的寄存器,源寄存器1,[源寄存器2]
SWP
指令用于将源寄存器
2
所指向的存储器中的字数据传送到目的寄存器中,同时将源寄存器
1
中的字数据传送到源寄存器
2
所指向的存储器中。显然,当源寄存器
1
和目的寄存器为同一个寄存器时,指令交换该寄存器和存储器的内容。
如:
SWP R0,R1
,
[R2]
;将
R2
所指向的存储器中的字数据传送到
R0
,同时将
R1
中的字数据传送到
R2
所指向的存储单元。
SWP R0,R0
,
[R1]
;该指令完成将
R1
所指向的存储器中的字数据与
R0
中的字数据交换。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0