push ebp表示 用 ebp 作 栈的 基址 ( frame )所有 栈 参数 以 ebp 为 标准叫  ebp based也可以 不 ebp based , 这时 ebp 可以 作 别的用 。

解决方案 »

  1.   

    为了取堆栈中的临时变量方便呗。
    mov eax,[ebp+8]
      

  2.   


    ebp based: 我觉得这个提法非常好!
      

  3.   

    参数,变量都是以ebp来做基准,这是一种实现机制
      

  4.   

    堆栈是ESP,PUSH EBP,是在保存EBP中的内容,以便后续使用(覆盖),使用完后必然会有一个POP EBP对应。
    EBP的使用,可以认为是临时变量,是不是用EBP并不是必然的,用其他寄存器一样可以完成,自动生成的汇编只是遵循了普遍的用法或是规则(比如THIS指针用ECX,返回值使用EAX),寄存器数量有限,所以在进入新的CALL后,一般都是要使用压栈方式(PUSH)保存当前会用到的寄存器旧数据内容,在完成CALL后再进行一个寄存器的恢复和堆栈的恢复。
    不同的编程语言,使用不同的规则,EBP的应用含义也就不同,像FASTCALL还使用EAX传递参数呢。
      

  5.   

    调用堆栈也是相对的,只是反映了ESP对应的调用过程,只要没有用ESP或堆栈进行有意识的保护处理,都还是很有参考价值的。
      

  6.   

    计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……对学习编程者的忠告:
    多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
    眼过千遍不如手过一遍!
    书看千行不如手敲一行!
    手敲千行不如单步一行!
    单步源代码千行不如单步Debug版对应汇编一行!
    单步Debug版对应汇编千行不如单步Release版对应汇编一行!VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
    对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
    (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)