对于ESP、EBP寄存器的理解

原文:http://blog.csdn.net/yeruby/article/details/39780943

esp是栈指针,是cpu机制决定的,push、pop指令会自动调整esp的值;

ebp只是存取某时刻的esp,这个时刻就是进入一个函数内后,cpu会将esp的值赋给ebp,此时就可以通过ebp对栈进行操作,比如获取函数参数,局部变量等,实际上使用esp也可以;

既然使用esp也可以,那么为什么要设定ebp呢?

答案是为了方便程序员。

因为esp在函数运行时会不断的变化,所以保存一个一进入某个函数的esp到ebp中 会方便程序员访问参数和局部变量,而且还方便调试器分析函数调用过程中的堆栈情况。前面说了,这个ebp不是必须要有的,你非要使用esp来访问函数参数 和局部变量也是可行的,只不过这样会麻烦一些。

通过一段程序理解esp和ebp:

main() {

//执行test前

print(int p1,int p2);

//执行test后

}

分析下上面程序的调用原理,假设执行print前esp=Q:

push p2; //函数参数p2入栈,esp=Q-4H

push p1; //函数参数p1入栈,esp=Q-8H

call print; //函数返回地址入栈,esp=Q-0CH

//现在进入print内,做些准备工作:

push ebp; //保护先前ebp指针,ebp入栈,esp=Q-10H

mov esp,ebp; //设置ebp等于当前的esp

// 此时,ebp+0CH=Q-4H,即p2的位置

// 同样,ebp+08H=Q-8H,即p1的位置

// 下面是print内的一些操作:

sub esp,20H; //设置长度为10H大小的局部变量空间,esp=Q-20H

// ... ...

// 一系列操作

// ... ...

add esp,20H; //释放局部变量空间,esp=Q-10H

pop ebp; //出栈,恢复原先的ebp的值,esp=Q-0CH

ret 8; //ret返回,弹出先前入栈的返回地址,esp=Q-08H,后面加操作数8H为平衡堆栈

// 之后,弹出函数参数,esp=Q,恢复执行print函数前的堆栈;

图示,注意栈在内存中的生长方向是逆向:

执行push p2;前,esp=Q;

执行push p2;过程中,esp-=4H,p2入栈;

执行push p2;后,esp=Q-4H;

时间: 2024-10-18 16:41:25

对于ESP、EBP寄存器的理解的相关文章

汇编中EBP寄存器和ESP寄存器的区别

炎炎夏日,在实验室里热成狗了,所以准备学习点汇编让心凉一下... 目前看的书是刘颖东编著的<揭秘数据解密的关键技术>. 闲话不表,言归正传. EBP和ESP都是汇编中关于指针的寄存器.但是定义不同: (1)ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶.(2)EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部. 也就是说ESP是栈顶

EFLAGS标志寄存器加深理解

符号位表 这些符号位存在一个叫做PSW(Program Status Word,程序状态字)的16位(4字节)寄存器里面. 符号位 叙述 典型应用 汇编测试 OF 溢出标志,标明一个溢出的运算.真置1,假置0. CPU 会根据有符号数来进行判断,如果有符号数溢出,OF置1 例如: 16位数 AX:0x858F 进行 SUB AX,0x7869 操作 后 OF就置1 ,CF位还是0,AX没有向第17位进行借位或进位. MOV AX,858F/ SUB AX,7869 SF 负号标志,标明结果为负数

汇编之寄存器学习

一般寄存器:AX.BX.CX.DX AX:累积暂存器,BX:基底暂存器,CX:计数暂存器,DX:资料暂存器 索引暂存器:SI.DI SI:来源索引暂存器,DI:目的索引暂存器 堆叠.基底暂存器:SP.BP SP:堆叠指标暂存器,BP:基底指标暂存器 EAX.ECX.EDX.EBX:為ax,bx,cx,dx的延伸,各為32位元 ESI.EDI.ESP.EBP:為si,di,sp,bp的延伸,32位元 eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 汇编语言

20135218——信息安全系统设计基础期中总结

第八周学习及期中考试总结 一: 1:Linux命令      登录Linux后,我们就可以在#或$符后面去输入命令,有的时候命令后面还会跟着选项(options)或参数(arguments).       即Linux中命令格式为:command[options][arguments].但有些命令也不需要跟着选项或参数. 2 :man命令       1是普通的Linux命令(用户命令帮助)       2是系统调用,操作系统的提供的服务接口(系统调用帮助)       3是库函数, C语言中的

20145234黄斐《信息安全系统升级系统》第五周学习总结

教材内容概述 3.1 历史观点 X86 寻址方式经历三代: 1 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全2 8086的分段模式3 IA32的带保护模式的平坦模式 3.2 程序编码 计算机系统使用了多种不同的抽象,对机器级编程来说,两种抽象尤为重要: 机器级程序的格式和行为,定义为"指令集体系结构"--"ISA" 机器级程序使用的存储器地址是虚拟地址 可见的处理器状态 程序计数器 指示将要执行的下一条指令在存储器中的位置 整数寄存器文件包含8个命名的位

Linux0.11内核源码——内核态进程切换的改进

由于Linux0.11的内核态进程切换使用的方式是用ljmp来进行TSS的跳转,效率较低,因此考虑对其进行优化,改为后面版本使用的kernel stack栈的切换 需要做的任务 1.重写schedule,switch_to函数 2.将修改过的函数接在一起 3.修改fork函数 目前 Linux 0.11 中工作的 schedule() 函数是首先找到下一个进程的数组位置 next,而这个 next 就是 GDT 中的 n,所以这个 next 是用来找到切换后目标 TSS 段的段描述符的,一旦获得

ESP和EBP指针寄存器

(转)ESP和EBP指针寄存器 2012-04-12 20:37:18 分类: 嵌入式 ebp和esp是32位的SP,BP esp是堆栈指针     ebp是基址指针 ESP与SP的关系就象AX与AL,AH的关系. 32位CPU所含有的寄存器有: 4个数据寄存器(EAX.EBX.ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES.CS.SS.DS.FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1.数据寄存器 数据

C++代码反汇编后的堆栈寄存器EBP和ESP

最近在分析一个进程崩溃的严重问题,其中有些过程分析需要对ebp, esp 有清晰的理解,对于ebp 和esp 相信大家都很熟悉了,但是为了使本文自成体系,我还是解释一下. ebp--栈底指针 esp--栈顶指针 如图所示,简化后的代码调用过程如下: void Layer02() { int b = 2; } void Layer01() { int a = 1; Layer02(); } 那么函数执行过程中ebp和esp是如何变化的呢?如下是反汇编后的代码: void Layer02() { 0

EBP与ESP寄存器的使用

push ebp mov esp,ebp esp是堆栈指针 ebp是基址指针 这两条指令的意思是将栈顶指向ebp的地址 --------------------------------------------------------------- 例如: push ebp ;ebp入栈 mov ebp, esp ;因为esp是堆栈指针,无法暂借使用,所以得用ebp来存取堆栈 sub   esp, 4*5 ;下面的wsprintf一共使用了5个参数,每个参数占用4个字节,所以要入栈4*5个字节 p