ebp和esp都是寄存器。
push ebp 保存ebp的值到栈指针esp所指向的地址
mov ebp,esp 把esp的值赋给ebp
如果push ebp出错即esp指向的地址无写权限,但编译系统生成的代码一般不会出此问题的。

解决方案 »

  1.   

    有个问题顺便问一下,eax是不是32位的通用寄存器,而ax是不是就是eax的低16位。
      

  2.   

    没有,我写了个程序在各窗口的标题栏上画了个按钮,点击了VC上的钩子按钮时出现了这个问题(VC出错了)
      

  3.   

    push        ebp
    mov        ebp,esp属于一个函数"prolog sequence"中的例行处理,"prolog sequence"中代码主要完成以下几个功能.
    1) 保护堆栈指针, 正如你列出的. 以便函数退出时,堆栈回复到函数调用者调用前的状态.
    2) 保护其他一些可能被改变的32位寄存器,如ESI,EDI(?)
    3) 从堆栈中分配函数的所有局部变量空间
    4) 初始化局部变量空间为0xcc所以从理论上说, "prolog sequence"中的例行处理不应该出现错误. 如果真的出现(如你所说)
    则最可能的原因是: 函数的调用和声明规则不统一. 例如stdcall/cdecl.另外, 你可以
    1) 检查你程序的project setting,看看是否改变了编译时的缺省栈大小
    2) rebuild all你的程序总而言之, 我觉得在"prolog sequence"中发生错误是非常难以理解的.
      

  4.   

    正如你提到的,我对stdcall和cdecl的区别一直不太清楚,能列举一下吗?