从汇编层看64位程序运行——栈上变量的rbp表达

在《从汇编层看64位程序运行——参数传递的底层实现》中,我们看到了栈帧中的变量是分为两种:

  • 局部非静态变量。
  • 调用超过6个参数的函数时,从第7个参数开始的入参。

比如下面的代码

void foo10(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j) {a = a + 5;b = b + 5;c = c + 5;d = d + 5;e = e + 5;f = f + 5;g = g + 5;h = h + 5;i = i + 5;j = j + 5;int sum = a + b + c + d + e + f + g + h + i + j;sum = sum + 5;
}int main() {int a = 10;int b = 20;int c = 30;int d = 40;int e = 50;int f = 60;int g = 70;int h = 80;int i = 90;int j = 100;foo10(a, b, c, d, e, f, g, h, i, j);return 0;
}

我们着重看main函数的反汇编
在这里插入图片描述
可以看到所有栈上变量都是通过rbp寄存器来表达。
我们知道rbp和rsp寄存器都是表达栈上地址的,但是为什么栈上变量不使用rsp寄存器表达?如上图中,下面的语句通过给rsp减小0x30,让栈扩大。这样诸如-0x28(%rbp)表达变量a的方式,也可以通过+0x08(%rsp)的形式来表达。而且加法表达法更符合人们的认知!

0x000055555555535a <+8>:     sub    $0x30,%rsp

那为什么不选择rsp而要选择rbp呢?
这个原因我们在《从汇编层看64位程序运行——栈帧(Stack Frame)边界》中提过一句:
栈顶指针寄存器(rsp)不仅可以被直接设置,还会随着栈上Push和Pop的操作而改变。这个特性和rbp有很大不同,rbp只能直接被设置,栈上Push和Pop操作并不会直接导致rbp的值发生变动。
上面这句说说明,在一个函数汇编层,rbp寄存器基本是稳定的。这样表达另外一个变量时也就是稳定的
比如变量a,用rbp表达,就可以一直是-0x28(%rbp)。
而rsp寄存器会因为有一些压栈和出栈行为,导致其一直变动。这样表达另外一个变量时就是不稳定的。比如在压栈前,变量a可以表达为+0x08(%rsp);如果发生了诸如0x00005555555553bb处的压栈行为,变量a的表达就要变成+0x10(%rsp),这对于汇编的阅读和编写会造成很大的麻烦。
我们调试下该程序,观察下rsp、rbp以及栈上变化。
在这里插入图片描述

刚进入main函数时,寄存器信息如下:
在这里插入图片描述
可以看到rsp和rbp寄存器值一样。
+8执行完,rsp寄存器的值因为直接修改而发生改变。这是编译器让rsp的进行改变的,表达这个函数需要0x30的栈上空间存储局部变量(a,b,c,d,e,f,g,h,i,j)。
在这里插入图片描述
我们通过下面指令查看栈上的空间

x /16xw $rsp

在这里插入图片描述
我们让所有的变量初始化完成,然后再查看栈上变量的变化,可以看到栈上数值已经发生了改变。
在这里插入图片描述
我们在让程序执行到+105处,此时第7个参数还没被压栈。我们查看此时rsp、rbp的值,可以看到没有任何变化。
在这里插入图片描述
执行第7个参数压栈,可以看到rsp的值发生了变动。
在这里插入图片描述
相应的栈上数值也发生了变动
在这里插入图片描述
我们将所有的参数都压栈,然后观察rsp和rbp的变化
在这里插入图片描述
可以看到rbp没有任何变化,rsp一直在变。这意味着ebp相对于个变量的距离随着代码运行是一致的;而rsp和变量的距离是一直在变的。
通过上述分析,我们就能理解为什么栈上变量使用rbp表达,而不使用rsp表达了。
也正因为rbp寄存器的重要性,我们在函数开始处,总能看到如下代码
在这里插入图片描述
push %rbp就是要保存上一个栈帧的rbp寄存器。这是因为本函数的栈上变量起始地址也要用rbp来表达,于是我们看到mov %rsp,%rbp来构建本函数的rbp。
当函数执行完时,一般又有如下的代码
在这里插入图片描述
它是将之前保存的,上一个栈帧的rbp的值从栈中弹出到rbp寄存器中,从而还原上一栈帧的rbp。这样调用者函数中的局部非静态变量就可以继续使用rbp寄存器正确表达了。

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

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

相关文章

Python实现简单的ui界面设计(小白入门)

引言&#xff1a; 当我们书写一个python程序时&#xff0c;我们在控制台输入信息时&#xff0c;往往多有不便&#xff0c;并且为了更加美观且直观的方式输入控制命令&#xff0c;我们常常设计一个ui界面&#xff0c;这样就能方便执行相关功能。如计算器、日历等界面。 正文&a…

水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集)

水表数字识别2&#xff1a;Pytorch DBNet实现水表数字检测(含训练代码和数据集) 目录 水表数字识别2&#xff1a;Pytorch DBNet实现水表数字检测(含训练代码和数据集) 1.前言 2. 水表数字识别的方法 3. 水表数字识别数据集 4. 水表数字分割模型训练 &#xff08;1&#x…

JavaSE 面向对象程序设计进阶 IO 压缩流 解压缩流

目录 解压缩流 压缩流 解压缩流 压缩包 压缩包里面的每一个文件在java中都是一个ZipEntry对象 把每一个ZipEntry按照层级拷贝到另一个文件夹当中 import java.io.*; import java.util.Date; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream;public cl…

c#与欧姆龙PLC通信——如何更改PLC的IP地址

前言 我们有时候需要改变欧姆龙Plc的ip地址,下图有两种更改方式,一种是已知之前Plc设置的Ip地址,还有一种是之前不知道Pl的Ip地址是多少,下面分别做介绍。 1、已知PLC的IP地址的情况下更改地址 假设已知PLC的Ip地址,比如本文中PLC的IP为192.168.1.2,我首先将电脑的IP地…

17:低功耗篇(PWR)---HAL库

一:PWR 1:简历 PWR&#xff08;Power Control&#xff09;电源控制 PWR负责管理STM32内部的电源供电部分&#xff0c;可以实现可编程电压监测器和低功耗模式的功能 可编程电压监测器&#xff08;PVD&#xff09;可以监控VDD电源电压&#xff0c;当VDD下降到PVD阀值以下或上升到…

51单片机9(使用左移实现流水灯编程)

一、序言&#xff1a;下面我们来给大家介绍一下这个流水灯&#xff0c;流水灯如何来实现&#xff1f;我们依然使用这个工程来完成它。 1、那要使用实现这个流水灯&#xff0c;那我们只需要让D1到D8逐个的点亮&#xff0c;那同样要实现它足够的点亮&#xff0c;也会涉及到延时&…

使用requirements.txt文件安装cuda(GPU)版本的pytorch

使用requirements.txt文件安装cuda&#xff08;GPU&#xff09;版本的pytorch 问题描述解决方法 问题描述 使用requirements.txt可以轻松地帮助我们配置新环境&#xff0c;然而&#xff0c;当使用requirements.txt安装pytorch时有时会出现仅能安装cpu版本pytorch的情况。 举例…

从汇编层看64位程序运行——函数的调用和栈平衡

函数调用 不知道有没有人想过一个问题&#xff1a;A函数调用B函数&#xff0c;B函数是如何知道在调用结束后回到A函数中的&#xff1f; 比如下面的代码&#xff0c;main函数调用foo。当foo执行完毕&#xff0c;需要执行main函数的return 0语句。但是main和foo是割裂的&#x…

Vulnhub靶场DC-3-2练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. joomla漏洞查找2. SQL注入漏洞3. 破解hash4. 上传一句话木马5. 蚁剑连接shell6. 反弹shell7. 提权 0x04 总结 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-3-2.zip 介绍&#…

一文清晰了解CSS——简单实例

首先一个小技巧&#xff1a; 一定要学会的vsCode格式化整理代码的快捷键&#xff0c;再也不用手动调格式了-腾讯云开发者社区-腾讯云 (tencent.com) CSS选择器用于选择要应用样式的HTML元素。常见的选择器包括&#xff1a; 类选择器&#xff1a;以.开头&#xff0c;用于选择具…

React Element介绍

React Element是React中的核心概念之一&#xff0c;它代表了React应用中的UI元素。React Element并不是真实的DOM节点&#xff0c;而是一个轻量级的、不可变的、描述性的对象&#xff0c;它包含了创建UI所需的类型&#xff08;type&#xff09;、属性&#xff08;props&#xf…

前端框架前置知识之Node.js:模块化、导入导出语法、包的概念、npm介绍

什么是模块化&#xff1f; 在Node.js中&#xff0c;每一个文件都被视为一个单独的模块 概念&#xff1a;项目是由很多个模块文件组成的 好处&#xff1a;提高代码复用性&#xff0c;按需加载&#xff0c;独立作用域 使用&#xff1a;需要标准语法导出和导入进行使用 导入导…

在pycharm 2023.2.1中运行由R语言编写的ipynb文件

在pycharm 2023.2.1中运行由R语言编写的ipynb文件 背景与目标&#xff1a; 项目中包含由R语言编写的ipynb文件&#xff0c;希望能在pycharm中运行该ipynb文件。 最终实现情况&#xff1a; 未能直接在pycharm中运行该ipynb文件&#xff0c;但是替代的实现方法有&#xff1a;…

自然语言处理(NLP)——法国工程师IMT联盟 期末考试题

1. 问题1 &#xff08;法语&#xff09;En langue arabe lcrasante majorit des mots sont forms par des combinaisons de racines et de schmes. Dans ce mcanisme... &#xff08;英语&#xff09;In Arabic language the vast majority&#xff08;十之八九&#xff09; of…

ServiceNow UI Jelly模板注入漏洞复现(CVE-2024-4879)

0x01 产品简介 ServiceNow 是一个业务转型平台。通过平台上的各个模块,ServiceNow 可用于从人力资源和员工管理到自动化工作流程或作为知识库等各种用途。 0x02 漏洞概述 由于ServiceNow的Jelly模板输入验证不严格,导致未经身份验证的远程攻击者可通过构造恶意请求利用,在…

在线图书销售管理系统设计

在线图书销售管理系统的设计是一个涉及多个模块和功能的复杂项目&#xff0c;它旨在提高图书销售的效率&#xff0c;优化库存管理&#xff0c;提升用户体验&#xff0c;以及提供数据分析支持。以下是系统设计的一些关键组成部分&#xff1a; 1. 需求分析 用户需求&#xff1a…

[综述笔记]Functional neuroimaging as a catalyst for integrated neuroscience

论文网址&#xff1a;Functional neuroimaging as a catalyst for integrated neuroscience | Nature 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔…

Stable Diffusion 使用

目录 背景 最简单用法 进阶用法 高手用法 safetensor 一、概述 二、主要特点 背景 Stable Diffusion 开源后&#xff0c;确实比较火&#xff0c;上次介绍了下 Stable Diffusion 最简单的concept。今天继续介绍下&#xff0c;以Liblib 为例&#xff0c;介绍下如何使用参…

807.力扣每日一题7/14 Java(执行用时分布击败100%)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;算法练习关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 解题思路 解题过程 时间复杂度 空间复杂度 Code 解题思路 首先…

LLM上下文长度扩展方案:YaRN

文章目录 I. 前言II. NTK-by-partsIII. YaRNIV. Dynamic NTK 题目&#xff1a; YaRN: Efficient Context Window Extension of Large Language Models 论文地址&#xff1a; YaRN: Efficient Context Window Extension of Large Language Models I. 前言 在之前的两篇文章中分…