栈帧及EBP、ESP寄存器及出入栈的流程
接下来咱们以一个例子来说明EBP、ESP寄存器的作用。由于刚是自己理解的,有错误可以提出,共同进步。
这个是栈帧的结构
以下是按调用约定__stdcall 调用函数test(int p1,int p2)的汇编代码
如果运行函数前堆栈指针ESP为0xAAAAAAA 。EBP为0xAAAAAB0
push p2 ;參数2入栈, ESP -= 4h , ESP = 0xAAAAAAA - 4h = 0xAAAAAA6
push p1 ;參数1入栈, ESP -= 4h , ESP = 0xAAAAAAA - 8h = 0xAAAAAA2
call test ;压入返回地址 ESP -= 4h, ESP = 0xAAAAAAA- 0Ch = 0xAAAAA9D,注意:这里是test函数的返回地址。即在代码段中的地址(偏移)。
;//进入函数内
{
push ebp ;保护先前EBP指针, EBP入栈(即0xAAAAAB0入栈。注意与返回地址差别), ESP-=4h, ESP = 0xAAAAA99
mov ebp, esp ;设置EBP指针指向栈顶 0xAAAAA99
mov eax, dword ptr [ebp+0ch] ;ebp+0ch为0xAAAAAA6即參数2的位置
mov ebx, dword ptr [ebp+08h] ;ebp+08h为0xAAAAAA2,即參数1的位置
sub esp, 8 ;局部变量所占空间ESP-=8, ESP = 0xAAAAA91
...
add esp, 8 ;释放局部变量, ESP+=8, ESP = 0xAAAAA99
pop ebp ;出栈,恢复EBP, ESP+=4, ESP = 0xAAAAA9D,即把栈中地址0xAAAAAB0的内容pop到ebp中,恢复现场。
ret 8 ;ret返回,弹出返回地址,ESP+=4, ESP=0xAAAAAA2, 后面加操作数8为平衡堆栈,ESP+=8,ESP=0xAAAAAAA, 恢复进入函数前的堆栈.
}
原来ESP就是一直指向栈顶的指针。
而EBP有两种作用,第一种,作为基址对参数的调用通过加减来调用。
第二种,作为栈底地址。在调用新的函数时,会把上一个原函数的栈底地址入栈保存现场,然后把esp的地址赋予ebp作为栈底地址。
每一次发生函数的调用(主函数调用子函数)时,在被调用函数初始时,都会把当前函数(主函数)的EBP压栈,以便从子函数返回到主函数时能够获取EBP。
栈帧及EBP、ESP寄存器及出入栈的流程相关推荐
- eax,ebx,ecx,edx,esi,edi,ebp,esp寄存器的作用
eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86汇编语言中CPU上的通用寄存器的名称,是32位的寄存器.如果用C语言来解释,可以把这些寄存器当作变量看待. 比方 ...
- 汇编语言里 eax, ebx, ecx, edx, esi, edi, ebp, esp 寄存器 含义
eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 汇编语言中CPU上的通用寄存器的名称,是32位的寄存器.如果用C语言来解释,可以把这些寄存器当作变量看待. 比 ...
- 11.JDK8内存模型、本地方法栈、虚拟机栈、栈帧结构(局部变量表、操作数栈、方法出口、虚拟机栈与本地方法栈的关系、寄存器、方法区、堆(Heap)、jvm中的常量池、Metaspace(元空间))
11.JDK8内存模型 11.1.本地方法栈(Native Method Stacks) 11.2.虚拟机栈(Java Virtual Machine Stacks) 11.3.栈帧结构 11.3.1 ...
- linux系统调用和内存管理以及栈帧
linux编程和C++笔记 目录 linux编程和C++笔记 0. terminal操作快捷键等 1. vfork的子进程return程序会挂掉,但exit不会 2. C++内存管理详解 3. 关于堆 ...
- 汇编-栈帧-寄存器esp, ebp
转载 原文地址 栈帧%ebp,%esp详解 分类专栏: 汇编 首先应该明白,栈是从高地址向低地址延伸的.每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息.寄存器ebp指向 ...
- 栈帧ebp,esp详解
栈帧%ebp,%esp详解 分类专栏: 汇编 首先应该明白,栈是从高地址向低地址延伸的.每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息.寄存器ebp指向当前的栈帧的底部 ...
- 栈帧详解ebp、esp
一. 理解栈帧 栈帧是什么,我们基本的理解是栈帧也叫活动记录过程,是编译器用来实现过程 函数调用的一种数据结构.通俗来说栈帧就时C语言函数在调用的过程中的调用原理,就是当我们执行一个函数操作的时候,它 ...
- 浅析栈指针ESP和帧指针EBP
ESP和EBP是刚接触栈的时候就碰到的两个指针.对这两个我一直是处于一知半解状态. 错误认知:ESP是指向栈顶指针,EBP是指向栈底指针. 我这么认为已经很长时间了,而且自己觉得没问题. 直到今天看英 ...
- X86-64寄存器和栈帧--牛掰降解汇编函数寄存器相关操作
X86-64寄存器和栈帧 概要 说到x86-64,总不免要说说AMD的牛逼,x86-64是x86系列中集大成者,继承了向后兼容的优良传统,最早由AMD公司提出,代号AMD64:正是由于能向后兼容,AM ...
最新文章
- Android SQLite数据库的基本操作-SQLiteDatabase
- boost::mp11::mp_map_erase相关用法的测试程序
- java 生成 xml dtd_使用DTD文件中的JAXB生成Java类 – 如何修改DTD?
- Java获取指定月份的最后一天
- 匿名管道和pipe函数
- lol云顶之奕助手_关于云顶之奕的感想
- 当html里语义化,HTML5语义化
- 关于AAARR模型,还停留在理论却不会用?附实例讲解
- 小米8android版本打开,怎么查看小米手机安卓系统版本
- Git简洁教程:本地项目如何与GitHub互连
- 丢失MSVCR71.dll问题解决
- linux登陆端口号和协议,linux iso镜像下载 协议号与端口号大全
- 一文带你了解影响因子IF和SCI分区
- 易捷文件共享web服务器 v3.5,易捷文件共享Web服务器 官方版
- 京东Java后台开发岗社招面试经验分享,4面的面经
- irepot使用简介
- MTK平台一个花屏重启问题的分析
- 聊聊 Spring Boot 2.0 的 WebFlux
- 优信二手车创新发展,获业内外交口称赞
- 熟读,理解,背诵,融会贯通!
热门文章
- 厦门大学2018年转专业计算机,厦门大学各学院2017年接收转专业学生计划.PDF
- 美国医生推荐感冒食疗方
- 解决ElementUI列表大数据操作卡顿问题
- 酷睿i7 8565u属于什么级别 i78565u相当于什么水平
- 局域网访问文件提示服务器内存不足,“服务器存储空间不足”的问题
- 直播带货那么火,测试人员如何对直播类产品的直播质量进行测试呢?
- 试验数据管理系统TDM与SDM
- “算力经济”时代扑面而来,智算中心成未来数据中心进化方向
- linux||Linux的操作系统的简单指令
- 微信用户头像不能高清问题