ARM 汇编指令:(七) STM/LDM多寄存器加载/多存储指令

news2024/10/7 18:23:44

目录

一.四种栈

1.满增栈:进栈(先移动指针再入栈,指针往地址增大的方向移动);出 栈(先出栈,栈指针往地址减小的地方移动)。

2.满减栈:进栈(先移动指针再入栈,指针往地址减小的方向移动);出栈(先出栈,栈指针往地址增大的地方移动)。

3.空增栈:进栈(先进栈,栈指针往地址增大的方向移动);出栈(先移动指针再出栈,栈指针往地址减小的方向移动

4.空减栈:进栈(先进栈,栈指针往地址减小的方向移动);出栈(先移动指针再出栈,栈指针往地址增大的方向移动) 

二.LDM(多寄存器加载)和STM(多存储内存)

1.LDM指令格式

2.STM指令格式

3.LDM和STM多种模式

4.arm 满递减栈使用

1)STMFD 压栈操作

2)LDMFD 寄存器加载操作

3)实际场景分析


一.四种栈

考验大家理解能力的地方来了,专心点,嘿嘿!!

1.满增栈:进栈(先移动指针再入栈,指针往地址增大的方向移动);出 栈(先出栈,栈指针往地址减小的地方移动)。

2.满减栈:进栈(先移动指针再入栈,指针往地址减小的方向移动);出栈(先出栈,栈指针往地址增大的地方移动)。

3.空增栈:进栈(先进栈,栈指针往地址增大的方向移动);出栈(先移动指针再出栈,栈指针往地址减小的方向移动

 

4.空减栈:进栈(先进栈,栈指针往地址减小的方向移动);出栈(先移动指针再出栈,栈指针往地址增大的方向移动) 

 

  满栈:当堆栈指针总是指向最后压入堆栈的数据

  空栈:当堆栈指针总是指向下一个将要放入数据的空位置

二.LDM(多寄存器加载)和STM(多存储内存)

1.LDM指令格式

LDM{cond}<模式>  Rn{!},reglist{^} ;

reglist :表示寄存器列表,可以包含多个寄存器,它们使用“,”隔开,如{R1,R2,R6-R9},寄存器由小到大排列; 

2.STM指令格式

STM{cond}<模式>  Rn{!},reglist{^} ;

3.LDM和STM多种模式

模式

说明

模式

说明

IA

每次传送后地址加4

FD

满递减堆栈

IB

每次传送前地址加4

ED

空递减堆栈

DA

每次传送后地址减4

FA

满递增堆栈

DB

每次传送前地址减4

EA

空递增堆栈

数据块传送操作

堆栈操作

4.arm 满递减栈使用

ARM 微处理器支持这四种类型的堆栈工作方式,一般使用那种栈都是由编译器决定的,arm_gcc是使用的满递减栈,那么我们写.s也按照满递减栈才方便。

1)STMFD 压栈操作
STMFD SP!,{r0,r1,R2,r14}

满递减入栈,r13(lr)为基址地址:

这里需要注意,寄存器r0 r1 r2 r14,哪一个先压得栈?这里有一个总结:不管递减存还是递增存,寄存器组里的高位寄存器(r14)对应到高地址,低位寄存器(r0)对应到低地址。那么取也就好理解了,高地址得load到高位寄存器,低地址得内容load到低位寄存器。

2)LDMFD 寄存器加载操作
LDMFD SP!,{r0,r1,R2,r14}

3)实际场景分析
__swi_entry:   //svc_mode
stmfd sp!, lr;  //保存管理模式下得lr save svc_mod:lr
stmfd sp!,{r0-lr}^;  //保存用户模式下得寄存器 usr_mode:r0-r14
       .
       .
       .
bl ker_syscall;  //系统调用
       .
       .
       .
//这里可能产生调度
ldmfd sp!,{r0-lr}^;  //调度回来,为用户态寄存器恢复线程得现场。
ldmfd sp!,{pc}^;     //修改pc指针,并且改CRSP得状态。
     

1). "!":

表示在操作结束后,将最后的地址写回Rn中;

2). "^":

可选后缀,它的作用就是在IRQ FIQ ABT UNDEF这些模式下,直接可以获取到user的r0-r14寄存器,而不用切模式。通常用作异常进入的压栈和异常退出时的恢复寄存器。(不能在USR模式和SYS模式下使用该符号,因为user和sys模式是公用r0-r14的,所以这两个模式下都不能用^。)

LDM寄存器列表如果包含R15(PC)时,那么除了正常的多寄存器传送外,还将SPSR也复制到CPSR中。这用于异常处理返回,仅在异常模式下使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1522908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

android studio设置flutter和dart的sdk配置

提示没有配置dart sdk的时候&#xff0c;其实只需要配置一下flutter的sdk就可以了&#xff0c;因为flutter的安装包里面包含了dart的sdk&#xff1a; 按照提示选中这个flutter的安装包路径就可以了&#xff1a; 并且需要开启windows的开发者开关&#xff1a;start ms-settings:…

【代码随想录】【回溯算法】补day25:组合总和,电话号码的总和

组合总和 def backtracking2(self, n: int, k: int, startindex: int, targetsum, sum):# 递归的终止条件if sum > targetsum:returnif len(self.path) k and sumtargetsum:self.result.append(self.path[:]) # 结果拷贝return self.result# for i in range(startindex,n1…

Java Web项目—餐饮管理系统Day06-套餐管理(一)

文章目录 1. 需求分析与实体类准备2. 依据菜品分类或者名字进行查询的请求(需求B)3. 新增套餐 1. 需求分析与实体类准备 如上图为新增套餐的界面, 它包含了套餐的一些基本信息, 例如名称、价格等, 同时还有套餐分类(因此这里需要一个查询所有套餐分类的请求处理方法, 需求A). 以…

layui table列表重载后保持进度条位置不变

使用layui的table表格组件时&#xff0c;当我们操作了某行的修改后&#xff0c;刷新了页面&#xff0c;进度条则跳回到最上面。 除了layui高版本应该内置有方法解决了此问题&#xff0c;但是低版本需要另外想办法解决。 具体解决方式如下&#xff1a; 1.在编辑操作成功前&am…

量子磁场测量“碰上”脑科学,未磁科技无创脑功能成像系统研发成功

从微观的神经元活动到宏观的认知行为&#xff0c;脑科学探索着人类最神秘、最复杂的领域之一。在这个过程中&#xff0c;科研人员、医生和创业者们扮演着至关重要的角色。他们不仅致力于揭示大脑的奥秘&#xff0c;更将科研成果转化为实际应用&#xff0c;推动脑科学领域的进步…

【SQL Server】实验七 数据完整性

1 实验目的 掌握实体完整性、参照完整性和用户自定义完整性约束的创建方法。掌握完整性约束的运行检查机制。掌握参照完整性的级联删除和修改方法。掌握正确设计关系模式完整性约束的方法。 2 实验内容 2.1 掌握实体完整性约束的创建和使用方法 创建表时定义由一个属性组成…

宜搭faas服务器获取accessToken

可以用faas服务器的OpenAPIUtil.getCustomAccessTokenThenCache&#xff08;Client ID,Client Secret&#xff09;就可以获取 至于获取这个Client ID&#xff0c;Client Secret 就需要在钉钉开放平台创建一个应用 然后在这个应用的基础信息里面有 注意的是&#xff1a;如果需要…

Rust 程序设计语言学习——所有权

这一节主要来学习 Rust 语言的其他特性&#xff0c;所有权、引用与借用、Slice 类型。 1 所有权 Rust 的核心功能&#xff08;之一&#xff09;是所有权&#xff08;ownership&#xff09;。虽然该功能很容易解释&#xff0c;但它对语言的其他部分有着深刻的影响。 所有程序…

Rancher操作手册(v2.7.5-rc1)

1.登录 访问地址&#xff1a;10.66.55.132使用账号和密码登录。初始的页面是英文版本&#xff0c;可以点击左下方改为简体中文 登录成功后可以看到现有的集群。右上角可以进行新集群的创建和导入已有集群。点击箭头所指的蓝色集群名称可以进入集群。 2.集群仪表盘 进入到集…

【leetcode】长度最小的子数组, test ok

题目 代码实现 #include <iostream> #include <vector> using namespace std;class Solution { public:int minSubArrayLen(int s, vector<int>& nums) {int n = nums.size();if (n == 0) {return 0;}int ans = INT_MAX;int start = 0, end = 0;int…

Github 2024-03-17 php开源项目日报 Top9

根据Github Trendings的统计,今日(2024-03-17统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目9Blade项目2Laravel:表达力和优雅的 Web 应用程序框架 创建周期:4631 天开发语言:PHP, BladeStar数量:75969 个Fork数量:24281 次关…

Redis远程连接本机——Docker

1. Docker拉取redis镜像并创建容器 1.1 拉取redis镜像 如果要指定redis版本&#xff0c;需要使用redis:&#xff08;版本&#xff09;&#xff0c;不写默认最新版本 docker pull redis1.2 创建容器并挂载配置文件 创建一个redis目录&#xff0c;并在其创建一个conf目录和一个d…

tomcat 实现会话绑定

Tomcat 后端服务器实现 Session ID会话保持 基础架构&#xff1a; 7-6 代理服务器nginx配置 7-3 tomcat 服务器 7-5 同理 测试&#xff1a; 此时刷新&#xff0c;会话ID一直在变&#xff0c;这样不好 如何解决呢&#xff1f; 不好的是确定ip之后&#xff0c;会一直在一台机上…

蓝桥杯单片机快速开发笔记——PWM

一、原理分析 使用定时器输出PWM&#xff08;脉宽调制&#xff09;信号是通过微控制器的定时器模块来生成一种周期性的脉冲信号&#xff0c;通过控制脉冲的高电平时间&#xff08;占空比&#xff09;来控制输出信号的平均功率。以下是生成PWM信号的基本原理概述&#xff1a; 定…

Java获取视频封面图,利用FFmpegFrameGrabber获取视频封面图

依赖 <dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.9</version></dependency>传入视频流获取图片byte /*** 获取视频截图** param frameNumber 视频的指定帧数* param …

01初识Python

一、Python 简介 二、为什么要学Python? 三、Python 安装 四、输出第一条指令 五、总结 一、Python 简介 Python是一种高级编程语言,由Guido van Rossum于1991年创建。它具有简单易学的语法结构,被广泛应用于Web开发、数据科学、人工智能等领域。 Python具有丰富的库…

SQLiteC/C++接口详细介绍之sqlite3类(十三)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十二&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十四&#xff09;&#xff08;未发表&#xff09; 40.sqlite3…

VMware Fusion 13.5.1 OEM BIOS Version - 在 macOS 中运行 Windows 虚拟机的最佳方式

VMware Fusion 13.5.1 OEM BIOS Version VMware Fusion 13 原版 App 中集成 OEM BIOS 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-fusion-13-oem/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 使用 VMware …

51单片机-AT24C02(I2C总线)

目录 一&#xff0c;介绍及元件工作原理 7.时序结构&#xff08;重要&#xff09; 8.i2C总线数据帧&#xff08;重要&#xff09; 二&#xff0c;应用 一&#xff0c;介绍及元件工作原理 1.元件介绍 2.存储器 3.地址总线和数据总线 地址总线只能一次选中一行 4.引脚及应用…

【ESP32 IDF】I2C的使用

文章目录 前言一、I2C驱动使用的步骤二、I2C的使用2.1 配置驱动程序2.2 安装驱动程序2.3 主机写入数据写入数据的过程接收数据的过程 总结 前言 ESP32是一款强大的微控制器&#xff0c;广泛应用于物联网&#xff08;IoT&#xff09;和嵌入式系统开发。它具备丰富的硬件接口&am…