CPU在处理C语言的 a++ 操作时,变量a因为是放在在内存里的,需要先把a从内存中读取到寄存器中,运算完毕后再保存到内存中。
因此,这个过程中肯定需要用到内存的读写指令。
目录
1、基本内存读写指令(4个字节读写)
(1) 写内存 STR
(2) 读内存 LDR
2、内存的其他读写方式(1个字节读写、2个字节读写)
(1) 加后缀 B(1个字节的读写)
(2) 加后缀 H(2个字节的读写)
1、基本内存读写指令(4个字节读写)
(1) 写内存 STR
STR 的作用是将数据保存到内存中,默认情况下,一次会向内存中写入4个字节。
指令格式:STR 第一操作寄存器, [ 第二个操作寄存器 ]
- 第一操作寄存器:保存数据的寄存器
- 第二个操作寄存器:保存内存地址的寄存器(即要写入到内存中的哪个地址)
MOV R1, #0x000000FF
MOV R2, #0x40000000
STR R1, [R2] @ 将R1寄存器中的数据保存到R2寄存器指向的地址
@ 即 将0x000000FF保存到内存中的0x40000000地址
注意:内存中不同的区域有不同的作用,有的区域存放的内容可读可写,有的区域存放的内容可执行,这里的0x40000000地址可读可写
(2) 读内存 LDR
LDR 的作用是从内存中加载(读取)数据,默认情况下,一次从内存中读取4个字节。
指令格式:LDR 第一操作寄存器, [ 第二操作寄存器 ]
- 第一操作寄存器:用于存储读取到的数据的寄存器
- 第二操作寄存器:保存内存地址的寄存器(即要从内存中的哪个地址读)
MOV R1, #0x000000FF
MOV R2, #0x40000000
STR R1, [R2]
LDR R3, [R2] @ 从R2寄存器指向的地址读取数据,保存到R3寄存器
2、内存的其他读写方式(1个字节读写、2个字节读写)
STR / LDR 一次读/写4个字节,处理器中的数据类型还有Byte、Halfword,分别对应C语言中char类型、short类型,如果要对这两种类型进行操作,上面的指令不大适用。
因此,ARM在上述指令的基础上加一个后缀,以满足操作1个字节 或 2个字节 的需求。
(1) 加后缀 B(1个字节的读写)
以写为例,如果我们要向内存中写入一个字节,那就可以使用指令 STRB,指令使用格式和上述基本指令一样。
MOV R1, #0xFFFFFFFF
MOV R2, #0x40000000
STRB R1, [R2]
我们发现R1寄存器中的最低位的1个字节被写入到内存里。
(2) 加后缀 H(2个字节的读写)
以写为例,如果我们要向内存中写入一个字节,那就可以使用指令 STRH
MOV R1, #0xFFFFFFFF
MOV R2, #0x40000000
STRB R1, [R2]
我们发现R1寄存器中的最低位的2个字节被写入到内存里。