栈的分类以及应用场景

news2025/2/1 9:55:25

栈的本质就是一段内存,程序运行时用于保存一些临时数据。栈大体可以分为四种类型空增、空减、满增、满减。ARM处理器一般使用满减栈


         目录

1、栈的分类

2、压栈/出栈的两种实现方式

(1) 方式一:使用后缀DB / IA

(2) 方式二:使用后缀FD

3、应用场景


1、栈的分类

从压栈的方向来看,可以分为增栈减栈。所谓增栈指的是入栈时,数据是由低地址往高地址的方向存储的。减栈正好相反。

从指针移动和压栈的顺序来看,可以分为满栈和空栈。所谓满栈,指的是先移动栈顶指针,再存数据,栈顶指针最终指向的内容一定不为空空栈恰恰相反,先存储数据,然后再把栈顶指针移动到下一个位置,此时栈顶指针最终指向的内容一定为空

增/减栈 与 空/满栈两两组合,就得到了栈的四种基本类型:空增(EA)、空减(ED)、满增(FA)、满减(FD)。ARM处理器一般使用满减栈

2、压栈/出栈的两种实现方式

(1) 方式一:使用后缀DB / IA

压栈其实就是将某个寄存器的数据保存到内存中,出栈其实就是从内存中取出数据保存到寄存器。因为ARM处理器是满减栈,入栈的时候,要先让地址自减然后再存数据,这就对应后缀 DB(Decrease Before)

出栈的时候,因为是满减栈,栈顶指针指向的内容一定不为空,此时应该是先取出数据,然后再让地址自增,这就对应后缀 IA(Increase After)

MOV SP!, #0x40000020        @ 初始化栈顶指针
MOV R1, #1
MOV R2, #2
MOV R3, #3
STMDB SP!, {R1-R3}			@ 入栈
LDMIA SP!, {R4-R6}			@ 出栈

 入栈测试:

 出栈测试:

 

(2) 方式二:使用后缀FD

上面的方法虽然可以达到效果,但是入栈和出栈使用不同的后缀,难免会不大方便,所以栈的四种类型空增(EA)、空减(ED)、满增(FA)、满减(FD)都可以直接作为后缀使用,达到的效果和方式一相同。

MOV SP!, #0x40000020        @ 初始化栈顶指针
MOV R1, #1
MOV R2, #2
MOV R3, #3
STMFD SP!, {R1-R3}			@ 入栈
LDMFD SP!, {R4-R6}			@ 出栈

本质还是会被转换成方式一的指令 

3、应用场景

发生函数调用跳转时,我们需要把寄存器中的数据暂时保存到内存,等函数调用结束,再把数据从内存中取出来。

	MOV SP, #0x40000020			@ 初始化栈顶指针
MAIN:
	MOV R1, #1
	MOV R2, #2
	BL FUNC                    @ 函数跳转
	ADD R3, R1, R2
	B STOP
	
FUNC:
	STMFD SP!, {R1-R2}			@ 保存原本的R1-R2寄存器的值
	MOV R1, #4
	MOV R2, #3
	SUB R4, R1, R2
	LDMFD SP!, {R1-R2}			@ 恢复R1-R2寄存器的值
	MOV PC, LR                  @ 跳转以后不会自动回去,需要自己手动设置PC
STOP:				
	B STOP

发生跳转以后R1-R2的值

回到回到跳转位置的下一个位置时,R1-R2的值

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

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

相关文章

nexus 远程代码执行 (CVE-2020-10199)

目录 一、漏洞信息 二、影响版本 三、环境搭建 四、漏洞复现 五、修复建议 这里用的是docker desktopvulfocus搭建的环境。 一、漏洞信息 名称: nexus 远程代码执行 (CVE-2020-10199/10204) 描述: Nexus Repository Manager(NXRM&a…

K8s 滚动升级与回退

目录前言一、升级二、回滚前言 Rolling Update 即滚动更新,先更新一部分副本,成功后再继续更新更多副本,最终完成所有的副本更新。前面说到动态伸缩容并不会触发上线,仅当 Deployment Pod 模板(即 .spec.template&…

代码随想录拓展day1 1365.有多少小于当前数字的数字;941.有效的山脉数组;

代码随想录拓展day1 1365.有多少小于当前数字的数字;941.有效的山脉数组;1207.独一无二的出现次数;283. 移动零 打卡结束了,趁着世界杯当了几天懒狗,现在正好世界杯也结束了,希望能保持一个好习惯吧。 13…

m基于DCAR编码感知的网络路由发现算法matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 1.路由请求过程 当一个源节点有数据要向目的节点发送且在当前路由缓存中未发现可用路径时,则启动路由请求过程,下面分步对该过程进行说明: 步骤1&#xff1a…

AI行动,解放做表打工人

1. atomecho 插件介绍 如果你是个—— 需要做财报、数据新闻的冤种; 或者是“网上有的我都想要”的囤积狂魔; 或是沉迷“CtrlC、CtrlV”的做表工具人。 那你一定不陌生—— 对不上的格式、找不到的数据、删不完的无效内容、按烂了的“CtrlC”和“CtrlV…

在Qt creator中查看Qt源码

Qt 是开源语言,阅读其实现的源代码可以帮助我们更好的了解Qt,解决开发中遇到的问题,能帮助我们更快的成长,本文介绍了Qt官方原代码的两种查看方法。 在Qt creator中查看Qt源码在线查看本地查看配置版本一、下载源码1、运行Mainten…

阿里云崩“出圈”了!保护业务还得加一道同云跨可用区容灾!

2022年12月18日,上午10点47分,阿里云的香港部分服务出现故障,导致多个香港及澳门站点受到影响。 随后阿里云方面发布公告表示,阿里云官网 12 月 18 日下午更新处理进展称,经排查,阿里云香港地域故障确认为…

嵌入式Linux驱动开发之点灯

使用驱动开发的方式点亮一个LED灯。看看两者有啥区别不? 一、先看原理图 首先查看原理图,看看我们的板子上的LED等接在哪一个IO口上面。 好了,看原理图我们知道LED灯接在芯片的GPIO1的第三个引脚上面,也就是GPIO1_IO03。 二、I…

优化稠密点之尝试通过 Balance 来分摊访问压力

回忆之前的官方架构图,数据在 storaged 中是分片的,且 raft 协议中只有 leader 才会处理请求,所以,重新进行数据平衡操作,是有可能将多个稠密点分摊到不同的服务上以减轻单一服务的压力。同时,我们对整个集…

记录C,C++关键字的位置,直接跳过注释和字符串文本。(修正)

依据第二版本&#xff0c;可以写一个跳过注释的查找函数 C_IndexOfWord Java_IndexOfWord CSharp_IndexOfWord 还有一种方法&#xff0c;可以先把所有注释用空格代替&#xff0c;查出的字符位置也不变。 以前版本&#xff1a; DList<TextColor> Syntax::GetTextColorP…

(三分钟)学会kd-tree 激光SLAM点云搜索常见

Kd-Tree&#xff1a; 今天来介绍一下有关Kdtree的相关概念&#xff0c;它是一维线段树的多维推广。Kd-tree常用在激光点云编程中使用&#xff0c;Kd-tree简称k维树&#xff0c;是一种空间划分的数据结构&#xff0c;常被用于高维空间中的搜索&#xff0c;比如范围搜索和最近邻…

动态规划问题——最长公共子序列问题

题目: 给定两个字符串 str1 和 str2 &#xff0c;返回两个字符串的最长公共子序列。 举例&#xff1a; str1 "1A2C3D4B56" str2 "B1D23CA45B6A" 最长公共子序列为&#xff1a;"123456" 或 "12C4B6" 返回哪个都行 思路&#xf…

「内核知识」Linux下的系统调用write

本文以x86_64平台为例&#xff0c;分析linux下的系统调用是如何被执行的。 假设目标系统调用是&#xff0c;其对应的内核源码为&#xff1a; // fs/read_write.c SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,size_t, count) {return ksys_write(fd, …

通过国产化低代码平台搭建设备管理系统,助力中国航天企业信息化建设

编者按&#xff1a;掌握软件自主权&#xff0c;支持信创国产化。本文分析了国产化低代码平台的意义&#xff0c;并介绍了低低代码平台是如何为航天企业提高信息化建设水平的。 关键词&#xff1a;国产化&#xff0c;第三方对接能力&#xff0c;文件管理 以容器、微服务、DevOp…

Linux内核中的open方法

在linux下&#xff0c;假设我们想打开文件/dev/tty&#xff0c;我们可以使用系统调用open&#xff0c;比如&#xff1a; int fd open("/dev/tty", O_RDWR, 0); 本文将从源码角度看下&#xff0c;在linux内核中&#xff0c;open方法是如何打开文件的。 首先看下入…

【opencv】centos下opencv的编译(带opencv_contrib扩展包)

目录1.安装cmake2.opencv安装文件准备可选安装3.进行编译4.进行安装5.使用测试编译步骤&#xff1a;1.安装cmake 安装wget: 应该已安装gcc工具套组&#xff1a; yum install sudo yum install -y gcc gcc-c make automake yum install -y wget wget https://cmake.org/files…

【树莓派不吃灰】兄弟连篇④ Shell编程

目录1、Shell基础1.1 脚本执行方式1.1.1 echo1.1.2 脚本执行1.2 Bash基本功能1.2.1 history1.2.2 命令补全1.2.3 命令别名1.2.4 常用快捷键1.2.5 输出输入重定向1.2.6 多命令顺序执行与管道符1.2.7 通配符和特殊符号1.3 Bash变量1.3.1 用户自定义变量1.3.2 环境变量1.3.3 位置变…

Hudi入门到实战

简介 Apache Hudi&#xff08;Hadoop Upserts Delete and Incremental&#xff09;是下一代流数据湖平台。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的upserts/delete、高级索引、流摄取服务、数据集群/压缩优化和并发&#xff0c;同时保持…

用于医学诊断的菁染料ICG-Sulfo-OSu,活性基团修饰ICG

英文名&#xff1a;ICG-Sulfo-EG4-OSu 激发波长: 780nm; 发射波长: 800nm 分子量: 1777.36 溶剂:DMSO 凯新生物描述&#xff1a; (ICG)是一种用于医学诊断的菁染料。它用于测定心输出量、肝功能和肝脏血流量&#xff0c;以及用于眼科血管造影。它的峰值光谱吸收接近800纳米…

【课程整理】随机系统期末整理

文章目录1 概率论部分 (1-4)概率空间随机变量概率分布随机变量的函数仍然是随机变量条件期望2 随机过程 (5-7)随机过程Martingale停时马尔科夫链3 参数估计 (8-10)参数估计问题充分统计量贝叶斯估计非随机估计部分思维导图如下&#xff0c;私信发送html完整版 1 概率论部分 (1-…