
ARM指令详解.pdf
8页ARM指令详解Load/Store 指令Load/Store 指令用于寄存器和内存间数据的传送Load 用于把内存中的数据装载到寄存器中Store 用于把寄存器中的数据存入内存该集合的指令使用频繁, 在指令集中最为重要, 因为其他指令只能操作寄存器, 当数据存放在内存中时, 必须先把数据从内存装载到寄存器,执行完后再把寄存器中的数据存储到内存中Load/Store 指令分为 3类:( 1)单一数据传送指令( LDR和 STR等)( 2)多数据传送指令( LDM和 STM)( 3)数据交换指令( SWP和 SWPB)Load/Store 指令 1-1 1. LDR 字数据加载指令格式: LDR{} ,; 功能: 把 addr 所表示的内存地址中的字数据装载到目标寄存器 Rd中,同时还可以把合成的有效地址写回到基址寄存器地址 addr 可以是一个简单的值、一个偏移量,或者是一个被移位的偏移量寻址方式:Rn:基址寄存器Rm:变址寄存器Index :偏移量, 12位的无符号数LDR Rd,[Rn] ; 把内存中地址为 Rn的字数据装入寄存器 Rd中LDR Rd,[Rn,Rm] ; 将内存中地址为 Rn+Rm的字数据装入寄存器 Rd中Load/Store 指令 1-2 LDR Rd,[Rn, # index] ; 将内存中地址为 Rn+index 的字数据装入 Rd中LDR Rd,[Rn,Rm,LSL# 5] ; 将内存中地址为 Rn+Rm× 32的字数据装入 Rd LDR Rd,[Rn,Rm] !; 将内存中地址为 Rn+Rm的字数据装入 Rd, 并将新地址 Rn+Rm写入 Rn LDR Rd,[Rn, # index] !; 将内存中地址为 Rn+index 的字数据装入 Rd,并将新地址 Rn+index写入 Rn LDR Rd,[Rn,Rm, LSL# 5] !; 将内存中地址为 Rn+Rm× 32的字数据装入 Rd,并将新地址 Rn+Rm×32写入 Rn Load/Store 指令 1-3 LDR Rd,[Rn],Rm ; 将内存中地址为 Rn的字数据装入寄存器 Rd,并将新地址 Rn+Rm写入 Rn LDR Rd,[Rn], # index; 将内存中地址为 Rn的字数据装入寄存器 Rd,并将新地址 Rn+index 写入 Rn LDR Rd,[Rn],Rm,LSL# 5 ; 将内存中地址为 Rn的字数据装入寄存器 Rd, 并将新地址 Rn+Rm× 32写入 Rn 例如:LDR R0,[R1,R2,LSL# 5]! ; 将内存中地址为 R1+R2× 32的字数据装入寄存器 R0,并将新地址R1+R2× 32写入 R1 Load/Store 指令 2 LDRB 字节数据加载指令格式: LDR{}B ,; 功能:同 LDR指令,但该指令只是从内存读取一个 8位的字节数据而不是一个 32位的字数据,并将 Rd的高 24位清 0。
例如:LDRB R0,[R1] ; 将内存中起始地址为 R1的一个字节数据装入 R0中Load/Store 指令 3 3. LDRBT 用户模式的字节数据加载指令格式: LDR{}BT ,; 功能:同 LDRB指令,但无论处理器处于何种模式,都将该指令当作一般用户模式下的内存操作Load/Store 指令 4 4. LDRH 半字数据加载指令格式: LDR{}H ,; 功能: 同 LDR指令, 但该指令只是从内存读取一个 16位的半字数据而不是一个 32位的字数据,并将 Rd的高 16位清 0例如:LDRH R0,[R1] ; 将内存中起始地址为 R1的一个半字数据装入 R0中Load/Store 指令 5 5. LDRSB 有符号的字节数据加载指令格式: LDR{}SB ,; 功能: 同 LDRB指令, 但该指令将寄存器 Rd的高 24位设置成所装载的字节数据符号位的值例如:LDRSB R0,[R1] ; 将内存中起始地址为 R1的一个字节数据装入 R0中, R0的高 24位设置成该字节数据的符号位Load/Store 指令 6 6. LDRSH 有符号的半字数据加载指令格式: LDR{}SH ,; 功能: 同 LDRH指令, 但该指令将寄存器 Rd的高 16位设置成所装载的半字数据符号位的值。
例如:LDRSH R0,[R1] ; 将内存中起始地址为 R1的一个 16位半字数据装入 R0中, R0的高 16位设置成该半字数据的符号位Load/Store 指令 7 7. LDRT 用户模式的字数据加载指令格式: LDR{}T ,; 功能:同 LDR指令,但无论处理器处于何种模式,都将该指令当作一般用户模式下的内存操作addr 所表示的有效地址必须是字对齐的,否则从内存中读出的数值需进行循环右移操作Load/Store 指令 8 8. STR 字数据存储指令格式: STR{} ,; 功能:把寄存器 Rd中的字数据( 32位)保存到 addr 所表示的内存地址中,同时还可以把合成的有效地址写回到基址寄存器地址 addr 可以是一个简单的值、一个偏移量,或者是一个被移位的偏移量寻址方式同 LDR指令例如:STR R0,[R1, # 5]! ; 把 R0中的字数据保存到以 R1+5为地址的内存中,然后 R1= R1+5 STR 指令应用举例STR指令应用举例 Load/Store 指令 9 9. STRB 字节数据存储指令格式: STR{}B ,; 功能:把寄存器 Rd中的低 8位字节数据保存到 addr 所表示的内存地址中。
其他用法同 STR指令例如:STRB R0,[R1] ; 将寄存器 R0中的低 8位数据存入 R1表示的内存地址中Load/Store 指令 10 10. STRBT 用户模式的字节数据存储指令格式: STR{}BT ,; 功能:同 STRB指令,但无论处理器处于何种模式,该指令都将被当作一般用户模式下的内存操作Load/Store 指令 11 11. STRH 半字数据存储指令格式: STR{}H ,; 功能: 把寄存器 Rd中的低 16位半字数据保存到 addr 所表示的内存地址中,而且 addr 所表示的地址必须是半字对齐的其他用法同 STR指令例如:STRH R0,[R1] ; 将寄存器 R0中的低 16位数据存入 R1表示的内存地址中存储格式对于加载 / 存储指令的影响Load/Store 指令 12 12. STRT 用户模式的字数据存储指令格式: STR{}T ,; 功能:同 STR指令,但无论处理器处于何种模式,该指令都将被当作一般用户模式下的内存操作Load/Store 指令 13-1 13. LDM 批量数据加载指令格式:LDM{}{} {!},{^}; 功能: 从一片连续的内存单元读取数据到各个寄存器中, 内存单元的起始地址为基址寄存器 Rn的值, 各个寄存器由寄存器列表 regs 表示。
该指令一般用于多个寄存器数据的出栈type 字段种类:IA:每次传送后地址加 1IB:每次传送前地址加 1DA:每次传送后地址减 1DB:每次传送前地址减 1FD:满递减堆栈ED:空递减堆栈FA:满递增堆栈EA:空递增堆栈注意: 有一个约定, 编号低的寄存器在存储数据或者加载数据时对应于存储器的低地址。












