ARM的Load/Store指令

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

ARM的数据存取指令Load/Store是唯一用于寄存器和存储器之间进行数据传送的指令。ARM指令集中有三种基本的数据存取指令:
 1 单寄存器的存取指令(LDR,STR)
 2 多寄存器存取指令(LDM,STM)
 3 单寄存器交换指令(SWP)

具体可以演化成:
   LDR  字数据加载指令
   LDRB  字节数据加载指令
   LDRSB  有符号字节数据加载指令
   LDRH  半字数据加载指令
   LDRSH 有符号半字数数据加载指令
   STR  字数据存储指令
   STRB  字节数据存储指令
   STRH  半字数据存储指令
   LDM/STM 批量数据加载/存储指令
   SWP/SWPB 数据交换指令

编码格式如下:

二进制编码如下:

 

多寄存器存取的二进制编码:

 

批量数据加载/存储指令(LDM, STM)
  LDM或(STM){条件}{类型} 基址寄存器{!},寄存器列表{^}

{!}选项
  若选择此项,则当数据传送完毕后,将最后的地址写入到基址寄存器,否则基址寄存器内容不变。
{^}选项
  当命令为LDM,且寄存器列表包含R15,选用此后缀时表示:除了正常数据传送之外,还将SPSP复制到CPSR。同时此后缀还表示传入传出的是用户模式下的寄存器,而不是当前模式下的寄存器。

存储器与寄存器交换指令swp

二进制编码格式:

 

汇编格式:

SWP{<cond>} {B} Rd,Rm,[Rn]

字数据交换(SWP)/字节数据交换(SWPB):在寄存器和外部存储器之间交换字节或字
SWP指令:
    SWP{条件} 目的寄存器,源寄存器1,[源寄存器2]

指令示例:
 SWP R0,R1,[R2] ;将R2所指向的存储器中的字数据传送到R0,同时将
                       ;R1中的字数据传送到R2所指向的存储单元
 SWP R0,R0,[R1] ;将R1所指向的存储器中的字数据与R0中的字数据交换

SWPB指令:
   SWP{条件}B 目的寄存器,源寄存器1,[源寄存器2]
指令示例:
 SWPB R0,R1,[R2] ;将R2所指向的存储器中的字节数据传送到R0,
                           ;R0的高24位清零,
                          ;同时将R1中的低8位数据传送到R2所指向的存储单元
 SWPB R0,R0,[R1] ;将R1所指向的存储器中的字节数据与R0中的低8位数据交换


程序状态寄存器与通用寄存器之间的传送指令PSR指令:

ARM指令中有两条指令,用于在状态寄存器和通用寄存器之间传送数据。修改状态寄存器一般是通过“读取-修改-写回”三个步骤的操作来实现的。 这两条指令分别是:
 状态寄存器到通用寄存器的传送指令(MRS)
 通用寄存器到状态寄存器的传送指令(MSR)

MRS的二进制编码如下:


其汇编格式如下:
 MRS{<cond>} Rd,CPSR|SPSR 
 

MSR的二进制编码如下:


其汇编格式如下:
 MSR{<cond>} CPSR_f | SPSR_f,#<32-bit immediate>
 MSR{<cond>} CPSR_<field> | SPSR_<field>,Rm

MRS指令
MRS {条件} 通用寄存器,程序状态寄存器(CPSR or SPSR)

示例:
 MRS R0,CPSR ;传送CPSR的内容到R0
 MRS R0,SPSR ;传送SPSR的内容到R0

MSR指令
MSR{条件} 程序状态寄存器(CPSR or SPSR)_<域>,通用寄存器
32位程序状态寄存器可分为4个域:
 位[31:24]为条件标志域,用f表示;
 位[23:16]为状态位域,用s表示;
 位[15:8]为扩展位域,用x表示;
 位[7:0]为控制位域,用c表示;

示例:
 MSR CPSR_cxsf,R0   ;传送R0的内容到CPSR
  MSR CPSR_f,#&F0000000  ;设置所有标志位
 MSR CPSR_c,R0  ;传送R0的内容到CPSR,但仅修改CPSR中的控制位域

转移指令:

ARM的转移指令可以从当前指令向前或向后的32MB的地址空间跳转,根据完成的功能它可以分为以下4种 :
 B  转移指令
 BL  带链接的转移指令 (可以回转)
 BX  带状态切换的转移指令 (ARM和Thumb之间的转换)
 BLX  带链接和状态切换的转移指令

转移指令B在程序中完成简单的跳转指令,可以跳转到指令中指定的目的地址。BL指令完全象转移指令一样地执行转移,同时把转移后面紧接的一条指令的地址保存到链接寄存器LR(R14)。
二进制编码如下:


汇编格式如下:
B{L}{<cond>} <target address>

BX BLX指令用于支持Thumb(16位)指令集的ARM芯片,程序可以通过这些指令完成处理器从ARM状态到Thumb状态的切换。类似的Thumb指令可以使处理器切换回32位ARM指令。 二进制编码如下:


汇编格式如下:
 1: B{L}X{<cond>} Rm
 2: BLX <target address>

 

转自:http://00923.blog.sohu.com/17983429.html

ARM架构--Load/Store指令 从R1指向的内存地址加载一个8位字节到R0的最低字节位置,高位字节填充为未知值。将存储在R1指向的内存地址中的32位数据加载到R0寄存器。将R0寄存器的最低8位字节存储到R1指向的内存地址。将R0寄存器中的32位数据存储到R1指向的内存地址。将R0寄存器的16位数据存储到R1指向的内存地址。- 从内存加载一个8位字节到寄存器,低位字节会被扩展到整个寄存器。- 从内存加载16位半字到寄存器,根据指令扩展到32位。- 将寄存器的16位数据存储到内存地址。- 将寄存器中的数据存储到内存地址。 阅读详情

相关推荐

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

文章主要介绍 ARM 指令集中 Load/Store 指令及批量数据传送指令Load/Store 指令包含前变址、自动变址和后变址三种类型,分别说明了其指令格式、功能及执行过程,并给出相应示例。同时介绍了批量数据传送指令,包括批量数据 Load/Store 指令和堆栈传送类指令,解释了其功能、基址寄存器的变化方式及等效指令

m0_74042991的博客 1537

【愚公系列】2023年06月 ARM汇编教程(数据装载和传输指令loadstore

STR指令的语法为STR{条件码}{B}{T} 源寄存器, [目标寄存器, 位移],用于将源寄存器中的数据存储到目标寄存器的位移地址处。在上面的案例中,首先将r0和r1压入栈中,然后将10存储到r0中,5存储到r1中,将r0和r1相加,并将结果存储到r0中,最后将r0和r1弹出,并存储到r0和r1寄存器中。以上示例代码将从数组a中读取4个字的数据,依次存储到R2~R5寄存器中,然后将这些数据存储到数组b中,最后返回。在上面的代码中,LDR指令用于从数组中加载元素,STR指令用于将结果存储在变量中。

愚公智库 4万+

第3章 ARM指令集寻址方式—Load/Store指令寻址(二)

三、半字、有符号字节寻址 这类指令可用来加载有符号字节、加载有符号半字、加载/存储无符号半字。一般称这类指令为“杂类的Load/Store指令”。 Load/Store指令对半字、有符号字节操作指令编码格式如下: 汇编指令汇编语法格式如下: 加载有符号字节到寄存器:LDR {<cond>}SB <Rd>, <addressing_mode> 加载有...

xiezhi123456的博客 714

ARMLoad Store指令

00. 目录 文章目录00. 目录01. Load/Store指令概述02. 单寄存器的Load/Store指令2.1 LDR 指令2.2 STR 指令2.3 LDRB 指令2.4 STRB 指令2.5 LDRH 指令2.6 STRH 指令03. 多寄存器的Load/Store内存访问指令3.1 LDM 指令3.2 STM 指令3.3 数据传送指令应用04. 单数据交换指令4.1 SWP 字交换指令4.2 SWPB 字节交换指令4.3 交换指令 SWP 应用05. 附录 01. Load/Store指令概述

C/C++软件工程师、嵌入式软件工程师、物联网研发工程师、C/C++讲师、物联网讲师、嵌入式讲师、鸿蒙讲师---欢迎大家一起交流(私信添加博主微信) 1万+

嵌入式:Load/Store之单寄存器的存取指令

ARM处理器是Load/Store型的,即它对数据的操作是通过将数据从存储器加载到片内寄存器中进行处理,处理完成后的结果经过寄存器存回到存储器中,以加快对片外存储器进行数据处理的速度。前变址的寻址模式使用计算出的地址作为存储器地址进行数据存取操作,然后,当要求回写(W=1)(即自动变址方式),将基址寄存器更新为计算出的地址值。在ARM系统中I/O操作是通过存储器映射进行寻址的,对I/O设备的操作可以和对存储器的操作一样,因此,也是使用Load/Store指令完成。无符号半字的传送用0扩展到32位。

timerring的博客 3396

ARM指令详解之Load/Store指令

Load/Store指令 Load/Store指令用于寄存器和内存间数据的传送。 Load 用于把内存中的数据装载到寄存器中。 Store用于把寄存器中的数据存入内存。 该集合的指令使用频繁,在指令集中最为重要,因为其他指令只能操作寄存器,当数据存放在内存中时,必须先把数据从内存装载到寄存器,执行完后再把寄存器中的数据存储到内存中。 Load/Store指令分为3类: (1)单一数据传

u014286342的专栏 4万+

ARM指令集之批量Load/Store指令

九天小哥的专栏 3094

ARM指令集之Load/Store访存指令(一)

文章目录

九天小哥的专栏 5144

ARM指令集之Load/Store指令寻址方式(一)

文章目录语法格式寻址方式立即数偏移量寻址寄存器偏移量寻址寄存器移位偏移量寻址 这篇笔记记录的是操作32位子类型和无符号字节数据的Load/Store指令所使用的寻址方式。 所有类型的Load/Store指令的寻址方式都是由基址加偏移量组成的,基址用任意的通用寄存器指定,偏移量的指定方式有如下三种: 立即数; 寄存器; 寄存器和一个移位常数; 寻址方式的计算又有如下三种方式: 偏移量方法; 事先更新方法; 事后更新方法;. 注意:上述内容适用于所有类型的Load/Store指令。 语法格式 操作32位

九天小哥的专栏 2901

第3章 ARM指令集寻址方式—批量Load/Store指令寻址方式

ARM指令系统提供了批量Load/Store指令寻址方式,即多寄存器寻址,也就是一次可以传送几个寄存器的值,允许一条指令最多传送16个寄存器。 一、编码格式 批量Load/Store指令汇编语法格式如下: 批量加载: LDM {<cond>} <addr_mode> <Rn> {!}, <regs> {^} 从一片连续的内存单元读取数据到各...

xiezhi123456的博客 790

ARM指令集之Load/Store访存指令(二)

文章目录寻址方式LDRH(半字数据读取指令)STRH(半字数据写入指令)LDRSB(有符号字节数据读取指令)LDRSH(有符号半字数据读取指令) 这篇笔记记录了第二类Load/Store指令,即操作数为16位半字和有符号字节数据的Load/Store指令。 助记符 说明 LDRH 半字数据读取指令 STRH 半字数据写入指令 LDRSB 有符号字节数据读取指令 LDRSH 有符号半字数据读取指令 寻址方式 这类指令拥有一致的寻址方式,具体介绍见这里。 语法 说明

九天小哥的专栏 1744

第3章 ARM指令集寻址方式—Load/Store指令寻址(一)

Load/Store指令是对内存进行存储/加载数据操作的指令,根据访问的数据格式的不同,将这类指令的寻址分为字、无符号字节的Load/Store指令寻址和半字、有符号字节Load/Store指令寻址两大类。 一、地址计算方法 1、寄存器间接寻址 寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令: LDR R0, [R1] ...

xiezhi123456的博客 1522

ARM指令集之Load/Store指令寻址方式(二)

文章目录

九天小哥的专栏 776

ARM Load/Store指令、伪指令ARM处理器指令系统——ARM指令集初学,下篇)

本文介绍了ARM架构中Load/Store内存访问指令和跳转指令的基本原理与使用方法。重点分析了单寄存器对齐访问指令的6种寻址模式,强调禁止基址与回写寄存器相同的操作以避免未定义行为。详细讲解了LDR/STR指令对32/64位数据的读写操作,以及B/BL等跳转指令的应用场景。同时阐述了AArch64下堆栈指针的16字节对齐要求,并简要介绍了程序状态寄存器访问指令、异常产生指令和ADR/LDR伪指令的功能。这些内容为理解ARM指令集架构提供了基础参考。

Yhexia的博客 822

ARM Load/Store寻址方式、AArch32/64中Load/Store寻址方式的区别(ARM处理器指令系统——ARM指令的寻址方式,下篇)

本文对比分析了AArch32与AArch64架构的内存寻址方式差异。AArch64采用64位寄存器(X0-X30)和固定32位指令,简化了寻址模式,取消批量操作指令,仅支持PC相对寻址±1MB范围。相比AArch32的32位寄存器(R0-R15)和丰富寻址方式,AArch64在基址更新寻址中仅支持立即数前索引,但保留了寄存器后索引。设计上,AArch32侧重功能全面性,而AArch64追求性能与简洁性,通过精简模式提高流水线效率,体现了从嵌入式场景向高性能计算的架构演进。

Yhexia的博客 478

ARM指令集-Load/Store指令【ldr,str,ldm,stm,swp,swpb】

Load/Store指令,not影响CPSR。同理LDRB, STRB,LDRH,STRH对应存取8、16位数据拓展;stmia 与 stmfa等区别STMDA r0!, {r5-r6};使用堆栈指令时不需要调整cond,而数据块传送指令需要取补集STMED r13!, {r5-r6};, {r5-r6}

qq_61832249的博客 1099

嵌入式linux-ARM体系结构及接口技术,ARM汇编指令,逻辑指令,算数指令,跳转指令load/store指令,GNU伪指令,批量操作指令,堆栈操作指令,软中断指令,C和汇编混合编程

文章目录1,逻辑指令1.1例2,算数指令3,跳转指令3.1.1例3.1.2例3.1.3例4,Load/Store 指令4.1 前索引/后索引4.2.1,例---代码4.2.2,例---运行结果4.3,例5,GNU伪指令5.1,例6,批量操作指令6.1,例7,堆栈操作指令8,软中断指令 1,逻辑指令 and r0,r1,#0xFF // r0 = r1&amp;amp;amp;0xFF orr r3,r...

m0_37542524的博客 561
上一篇: 深入浅出大端小端
下一篇: ARM指令集
xphh
博客等级 码龄20年 1粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值