汇编:stmdb和ldmia指令

arm汇编指令探究之 ldmia ldmia r0!, {r4-r11, r14} 的意思是 LDMIA 中的 I 是 increase 的缩写,A 是 after 的缩写,LD加载(load)的意思 R0后面的感叹号“!表示会自动调节 R0里面的指针 所以整句话意思是任务栈R0的存储地址由低到高,将R0存储地址里面的内容手动加载到 CPU 寄存器 R0,R4-R12里 还有一种是STMDB R1!, {R0,R4-R12} 这就上面反过来了,ST是存储(store)的意思,D是decrease的意思,B是before的意思,整句话就. 阅读详情

参考了网上一些文章,简单说一下stmdb和ldmia指令的作用,如有错误欢迎指正。


首先一句话说一下stmdb和ldmia指令的作用:

stmdb和ldmia指令一般配对使用,stmdb用于将寄存器压栈,ldmia用于将寄存器弹出栈,作用是保存使用到的寄存器。


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)
多寄存器加载/存储指令共有8种模式(4个用与数据块的传输,4个用于栈操作)



举例一:

指令: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。


如果想要将r0-r12和lr弹出,可以用ldmia指令:

指令:ldmia sp!,{r0-r12,lr}



举例二:


STMIA, 比如当前r0指向的内存地址是 0x1000,STMIA R0!,{R1-R7} 就是 首先把r1存入 0x1000,然后r2存入0x1004,然后r3存入0x1008,如果是32位的处理器就是每次加4个字节,以此类推把 r1-r7按照递增的地址存入,这个r0!就是从r0的地址开始存的意思。
STMDB则是地址从r0开始减少,依次存储。
ARM 汇编指令:PUSH POP 本文介绍了ARM汇编中的PUSHPOP指令,它们是用于栈操作的指令。PUSH用于将寄存器值压入栈(等价于STMDB),而POP用于从栈中恢复寄存器值(等价于LDMIA)。文章详细说明了这两种指令的语法、功能使用场景,包括在子程序调用时保存恢复现场的应用。此外,还指出了寄存器顺序、栈对齐要求等注意事项,并与x86架构的栈操作进行了简要对比。文章最后给出了一个完整的函数调用与返回示例,帮助理解这些指令的实际应用。 阅读详情

相关推荐

开发者的避坑指南:在Apple Silicon Mac上构建RocketMQ Python客户端的完整心路历程

本文详细记录了在Apple Silicon Mac上构建RocketMQ Python客户端的完整过程,重点解决了架构兼容性问题。通过源码编译rocketmq-client-cpp库,修复构建脚本CMake配置,最终成功在M2芯片MacBook Pro上部署RocketMQ Python客户端,为开发者提供了实用的避坑指南。

Pepper的专栏 668

​​​​​​汇编批量传送指令

查看linux内核代码时,常常看到下面八个汇编指令,下面简单讲解一下它们的含义用法。 这8个是汇编常用的批量传送指令,用来加载或者存储几个连续的内存。 ldmib、ldmia、 ldmdb、ldmda、 stmib、stmia、 stmdb、stmda、 观察指令时可将指令分两部分解释: ldm:Load Memory  加载内存,意思是将内存加载到CPU寄存器中; stm:St...

stopshooting的博客 874

cesium vue2/vue3教程目录导航

以下是本专栏目录导航,送完整项目源码(拒绝单页源码),可以直接运行,全部配置免费视频教程(B站)。

qq_29384639的博客 4282

arm汇编指令总结

1、stmdbldmia指令 stmdbldmia指令一般配对使用,stmdb用于将寄存器压栈,ldmia用于将寄存器弹出栈,作用是保存使用到的寄存器。 eg: stmdb sp!,{r0-r12,lr} 含义: sp = sp - 4,先压lr,sp = lr(即将lr中的内容放入sp所指的内存地址)。sp = sp - 4,再压r12,sp = r...

xunmengxiaozi的博客 1201

汇编LDMIA ,STMDB指令

LDMIA 中的 I 是bai increase 的缩写,A 是 after 的缩小,LD加载(load)的意思 R1后面的感叹du号“!”表示会自动调节 R1里面zhi存的指dao针 所以整句话意思是任务栈R1的存储地址由低到高,将R1存储地址里面的内容手动加载到 CPU 寄存器 R0,R4-R12里 还有一种是STMDB R1!, {R0,R4-R12} 这就上面反过来了,ST是存储(store)的意思,D是decrease的意思,B是before的意思,整句话就是R1的存储地址由高到低递减,将R0,

Szh8888的博客 1791

寄存器(R0~R16)以及从SysTick系统时钟理解RTOS移植初始化

一、AMR寄存器别名及APCS 二、R0~R16寄存器用途、介绍 R0-R3 用作传入函数参数,传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。 被调用函数在返回之前不必恢复 r0-r3。如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。 RT-Thread代码启动过程 ①从系统初始化开始执行,将函数地址赋给R0寄存器,跳转到R0地址执行并返回此处(BLX是带链接的跳转,即带返回的跳转)。 ②将main函数地址给R0,将函数地址赋给R0,跳转到R0地址执行,不返回(B

weixin_38265028的博客 3360

arm汇编基础(转)

先看个例子: void test2(int a,int b,int c) { int k=a,j=b,m=c; } GCC反汇编: 00000064 <test2>: mov ip, sp //IP=SP;保存SP stmdb sp!, {fp, ip, lr, pc} //先对SP减...

weixin_33802505的博客 634

ARM汇编学习三

有时,一次性加载(或存储)多个值更有效率。因此,我们需要使用LDM(载入多个值)STM(存储多个值)。这些指令基于起始地址的不同,有不同的形式。下面是我们将在本节中将会使用的代码。我们将一步一步地完成每一个指令.代码在test5.s中 .data array_buff: .word 0x00000000 /* array_buff[0] / .word 0x0000000...

Yale的博客 927

FreeRTOS中汇编指令

立即数很大,无法将立即数指令合并成32bit,指令会被编译器拆分为LDR R0, [PC, #offset];.word 0xF00000000两条指令,即先将立即数利用.word指令存储在该LDR指令附近,编译器计算立即数与当前正在执行指令PC(program counter)指针的偏差offset,注意ARM是流水线指令,采用取指令,译指令执行指令。BX 指令跳转到指令中所指定的目标地址, 目标地址处的指令既可以是ARM 指令,也可以是Thumb指令

weever7的博客 2880

ARM汇编

ARM汇编

ask_true的博客 155

【工程源码】stmdbldmia汇编指令

本文由FPGA爱好者小梅哥编写,未经作者许可,本文仅允许网络论坛复制转载,且转载时请标明原作者。 首先一句话说一下stmdbldmia指令的作用: stmdbldmia指令一般配对使用,stmdb用于将寄存器压栈,ldmia用于将寄存器弹出栈,作用是保存使用到的寄存器。 ARM指令的多数据传输(STM、LDM)中,提到:多寄存器的LoadStore指令分为2组:一组用于数据的存储与读取...

zgmxs的专栏 1304

汇编 -- arm架构的ldmia与stmia指令

在ARM架构中,数据传输指令被广泛用于从内存读取数据向内存存储数据。ldmia(Load Multiple Increment After)stmia(Store Multiple Increment After)是两条用于多寄存器传输的指令,可以一次性读取或写入多个寄存器,常用于堆栈操作上下文切换。

sz66cm 学习随笔 2247

ARM汇编指令基础(二)

ARM汇编指令基础(二)加减指令ADDSUB跳转指令BL读写指令LDMSTM 本文是基于韦东山视频的学习笔记 加减指令 ADD 就加啊。 add fp, sp, #0 fp = sp + 0 SUB 就减。 sub sp, sp, #12 sp = sp - 12 跳转指令 BL branch and link 区别于B指令, 他不仅跳转,还会把返回地址(下一条指令的地址)保存在LR寄存器中。...

weixin_36778746的博客 490

Cortex-M3 RTOS常用汇编指令

BX指令跳转到指令中所指定的目标地址,若目标地址的bit[0]为0,则跳转时自动将CPSR中的标志位T复位,即把目标地址的代码解释为ARM代码;IMPORT伪操作告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号,而且不论本源文件是否实际引用该符号,该符号都将被加入到本源文件的符号表中。LDR指令的作用:将 存储器地址 所指地址处连续的4个字节(1个字)的数据传送到目的寄存器中。将依次压入R4-R11的值存入R0所存地址处的数据, 先减地址,再压入数据。

qq_40474517的博客 1102

linux mdb 反汇编,[arm-汇编stmdbldmia、stmfd、ldmfd]

STMFDST - storeM - MultipleF - FULLD - DescendingLDMFDLD - LoadM - MultipleF - FULLD - Descending栈指针通常可以指向不同的位置。栈指针指向栈顶元素(即最后一个入栈的数据元素)时称为FULL栈;栈指针指向与栈顶元素相邻的一个可用书局单元时称为EMPTY栈。数据栈的增长方向也可以不同。当数据栈向内存地址减小...

weixin_36170708的博客 630

cmp 字节 汇编_Arm常用汇编指令

最近在做ARM查错方面的工作,用到trace32时,需要阅读代码中一些汇编指令,特此记录下来。1. 单寄存器加载指令(LDR)LDR r0, [r1] r0 <=========[r1] 取数据加载字指令:LDR r0, [r1],将内存中的一个字(4个字节)加载到寄存器r0中加载字节指令:LDRB r0, [r1],将内存中的一个字节加载到...

weixin_42126677的博客 2706

ARM A32多数据处理汇编指令理解分享

在ARM A32多数据处理汇编指令分为多数据存储指令多数据加载指令:1,多数据存储指令:push, STMFD(STMDB), STMED(STMDA) , STMFA(STMIB), STMEA(STMIA);2,多数据加载指令:pop,LDMF(LDMIA), LDMFA(LDMDA), LDMEA(LDMDB), LDMED(LDMIB);

天使之翼 1877

stmdbldmia

当发生中断异常的时候,寄存器r0-r12的值可能会发生变化,所以需要提前保存一下。怎么保存? stmdb sp!, {r0-r12, lr} 这样就把这些寄存器保存到了栈中 ldmia sp!, {r0-r12,pc}^ 就是恢复各个寄存器,其^表示会把spsr的值恢复到c’psr中 ...

weixin_45479946的博客 899

P4:一些常用的汇编指令

本文讲述了一些常用的汇编指令

m0_53394161的博客 514

ARM汇编指令

arm体系采用的方案是满减,但是在进行操作之前,我们必须告诉2440栈底的位置,这里我们把栈底设置为0x40001000,从地址0x40000000开始的0x1000这段内存空间对应的是2440内部的一段ram,总共4k。该位是针对有符号数的操作,会在下面两种情形变为1,两个最高有效位均为0的数相加,得到的结果最高有效位为1;汇编指令的s后缀,几乎所有的汇编指令都可以在指令后面加上s后缀,s后缀的含义是在指令执行过程中会更新cpsr寄存器的N,V,C,Z位。如果结果为0,则Z=1;

qq_65747669的博客 2552

基于Robotstudio的工业机器人汽车喷涂仿真设计_3.zip

本文利用ABB自主开发的Robot Studio离线模拟软件对涂料生产线进行了模拟,并对其反复定位精度、颜色清洁等方面进行了深入的探讨。首先,叙述了涂料生产线的功能、历史、工艺流程,并对其发展过程、特点、研究背景、研究意义作了简要的介绍。本文对喷漆机器人着色系统的硬件组成、换色与清洁机理进行了分析,并对其引起的问题及影响因素进行了分析,并进行了预处理软件的设计。对机器人在喷涂过程中容易产生的漆膜问题进行了研究,并对产生的原因进行了分析,并提出了解决办法。并对静电电压、成型空气等各工艺参数的影响进行了分析。其次,对机器人的姿态重复度姿态精度进行了分析,提出了用雅可比矩阵表达机器人各个关节轴线的角速度与速度的关系;本文对离线编程技术的发展状况进行了分析,并对离线程序的各模块及界面的作用进行了详细的说明,并给出了离线编程的整体设计思路。最后,在Robot Studio仿真软件的基础上,通过Robot Studio仿真软件实现了涂装流水线工作站的布置,建立了工件坐标系、工具坐标系、离线输送系统模块、喷涂模型仿形模块。### 基于Robot Studio的工业机器人汽车喷涂仿真设计#### 一、引言近年来,随着汽车行业的快速发展,消费者对于汽车的外观性能提出了更高的要求。为了满足市场需求,提高生产效率并降低生产成本,各大汽车制造商纷纷对传统油漆生产线进行改造升级。在这个背景下,喷射机器人因其高效性、精确性可靠性而在汽车涂装生产线上扮演着关键角色。本研究旨在通过ABB自主开发的Robot Studio离线模拟软件来实现汽车喷涂生产线的仿真设计,重点讨论了机器人的重复定位精度、颜色清洁等方面的优化方案。#### 二、涂料生产线概述##### 2.1 功能与历史涂料生产线主要用于汽车表面涂层的加工,它能够根据不同的需求进行多层涂装。随着技术进步,现代涂料生产线不仅提高了生产效率,还降低了能耗环境污染。##### 2.2 工艺流程涂料生产线的工艺流程一般包括预处理、电泳、中涂、面漆等多个环节。其中,预处理主要是去除车身表面的油污其他杂质;电泳则是通过电流将涂料均匀地附着在车身上;中涂面漆则负责赋予汽车美观的外观。#### 三、喷漆机器人着色系统分析##### 3.1 硬件组成喷漆机器人的硬件主要包括喷枪、颜色更换装置、清洗系统等部件。喷枪用于喷射涂料;颜色更换装置使得机器人能够在不同颜色之间快速切换;清洗系统则保证了喷枪在每次更换颜色后都能得到彻底清洁。##### 3.2 换色与清洁机理喷漆机器人通过更换不同的喷嘴或者内部管道来实现颜色的快速切换。在更换颜色前后,需要对喷枪进行彻底清洁以避免颜色污染。通常采用压缩空气或溶剂进行清洗。##### 3.3 影响因素影响喷漆机器人性能的因素主要包括涂料种类、喷涂压力、喷枪与工件之间的距离等。这些因素都会直接影响到喷涂效果的质量。#### 四、漆膜问题研究在实际喷涂过程中,可能会遇到各种漆膜问题,如流挂、橘皮现象、针孔等。这些问题通常是由涂料黏度、喷涂速度、环境温度等因素引起的。为解决这些问题,可以通过调整涂料配方、优化喷涂参数等方式来进行改进。#### 五、离线编程技术##### 5.1 发展现状离线编程技术是指在不占用实际生产设备的情况下,通过计算机软件预先编写模拟机器人运行程序的技术。随着计算机技术的发展,离线编程已经成为提高生产效率的重要手段之一。##### 5.2 雅可比矩阵应用雅可比矩阵是描述机器人各关节轴线角速度与末端执行器速度关系的一种数学工具。通过计算雅可比矩阵,可以更准确地控制机器人的运动轨迹,从而提高其重复定位精度姿态精度。##### 5.3 整体设计思路离线编程的整体设计思路主要包括任务规划、路径规划程序生成三个阶段。其中,任务规划阶段确定机器人的工作任务;路径规划阶段根据任务要求计算出机器人的运动轨迹;程序生成阶段则是将规划好的轨迹转化为机器人可以执行的指令。#### 六、Robot Studio仿真软件应用##### 6.1 工作站布局利用Robot Studio软件可以实现涂装流水线工作站的虚拟布局,包括工件坐标系、工具坐标系等的设定。##### 6.2 模型仿真通过建立喷涂模型仿形模块,可以在软件中模拟整个喷涂过程,从而验证设计方案的有效性。#### 七、结论通过对喷漆机器人及其在汽车涂装生产线中应用的研究,本文不仅介绍了涂料生产线的基本情况发展趋势,还深入探讨了喷漆机器人着色系统的工作原理、漆膜问题及其解决方案等内容。利用Robot Studio软件进行离线编程仿真,不仅可以提高生产效率,还能有效减少生产成本,具有重要的理论实践意义。

上一篇: arm汇编:mrs与msr
下一篇: 一个新的正视自己
「已注销」
博客等级 码龄14年 15粉丝 4原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值