`
java-mans
  • 浏览: 11340996 次
文章分类
社区版块
存档分类
最新评论

关于寄存器ESP和EBP的一些理解

 
阅读更多
原文:<wbr><a rel="nofollow" href="http://blog.csdn.net/zsJum/article/details/6117043" style="color:rgb(245,149,19); text-decoration:none">http://blog.csdn.net/zsJum/article/details/6117043</a> <div> <div> <span style="color:#003366">一直对寄存器ESP和EBP的概念总是有些混淆,查看定义</span><span style="color:#993300">ESP</span><span style="color:#003366">是栈顶指针,</span><span style="color:#993300">EBP</span><span style="color:#003366">是存取堆栈指针。还是不能很透彻理解。之后借于一段汇编代码,总算是对两者有个比较清晰的理解。</span> </div> <div>下面是按调用约定__stdcall 调用函数test(int p1,int p2)的汇编代码</div> <div>假设执行函数前堆栈指针ESP为NN</div> <div>push p2 ;参数2入栈, ESP -= 4h , ESP = NN - 4h</div> <div>push p1 ;参数1入栈, ESP -= 4h , ESP = NN - 8h</div> <div>call test ;压入返回地址 ESP -= 4h, ESP = NN - 0Ch </div> <div><span style="color:#808080">;//进入函数内</span></div> <div>{</div> <div>push ebp ;保护先前EBP指针, EBP入栈, ESP-=4h, ESP = NN - 10h</div> <div>mov ebp, esp ;设置EBP指针指向栈顶 NN-10h</div> <div>mov eax, dword ptr [ebp+0ch] ;ebp+0ch为NN-4h,即参数2的位置</div> <div>mov ebx, dword ptr [ebp+08h] ;ebp+08h为NN-8h,即参数1的位置</div> <div>sub esp, 8 ;局部变量所占空间ESP-=8, ESP = NN-18h</div> <div>...</div> <div>add esp, 8 ;释放局部变量, ESP+=8, ESP = NN-10h</div> <div>pop ebp ;出栈,恢复EBP, ESP+=4, ESP = NN-0Ch</div> <div>ret 8 ;ret返回,弹出返回地址,ESP+=4, ESP=NN-08h, 后面加操作数8为平衡堆栈,ESP+=8,ESP=NN, 恢复进入函数前的堆栈.</div> <div>}</div> <div>看完汇编后,再看EBP和ESP的定义,哦,豁然开朗,</div> <div> <span style="color:#000080">原来</span><span style="color:#993300">ESP</span><span style="color:#000080">就是一直指向栈顶的指针,而</span><span style="color:#993300">EBP</span><span style="color:#000080">只是存取某时刻的栈顶指针,以方便对栈的操作,如获取函数参数、局部变量等。</span> </div> </div> </wbr>

分享到:
评论

相关推荐

    反汇编代码中EBP和ESP的关系

    本文档主要介绍高级语言反汇编之后的汇编代码中寄存器EBP的作用。

    8086cpu寄存器详解.doc

    堆栈寄存器 2个 ESP和EBP 32位 指令指针寄存器 1 EIP 32位 状态标志寄存器 1 EFlags 32位 控制寄存器 CR0-CR4 调试寄存器 DR0-DR7 测试寄存器 TR3-TR5 系统地址寄存器 2个 GDTR,IDTR 48位

    x86架构常见寄存器介绍

    介绍了一些X86常见的寄存器,帮助分析程序,在碰到需要分析性能或者程序的时候将大大的帮助你 比如:EAX、EBX、ECX、EDX、EDI、ESI、EBP、ESP 、CS、DS、ES、FS、GS、SS、EFLAGS RAX、RBX、RCX、RDX、RSI、RDI、RSP...

    OllyICE反汇编教程及汇编命令详解

    内容目录 计算机寄存器分类简介 计算机寄存器常用指令 ...2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)

    chaleaoch#gitblog#9_x86架构32位处理器寄存器1

    x86架构32位处理器寄存器8个通用寄存器%esp -- 栈顶寄存器%ebp -- 栈帧基址寄存器%eip 下一条指令地址6个段寄存器条件码cf carry f

    揭秘数据解密的关键技术 CHM

     1.6.2 EBP和ESP寄存器的用途  1.7 标志寄存器  1.7.1 EFLAGS寄存器  1.7.2 EFLAGS寄存器的用途  1.8 灵活的寻址方式  1.8.1 寻址方式的分类  1.8.2 高级语言中的数据结构和80386寻址方式的关系  1.9...

    VB 获得寄存器的值

    VB获得寄存器的值 可以获得 ContexFlags dr0 dr1 dr2 dr3 dr4 dr5 dr6 dr7 SegGs SegFs SegEs SegDs Edi Esi Ebx Edx Ecx Eax Ebp Eip SegCs EFlags Esp SegSs

    OD反汇编语言解释.doc

    2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1、数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,...

    CPU_ASM.rar_EFLAGS

    CPU寄存器和汇编指令 ...2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) &#160 6个段寄存器(ES、CS、SS、DS、FS和GS)&#160 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) &#160 ......

    8086汇编指令速查手册

    8086汇编指令速查手册:常用指令、算术运算指令 、逻辑运算指令...2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) ;6个段寄存器(ES、CS、SS、DS、FS和GS);1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 。

    汇编语言相关知识学习

    指针寄存器:ESP,EBP,ESI,EDI ESP始终指向最后入栈的一个地址 EBP始终指向最后一个入栈地址的值【一般存储基址】,也就是ESP的当前值 EBP+4 或esp+4处为返回地址,ebp|ebp+8为第一个参数,+12为第二个参数,以此类推...

    汇编语言指令以及伪指令速查手册

    它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,...

    8086汇编指令集

    它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA...

    揭秘数据解密的关键技术

    1.4 通用寄存器 1.4.1 EAX、EBX、ECX和EDX寄存器 1.4.2 EAX、EBX、ECX和EDX寄存器的用途 1.5 变址寄存器 1.5.1 ESI和EDI寄存器 1.5.2 ESI和EDI寄存器的用途 1.6 指针寄存器 1.6.1 EBP和ESP寄存器 1.6.2 EBP和ESP...

    汇编 命令 详详细解说 命令结合

    PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. BSWAP 交换32位寄存器里字节的顺序 XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器...

    汇编指令大全

    MOV 传送字或字节. MOVSX 先符号扩展,再传送....PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. BSWAP 交换32位寄存器里字节的顺序

    matlab语言dll反编译成源码-Disassembly:拆卸

    也就是恢复数据栈指针寄存器esp,并且将ebp寄存器的数值恢复到这个函数之前的状态。因为在之前开始函数的阶段中对ebp,esp寄存器进行了初始化操作,(mov ebp,esp/and esp,0ffffff0h ...),所以在退出之前要恢复...

    8080手册的汇编的素材吧

     它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.  1. 通用数据传送指令.  MOV 传送字或字节.  MOVSX 先符号扩展,再传送.  MOVZX 先零扩展,再传送.  PUSH 把字压入堆栈.  POP 把字弹出堆栈. ...

    常用汇编指令

    PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. BSWAP 交换32位寄存器里字节的顺序 XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器...

    超全汇编速查手册.zip

    PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. BSWAP 交换32位寄存器里字节的顺序 XCHG 交换字或字节.( 至少有一个操作数为寄存器,段...

Global site tag (gtag.js) - Google Analytics