arm汇编指令之数据块传输(LDM,STM)详见

arm汇编指令之数据块传输(LDM,STM)详见数据块传输指令用于加载 LDM 或者存储 STM 当前有效寄存器的任意子集 它们支持所有可能的堆栈模式 维持空或者满的堆栈 此堆栈可以向上或者向下 在保存或者恢复内容 移动主存储器的大数据块是非常有效的 1 指令格式 cond nbsp nbsp nbsp Rn nbsp nbsp nbsp nbsp nbsp nbsp cond nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 条件代码 nbsp nbsp nbsp nbsp nbsp 指令类型 nbsp nbsp nbsp nbsp Rn

数据块传输指令用于加载(LDM或者存储(STM当前有效寄存器的任意子集。
它们支持所有可能的堆栈模式,维持空或者满的堆栈,此堆栈可以向上或者向下,在保存或者恢复内容,
移动主存储器的大数据块是非常有效的。

1,指令格式:
arm汇编指令之数据块传输(LDM,STM)详见
{cond}     Rn{!},   {^}
    *{cond}
         条件代码
    * 指令类型
    *Rn            基址寄存器,其不可以为R15
    *
        寄存器列表,寄存器范围包含在{}(比如{R0,R2-R7,R10}),其可以是R0~R15的任意组合
                           由于R15是pc,对其操作可能会造成程序跳转,R15在最后一个被传输。
                            序号低的寄存器对应于存储器的低地址,不考虑{…}中的次序
    *{!} 

           为可选后缀,
            若选用该后缀,表示请求回写(W=1),则当数据传送完毕之后,将最后的地址写入到基址寄存器(Rn中,
            否则,W=0。表示请求不写回,基址寄存器的内容不改变
    *{^}            为可选后缀,
            当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送外,还将SPSR复制到CPSR中。
            同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。

2,指令类型:
arm汇编指令之数据块传输(LDM,STM)详见

arm汇编指令之数据块传输(LDM,STM)详见
  
    当LDM/STM没有被用于堆栈,而只是简单地表示地址前向增加,后向增加,前向减少,后向减少时,由IA,IB,DA,DB控制。
        IA    —->   Increment    After    每次传送地址加4
        IB    —->   Increment    Before    每次传送地址加4
        DA    —->   Decrement    After    每次传送地址减4
        DB    —->   Decrement    Before    每次传送地址减4

    堆栈请求格式

,FD,ED,FA,EA定义了前/后向索引和上/下位,F,E表示堆栈满或者空。
    A 和D 定义堆栈是递增还是递减,如果递增,STM将向上,LDM向下,如果递减,则相反。
        FA    —->   Full    Ascending        满递增堆栈          
        FD    —->   Full    Descending        满递减堆栈 
        EA    —->   Empty    Ascending    空递增堆栈
        ED    —->   Empty    Descending    空递减堆栈

arm汇编指令之数据块传输(LDM,STM)详见

        示例:
arm汇编指令之数据块传输(LDM,STM)详见

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

3,指令详解:
    (1)IA
            STMIA

 R0!,{R1,R2, R3,R14}
                    先传后增,寄存器→RAM
                    效果图:
arm汇编指令之数据块传输(LDM,STM)详见
                               
arm汇编指令之数据块传输(LDM,STM)详见


















































            LDMIA R0!,{R1,R2, R3,R14}

                    先传后增, RAM →寄存器

                    效果图:

arm汇编指令之数据块传输(LDM,STM)详见

    (2)IB
            STMIB
 R0!,{R1,R2, R3,R14}
                    先增后传,寄存器→RAM
                    效果图:
arm汇编指令之数据块传输(LDM,STM)详见
                   arm汇编指令之数据块传输(LDM,STM)详见






            LDMIB R0!,{R1,R2, R3,R14}
        先增后传, RAM →寄存器
        效果图:

arm汇编指令之数据块传输(LDM,STM)详见

    (3)DA
            STMDA 
R0!,{R1,R2, R3,R14}
                    先传后减, 寄存器→ RAM
                    效果图:
arm汇编指令之数据块传输(LDM,STM)详见
 arm汇编指令之数据块传输(LDM,STM)详见

            LDMDA R0!,{R1,R2, R3,R14}
                    先传后减, RAM → 寄存器
                    效果图:
arm汇编指令之数据块传输(LDM,STM)详见

    (4)DB
            STMDB 
R0!,{R1,R2, R3,R14}
                    先减后传,寄存器→ RAM
                    效果图:
arm汇编指令之数据块传输(LDM,STM)详见
arm汇编指令之数据块传输(LDM,STM)详见
                     
            LDMDB R0!,{R1,R2, R3,R14}
                    先减后传, RAM → 寄存器
                    效果图:
arm汇编指令之数据块传输(LDM,STM)详见
    (5)FA
            STMFA 
SP!,{R0,R1,R2,R14}
                    满递增入栈,R13为基址地址
                    效果图:
arm汇编指令之数据块传输(LDM,STM)详见
            LDMFA SP!,{R0,R1,R2,R14}
                    满递增出栈,R13为基址地址
                    效果图:
arm汇编指令之数据块传输(LDM,STM)详见
   
(6)FD
            STMFD 
SP!,{R0,R1,R2,R14}
                    满递减入栈,R13为基址地址
                    效果图:
arm汇编指令之数据块传输(LDM,STM)详见
            LDMFD SP!,{R0,R1,R2,R14}
                    满递减出栈,R13为基址地址
                    效果图:
arm汇编指令之数据块传输(LDM,STM)详见
    (7)EA
            STMEA 
SP!,{R0,R1,R2,R14}
                    空递增入栈,R13为基址地址
                    效果图:
arm汇编指令之数据块传输(LDM,STM)详见
            LDMEA SP!,{R0,R1,R2,R14}
                    空递增出栈,R13为基址地址
                    效果图:
arm汇编指令之数据块传输(LDM,STM)详见
    (8)ED
            STMED 
SP!,{R0,R1,R2,R14}
                    空递减入栈,R13为基址地址
                    效果图:
            arm汇编指令之数据块传输(LDM,STM)详见
            LDMED SP!,{R0,R1,R2,R14}
                    空递减出栈,R13为基址地址
                    效果图:
arm汇编指令之数据块传输(LDM,STM)详见

http://blog.chinaunix.net/uid-28458801-id-3791987.html




























































 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222727.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午3:07
下一篇 2026年3月17日 下午3:07


相关推荐

  • sha1解密的方法,分享实用的sha1在线解密网站

    sha1解密的方法,分享实用的sha1在线解密网站sha1 是一种密码散列函数 是一个用来进行数字签名的算法 这种算法通俗来说 就是接收一段明文 并以不可逆的方式转换成一段密文 通过密文无法知道原文是什么 那么 sha1 算法原理是什么 sha1 如何解密 本文将对这两个问题进行解答 并分享实用的 sha1 在线解密工具

    2026年3月19日
    1
  • idea项目打包成war_war文件打成war包

    idea项目打包成war_war文件打成war包IntelliJIDEA将项目打包war包1、准备工作IntelliJIDEA开发工具可以正常运行的Java项目2、打包war包流程使用快捷键Ctrl+Alt+Shift+s或者鼠标点击选中项目名按F4打开ProjectStructure界面选择Artifacts,点击右边+,依次选择WebApplication:Archive和For’myP…

    2025年7月29日
    5
  • CTFshow刷题日记-WEB-反序列化(web254-278)PHP反序列化漏洞、pop链构造、PHP框架反序列化漏洞、python反序列化漏洞

    CTFshow刷题日记-WEB-反序列化(web254-278)PHP反序列化漏洞、pop链构造、PHP框架反序列化漏洞、python反序列化漏洞非反序列化web254-简单审计这个题是搞笑的么????按着源码顺序走一遍……$username=$_GET[‘username’];$password=$_GET[‘password’];if(isset($username)&&isset($password)){$user=newctfShowUser();if($user->login($username,$password)){if($user->c

    2022年7月14日
    14
  • npn饱和截止放大怎么判断_二极管饱和状态

    npn饱和截止放大怎么判断_二极管饱和状态幼儿园水平理解三极管截止、放大和饱和状态!书上看不懂,听课听不懂的过来!绕不开的三极管结构以NPN为例,晶体三极管的结构,这是很多人不想看的,但是确实是非常重要的!不看结构是理解不了工作原理的!(这样记忆:N是negative,负,代表多子为电子;P是positive,正,代表多子为空穴)注意观察三极管的结构,有助于理解工作时的状态。两张图结合起来看,略作解释:1.图中空心为空穴带正…

    2025年10月19日
    8
  • MATLAB 绘图时如何设置中文宋体英文新罗马

    MATLAB 绘图时如何设置中文宋体英文新罗马MATLAB 绘图混合字体设置

    2026年3月18日
    2
  • VLAN的基本配置_划分不全的例子

    VLAN的基本配置_划分不全的例子1、VLAN基础知识VLAN(VirtualLocalAreaNetwork)的中文名为:“虚拟局域网”,注意和’VPN’(虚拟专用网)进行区分。VLAN是一种将局域网设备从逻辑上划分(不是从物理上划分)成一个个网段,从而实现虚拟工作组的新兴数据交换技术。这一新兴技术主要应用于交换机和路由器中,但主流应用还是在交换机之中。但又不是所有交换机都具有此功能,只有VLAN协议的第三层以上交换机才具有此功能,这一点可以查看相应交换机的说明书即可得知。由于它是从逻辑上划分,而不是从物理上..

    2026年1月25日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号