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、LDRB指令
LDRB指令的格局为:
LDR{条件}B意图寄存器,<存储器地址>
LDRB指令用于从存储器中将一个8位的字节数据传送到意图寄存器中,一起将寄存器的高24位清零。该指令一般用于从存储器中读取8位的字节数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为意图寄存器时,指令从存储器中读取的字数据被当作意图地址,然后能够完结程序流程的跳转。
指令示例:
LDRB R0,[R1];将存储器地址为R1的字节数据读入寄存器R0,并将R0的高24位清零。
LDRB R0,[R1,#8];将存储器地址为R1+8的字节数据读入寄存器R0,并将R0的高24位清零。
3、LDRH指令
LDRH指令的格局为:
LDR{条件}H意图寄存器,<存储器地址>
LDRH指令用于从存储器中将一个16位的半字数据传送到意图寄存器中,一起将寄存器的高16位清零。该指令一般用于从存储器中读取16位的半字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为意图寄存器时,指令从存储器中读取的字数据被当作意图地址,然后能够完结程序流程的跳转。
指令示例:
LDRH R0,[R1];将存储器地址为R1的半字数据读入寄存器R0,并将R0的高16位清零。
LDRH R0,[R1,#8];将存储器地址为R1+8的半字数据读入寄存器R0,并将R0的高16位清零。
LDRH R0,[R1,R2];将存储器地址为R1+R2的半字数据读入寄存器R0,并将R0的高16位清零。
4、STR指令
STR指令的格局为:
STR{条件}源寄存器,<存储器地址>
STR指令用于从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常用,且寻址方法灵活多样,运用方法可参阅指令LDR。
指令示例:
STR R0,[R1],#8;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。
STR R0,[R1,#8];将R0中的字数据写入以R1+8为地址的存储器中。
5、STRB指令
STRB指令的格局为:
STR{条件}B源寄存器,<存储器地址>
STRB指令用于从源寄存器中将一个8位的字节数据传送到存储器中。该字节数据为源寄存器中的低8位。
指令示例:
STRB R0,[R1];将寄存器R0中的字节数据写入以R1为地址的存储器中。
STRB R0,[R1,#8];将寄存器R0中的字节数据写入以R1+8为地址的存储器中。
6、STRH指令
STRH指令的格局为:
STR{条件}H源寄存器,<存储器地址>
STRH指令用于从源寄存器中将一个16位的半字数据传送到存储器中。该半字数据为源寄存器中的低16位。
指令示例:
STRH R0,[R1];将寄存器R0中的半字数据写入以R1为地址的存储器中。
STRH R0;将寄存器R0中的半字数据写入以R1+8为地址的存储器中。
7、批量数据加载/存储指令
ARM微处理器所支撑批量数据加载/存储指令能够一次在一片接连的存储器单元和多个寄存器之间传送数据,批量加载指令用于将一片接连的存储器中的数据传送到多个寄存器,批量数据存储指令则完结相反的操作。常用的加载存储指令如下:
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)。