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个字节 
  push    1111 
  push    2222 
  push    3333 
  push    offset szFormat 
  push    offset szOut 
  call     wsprintf       ;调用wsprintf 
  add     esp, 4*5     ;堆栈使用完毕,“还”回4*5个字节给系统 
  ... 
  mov     esp, ebp     ;恢复esp的值 
  pop      ebp        ;ebp出栈 
  ret 

主要是用来保存/恢复堆栈,以便传递参数给函数。 
  在MASM里面,有一条更方便的语句,就是invoke, 使用它后,你就不用自己做这些事情了。 
  --------------------------------------------------------------- 
  esp始终指向栈顶,ebp是在堆栈中寻址用的

EBP与ESP寄存器的使用

时间: 2024-10-11 07:02:28

EBP与ESP寄存器的使用的相关文章

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寄存器的区别

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

函数调用(ebp,esp,堆栈快照)

概率 esp :栈顶指针,必须的 ebp:  存放堆栈指针,不是必须的 #include <stdio.h> int func(int param1 ,int param2,int param3) { int var1 = param1; int var2 = param2; int var3 = param3; printf("var1=%d,var2=%d,var3=%d",var1,var2,var3); return var1; } int main(int arg

c语言背后的运行机制

目的:通过分析c语言转换成汇编代码后的执行过程对汇编语言和X86构架有一个初步认识 实验代码 1 #include <stdio.h> 2 3 int g(int x) 4 { 5 return x + 3; 6 } 7 8 int f(int x) 9 { 10 return g(x); 11 } 12 13 int main(void) 14 { 15 return f(8) + 1; 16 } 实验过程 编译 1.使用cd Desktop切换至桌面 2.使用touch 1-1.c在桌面建

理解计算机的工作方式——通过汇编一个简单的C程序并分析汇编代码

Author: 翁超平 Notice:原创作品转载请注明出处 See also:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  本文通过汇编一个简单的C程序,并分析汇编代码,来理解计算机是如何工作的.整个过程都在实验楼上完成,感兴趣的读者可以通过上面给出的课程链接自行动手学习.以下是实验过程和结果. 一.操作步骤 1.首先在通过vim程序建立main.c文件.代码如下: 图1 2.使用如下命令将main.c编

栈和函数调用

栈是一个很重要的编程概念(编译课和程序设计课都讲过相关内容),与编译器和编程语言有紧密的联系.理解调用栈最重要的两点是:栈的结构,EBP寄 存器的作用.一个函数调用动作可分解为:零到多个PUSH指令(用于参数入栈),一个CALL指令.CALL指令内部其实还暗含了一个将返回地址(即 CALL指令下一条指令的地址)压栈的动作(由硬件完成).几乎所有本地编译器都会在每个函数体之前插入类似如下的汇编指令: pushl %ebp movl %esp , %ebp 这样在程序执行到一个函数的实际指令前,已经

C语言函数调用栈(三)

6 调用栈实例分析 本节通过代码实例分析函数调用过程中栈帧的布局.形成和消亡. 6.1 栈帧的布局 示例代码如下: 1 //StackReg.c 2 #include <stdio.h> 3 4 //获取函数运行时寄存器%ebp和%esp的值 5 #define FETCH_SREG(_ebp, _esp) do{ 6 asm volatile( 7 "movl %%ebp, %0 \n" 8 "movl %%esp, %1 \n" 9 : "

x80386汇编

EAX寄存器:EAX称为累加器,常用于算数运算.布尔操作.逻辑操作.返回函数结果等.EBX寄存器:EBX称为基址寄存器,常用于存档内存地址.ECX寄存器:ECX称为计数寄存器,常用于存放循环语句的循环次数,字符串操作中也常用.EDX寄存器:称为数据寄存器,常常和EAX一起使用. 5.变址寄存器 变址寄存器 顾名思义,变址的含义是内存地址会变动的,也就是说变址寄存器中存放在变动的内存地址.80386架构中有两个变址寄存器,分别是ESI和EDI.ESI和EDI寄存器:ESI:ESI称为源变址寄存器,

汇编学习-堆栈与子程序

任何程序在运行过程中都需要使用堆栈,操作系统为每一个程序(进程及线程)设置一个堆栈.在使用高级语言编程时,源程序中使用的函数调用.局部变量都要用到堆栈,由编译器来负责生成有关的机器指令.我的理解,堆栈就是维护当前线程中运行状态的一个数据结构,这种状态包括:需要传递的变量,函数的返回地址,局部变量等等. 与堆栈相关的 3 个寄存器是:SS, ESP, EBP. ESP 寄存器中的内容作为堆栈的当前指针.PUSH, POP, CALL, RET 等指令都与堆栈有关,使用 SS:ESP 指向堆栈单元.