ARM之栈与方法

ARM之栈与方法

计算机中的栈是一种线性表,它被限定只能在一端进行插入和删除操作(先进后出)。通常将可以插入和删除操作的一端称为栈顶,相对的一端为栈底。

通常栈有递增堆栈(向高地址方向生长)、递减堆栈(向低地址方向生长)、满堆栈(堆栈指针指向最后压入堆栈的有效数据项)和空堆栈(堆栈指针指向下一个要放入的空位置)。

ARM堆栈与计算机中的栈类似,都具有先进后出和递减满堆栈特点。在调用函数时用于保存一些临时数据。

ARM堆栈从高地址向低地址入栈、从低地址向高地址出栈,SP指向栈顶的元素,其他的元素通过SP+offset获取。

栈帧

栈帧包括:

参数区:存放调用函数传递的参数;

连接区:存放调用者的下一条指令;

栈帧指针存放区:存放调用函数的栈帧的底部;

寄存器存储区:被调用函数返回需要恢复的寄存器内容;

局部存储区:存放被调用函数的局部变量;

寄存器

关于寄存器(从计算机内存结构到iOS)。

函数调用会开辟栈帧,在AArch64中,函数参数通过x0~x7传递(小数通过d0和d1传递)。

关于函数堆栈有:

PC(Program Counter)寄存器:用于记录执行代码的地址;

FP(Frame Pointer)寄存器:指向栈帧的底部(x29);

LR(Link Register)寄存器:指向返回地址(x30);

SP(Stack Pointer)寄存器:指向栈帧指针(x31);

函数调用流程

一. 函数调用前

  1. 开辟栈帧空间;
  2. 保存FP和LR寄存器(可以找到上一个栈帧和返回地址);
  3. 设置新的FP寄存器;
  4. 保存子函数会用到的寄存器;
  5. 保存局部变量或参数;
    二. 函数调用结束
  6. 还原FP和LR寄存器;
  7. 释放栈帧空间;
  8. 跳到LR子程序返回;
相关推荐
晚夜微雨问海棠呀3 分钟前
长沙景区数据分析项目实现
开发语言·python·信息可视化
graceyun4 分钟前
C语言初阶习题【9】数9的个数
c语言·开发语言
波音彬要多做38 分钟前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
Swift社区1 小时前
Excel 列名称转换问题 Swift 解答
开发语言·excel·swift
一道微光1 小时前
Mac的M2芯片运行lightgbm报错,其他python包可用,x86_x64架构运行
开发语言·python·macos
矛取矛求1 小时前
QT的前景与互联网岗位发展
开发语言·qt
Leventure_轩先生1 小时前
[WASAPI]从Qt MultipleMedia来看WASAPI
开发语言·qt
向宇it1 小时前
【从零开始入门unity游戏开发之——unity篇01】unity6基础入门开篇——游戏引擎是什么、主流的游戏引擎、为什么选择Unity
开发语言·unity·c#·游戏引擎
是娜个二叉树!1 小时前
图像处理基础 | 格式转换.rgb转.jpg 灰度图 python
开发语言·python
Schwertlilien1 小时前
图像处理-Ch5-图像复原与重建
c语言·开发语言·机器学习