找call写call吧 关注:96贴子:951
  • 6回复贴,共1

32位CPU,有2个指针寄存器:ESP和EBP。(写cal

只看楼主收藏回复

32位CPU,有2个指针寄存器:ESP和EBP。
(写call要用到)
ebp和esp是32位的SP,BP
esp是堆栈指针
ebp是基址指针 。
寄存器EBP、ESP、BP和SP,总称为指针寄存器(Pointer Register),
主要用来存放堆栈里面的,存储单元的偏移量。
………………
………………
32位CPU有2个变址寄存器(ESI和EDI)。
它们主要用来存放,硬盘、内存等存储单元,在段内的偏移量。


来自手机贴吧1楼2015-02-05 10:59回复
    英特尔和AMD规定:
    SP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。
    BP为基指针(Base Pointer) 寄存器,用它可直接存取堆栈中的数据;
    ………………


    来自手机贴吧2楼2015-02-05 11:00
    回复
      这里特别说明一下ESP和EBP的作用:
      ESP始终指向栈顶,可以通过sub,push,call等指令改变ESP的值;
      而EBP对应于当前活动区。
      EBP的值一般不变,固定指向堆栈列表中的一个地址。


      来自手机贴吧4楼2015-02-05 11:05
      回复
        (一般为进入函数后ESP指向的栈顶地址暂时称为基栈),
        若当前活动区改变(如调用函数等),EBP值也就改变。
        通过查看汇编程序,
        我们可以看到一般进入子函数后有一下指令:
        pushl ebp
        mov esp, ebp
        压栈上一层的基栈,把这一层的基栈(目前存在ESP中)传给EBP


        来自手机贴吧5楼2015-02-05 11:09
        回复
          堆栈的保护作用。
          这里我们要提一下寄存器环境保护,众所周知,CPU的寄存器只有一个EAX ,EBX,ECX,EDX...... 如果一个寄存器EAX里存放着一些资料供后面使用,但当前CALL却需要EAX储存一些临时的数值这个时候要怎么办?
          这个时候我们则需要把寄存器EAX里的数值保存到一个地方,然后把EAX给CALL使用用完后在把那个值放
          回到寄存器EAX里去. 这个过程则是寄存器的环境保护. 在反汇编里保存寄存器的地方就是堆栈.
          当你在一个子程序头部看到一些 push eax 而又在尾部看到 pop eax 的时候 这里的eax 就是寄存器数值保护,push eax 则是保存eax储存的数值, pop eax则是放回去.
          ………………
          ………………
          ………………
          ………………
          堆栈如何平衡?
          如何理解堆栈的平衡呢?
          当push 压入了一个堆栈, esp的值就会-4 来存放数值. CALL完后就需要+4来把esp的值恢复回去.
          如何知道一个CALL是否需要堆栈平衡呢?看CALL内部的尾部就可以了,
          如果CALL尾部有RETN ** 或者add esp,*之类的,则是CALL自动平衡了一些堆栈,至于恢复了多少则要看指令后面带的数字。


          来自手机贴吧6楼2015-02-05 11:11
          回复
            顶起来再说


            来自iPhone客户端7楼2015-02-06 10:09
            回复