寄存器内存读写指令(一) —— 单寄存器读写 LDR / STR

本文详细讲解了CPU如何处理C语言的a++操作,涉及STR和LDR指令的基本用法,以及针对不同数据类型的1字节和2字节读写。还介绍了内存地址的基址加变址寻址技巧,以及STRB和STRH这类针对小数据类型的扩展指令。
摘要由CSDN通过智能技术生成

CPU在处理C语言的 a++ 操作时,变量a因为是放在在内存里的,需要先把a从内存中读取到寄存器中,运算完毕后再保存到内存中。

因此,下面要介绍的是单个寄存器的读写

  • 一个寄存器的数据写入到内存              —— STR指令
  • 从内存中读取数据保存到一个寄存器       —— LDR指令

         目录

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
MOV R3, #4

@ 基本使用方式
STR R1, [R2]            @ 将R1寄存器中的数据保存到 R2 的地址
                        @ 也就是 将0x000000FF保存到内存中的 0x40000000地址

@ 基址加变址寻址 —— 前索引(地址先自增,然后再存)  
STR R1, [R2, R3]        @ 将R1寄存器中的数据保存到 R2+R3 的地址  —— R2 保存的地址不自增                
STR R1, [R2, #4]        @ 与上述写法等价          —— R2 保存的地址不自增
STR R1, [R2, #4]!       @ 上述写法实现的功能一样   —— R2 保存的地址自增4

@ 基址加变址寻址 —— 后索引(先存,地址再自增)
STR R1, [R2], #4        @ 先将R1寄存器中的数据保存到 R2 的地址,然后R2中保存的地址自增4

注意:内存中不同的区域有不同的作用,有的区域存放的内容可读可写,有的区域存放的内容可执行,这里的0x40000000地址可读可写

(2) 读内存 LDR

LDR 的作用是从内存中加载(读取)数据,默认情况下,一次从内存中读取4个字节

指令格式:LDR 第一操作寄存器,  [ 第二操作寄存器 ]

  • 第一操作寄存器:用于存储读取到的数据的寄存器
  • 第二操作寄存器:保存内存地址的寄存器(即要从内存中的哪个地址读)
MOV R1, #0x000000FF
MOV R2, #0x40000000
STR R1, [R2]

@ 基本使用方式	
LDR R3, [R2]            @ 从R2寄存器指向的地址读取数据,保存到R3寄存器

@ 基址加变址寻址 —— 前索引(地址先自增,然后读)  
LDR R1, [R2, R3]        @ 读取内存中 R2+R3 地址处的数据保存到R1  —— R2 保存的地址不自增                
LDR R1, [R2, #4]        @ 与上述写法等价          —— R2 保存的地址不自增
LDR R1, [R2, #4]!       @ 上述写法实现的功能一样   —— R2 保存的地址自增4

@ 基址加变址寻址 —— 后索引(先读,地址再自增)
LDR R1, [R2], #4        @ 先将R1寄存器中的数据保存到 R2 的地址,然后R2中保存的地址自增4

@ 伪指令赋值
LDR R2, =0x40000000      @ 等效于 R2 = 0x40000000

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个字节被写入到内存里。

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值