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 位的半字数据传送到目的寄存器40
中,同时将寄存器的高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,[R1,#8] ;将寄存器R0 中的半字数据写入以R1+8 为地址的内存中。
2.6.6连续数据加载/存储指令
ARM 微处理器所支持连续数据加载/存储指令可以一次在一片连续的记忆体单元和多个寄存器之间传送数据,连续加载指令用于将一片连续的内存中的数据传送到多个寄存器,连续数据存储指令则完成相反的操作。常用的载入存储指令如下:
LDM 连续数据加载指令
STM 连续数据存储指令
LDM(或STM)指令
LDM(或STM)指令的语法为:
LDM(或STM){条件}{类型}
基址寄存器{!},寄存器列表{∧}
LDM(或STM)指令用于从由基址寄存器所指示的一片连续内存到寄存器列表所指示的多个寄存器之间传送数据,该指令的常见用途是将多个寄存器的内容入堆栈或出堆栈。其中,{类型}为以下几种情况:
IA 每次传送后地址加1;
IB 每次传送前地址加1;
DA 每次传送后地址减1;
DB 每次传送前地址减1;
FD 满递减堆栈;
ED 空递减堆栈;42
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)。
ARM 微处理器所支持数据交换指令能在内存和寄存器之间交换数据。资料交换指令有如下两条:
SWP 字数据交换指令
SWPB 字节数据交换指令
SWP
指令
SWP
指令的语法为:
SWP{条件}
目的寄存器,来源寄存器1,[来源寄存器2]
SWP 指令用于将来源寄存器2 所指向的内存中的字数据传送到目的寄存器中,同时将来源寄存器1
中的字数据传送到来源寄存器2
所指向的内存中。显然,当来源寄存器1
和目的寄存器为同一个寄存器时,指令交换该寄存器和记忆体的内容。指令范例:
SWP R0,R1,[R2] ;将R2 所指向的内存中的字数据传送到R0,同时将R1 中的字数据传送到R2 所指向的存储单元。
SWP R0,R0,[R1] ;该指令完成将R1 所指向的内存中的字数据与R0 中的字资料交换。
SWPB
指令
SWPB
指令的语法为:
SWP{条件}B
目的寄存器,来源寄存器1,[来源寄存器2]
SWPB指令用于将来源寄存器2 所指向的内存中的字节数据传送到目的寄存器中,目的寄存器的高24
清零,同时将来源寄存器1 中的字节数据传送到来源寄存器2 所指向的内存中。显然,当来源寄存器1 和目的寄存器为同一个寄存器时,指令交换该寄存器和内存的内容。指令范例:
SWPB R0,R1,[R2] ;将R2 所指向的内存中的字节数据传送到R0,R0 的高24位清零,同时将R1 中的低8 位数据传送到R2 所指向的存储单元。
SWPB R0,R0,[R1] ;该指令完成将R1 所指向的内存中的字节数据与R0 中的低8位数据交换。