ARM汇编【5】:STACK AND FUNCTIONS

news2024/11/25 16:21:23

       在这一部分中,我们将研究称为堆栈的进程的一个特殊内存区域。本章介绍了Stack的用途和相关操作。此外,我们还将介绍ARM中函数的实现、类型和差异。

STACK      

    一般来说,堆栈是程序/进程中的一个内存区域。这部分内存是在创建进程时分配的。我们使用Stack存储临时数据,如某些函数的局部变量、帮助我们在函数之间转换的环境变量等。我们使用PUSH和POP指令与堆栈交互。正如第4部分:内存指令中所解释的:加载和存储PUSH和POP是其他一些与内存相关的指令的别名,而不是真正的指令,但出于简单的原因,我们使用PUSH和POP。

    在我们研究一个实际的例子之前,我们必须知道Stack可以用各种方式实现。首先,当我们说Stack增长时,我们的意思是一个项目(32位数据)被放在Stack上。堆栈可以向上(当堆栈以降序实现时)或向下(当堆栈按升序实现时)增长。下一条(32位)信息将被放入的实际位置由堆栈指针定义,或者准确地说,由存储在SP寄存器中的存储器地址定义。在这里,地址可以再次指向堆栈中的当前(最后)项或该项的下一个可用内存插槽。如果SP当前指向堆栈中的最后一个项目(全堆栈实现),则SP将减少(如果是降序堆栈)或增加(如果是升序堆栈),然后该项目才会放在堆栈中。如果SP当前指向堆栈中的下一个空插槽,则会先放置数据,然后SP才会减少(降序堆栈)或增加(升序堆栈)。

 作为不同Stack实现的总结,我们可以使用下表,该表描述了在不同情况下使用的存储多条/加载多条指令。

 在我们的示例中,我们将使用全降序堆栈。让我们快速了解一个简单的练习,它处理这样一个堆栈,它就是堆栈指针。

/* azeria@labs:~$ as stack.s -o stack.o && gcc stack.o -o stack && gdb stack */
.global main

main:
     mov   r0, #2  /* set up r0 */
     push  {r0}    /* save r0 onto the stack */
     mov   r0, #3  /* overwrite r0 */
     pop   {r0}    /* restore r0 to it's initial state */
     bx    lr      /* finish the program */

  一开始,堆栈指针指向地址0xbefff6f8(在您的情况下可能不同),它表示堆栈中的最后一项。此时,我们看到它存储了一些值(同样,在您的情况下,值可能不同):

gef> x/1x $sp
0xbefff6f8: 0xb6fc7000

     在执行第一条(MOV)指令后,堆栈方面没有任何变化。当我们执行PUSH指令时,会发生以下情况:首先,SP的值减少4(4字节=32位)。然后,R0的内容被存储到SP指定的新地址。当我们现在检查SP引用的更新的内存位置时,我们看到整数2的32位值存储在该位置:

gef> x/x $sp
0xbefff6f4: 0x00000002

   我们示例中的指令(MOV r0,#3)用于模拟r0的损坏。然后,我们使用POP来恢复以前保存的R0值。因此,当POP被执行时,会发生以下情况:首先,从SP中地址当前指向的存储位置(0xbefff6f4)读取32位数据。然后,SP寄存器的值增加4(再次变为0xbefff6 f8)。作为结果,寄存器R0包含整数值2。

gef> info registers r0
r0       0x2          2

    (请注意,下面的gif显示的堆栈顶部有较低的地址,底部有较高的地址,而不是像第一幅不同堆栈变体的插图中那样相反。这样做的原因是让它看起来像你在GDB中看到的堆栈视图)

 

 

     我们将看到函数利用Stack来保存局部变量、保留寄存器状态等。为了保持一切有序,函数使用Stack Frames,这是堆栈中专用于特定函数的本地化内存部分。在函数的序言中创建了一个堆栈框架(下一节将对此进行详细介绍)。帧指针(FP)被设置到堆栈帧的底部,然后为堆栈帧分配堆栈缓冲区。堆栈帧(从底部开始)通常包含返回地址(前一个LR)、前一个帧指针、需要保留的任何寄存器、函数参数(如果函数接受4个以上)、局部变量等。虽然堆栈帧的实际内容可能有所不同,但前面概述的内容是最常见的。最后,堆栈帧在函数的尾声中被销毁。

以下是堆栈中堆栈帧的抽象说明:

作为Stack Frame可视化的一个快速示例,让我们使用以下代码:

/* azeria@labs:~$ gcc func.c -o func && gdb func */
int main()
{
 int res = 0;
 int a = 1;
 int b = 2;
 res = max(a, b);
 return res;
}

int max(int a,int b)
{
 do_nothing();
 if(a<b)
 {
 return b;
 }
 else
 {
 return a;
 }
}
int do_nothing()
{
 return 0;
}

 在下面的屏幕截图中,我们可以通过GDB调试器的视角看到堆栈帧的简单说明

   我们可以在上图中看到,目前我们即将离开函数max(见底部反汇编中的箭头)。在这种状态下,FP(R11)指向0xbefff254,它是堆栈帧的底部。堆栈上的此地址(绿色地址)存储0x00010418,它是返回地址(以前的LR)。在此之上4个字节(在0xbefff250处),我们有一个值0xbefff26c,它是前一个帧指针的地址。地址0xbefff24c和0xbefff248处的0x1和0x2是在执行函数max期间使用的局部变量。因此,我们刚刚分析的堆栈帧只有LR、FP和两个局部变量。

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

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

相关文章

《信息安全技术 数据安全风险评估方法》(征求意见稿)解读

8月21日&#xff0c;全国信息安全标准化技术委员会秘书处发布关于征求国家标准《信息安全技术 数据安全风险评估方法》&#xff08;征求意见稿&#xff09;意见的通知&#xff0c;面向社会广泛征求意见。 一、数据安全相关政策法规 此前&#xff0c;国家也发布了多部数据安全相…

dockerfile镜像及Harbor私有仓库搭建的应用

目录 搭建私有仓库harbordockerfile构建镜像1&#xff0c;先创建一个目录2&#xff0c;编写dockerfile3&#xff0c;构建4&#xff0c; 验证镜像5&#xff0c;标记镜像6&#xff0c;上传镜像 搭建私有仓库harbor 首先安装容器编排工具&#xff1a;docker compose 我使用的是离…

企业如何做好实施数字工厂管理系统前的需求分析

随着工业4.0的到来&#xff0c;数字工厂系统解决方案已经成为企业提高生产效率、优化资源配置和提升产品质量的重要工具。在考虑实施数字工厂管理系统之前&#xff0c;企业需要进行详细的需求分析&#xff0c;以确保系统的实施能够真正满足企业的业务需求。本文将探讨企业如何做…

基于Spark框架的新闻推荐系统的设计与实现

1.摘要 离线ALS算法,以及基于内容的推荐算法进行结合.实时计算部分,使用Spark平台上的Spark Streaming流处理技术,处理日志收集框架Flume收集的日志信息. 2.需要的技术 jieba分词工具 LDA分词处理技术 LDA(Latent Dirichlet Allocatio

Java“牵手”天猫店铺所有商品API接口数据,通过店铺ID获取整店商品详情数据,天猫API申请指南

天猫商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。天猫商品详情可以帮助消费者更好的了解宝贝信息&#xff0c;从而做出购买决策。同时&#xff0c;消费者也可以通过商品详情了解其他买家对宝贝的评价&#xf…

一些总结C++(2)

1.windwos 不推荐使用redis 强行使用的话&#xff0c;可以用这个 hiredis-for-windowshttps://gitee.com/yokel007/hiredis-for-windows 使用方法&#xff1a;编译静态库。然后将所有文件作文C 包含目录&#xff0c;静态库作为库目录&#xff0c;然后添加链接。 不要使用wi…

海思Hi3861L开发三-新建自定义项目

一、简介 上一篇文章,介绍了如何下载安装SDK,并且编译和下载。但都是基于SDK原生提供的demo。那本节我们就来介绍一下,如果创建一个自己的项目。 二、新建目录结构 先看SDK提供的目录结构,如下图: 因为是基于应用的开发,所以我们只关注app这个文件夹。可以看到…

CentOS7.9安装docker服务,配置镜像加速器

目录 一、安装docker服务 二、配置镜像加速器 三、下载系统镜像&#xff08;Ubuntu、 centos &#xff09; 四、基于下载的镜像创建两个容器&#xff08;容器名一个为自己名字全拼&#xff0c;一个为首名字字母 &#xff09; 五、容器的启动、 停止及重启操作 六、查看正在…

2023国赛数学建模思路 - 案例:随机森林

文章目录 1 什么是随机森林&#xff1f;2 随机深林构造流程3 随机森林的优缺点3.1 优点3.2 缺点 4 随机深林算法实现 建模资料 ## 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 什么是随机森林&#xff…

启动audit服务报错

启动centos audit服务报错 错误信息 $service auditd restart Stopping logging: [FAILED] Redirecting start to /bin/systemctl start auditd.service Job for auditd.service failed because the control process exited with error code. See “systemctl status auditd.s…

Matlab进阶绘图第26期—双向堆叠图

双向堆叠图是一种特殊的堆叠图&#xff0c;其通过在两个方向构建堆叠图&#xff0c;从而可以对两种类别的同名及综合属性进行全方位的比较。 由于Matlab中未收录双向堆叠图的绘制函数&#xff0c;因此需要大家自行设法解决。 本文分享一个简单的双向堆叠图的绘制方法&#xf…

Vue3二维码生成

目录 qrcode.vue 快速开始 使用 全部代码 qrcode.vue https://github.com/scopewu/qrcode.vue/blob/main/README-zh_cn.mdhttps://github.com/scopewu/qrcode.vue/blob/main/README-zh_cn.md ⚠️ 如果你正在使用 Vue 3&#xff0c;请升级 qrcode.vue 到 3.x; &#x1f5…

elementUI moment 年月日转时间戳 时间限制

changeStartTime(val){debuggerthis.startT val// this.startTime parseInt(val.split(-).join())this.startTime moment(val).unix() * 1000 //开始时间毫秒if(this.endTime){this.endTime moment(this.endT).unix() * 1000 //结束时间毫秒if(this.startTime - this.endTi…

上海亚商投顾:创业板指反弹大涨1.26% 核污染概念股午后全线走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数今日集体反弹&#xff0c;沪指午后冲高回落&#xff0c;创业板指盘中涨超2%&#xff0c;尾盘涨幅也有所收…

Jsp 解决out.print()输出多出空行

一、原因 在 JSP 中&#xff0c;HTML 标签和 JSP 指令之外的内容会被当作文本处理&#xff0c;包括空行、空格和制表符等。当 JSP 引擎解析 JSP 页面时&#xff0c;会将这些文本内容原封不动地输出到响应中。 http响应 二、解决方法 在Jsp页面最前端添加 <% page trimDir…

国标视频云服务EasyGBS国标平台与海康4200平台级联后不能播放的问题解决方法

国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入&#xff0c;并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强&#xff0c;支持将接入的视频流进行全终端、全平台分发&#xff0c;分发的视频…

如何使用自动化测试工具Selenium?

哈喽&#xff0c;大家好&#xff0c;我是小浪。那么有一段时间没有更新了&#xff0c;还是在忙实习和秋招的事情&#xff0c;那么今天也是实习正式结束啦&#xff0c;开始继续更新我们的学习博客&#xff0c;后期主要是开发和测试的学习博客内容巨多&#xff0c;感兴趣的小伙伴…

2023前端面试笔记 —— HTML5

系列文章目录 内容链接2023前端面试笔记HTML5 文章目录 系列文章目录前言一、HTML 文件中的 DOCTYPE 是什么作用二、HTML、XML、XHTML 之间有什么区别三、前缀为 data- 开头的元素属性是什么四、谈谈你对 HTML 语义化的理解五、HTML5 对比 HTML4 有哪些不同之处六、meta 标签有…

【动手学深度学习】--21.锚框

锚框 学习视频&#xff1a;锚框【动手学深度学习v2】 官方笔记&#xff1a;锚框 1.锚框 目标检测算法通常会在输入图像中采样大量的区域&#xff0c;然后判断这些区域中是否包含我们感兴趣的目标&#xff0c;并调整区域边界从而更准确地预测目标的真实边界框&#xff08;gro…

模型下载不知道去哪下便宜的可以看过来!

我们在画图的时候&#xff0c;为了提升工作效率&#xff0c;会上一些模型下载网站下载一些模型&#xff0c;但是有时候模型网站的免费模型找不到自己想要的模型&#xff0c;我们只能下载付费的。因此&#xff0c;寻找一个便宜的又能满足自己需求的模型下载网站变得很重要。现在…