ARM-内存访问指令
Comment灵感,总是在不经意的时刻突然出现。这顽皮的小精灵怕人,刻意去寻找它,反而会迷失方向。
内存访问指令
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 | LDM R1!, {R0, R2, R3} @此条指令是从R1保存的地址开始递增并依次读取内存地址赋值给R0,R2,R3寄存器。 |
- 类似,STM是将多个寄存器中的值,写入到内存地址中。
1 | STM R1!,{R0,R2,R3} |
下雨天,天色朦胧灰暗,除了不间断的雨滴打在玻璃和铁板上,再无其他声音,我只感到一种宁静,它能把周围的一切都融入胸怀,包括我。我向它张开双臂,迎接它,欢迎它。
栈操作指令:PUSH(STMFD)和POP(LDMFD)
需要注意的是,在ARM默认的满递减堆栈下,SP指针是向下增长的,每有一个值存入,sp就会减少4个字节。
进栈:
1 | stmfd sp!,{寄存器列表} |
出栈:
1 | ldmfd sp!,{寄存器列表} |