zoukankan      html  css  js  c++  java
  • 对寄存器ESP和EBP的一些理解

    PS:EBP是当前函数的存取指针,即存储或者读取数时的指针基地址;ESP就是当前函数的栈顶指针。每一次发生函数的调用(主函数调用子函数)时,在被调用函数初始时,都会把当前函数(主函数)的EBP压栈,以便从子函数返回到主函数时可以获取EBP。

    下面是按调用约定__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,即把栈中地址0xAAAAA99的内容pop到ebp中
    ret    8                          ;ret返回,弹出返回地址,ESP+=4, ESP=0xAAAAAA2, 后面加操作数8为平衡堆栈,ESP+=8,ESP=0xAAAAAAA, 恢复进入函数前的堆栈.
    }
    看完汇编后,再看EBP和ESP的定义,哦,豁然开朗,
    原来ESP就是一直指向栈顶的指针,而EBP只是存取某时刻的栈顶指针,以方便对栈的操作,如获取函数参数、局部变量等。
     
    http://blog.csdn.net/wangkr111/article/details/41315629
  • 相关阅读:
    20200209 ZooKeeper 3. Zookeeper内部原理
    20200209 ZooKeeper 2. Zookeeper本地模式安装
    20200209 Zookeeper 1. Zookeeper入门
    20200206 尚硅谷Docker【归档】
    20200206 Docker 8. 本地镜像发布到阿里云
    20200206 Docker 7. Docker常用安装
    20200206 Docker 6. DockerFile解析
    20200206 Docker 5. Docker容器数据卷
    20200206 Docker 4. Docker 镜像
    Combining STDP and Reward-Modulated STDP in Deep Convolutional Spiking Neural Networks for Digit Recognition
  • 原文地址:https://www.cnblogs.com/feng9exe/p/7885420.html
Copyright © 2011-2022 走看看