x86 的 ebp 寄存器,可能比 cr3 更重要,好好掰扯一下 ebp

在 x86 架构的计算机中,ebp(Extended Base Pointer)寄存器通常用于指向当前函数的栈帧(stack frame)的基地址。栈帧是函数调用期间在栈上分配的一块内存区域,用于存储局部变量、函数参数、返回地址和其他临时数据。Linux 中,用户注册的信号处理函数,就是从内核态回到用户态时,发现有此信号,于是内核修改用户态的栈,增加一个栈帧来对应执行信号处理函数,从而实现了 Linux 信号机制。

1,栈帧和 ebp 的作用

   1.1. 栈帧的结构:

    每次函数调用时,都会在栈上分配一个新的栈帧。栈帧通常包含以下内容:

            <1> 函数的局部变量

            <2> 函数参数

            <3> 返回地址(调用函数的地址)

            <4> 前一个栈帧的基地址(即调用者的 ebp 值)

   1.2. ebp 的作用:

             <1> ebp 寄存器指向当前栈帧的基地址。通过 ebp,程序可以方便地访问栈帧中的各个元素

            <2> 在函数调用时,ebp 的值会被保存到栈上,并且 ebp 会被更新为当前栈帧的基地址

             <3> 当函数返回时,ebp 会被恢复为调用者的栈帧基地址。

2,函数调用过程中的 ebp 使用

    2.1. 函数入口:

  • 在函数入口处,当前的 ebp 值会被保存到栈上,然后 ebp 会被更新为当前栈顶的值。这通常通过以下汇编指令实现:
    push ebp        ; 保存调用者的 ebp 值mov ebp, esp    ; 更新 ebp 为当前栈顶的值

    这是32为x86中的寄存器名字,x86_64 有对应的急促起,rbp,rsp等

 以下面的hello.c 中的 add() 为例:

int add(int x, int y)
{return x+y;
}int main()
{int s = 3;int t = 4;int u = 5;u = u + add(s, 5);return u;
}

生成 -m32 汇编代码如下:

 

 

 

    2.2. 函数内部:

在函数内部,通过 ebp 可以访问函数参数和局部变量。例如:

  • 函数参数:[ebp + 8] 表示第一个参数,[ebp + 12] 表示第二个参数,依此类推。

 

  • 局部变量:[ebp - 4] 表示第一个局部变量,[ebp - 8] 表示第二个局部变量,依此类推。

 

    2.3. 函数返回:

  • 在函数返回时,ebp 会被恢复为调用者的栈帧基地址,然后栈顶指针 esp 会被更新为 ebp 的值,如图一所示。
  • 这通常通过以下汇编指令实现:

         mov esp, ebp    ; 恢复 esp 为当前栈帧的基地址

         pop ebp         ; 恢复调用者的 ebp 值

         ret             ; 返回调用者

3,示例 intel 汇编格式

以下是一个简单的 C 函数及其对应的汇编代码示例:
 

int add(int a, int b) {int sum = a + b;return sum;}

对应的汇编代码可能如下:

add:

    push ebp            ; 保存调用者的 ebp 值

    mov ebp, esp        ; 更新 ebp 为当前栈顶的值

    sub esp, 16         ; 为局部变量分配空间

    mov eax, [ebp + 8]  ; 获取第一个参数 a

    mov ecx, [ebp + 12] ; 获取第二个参数 b

    add eax, ecx        ; 计算 a + b

    mov [ebp - 4], eax  ; 将结果存储到局部变量 sum

    mov eax, [ebp - 4]  ; 将 sum 的值放入 eax 作为返回值

    mov esp, ebp        ; 恢复 esp 为当前栈帧的基地址

    pop ebp             ; 恢复调用者的 ebp 值

    ret                 ; 返回调用者

4,总结

ebp 寄存器在 x86 架构中用于指向当前函数的栈帧基地址。

通过 ebp,程序可以方便地访问栈帧中的函数参数和局部变量。

在函数调用过程中,ebp 的值会被保存和恢复,以维护栈帧的结构。

通过理解 ebp 的作用,可以更好地理解函数调用过程中的栈帧管理和内存布局。

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

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

相关文章

[FreeRTOS 功能应用] 信号量 功能应用

文章目录 一、基础知识点二、代码讲解三、结果演示四、代码下载 一、基础知识点 [FreeRTOS 基础知识] 信号量 概念 [FreeRTOS 内部实现] 信号量 [FreeRTOS 内部实现] 创建任务 xTaskCreate函数解析 本实验是基于STM32F103开发移植FreeRTOS实时操作系统&#xff0c;信号量实战…

Linux:基础IO(三.软硬链接、动态库和静态库、动精态库的制作和加载)

上次介绍了基础IO&#xff08;二&#xff09;&#xff1a;Linux&#xff1a;基础IO&#xff08;二.缓冲区、模拟一下缓冲区、详细讲解文件系统&#xff09; 文章目录 1.软硬链接1.1硬链接1.2软链接使用场景 2.动态库和静态库1.1回顾1.2静态库的制作和使用为什么要有库制作者角度…

PyMuPDF 操作手册 - 01 从PDF中提取文本

文章目录 一、打开文件二、从 PDF 中提取文本2.1 文本基础操作2.2 文本进阶操作2.2.1 从任何文档中提取文本2.2.2 如何将文本提取为 Markdown2.2.3 如何从页面中提取键值对2.2.4 如何从矩形中提取文本2.2.5 如何以自然阅读顺序提取文本2.2.6 如何从文档中提取表格内容2.2.6.1 提…

人机恋爱新趋势:与AI男友谈恋爱的甜蜜与挑战

"我曾经把ChatGPT当成工具&#xff0c;从未追过星&#xff0c;也没有嗑过CP。没想到&#xff0c;到了36岁&#xff0c;我竟然嗑上了AI男友。Open AI&#xff0c;你赢了。你不仅是最好的AI公司&#xff0c;还是乙女游戏公司。" 转行大龄互联网人&#xff0c;走遍20国…

RT-Thread的Finsh实现学习

学习原因 工作中&#xff0c;使用同事开发的调试软件&#xff0c;输入参数打印的函数名就可以打印参数&#xff0c;但看不到代码实现&#xff0c;只能用自己微薄的知识积累去猜一下&#xff0c;之前尝试过&#xff0c;专门写一个函数&#xff0c;去解析编译生成的map文件&#…

一、Jquery入门(超详)

* [5.3 jQuery 对象和 DOM 对象之间的相互转换](about:blank#53_jQuery__DOM__271)* * [5.3.1 jQuery 对象转换为 DOM 对象](about:blank#531_jQuery__DOM__282)* [5.3.2 DOM 对象转换为 jQuery 对象](about:blank#532_DOM__jQuery__295)六、 解决 jQuery 和其他库的冲…

AI数据分析:集中度分析和离散度分析

在deepseek中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个Python脚本编写的任务&#xff0c;具体步骤如下&#xff1a; 读取Excel表格&#xff1a;"F:\AI自媒体内容\AI行业数据分析\toolify月榜\toolify2023年-2024年月排行榜汇总数据.xlsx&qu…

Redis-事务-基本操作-在执行阶段出错不会回滚

文章目录 1、Redis事务控制命令2、Redis事务错误处理3、Redis事务错误处理&#xff0c;在执行阶段出错不会回滚 1、Redis事务控制命令 127.0.0.1:6379> keys * (empty array) 127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> set a1 v1 QUEUED 127.0.0.1:6379(TX)>…

深入研究websocket直播中signature这个参数怎么来的,模拟自己生成一个

上一节课我们已经找到了生成signature这个字段的代码位置&#xff0c;就是这个B函数&#xff0c;嗯......听起来好像有点奇怪&#xff0c;但是它确实叫B啊&#xff0c;笑死。不管了&#xff0c;看一下里面的逻辑是啥。 注意e参数的内容是&#xff1a; {"app_name":…

Flutter ffi Failed to lookup symbol

iOS release版本&#xff0c;解决方式参考官方文档&#xff1a;在 iOS 中使用 dart:ffi 调用本地代码 如果debug版本也报这个错误&#xff0c;很可能是有多个.c文件&#xff0c;编译的时候没带上&#xff01; 假设你的ffi模块名字是 c_lib 对于Android端&#xff0c;需要修改…

索引的分类和回表查询——Java全栈知识(29)

索引的分类和回表查询 Mysql 的索引按照类型可以分为以下几类&#xff0c;但是我们使用的 InnoDB 只支持主键索引&#xff0c;唯一索引&#xff0c;普通索引&#xff0c;并不支持全文索引。 1、聚集索引和二级索引 InnoDB 可以将索引分为两类分别是聚集索引和二级索引&…

java基于ssm+jsp 医院远程诊断系统

1前台首页功能模块 医院远程诊断系统&#xff0c;在系统首页可以查看首页、医生信息、论坛信息、我的、跳转到后台、客服等内容&#xff0c;如图1所示。 图1前台首页功能界面图 用户登录&#xff0c;在用户登录页面可以填写用户名、密码、等信息进行用户登录&#xff0c;如图2…

vue3滚动日历选择器

倒叙日历&#xff1a; <template><div class"date-picker"><div class"column" wheel"onYearScroll"><div v-for"(year, index) in displayedYears" :key"index" :class"{current: year current…

复分析——第7章——ζ 函数和素数定理(E.M. Stein R. Shakarchi)

第7章 ζ函数和素数定理 Bernhard Riemann, whose extraordinary intuitive powers we have already mentioned, has especially renovated our knowledge of the distribution of prime numbers, also one of the most mysterious questions in mathematics. He has tau…

uniapp实现路由拦截——遇到问题(三)

uniapp路由拦截开发过程中遇到问题 文章目录 uniapp路由拦截开发过程中遇到问题App 无法退出应用监听返回数据结构解决方式模拟原生物理返回键提示不提示&#xff0c;直接退出应用 微信小程序 登录成功返回页面报错效果图不同平台来源页面数据结构解决方式 App 无法退出应用 安…

WPF——属性

一、属性 类最初只有字段与函数&#xff0c;字段为一个变量&#xff0c;访问权限可以是private&#xff0c;protected&#xff0c;public。而将字段设为private&#xff0c;不方便外界对类数据的操作&#xff0c;但是将字段设为public又怕外界对数据进行非法操作&#xff0c;于…

SpringMVC系列十一: 文件上传与自定义拦截器

文章目录 SpringMVC文件上传基本介绍需求分析 / 图解应用实例-代码实现 自定义拦截器什么是拦截器自定义拦截器执行流程分析图自定义拦截器应用实例快速入门注意事项和细节Debug执行流程 多个拦截器多个拦截器执行流程示意图应用实例1代码实现注意事项和细节 应用实例2 作业布置…

怎么区分Boombap 制作Boombap曲子教学 boombap音乐出现的时间

Boombap音乐作为嘻哈音乐文化的重要组成部分&#xff0c;具有独特的音乐节奏、样式和情感。要理解和区分Boombap音乐&#xff0c;需要从其音乐的历史渊源、音乐特征和文化影响入手。接下来给大家介绍怎么区分Boombap&#xff0c;制作Boombap曲子教学的具体内容。 一、怎么区分B…

虚拟机配置桥接模式

背景 因为要打一些awd比赛,一些扫描工具什么的,要用到kali,就想着换成一个桥接模式 但是我看网上的一些文章任然没弄好,遇到了一些问题 前置小问题 每次点开虚拟网络编辑器的时候都没有vmnet0,但是点击更改的时候却有vmnet0 第一步: 点击更改设置 第二步: 把wmnet0删掉 …

【计算机视觉】人脸算法之图像处理基础知识(六)

图像直方图 图像直方图是描述图像中像素强度分布的一种统计图表&#xff0c;它是图像处理和计算机视觉领域中一个非常基础且重要的概念。图像直方图通常用于分析图像的亮度、对比度特性&#xff0c;以及在图像增强、阈值分割、特征提取等多种图像处理任务。 import cv2 impor…