STR{条件} Rd, <地址> ;将寄存器Rd中的数值存储到<地址>中的内存中
LDR{条件}B Rd, <地址> ;将内存地址所对应值得低8位加载到Rd的寄存器中。
STR{条件}B Rd, <地址> ;将寄存器Rd的后8为存的到内存地址中。
•LDR (Load Register) : 将数据从内存中取出,加载到寄存器。
•LDR Rt, [Rn], #offset ;Rt = *Rn; Rn = Rn + offset
•LDR Rt, [Rn, #offset]! ; Rt = *(Rn + offset); Rn = Rn + offset
•STR (Store Register): 将寄存器中的数据,存储到内存。
•STR Rt, [Rn], #offset ;*Rn = Rt; Rn = Rn + offset
•STR Rt, [Rn, #offset]! ;*(Rn + offset) = Rn; Rn = Rn + offset(地址回写)
(2)、一次传送两个数据
•LDRD (Load Register Double): 一次填充两个寄存器
•LDRD R4, R5, [R6, #offset] ;R4 = *(R6 + offset); R5 = *(R6 + offset + 4)
•STRD (Store Register Double):一次存储两个值到内存
•STRD R4, R5, [R6, #offset] ;*(R6 + offset) = R4; *(R6 + offset + 4) = R5
(3)、块数据存取
•LDM (Load Mutiple): 将一块数据从寄存器中加载到内存中(reg list)。
•STM (Store Multiple): 将块数据从内存中加载到寄存器。
•LDM与STM块内存操作都有一个后缀,下方就是这四种条件,我们假设下方R0寄存器中存储的值是0(R0 = 6) •IA (Increment After): 传输后再增加值, •如:LDMIA R0, {R1 - R3} ;R1 = 6, R2 = 7, R3 = 8
•IB (Increment Befor): 传输前增加值 •如:LDMIB R0, {R1 - R3} ;R1 = 7, R2 = 8, R3 = 9
•DA (Decrement After):传输后减少值 •如: LDMDA R0, {R1 - R3} ;R1 = 6, R2 = 5, R3 = 4
•DB (Decrement Before):传输前减少值 •如:LDMDB R0, {R1 - R3} ;R1 = 5, R2 = 4, R3 = 3
(4)、单一数据交换:SWP
SWP命令用来交换寄存器与内存直接的值,下方是SWP的指令格式:
SWP{条件}{B} Rd, Rm, [Rn]
上述命令表示将Rn中内存地址所指向内存中的数据加载到Rd中,然后将寄存器Rm中的值存储到该内存地址指向的区域中。如果Rd = Rm, 那么Rn指向的内存中的值就会与Rd进行交换。如果加上条件后缀的话,就说明在满足该条件时进行操作,后缀B则是操作低8位。
5、比较、分支与条件指令
分支与条件指令是编程中不可或缺的指令,在处理一些特定的业务逻辑时会经常使用到分支与条件指令。分支说白了就是跳转,而分支与条件结合使用就是当满足一定条件后进行特定的跳转。接下来,将总结一下ARM指令集中常用的分支指令与条件指令,更确切的说是条件后缀。
(1)、比较指令
在ARM指令集中使用到的比较指令有CMN、CMP、TEQ、TST。有一点需要注意的是CMN与CMP是算术指令,TEQ和TST属于逻辑指令。比较指令在执行后总是会设置标志位(N、Z、C、V), 因为条件后缀是根据被设置的标志位来判断比较结果是否满足条件的。下方会给出详细的条件后缀。比较命令后方也是可以添加条件后缀的。










