灵感,总是在不经意的时刻突然出现。这顽皮的小精灵怕人,刻意去寻找它,反而会迷失方向。

内存访问指令

LDR和STR

这两条指令,在一条语句中只能对单个寄存器进行内存读写。

  • LDR的功能是把内存中的数据拿出来装载到寄存器。
1
LDR Rd,[Rn,#offset] @从Rn内存地址中产生offset偏移量,在之后的内存中读取数据加载到Rd中
  • STR的功能是把寄存器的数据写入到内存地址中
    其实算是和LDR指令反过来了。
1
STR R0, [R1, #4] @意思是把R0寄存器保存的数据写入到R1偏移4个字节的内存地址中

LDM和STM

和上面指令的不同之处在于,LDM和STM是对多个数据进行操作。

  • LDM是将内存中读取多个值,装载到多个寄存器中。
1
2
3
4
5
LDM R1!, {R0, R2, R3} @此条指令是从R1保存的地址开始递增并依次读取内存地址赋值给R0,R2,R3寄存器。  
@R1:0x2000 -> R0
@R1+4 0x2004 -> R2
@R1+4 0x2008 -> R3
@最终R1的值变为0x2008
  • 类似,STM是将多个寄存器中的值,写入到内存地址中。
1
2
3
4
STM R1!,{R0,R2,R3}
@R0 -> R1(0x2000)
@R2 -> R1+4 (0x2004)
@R3 -> R1+4 (0x2008)

下雨天,天色朦胧灰暗,除了不间断的雨滴打在玻璃和铁板上,再无其他声音,我只感到一种宁静,它能把周围的一切都融入胸怀,包括我。我向它张开双臂,迎接它,欢迎它。

栈操作指令:PUSH(STMFD)和POP(LDMFD)

需要注意的是,在ARM默认的满递减堆栈下,SP指针是向下增长的,每有一个值存入,sp就会减少4个字节。

进栈:

1
stmfd sp!,{寄存器列表}

出栈:

1
ldmfd sp!,{寄存器列表}