stmdb和ldmia

2023-05-16

stmdb:db(decrease before)表示先减后存。

指令 stmdb sp!, { fp, ip, lr, pc}  %% "!”表示sp等于最终被修改的sp的值。

假设 sp=4096,此条指令的执行过程如下:

1.先减:sp=sp-4=4092;

2.后存:4092-4095处存放pc的值;

3.先减:sp=sp-4=4088;

4.后存:4088-4091处存放lr寄存器的值;

以此类推,..........。

ldmia:ia(increase after)表示先读后增。

指令ldmia sp, {fp,sp, pc}

假设 sp=4080,此条指令的执行过程如下:

1.先读:fp位于4080-4083处存放原来保存的fp;

2.后增:sp=sp+4=4084;

3.先读:sp位于4084-4087处存放原来保存的ip;

4.后增:sp=sp+4;

以此类推,..........。

stm和ldm
    释义:
       stm:   (store much)多数据存储,将寄存器的值存到地址上
      ldm:   (load much)多数据加载,将地址上的值加载到寄存器上
    格式:
       ldm{cond}  mode  rn{!}, reglist{^}
       stm{cond} mode  rn{!}, reglist{^}
   详细释义:
       arm指令的多数据传输(stm、ldm)中,提到:多寄存器的load和store指令分为2组:
            一组用于数据的存储与读取(常用),对应于ia、ib、da、db 
              一组用于堆栈操作(基本用不到),对应于fd、ed、fa、ea,两组中对应的指令含义相同。

                即:
  
             stmib(地址先增而后完成操作)                   stmfa(满递增堆栈);
               stmia(完成操作而后地址递增)                   stmea(空递增堆栈);
               stmdb(地址先减而后完成操作)                  stmfd(满递减堆栈);
               stmda(完成操作而后地址递减)                  stmed(空递减堆栈)。
               上述各组2个指令含义相同只是适用场合不同,同理有:
               ldmib                                                 ldmed;
               ldmia                                                 ldmfd;
              ldmdb                                                ldmea;
               ldmda                                                 ldmfa。

               ia模式表示:每次传送后地址+4;(after increase)
               db模式表示:每次传送前地址-4;(before decrease)
               !   : 是选项,可有可无。加此选项,指令执行后,rn 的值会更新,等于下一个内存单元的地址
                 ^  : 如果reglist有pc寄存器,它表示指令执行后,spsr寄存器的值将自动复制到cpsr寄存器中
                                    —— 这常用于从中断处理函数中返回
                        如果reglis中没有 pc寄存器 , ^ 表示操作的是用户模式下的寄存器,而不是当前特权模式
                                   的寄 存器

stmdb和ldmia:
stmdb和ldmia指令一般配对使用,stmdb用于将寄存器存到某个地址上(一般是栈地址),ldmia用于将地址上
       的值加载到寄存器上,作用是保存使用到的寄存器。
  
举例一: 保存使用到的寄存器。
   将寄存器压栈(保存寄存器的值)
    指令:stmdb sp!,{r0-r12,lr}
    含义:sp = sp - 4,先压lr,[sp] = lr(即将lr中的内容放入sp所指的内存地址)。sp = sp - 4,再压r12,  
            [sp] = r12。sp = sp - 4,再压r11,[sp] = r11......sp = sp - 4,最后压r0,[sp] = r0。

   寄存器弹出栈(恢复寄存器的值)
    指令:ldmia sp!,{r0-r12,lr}
    含义:r0 = [sp](sp地址处的值赋值给r0),sp = sp + 4,r1 = [sp],
              sp = sp + 4,r2 = [sp], sp = sp + 4,r3 = [sp]......最后lr = [sp]

    详细分析:
    ldmia r0!,{r1-r4}
   r0:要操作的存储空间首地址,要操作的数据个数由寄存器列表决定,现在是r0到r4,共4个数据(每个数
          据32bit)
    具体:
   地址为r0的存储空间的数据赋值给r1
   地址为r0+4的存储空间的数据赋值给r2
   地址为r0+8的存储空间的数据赋值给r3
   地址为r0+12的存储空间的数据赋值给r4
    例:执行前:
   mem32[0x1000c] = 0x04
   mem32[0x10008] = 0x03
   mem32[0x10004] = 0x02
   mem32[0x10000] = 0x01
    r0 = 0x00010000
    r1 = 0x00000000
    r2 = 0x00000000
    r3 = 0x00000000
    r4 = 0x00000000
   执行后:存储空间不变,寄存器变化
    r0 = 0x00010000
    r1 = 0x01
    r2 = 0x02
    r3 = 0x03
    r4 = 0x04

举例二:
    stmia, 比如当前r0指向的内存地址是 0x1000,stmia r0!,{r1-r7} 就是 首先把r1存入 0x1000,然后r2
   存入0x1004,然后r3存入0x1008,如果是32位的处理器就是每次加4个字节,以此类推把 r1-r7按照递增、
   的地址存入,这个r0!就是从r0的地址开始存的意思。
   
   STMDB则是地址从r0开始减少,依次存储。
 

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

stmdb和ldmia 的相关文章

  • OFDPA软件概述

    OFDPA软件概述 OF DPA xff08 openflow data plane abstraction xff09 是一个应用软件组件 实现了 openflow与broadcom SDK间适配层的功能 OF DPA在broadcom交
  • freertos和ucos的区别

    一 freeRTOS比uCOS II优胜的地方 xff1a 1 内核ROM和耗费RAM都比uCOS 小 xff0c 特别是RAM 这在单片机里面是稀缺资源 xff0c uCOS至少要5K以上 xff0c 而freeOS用2 3K也可以跑的很
  • wget和curl中使用代理

    命令使用代理 wget curl 都支持使用代理 wget e http proxy 61 10 1 4 43 8080 proxy mimvp com curl x 10 1 4 43 8080 proxy mimvp com 环境变量使
  • SQL 触发器与WebApi回执

    1 需求数据库表添加 xff0c 修改 xff0c 删除数据 xff0c 触发器生效 xff0c 推送数据数据到WCF接口 a 创建WCF服务 xff0c 发布服务 b 启用数据库CLR功能 xff0c 默认是关闭状态 EXEC sp co
  • inelliJ IDEA注册码

    http idea lanyus com
  • 正则表达式之?、(?:pattern)、(?!pattern)、(?=pattern)理解及应用

    今天朋友问我一个问题 xff0c 是这样子的 xff0c 通过正则表达式匹配html标签input包含hidden的字符串 xff0c 具体如下 xff1a 34 lt input type 61 34 hidden 34 id 61 34
  • cmake源码安装

    Data 2017 12 1 Author cjh Theme cmake源码安装 在玩TI AM5728时 xff0c 要用到cmake编译程序 xff0c 无奈开发板又不能用apt get只好自己源码安装了 cmake源码下载 解压源码
  • Ubuntu下逻辑坏道解决方案

    一 逻辑坏道修复方法 逻辑坏道 服务器硬盘相比其他部件是较容易坏的 xff0c 如突然断电 大量频繁写入都会加速硬盘的老化 xff0c 下面介绍一些判断硬盘状况和修复的方法 发现硬盘坏道 dmesg 当有硬盘坏道时 xff0c 通常在dme
  • 解决本地无法ssh连接ubuntu虚拟机

    1 保证双方都能互相ping通 本地 Windows 查看ip xff1a ipconfig ubuntu虚拟机查看ip span class token function ifconfig span 2 保证ubuntu虚拟机安装了ssh
  • 70、在js中为什么0.1+0.2不等于0.3

    并不是所有小数都可以用 完整 的二进制来表示的 xff0c 比如十进制 0 1 在转换成二进制小数的时候 xff0c 是一串无限循环的二进制数 xff0c 计算机是无法表达无限循环的二进制数的 xff0c 毕竟计算机的资源是有限 因此 xf
  • Outlook 2013/2016 显示“正在启动...“ 无法进入Outlook的解决方案

    因上次非正常关闭 xff0c 导致Outlook 2016启动时 xff0c 一直处于启动界面 xff0c 无法进入主界面正常工作 刚开始Outlook 2016启动界面显示的是 34 正在处理 34 查询网上各种方法 xff0c 安全启动
  • H265 CTU、CU、PU、TU划分的特点及要求

    目录 H265 CTU CU PU TU划分的特点及要求大小及划分模式常见问题1 Spec里对于CTU大小的规定在哪 xff1f 2 Spec对于TU大小的规定在哪 xff1f 3 Spec里对于M 2 M 2的划分方式的规定在哪里 xff

随机推荐

  • Oracle VM VirtualBox虚拟机使用问题总结

    我本机的配置是Ubuntu 18 04 43 Oracle VM VirtualBox虚拟机 6 1 12 43 虚拟win7操作系统 xff0c 对虚拟机了解甚少 xff0c 以下仅为一些实践中的经验 xff1a 一 升级后屏幕分辨率问题
  • C语言中string函数详解

    PS xff1a 本文包含了大部分strings函数的说明 xff0c 并附带举例说明 本来想自己整理一下的 xff0c 发现已经有前辈整理过了 xff0c 就转了过来 修改了原文一些源码的问题 xff0c 主要是用char 字义字符串的问
  • MP3的帧结构

    原文地址 xff1a http www eefocus com jjbearustc blog 07 09 3716 3e901 html MP3帧包括以下4个部分 xff1a 1 帧头 xff1a 比特流中包含同步和状态信息的部分 2 错
  • git am PATCH 失败的处理方法

    参考 xff1a http www cnblogs com domainfei articles 2433504 html http blog sina com cn s blog 5372b1a301015y0n html 英文原文地址
  • AAC帧格式及编码介绍

    参考资料 xff1a AAC以adts格式封装的分析 xff1a http wenku baidu com view 45c755fd910ef12d2af9e74c html aac编码介绍 xff1a http wenku baidu
  • 基于ubuntu14.04的Mobilenet_SSD环境搭建

    Data 2017 11 22 Author cjh Theme 基于ubuntu14 04的Mobilenet SSD环境搭建 Caffe for SSD xff1a https github com weiliu89 caffe tre
  • [open vSwitch]查看OVS端口ofport编号及对应虚拟机MAC

    在用open vSwitch做实验时 xff0c 我们经常需要知道OVS port对应的ofport编号 xff0c 这个比较容易 xff0c 用 ovs ofctl show bridge 就能得到 如 root 64 vaio ovs
  • 4、基于51单片机智能语音识别小车控制 语音口令说话控制系统设计

    毕设帮助 开题指导 技术解答 xff08 有偿 xff09 见文末 目录 摘要 一 硬件方案 二 设计功能 三 实物图 四 原理图 五 PCB图 六 程序源码 七 资料包括 摘要 随着电子工业的发展 xff0c 具有语音控制功能的小车越来越
  • H264中的SPS、PPS提取与作用

    牛逼的视频会议网站 xff1a http wmnmtm blog 163 com blog m 61 0 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 4
  • Linux系统备份与还原

    在 使用Ubuntu之前 xff0c 相信很多人都有过使用Windows系统的经历 如果你备份过Windows系统 xff0c 那么你一定记忆犹新 xff1a 首先需要找到一个备份工 具 通常都是私有软件 xff0c 然后重启电脑进入备份工
  • ip能ping开但是不能远程登陆

    刚刚安装ftp时玩将防火墙开启了 然后退出ssh再登陆时就登陆不上去了 出现 xff1a ip能ping开但是不能远程登陆 xff1b telnet ip 也不通 以为使系统问题 xff0c 但是想想刚刚的操作还是防火墙 解决方法 xff1
  • 如何检索CPCI-S

    1 打开Web of Science www webofknowledge com 2 选择数据库大类 xff1a Web of Science核心合集 xff1b 3 会议论文 xff0c 需要选择web of science数据库中的一
  • ZeroMQ消息传输协议 (v2.0)

    因为项目上在和其他团队联调时需要抓包分析消息正确性的问题 xff0c 因此在网络上查找了一下关于ZeroMQ的协议资料 找到如下文章 原文 另外这里有一篇对ZeroMQ实现讲的比较深的文章 xff0c 有兴趣也可以看看 xff1a 全网仅此
  • mysql左右匹配原则的用法和理解

    重点 xff1a mysql的最左匹配原则其实是和where后面的查询条件顺序是没有关系的只和索引的字段顺序有关 xff1b xff08 这里说的顺序是联合索引的顺序 xff09 这点网上很多地方都说错了 下面我们来用代码模拟一下问题 这里
  • 如何做好项目经理

    我一直赞同这个观点 xff1a 项目经理是干出来的 xff0c 不是学出来的 xff1b 是带出来的 xff0c 不是教出来的 一个人要成长为一名合格的项目经理主要不是靠学 xff0c 而是靠干 xff0c 当然学也很重要 靠干 xff0c
  • Javascript进制转换

    介绍一个简单的用Javascript进行 进制 转换的方式 xff1a 将十进制转换为十六进制 xff1a var i 61 10 alert parseInt 10 10 toString 16 同样 xff0c 将十六进制转换为十进制
  • js实现进制变换 10->16

    进制变换 10 gt 16 function heTransform data var pattern 61 new RegExp 39 1 9 d 0 39 判断是否是10进制数字 if pattern test data var hex
  • 用Visual C#实现局域网点对点通讯

    用Visual C xff03 实现局域网点对点通讯 作者 xff1a 马金虎 日期 xff1a 2003 9 28 出处 xff1a P2P中国 PPcn net 点对点即Peer To Peer xff0c 通常简写为P2P 所谓网络中
  • Makefile学习总结

    Data 2017 12 07 Author cjh Theme Makefile Tutorial 俗话说 xff0c 工欲善其事必先利其器 xff0c 所以我们先来介绍一下Makefile中的特殊字符 64 表示目标文件 表示所有的依赖
  • stmdb和ldmia

    stmdb xff1a db xff08 decrease before xff09 表示先减后存 指令 stmdb sp fp ip lr pc 34 表示sp等于最终被修改的sp的值 假设 sp 61 4096 xff0c 此条指令的执