zoukankan      html  css  js  c++  java
  • 了解EBP寄存器

    转自:http://blog.csdn.net/lijie_sh/archive/2009/09/07/4527605.aspx

    在寄存器里面有很多寄存器虽然他们的功能和使用没有任何的区别,但是在长期的编程和使用中,在程序员习惯中已经默认的给每个寄存器赋上了特殊的含义,比如:EAX一般用来做返回值,ECX用于记数等等。在win32的环境下EBP寄存器用与存放在进入call以后的ESP的值,便于退出的时候回复ESP的值,达到堆栈平衡的目的。 

    应用以前说过的一段话: 

    原程序的OEP,通常是一开始以 Push EBP 和MOV Ebp,Esp这两句开始的,不用我多说大家也知道这两句的意思是以EBP代替ESP,作为访问堆栈的指针。 

    为什么要这样呢?为什么几乎每个程序都是的开头能?因为如果我们写过C等函数的时候就应该清楚,程序的开始是以一个主函数main()为开始的,而函数在访问的过程中最重要的事情就是要确保堆栈的平衡,而在win32的环境下保持平衡的办法是这样的: 

    1.让EBP保存ESP的值; 

    2.在结束的时候调用 


    mov esp,ebp 
    pop ebp 
    retn

    或者是 


    leave
    retn


    两个形式是一个意思。 
    这样做的好处是不用考虑ESP等于多少,PUSH了多少次,要POP多少次了,因为我们知道EBP里面放的是开始时候的ESP值。

  • 相关阅读:
    CMDB整体项目整理(3)
    聊聊restful和restframework
    mysql笔记(2)
    mysql笔记(1)
    cmdb整体项目梳理(2)
    DOM4J解析XML
    JAXP进行DOM和SAX解析
    XML
    CSS案例
    CSS基础总结
  • 原文地址:https://www.cnblogs.com/iwaitu/p/1704913.html
Copyright © 2011-2022 走看看