当前位置: 首页 > news >正文

指令系统2(Load/Store 指令)

一. Load/Store 指令

1. 前变址

前变址指令是在读取或存储数据时,先根据基址寄存器(Rn)与偏移量(offset)计算出有效地址,再进行数据操作。相关指令及示例如下:

  • LDR R0, [R1, #4]:从地址R1 + 4处读取一个字(32 位)到R0。假设R1 = 0x10000000,指令执行后R0 = 0x88776655R1的值保持为0x10000000 。

  • LDRB R2, [R1, #4]:从地址R1 + 4处读取一个字节(8 位)到R2,高位补零扩展为 32 位。执行后R2 = 0x00000055R1的值不变。

  • LDRH R3, [R1, #4]:从地址R1 + 4处读取一个半字(16 位)到R3,高位补零扩展为 32 位。执行后R3 = 0x00006655R1的值不变。

  • LDRSB R4, [R1, #7]:从地址R1 + 7处读取一个字节,执行符号扩展成 32 位后存入R4。执行后R4 = 0xFFFFFFFF88R1的值不变。

前变址指令详细说明如下:

指令

功能描述

LDRB Rd, [Rn, offset]

从地址Rn + offset处读取一个字节到Rd

LDRH Rd, [Rn, offset]

从地址Rn + offset处读取一个半字到Rd

LDR Rd, [Rn, offset]

从地址Rn + offset处读取一个字到Rd

LDRD Rd1, Rd2, [Rn, offset]

从地址Rn + offset处读取一个双字(64 位整数)到Rd1(低 32 位)和Rd2(高 32 位)中

STRB Rd, [Rn, offset]

Rd中的低字节存储到地址Rn + offset

STRH Rd, [Rn, offset]

Rd中的低半字存储到地址Rn + offset

STR Rd, [Rn, offset]

Rd中的低字存储到地址Rn + offset

STRD Rd1, Rd2, [Rn, offset]

Rd1(低 32 位)和Rd2(高 32 位)表达的双字存储到地址Rn + offset

LDRSB Rd, [Rn, offset]
LDRSH Rd, [Rn, offset]

字节 / 半字的自动变址加载,并且在加载后执行符号扩展成 32 位

2.自动变址

自动变址指令在完成数据操作后,会自动对基址寄存器进行调整。

以   LDR.W R0, [R1, #20]!  为例,执行步骤如下:

  • 先计算R1 = R1 + 20 。

  • 然后将计算后的地址R1中的数据读取到R0 。

自动变址指令详细说明如下:

指令

功能描述

LDR.W Rd, [Rn, offset]!
LDRB.W Rd, [Rn, offset]!
LDRH.W Rd, [Rn, offset]!
LDRD.W Rd1, Rd2, [Rn, offset]!

字 / 字节 / 半字 / 双字的自动变址加载(不做带符号扩展,没有用到的高位全部置 0)

LDRSB.W Rd, [Rn, offset]!
LDRSH.W Rd, [Rn, offset]!

字节 / 半字的自动变址加载,并且在加载后执行符号扩展成 32 位整数

STR.W Rd, [Rn, offset]!
STRB.W Rd, [Rn, offset]!
STRH.W Rd, [Rn, offset]!
STRD.W Rd1, Rd2, [Rn, offset]!

字 / 字节 / 半字 / 双字的自动变址存储

3.后变址

后变址指令先以基址寄存器(Rn)的当前值进行数据操作,然后再对基址寄存器进行调整。

STR.W R0, [R1], #-12为例,执行步骤如下:

  • 先将R0的数据存储到地址R1处。

  • 然后计算R1 = R1 + (-12) 。

后变址指令详细说明如下:

指令

功能描述

LDR.W Rd, [Rn], offset
LDRB.W Rd, [Rn], offset
LDRH.W Rd, [Rn], offset
LDRD.W Rd1, Rd2, [Rn], offset

字 / 字节 / 半字 / 双字的带后索引加载(不做带符号扩展,没有用到的高位全清 0)

LDRSB.W Rd, [Rn], offset

字节 / 半字的带后索引加载,并且在加载后执行符号扩展成 32 位整数

STR.W Rd, [Rn], offset
STRB.W Rd, [Rn], offset
STRH.W Rd, [Rn], offset
STRD.W Rd1, Rd2, [Rn], offset

字 / 字节 / 半字 / 双字的带后索引存储

后变址应用举例:

  • LDR R0, [R1], #4:假设R1 = 0x10000000,先从地址R1(即0x10000000)处读取一个字到R0R0 = 0x44332211,然后R1 = R1 + 4 = 0x10000004 。

  • LDRB R2, [R1], #4:从地址R1(此时R1 = 0x10000004)处读取一个字节到R2R2 = 0x00000011,接着R1 = R1 + 4 = 0x10000004 。

  • LDRH R3, [R1], #4:从地址R10x10000004)处读取一个半字到R3R3 = 0x00002211,之后R1 = R1 + 4 = 0x10000004 。

  • LDRSB R4, [R1], #7:从地址R10x10000004)处读取一个字节并符号扩展到 32 位存入R4R4 = 0x00000011,最后R1 = R1 + 7 = 0x10000007 。

Load/Store 指令综合举例(字序调整):


假设内存地址0x1000处存储的值为0x12345678ABCDEF00,执行以下指令:

  • LDR R2, =0x1000:将地址0x1000加载到R2 。

  • LDRD.W R0, R1, [R2]:从地址R2(即0x1000)处读取一个双字,R0 = 0xABCDEF00R1 = 0x12345678 。

  • STRD.W R1, R0, [R2]:把R1(低 32 位)和R0(高 32 位)存储到地址R20x1000)处,此时(0x1000) = 0xABCDEF0012345678 。

二. 批量数据传送指令

1. 批量数据 Load/Store 指令

这些指令用于在内存与多个寄存器之间批量传输数据,Rd后面的!表示在每次访问前(Before)或访问后(After),要自增(Increment)或自减(Decrement)基址寄存器Rd的值,增 / 减单位为 1 个字(4 字节)。具体指令如下:

指令

功能描述

LDMIA Rd!, {寄存器列表}

Rd处读取多个字,每读一个字后Rd自增一次,16 位宽度

STMIAR Rd, {寄存器列表}

存储多个字到Rd处,每存一个字后Rd自增一次,16 位宽度

LDMIA.W Rd!, {寄存器列表}

Rd处读取多个字,每读一个字后Rd自增一次,32 位宽度

LDMDB.W Rd!, {寄存器列表}

Rd处读取多个字,每读一个字前Rd自减一次,32 位宽度

STMIA.W Rd!, {寄存器列表}

存储多个字到Rd处,每存一个字后Rd自增一次,32 位宽度

STMDB.W Rd!, {寄存器列表}

存储多个字到Rd处,每存一个字前Rd自减一次,32 位宽度

例如,当R8 = 0x8000时:

  • STMIA.W R8!, {R0 - R3}:每存储一次,R8的值增加 4 字节,先存储R0 - R3的值,然后R8自增。执行后R8值变为0x8010 。

  • STMDB.W R8!, {R0 - R3}:每存储一次,R8的值减少 4 字节,先自减R8,然后存储R0 - R3的值。执行后R8值变为0x7FF0 。

2.堆栈传送类指令

  • STMDB SP!, [R0 - R3, LR]:等效于PUSH {R0 - R3, LR},将寄存器R0 - R3和链接寄存器LR的值压入堆栈,堆栈指针SP在存储前递减。

  • LDMIIA SP!, {R0 - R3, PC}:等效于POP {R0 - R3, PC},从堆栈中弹出数据到寄存器R0 - R3和程序计数器PC,堆栈指针SP在读取后递增。

相关文章:

  • 打靶笔记:利用站点Install功能连接Kali本地数据库
  • 传输层协议 — TCP协议与套接字
  • Practical Data Science with SAP Machine Learning Techniques for Enterprise Data
  • KMP-子串匹配算法-关键点理解
  • 蓝桥杯 对联【算法赛】
  • 仙剑奇侠传1隐藏宝箱
  • 【小派项目书】sprintboot + vue 语言实现
  • 单机游戏的工作逻辑
  • Spring IoC DI入门
  • QT-LINUX-Bluetooth蓝牙开发
  • 解释 TypeScript 中的类型保护(type guards),如何使用类型保护进行类型检查?
  • 麦肯锡外运集团企业卓越采购供应链管理体系规划(117页PPT)(文末有下载方式)
  • 阿里云平台Vue项目打包发布
  • 识别并脱敏上传到deepseek/chatgpt的文本文件中的护照信息
  • 晶鑫股份迈向敏捷BI之路,永洪科技助力启程
  • 天梯赛 L2-011 玩转二叉树
  • 使用uniapp的vite版本进行微信小程序开发,在项目中使用mqtt连接、订阅、发布信息
  • 若依(RuoYi)框架新手使用指南
  • Bilve 搭建手册
  • L2TP的LAC拨号模式实验
  • 《求是》杂志发表习近平总书记重要文章《锲而不舍落实中央八项规定精神,以优良党风引领社风民风》
  • “85后”贵阳市政府驻重庆办事处主任吴育材拟任新职
  • 端午假期购票日历发布,今日可购买5月29日火车票
  • 以军向也门3个港口的居民发布撤离令
  • 沧州制造展现硬核实力:管道装备支撑大国基建,核电锚栓实现国产
  • 跨文化戏剧的拓荒者与传承者——洪深与复旦剧社的百年回响