ARM中栈的种类与运用

news2024/11/24 3:02:19

1. 栈的概念

栈,本身是一段内存,程序运行时用于保存一些临时数据,如局部变量、参数、返回地址等等。

        学习了数据结构,对栈的概念相信大家都不陌生,后进先出的数据结构,即最后进栈的元素最先出栈。但是在C语言中,栈是由编译器自动管理的。这一点与堆相反,堆是由程序员手动分配和释放的,例如malloc和free。而栈是由编译器自动管理的。

        当程序调用一个函数时,编译器会为该函数的局部变量参数返回地址等信息在栈上分配一段空间,并将这些信息压入栈中。当函数执行完毕后,这些信息会被弹出栈,并回到调用该函数的位置继续执行代码。

在C语言中我们不需要了解栈的工作方式,但是学习了ARM底层架构,就要了解栈在程序中的工作过程。

2. 栈的分类

在学习数据结构,没有听说过栈还有什么分类,通常是将栈和队列一起讲的,而在底层技术中,栈其实有很多种分类,这些分类决定了栈的特点和使用方式,而C语言中不需要关心,所以我们没有了解。那么栈有哪几种分类呢?他们之间的区别是什么?

首先我们要了解,CPU要使用栈,那么就要知道栈的地址在哪?栈是由栈指针来管理的,栈指针指向栈的顶部。栈指针的地址通常由编译器或操作系统来分配,对于ARM来讲,在汇编语言中,可以使用寄存器SP来表示栈指针,所以当使用栈时,找到SP就能知道栈指针指向的地址了。

2.1 增栈与减栈

增栈:压栈操作将数据放入栈顶,栈顶指针向下移动;减栈:压栈操作将栈顶数据弹出,栈顶指针向上移动。

  • 对于增栈,存数据时,SP指向的地址越来越大;取数据时,SP指向的地址越来越小
  • 对于减栈,存数据时,SP指向的地址越来越小;取数据时,SP指向的地址越来越大

可以理解为SP最开始指向中间某个地址,增栈意味着向地址大的压入,而减栈意味着向地址小的压入。

2.2 满栈与空栈

满栈:栈指针指向最后一次压入到栈中的数据,压栈时需要先移动栈指针到相邻的位置再压栈

空栈:栈指针指向最后一次压入到栈中的数据的相邻位置,压栈时可直接压栈,之后才需要把栈指针移动到相邻位置

简单来说,

  • 对于满栈,刚开始的时候栈指针指向的地址有元素,指向的是最后一个压入栈中的数据,所以先移动栈指针,才能继续压栈。
  • 对于空栈,刚开始的时候栈指针指向的地址无元素,指向的是最后一个压入栈的数据的后一个地址,所以可以先进行压栈,后再移动栈指针。

2.3 四种栈的分类

根据2.1和2.2,我们可以知道栈的两种地址类型和两种数据方式,将这两种大类进行合并,我们可以知道,栈有四种类型:空增(EA)、空减(ED)、满增(FA)、满减(FD)对于ARM处理器一般使用满减栈

2.4 多寄存器内存访问指令的寻址方式

在寄存器中,用于将多个寄存器的数据存储到连续的一块内存中

STMIA和STMIB

这两种都是从低地址向高地址存放数据

  • STMIA:指针指向哪,就从那开始以由低到高地址存数据
  • STMIB:指针先指向的下一个地方开始,再由低到高地址存数据

STMDA和STMDB

这两种都是从高地址向低地址存放数据

  • STMDA:指针指向哪,就从那开始以由高到低地址存数据
  • STMDB:指针先指向的下一个地方开始,再由高到低地址存数据

思考:如上我们知道,ARM存储器一般使用满减栈,那么我们如何选择上述寻址方式?

回忆一下满减(FD),对于满减是先移动指针,再进行存入数据,且存入数据时,地址越来越小,可以很容易得到,满减对应的是STMDB

2.5 如何读取栈里的数据?

对于满减,后进先出,那么我们从地址低的读到地址高的,且从指针的指向开始,那么满减对应的应该是LADIA

示例代码:

	MOV R1, #1
	MOV R2, #2
	MOV R3, #3
	MOV R4, #4
	MOV R11, #0x40000020
	STMDB R11!, {R1-R4}
	LDMIA R11!, {R6-R9}
	@ STMFD R11!, {R1-R4}
	@ LDMFD R11!, {R6-R9}

因为已知是满减,所以可以直接使用FD作为结尾也是没有问题的。但是要记住,虽然可以直接使用满减后缀,但是编译器也是会自动转换成第一种方法的。

得到:

3. 栈的应用举例

3.1 叶子函数的调用

	@ 初始化栈指针
    MOV SP, #0x40000020
	
MAIN:
		MOV R1, #3
		MOV R2, #5
		BL	FUNC
		ADD R3, R1, R2
		B stop
		
FUNC:
		@ 压栈保护现场
		STMFD SP!, {R1, R2}		@ 满减栈
		MOV R1, #10
		MOV R2, #20
		SUB R3, R2, R1
		@ 出栈恢复现场
		LDMFD SP!, {R1, R2}
		MOV PC, LR

结果:

        这段代码作用是:先初始化栈指针,0x40000020初始化地址,在FUNC函数中,首先使用STMFD指令将R1和R2的值压入栈中,以保护现场。以免等下重新赋值时覆盖了原有的值。然后计算R2-R1的值,并将结果存储在R3中。最后使用LDMFD指令将R1和R2的值从栈中弹出,以恢复现场

3.2 非叶子函数的调用

	@ 初始化栈指针
    MOV SP, #0x40000020
	
MAIN:
		MOV R1, #3
		MOV R2, #5
		BL	FUNC1
		ADD R3, R1, R2
		B stop
		
@ FUNC1:
		STMFD SP!, {R1, R2, LR}		@ 满减栈
		MOV R1, #10
		MOV R2, #20
		BL FUNC2
		SUB R3, R2, R1
		LDMFD SP!, {R1, R2, LR}
		MOV PC, LR
FUNC2:
		STMFD SP!, {R1, R2}	
		MOV R1, #7
		MOV R2, #8
		MUL R3, R1, R2
		LDMFD SP!, {R1, R2}
		MOV PC, LR

        非叶子函数,可能会再次覆盖之前入栈的数据,那么就要在入栈的程序后,在下一个程序中紧跟着入栈。

        这段ARM汇编代码演示了如何在函数调用期间使用栈来保护现场和恢复现场,并且演示了如何嵌套调用多个函数。该代码使用STMFD和LDMFD指令将当前函数的寄存器值保存到栈中,并在函数返回时将这些值从栈中弹出,以恢复现场,具体的动态结果可以自行演示!

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

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

相关文章

用html+javascript打造公文一键排版系统5:二级标题排版

公文中二级标题的一般以(X)标注(其中X为由"一二三四五六七八九十"中的字符组成的字符串),用楷体字加粗。 首先我们要判断一段文字是否包含二级标题,最简单的方法 就是判断文字中的头一个字符是否…

springBoot整合二维码

一、引入坐标 <!-- 二维码 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.2.1</version></dependency><dependency><groupId>com.google.zxing</group…

Unhandled error during execution of component event handler at

Unhandled error during execution of component event handler at 执行组件事件处理程序期间出现未处理的错误 在 意思就是有些地方的值用早了,在没有数据之前就使用了 我这次报错是子组件的表单校验 调用事件就报错了 解决方法 setTimeout(() > { //调用方法 }, 0); 就是…

chapter10:SpringBoot与缓存

尚硅谷SpringBoot整合教程 1. JSR107 缓存开发规范&#xff0c;Java Caching 定义了5个核心接口&#xff0c; 分别是CachingProvider&#xff0c;CacheManager&#xff0c;Cache&#xff0c;Entry和Expiry。 CachingProvider&#xff1a;定义了创建&#xff0c;配置&#xff…

【bug】flameshot在ubuntu上的4K屏幕,双屏幕上用不了截图

问题 直接在4K屏幕上运行flameshot截图&#xff0c;直接黑屏 主屏 &#xff1a;4K 副屏&#xff1a;2k 解决 2.1长按1-2秒开机键&#xff0c;先回到桌面。 2.2 设置主屏缩放为125% 2.3 设置键盘快捷键命令为env QT_AUTO_SCREEN_SCALE_FACTOR1 flameshot gui 替代flameshot的…

第51步 深度学习图像识别:Convolutional Vision Transformer建模(Pytorch)

基于WIN10的64位系统演示 一、写在前面 &#xff08;1&#xff09;Convolutional Vision Transformers Convolutional Vision Transformer&#xff08;ConViT&#xff09;是一种结合了卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff09…

飞机【频闪灯、导航灯】效果的设置——灯和灯的光晕

一、飞机外部灯光系统——频闪灯和防撞灯——闪烁效果 二、实现的原理 如下图所示&#xff0c;灯效果的组成包含两部分&#xff0c;一是灯本身&#xff0c;二是灯光产生的光晕 灯—— 就是一个球&#xff08;Sphere&#xff09;,给它一个Emission(自发光)材质光晕——光晕的…

云苍穹各类参数使用说明

目录 公共参数 云参数 应用参数 单据参数 单据类型参数 用户选项参数 列表选项参数 公共参数 不推荐使用 参数值获取&#xff1a; // 获取整体公共参数 Map<String,Object> publicParamWhole SystemParamServiceHelper.loadPublicParametersFromCache();// 获取某…

vscode安装文件下载缓慢

官网下载vscode安装文件太慢大部分是因为vscode官网服务器跟我们国内的链接速度有关&#xff0c;当我们去官网下载&#xff08;Download Visual Studio Code - Mac, Linux, Windows&#xff09;一般都会出现下面的情况 下载速度几乎为0。 解决办法&#xff0c;鼠标右键复制下载…

C语言a---b

C语言的编译遵循贪心读法&#xff0c;也就是说&#xff0c;对于有歧义的符号&#xff0c;编译器会一直读取&#xff0c;直到它的意思完结&#xff1b; a---b&#xff0c;是a-- -b还是a- --b&#xff0c;根据贪心法则&#xff0c;读到第二个减号&#xff0c;意思完结&#xff0c…

今日分享——语音同声翻译软件

安娜和卡洛是一对在旅行时偶遇的年轻男女&#xff0c;他们互有好感&#xff0c;但他们来自不同的国家&#xff0c;说着不同的语言。每次面对彼此的时候&#xff0c;他们总是陷入语言的困扰&#xff0c;无法用自己熟悉的语言表达内心的情感。因此他俩都十分需要一款翻译语音的软…

【从零开始进行高精度手眼标定 eye in hand(小白向)3 非线性高精度标定法编程实现】

从零开始进行高精度手眼标定 eye in hand&#xff08;小白向&#xff09;1 原理推导 前言原理推导算法框图 MATLAB编程计算相关优化工具箱的安装&#xff08;不安装会报错&#xff09;数据读取目标函数计算完整代码实验验证 传送门&#xff1a; 1.【从零开始进行高精度手眼标定…

2023.7.13-【if】与【for】的配合使用:键入一个整数,输出结果用1234567890循环填充,填充的位数等于键入的整数

功能描述&#xff1a; 例如我们输入一个整数&#xff1a;25。输出的结果为1234567890123456789012345&#xff0c;共计25个数填充了这个输出结果。 程序&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() {int a;int b; int c;int i;prin…

fiddler抓包工具使用大全

目录 Fiddler基础知识 HTTP协议 Fiddler的使用 HTTPS抓包 Fiddler过滤会话 对request设置断点 对response设置断点 Fiddler的编码和解码 Fiddler基础知识 Fiddler是强大的抓包工具&#xff0c;它的原理是以web代理服务器的形式进行工作的&#xff0c;使用的代理地址是&…

Camtasia Studio 2023怎么导出mp4格式的视频的详细教程介绍

很多用户刚接触Camtasia Studio 2023&#xff0c;不熟悉如何保存mp4格式的视频。在今天的文章中小编为大家带来了Camtasia Studio 2023保存为mp4格式的视频的详细教程介绍。 Camtasia Studio 2023保存为mp4格式的视频的详细教程 1、 打开Camtasia Studio。 Camtasia Studio- …

Linux 删除 颜色转义字符 乱码 \x1b

目录 Linux颜色控制 方式一&#xff1a;添加sed正则命令 方式二&#xff1a;将输出写入文件再读取 Git颜色控制 使用Python paramiko ssh 获取 git 输出时&#xff0c;出现乱码&#xff0c;实际上是终端输出的ANSI颜色转义字符&#xff0c;用于控制终端颜色展示&#xff1a;…

CSS---CSS面试题

目录 1.盒模型 2.offsetHeight /clientheight/scrollHeight 3.left与offsetLeft 4.对BFC规范的理解 5.解决元素浮动导致的父元素高度塌陷的问题 6.CSS样式的先级 7.隐藏页面元素 8.display: none 与 visibility: hidden 的区别 9.页面引入样式时&#xff0c;使用link与import有…

水库大坝安全监测系统是由什么组成的?

水库大坝是防洪抗灾的重要设施&#xff0c;它们的安全性直接关系到人民群众的生命财产安全。因此&#xff0c;水库大坝的安全监测必不可少。水库大坝安全监测系统是一种集成了数据采集、传输、处理和分析的技术平台&#xff0c;能够实时、准确地监测大坝的状态&#xff0c;及时…

Python实现将pdf,docx,xls,doc,wps链接下载并将文件保存到本地

前言 本文是该专栏的第31篇,后面会持续分享python的各种干货知识,值得关注。 在工作上,尤其是在处理爬虫项目中,会遇到这样的需求。访问某个网页或者在采集某个页面的时候,正文部分含有docx,或pdf,或xls,或doc,或wps等链接。需要你使用python自动将页面上含有的这些信…

青岛大学_王卓老师【数据结构与算法】Week05_09_顺序栈的操作3_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c; 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础…