四、Load/Store指令
对于存储器的读/写只能用此类指令
LDR R4, [R5] ;R4 ← [R5]
STR R4, [R5] ;R4 → [R5]
注:
LDR指令:32位字数据读取指令
LDRB指令:8位字节数据读取指令
LDRH:16位半字数据读取指令
LDRSH:有符号的半字数据读取指令
STR指令:32位字数据写入指令
STRB指令:8位字节数据写入指令
STRH:16位半字数据写入指令
STRSH:有符号的半字数据写入指令
Ex1:编写程序,比较存储器中0x400000和0x400004两无符号字数据的大小,并且将比较结果存于0x400008的字中,若两数相等其结果记为0,若前者大于后者其结果记为1,若前者小于后者其结果记为-1。
MOV R0, 0x400000
LDR R1, [R0] ;采用寄存器间接寻址方式,将R1 <-- [R0]
LDR R2, [R0, #4] ;采用寄存器间接寻址方式,将R2 <-- [R0 + 4]
CMP R1, R2 ;比较一下R1与R2之间的大小关系,改变CPSR中的标志寄存器
MOVEQ R1, #0 ;相等R1 = 0
MOVHI R1, #1 ;R1大,R1 = 1
MOVCC R1, #-1 ;R1小,R1 = -1
STR R1, [R0, #8] ;将数据存储到0x400008位置中去
Ex2:将存储器中0x400000开始的200字节的数据,传送到0x480000开始的区域。
MOV R0, #0x400000
MOV R1, #0
MOV R2, #0x480000
LOOP
LDRB R3, [R0, R1]
STRB R3, [R2, R1]
ADD R1, R1, #1
CMP R1, #200
BNE LOOP
Ex3:编写一段程序,存储器中从0x400000开始有一个64位的数(1)将其取反,再存回原处。(2)求其补码,存放到0x400008处。
MOV R0, 0x400000
LDR R1, [R0] ;取低32位
LDR R2, [R0, #4] ;取高32位
MVN R1, R1 ;取反操作
ADDS R1, R1, #1 ;反码 + 1即为补码
STR R1, [R0, #8] ;存放到0x400008处,低32位补码
MVN R2, R2 ;取反操作
ADC R2, R2, #1 ;反码 + 1即为补码
STR R2, [R0, #12] ;存放到0x400012处,高32位补码