多寄存器寻址指令ldmia/ldmib和ARM存储器访问指令——多寄存器存取

2023-05-16

多寄存器和堆栈寻址的用法:多寄存器寻址:LDMIA,LDMIB,STMIA,STMIB,LDMDA,LDMDB,STMDA,STMDB;
堆栈寻址:LDMFA,LDMFD,STMFA,STMFD,LDMEA,LDMED,STMEA,STMED;

弄清堆栈寻址的SP的变化:LDMFA,LDMFD,STMFA,STMFD,LDMEA,LDMED,STMEA,STMED;

IA: 每次传送后地址加4;
IB: 每次传送前地址加4;
DA: 每次传送后地址减4;
DB: 每次传送前地址减4;
FD: 满递减堆栈;
ED: 空递减堆栈;
FA: 满递增堆栈;
EA: 空递增堆栈。




1、多寄存器寻址:
LDMIA R0!,{R1-R4}  

                               ;R1<----[R0]
                               ;R2<----[R0+4]
                               ;R3<----[R0+8]
                               ;R4<----[R0+12]         

例如:

所有的示例指令执行前:
mem32[0x1000C] = 0x04
mem32[0x10008] = 0x03
mem32[0x10004] = 0x02
mem32[0x10000] = 0x01
r0 = 0x00010010
r1 = 0x00000000
r3 = 0x00000000
r4 = 0x00000000
1) ldmia r0!, {r1-r3} 2) ldmib r0!, {r1-r3}
执行后:                      执行后:
r0 = 0x00100000    r0 = 0x00100000
r1 = 0x01                   r1 = 0x02
r2 = 0x02                   r2 = 0x03
r3 = 0x03                   r3 = 0x04


2、堆栈寻址:
STMFD入栈指令,相当于STMDB
STMFD SP!,{R2-R4}                            ;[SP-4]<---R4
                                             ;[SP-8]<---R3 
                                             ;[SP-12]<---R2   
LDMFD出栈指令,相当于LDMIA
LDMFD SP!,{R6-R8}                ;R6<----[SP]
                                 ;R7<----[SP+4]
                                 ;R8<----[SP+8]

•LDR和STR——字和无符号字节加载/存储指令
  LDR指令用于从内存中读取单一字或字节数据存入寄存器中,STR指令用于将寄存器中的单一字或字节数据保存到内存。指令格式如下:
  LDR{cond}{T} Rd,<地址>  ;将指定地址上的字数据读入Rd
  STR{cond}{T} Rd,<地址>  ;将Rd中的字数据存入指定地址
  LDR{cond}B{T} Rd,<地址>  ;将指定地址上的字节数据读入Rd
  STR{cond}B{T} Rd,<地址>  ;将Rd中的字节数据存入指定地址
•LDR和STR——字和无符号字节加载/存储指令
   LDR/STR指令寻址非常灵活,它由两部分组成,其中一部分为一个基址寄存器,可以为任一个通用寄存器;另一部分为一个地址偏移量。地址偏移量有以下3种格式:
    立即数。立即数可以是一个无符号的数值。这个数据可以加到基址寄存器,也可以从基址寄存器中减去这个数值。
    如:LDR  R1,[R0,#0x12] ;R1<-[R0+0x12]
    寄存器。寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。
    如:LDR  R1,[R0,R2]  ; R1<-[R0+R2]
       LDR  R1,[R0,-R2]  ; R1<-[R0-R2]
    寄存器及移位常数。寄存器移位后的值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。
    如:LDR  R1,[R0,R2,LSL #2]

 多寄存器加载/存储指令格式如下:
LDM{cond}<模式>  Rn{!},reglist{^} ;
STM{cond}<模式>  Rn{!},reglist{^} ;
        多寄存器加载/存储指令格式如下:
LDM{cond}<模式>  Rn{!},reglist{^} ;
STM{cond}<模式>  Rn{!},reglist{^} ;
cond:指令执行的条件;
模式:控制地址的增长方式,一共有8种模式;
!:表示在操作结束后,将最后的地址写回Rn中;
reglist :表示寄存器列表,可以包含多个寄存器,它们使用“,”隔开,如{R1,R2,R6-R9},寄存器由小到大排列;
^:可选后缀。允许在用户模式或系统模式下使用。它有以下两个功能:
1)若op是LDM且寄存器列表包含R15时,那么除了正常的多寄存器传送外,还将SPSR也复制到CPSR中。这用于异常处理返回,仅在异常模式下使用。
2)数据传入或传出的是用户模式下的寄存器,而不是当前模式的寄存器。

多寄存器加载/存储指令的8种模式如下表所示,右边四种为堆栈操作、左边四种为数据传送操作。
模式
说明
模式
说明
IA
每次传送后地址加4
FD
满递减堆栈
IB
每次传送前地址加4
ED
空递减堆栈
DA
每次传送后地址减4
FA
满递增堆栈
DB
每次传送前地址减4
EA
空递增堆栈
数据块传送操作
堆栈操作
        进行数据复制时,先设置好源数据指针和目标指针,然后使用块拷贝寻址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB进行读取和存储 。
        进行堆栈操作操作时,要先设置堆栈指针(SP),然后使用堆栈寻址指令STMFD/LDMFD 、STMED/LDMED、STMFA/LDMFA和STMEA/LDMEA实现堆栈操作。
数据块传送
存储
堆栈操作
压栈
说明
 
数据块传送
加载
堆栈操作
出栈
说明
STMDA
STMED
空递减
LDMDA
LDMFA
满递减
STMIA
STMEA
空递增
LDMIA
LDMFD
满递增
STMDB
STMFD
满递减
LDMDB
LDMEA
空递减
STMIB
STMFA
满递增
LDMIB
LDMED
空递增
;使用数据块传送指令进行堆栈操作
STMDA R0!,{R5-R6}将R5、R6存入相应的R0指向的地址对应的内存
. . .
LDMIB R0!,{R5-R6} 将R0指向的地址对应的内存的内容存入R5和R6
;使用堆栈指令进行堆栈操作
STMED R13!,{R5-R6}
. . .
LDMED R13!,{R5-R6}这一段代码的两个都是ED

两段代码的执行结果是一样的,但是使用堆栈指令的压栈和出栈操作编程很简单(只要前后一致即可),而使用数据块指令进行压栈和出栈操作则需要考虑空与满、加与减对应的问题。(相当于堆栈指令做了封装)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多寄存器寻址指令ldmia/ldmib和ARM存储器访问指令——多寄存器存取 的相关文章

  • 往oracle中插入geometry的两种方式

    方式一 xff08 传入的是wkt xff09 xff1a INSERT INTO tablename id GEOMETRY VALUES 1 SDO GEOMETRY 39 LINESTRING 115 48883 36 59252 1
  • 反思了一下过去几年的程序员之路

    最近回忆起一年前的找工作时的面试时的题目 xff0c 很多基础题都没做好 xff0c 很多概念也混淆不清 虽然自己这几年写的代码不少 xff0c 但都使用自己熟悉的东西写 xff0c 而已经有很多新的技术新的方法却没有使用过 一方面公司自己
  • 怎样使用OpenCV进行人脸识别 [停止更新]

    唯一持续维护地址 xff1a http guoming me face recognition with opencv 更新 2013 6 27 停止人脸识别的研究 xff0c 具体人脸识别系统可以参见文章 使用Kinect进行人脸识别 K
  • OpenCV矩阵运算

    一 矩阵 Mat I img I1 I2 dst A B double k alpha Scalar s 1 加法 I 61 I1 43 I2 等同add I1 I2 I add I1 I2 dst mask dtype scaleAdd
  • OpenCV官方学习文档[2013-7-4更新][最新版本2.4.6]

    最新的OpenCV2 4 6文档更新参见 xff1a http guoming me opencv OpenCV配置视频 OpenCV2 4 6 2013 7 3更新 http opencv org opencv 2 4 6 is out
  • adb: error: failed to copy ... remote couldn‘t create file: Permission denied

    参考 xff1a https blog csdn net qq 39952796 article details 104511806
  • Java面试题总结(乱序版,2020-09-03)

    一 如何实现数组和 List 之间的转换 xff1f String arr 61 34 zs 34 34 ls 34 34 ww 34 List lt String gt list 61 Arrays asList arr System o
  • 【计算机网络 24】TCP/IP数据包结构详解

    一 前言 一般来说 xff0c 网络编程我们只需要调用一些封装好的函数或者组件就能完成大部分的工作 xff0c 但是一些特殊的情况下 xff0c 就需要深入的理解 网络数据包的结构 xff0c 以及协议分析 如 xff1a 网络监控 xff
  • 读《Java编程思想第五版》心得体会

    x1f345 Java学习路线 xff1a 搬砖工逆袭Java架构师 x1f345 简介 xff1a Java领域优质创作者 x1f3c6 CSDN哪吒公众号作者 Java架构师奋斗者 x1f4aa x1f345 扫描主页左侧二维码 xff
  • 操作系统基础知识详解

    作者简介 哪吒 CSDN2022博客之星Top1 CSDN2021博客之星Top2 多届新星计划导师 博客专家 专注Java硬核干货分享 立志做到Java赛道全网Top N 本文收录于 Java基础教程系列 目前已经700 订阅 CSDN最
  • 【SUSE Linux kernel版本升级】SUSE Linux Enterprise Server 12 SP5

    安装完SUSE Linux操作系统后 xff0c 正常会将SUSE Linux的kernel升级至最新版本 本次实验环境是SUSE Linux Enterprise Server 12 SP5 xff1a cat etc release S
  • 一个用消息队列 的人,不知道为啥用 MQ,这就有点尴尬

    消息队列 为什么写这篇文章 博主有两位朋友分别是小A和小B 小A xff0c 工作于传统软件行业 某社保局的软件外包公司 xff0c 每天工作内容就是和产品聊聊需求 xff0c 改改业务逻辑 再不然就是和运营聊聊天 xff0c 写几个SQL
  • iOS开发之NSMutableParagraphStyle富文本

    在iOS开发中 xff0c 常常会有一段文字显示不同的颜色和字体 xff0c 或者给某几个文字加删除线或下划线行间距的需求 就需要富文本来实现 一 实例化方法和使用方法 NSMutableAttributedString detailStr
  • Ubuntu一直卡死的问题(18.04)

    昨天今天Ubuntu突然出现了一个问题 xff0c 就是每次开机不到5分钟 xff0c 随便点击一下浏览器或者其他的地方就会卡住 xff0c 但是鼠标可以移动 xff0c 就是无法点击 xff0c 而且等待一段时间后会出现黑屏然后提示如下图
  • 作为一个普通的程序员,到底应不应该转型AI工程师?

    动不动就是50万的毕业生年薪 xff0c 动不动就是100万起步价的海归AI高级人才 xff0c 普通员到底应不应该转型AI工程师 xff0c 普通程序员到底应该如何转型AI工程师 xff1f 下面就分享几个特别典型的普通程序员成功转型AI
  • 编译原理第二章习题

    一 填空题 假设G是一个文法 xff0c S是文法的开始符号 xff0c 如果S 61 gt x xff0c 则称x是 句型 文法G产生的 句子 的全体是该文法描述的语言 文法 G S S AB A aA B bBc bc描述的语言 L G
  • 推荐几个免费好用的搜书网站

    小不点搜索 地址 xff1a https www xiaoso net 介绍 xff1a 一个公益的网站不收费 我用来搜索过图书 xff0c 其他资源还没搜索过 xff0c 用起来速度挺快的 2 java1234 地址 http www j
  • 推荐一些好用的APP

    南瓜影视 链接 xff1a https ng33 app channelCode 61 share88 appkey 61 ayo1id amp recommend 61 5708550 没有广告 xff0c 有电视版 xff0c 手机版
  • 虚拟机的初始化设置的磁盘空间太大,进行缩小

    xff08 如果你的磁盘文件是多文件的直接跳到第二步 xff09 1 将但磁盘文件分解为多磁盘文件 在虚拟机安装目录下 xff0c 执行该命令 vmware vdiskmanager exe r 你的虚拟机磁盘文件 vmdk t 1 spa
  • yum包查找网站

    https pkgs org http rpm pbone net index php3

随机推荐