vc生成的代码,如果不级联ebp,那么就不能看调用栈? push ebp表示 用 ebp 作 栈的 基址 ( frame )所有 栈 参数 以 ebp 为 标准叫 ebp based也可以 不 ebp based , 这时 ebp 可以 作 别的用 。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 为了取堆栈中的临时变量方便呗。mov eax,[ebp+8] ebp based: 我觉得这个提法非常好! 参数,变量都是以ebp来做基准,这是一种实现机制 堆栈是ESP,PUSH EBP,是在保存EBP中的内容,以便后续使用(覆盖),使用完后必然会有一个POP EBP对应。EBP的使用,可以认为是临时变量,是不是用EBP并不是必然的,用其他寄存器一样可以完成,自动生成的汇编只是遵循了普遍的用法或是规则(比如THIS指针用ECX,返回值使用EAX),寄存器数量有限,所以在进入新的CALL后,一般都是要使用压栈方式(PUSH)保存当前会用到的寄存器旧数据内容,在完成CALL后再进行一个寄存器的恢复和堆栈的恢复。不同的编程语言,使用不同的规则,EBP的应用含义也就不同,像FASTCALL还使用EAX传递参数呢。 调用堆栈也是相对的,只是反映了ESP对应的调用过程,只要没有用ESP或堆栈进行有意识的保护处理,都还是很有参考价值的。 计算机组成原理→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对应的汇编并单步执行观察相应内存和寄存器变化。) 问个简单的dll问题 MFC 画直线 光标移动到button上,和离开button,怎样在父窗体Dlg上判断 问个很菜的问题,怎样改变标题栏的内容? 怎么用C/C++操作Sybase数据库 MFC类与WinMain()函数是如何关联在一起的? 请问哪里有VISUALSTUDIO.NET的免费图书下载啊各位大虾 怎样在MFC中处理SDK中的消息? 在多文档中,我另建了个Dialog类,我怎么在这个类中得到CView得指针? 键盘过滤的问题 为啥HTTP访问我只看到一次请求? _stdcall 和 extern"C"两种生成的动态库有什么区别?
mov eax,[ebp+8]
ebp based: 我觉得这个提法非常好!
EBP的使用,可以认为是临时变量,是不是用EBP并不是必然的,用其他寄存器一样可以完成,自动生成的汇编只是遵循了普遍的用法或是规则(比如THIS指针用ECX,返回值使用EAX),寄存器数量有限,所以在进入新的CALL后,一般都是要使用压栈方式(PUSH)保存当前会用到的寄存器旧数据内容,在完成CALL后再进行一个寄存器的恢复和堆栈的恢复。
不同的编程语言,使用不同的规则,EBP的应用含义也就不同,像FASTCALL还使用EAX传递参数呢。
多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步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对应的汇编并单步执行观察相应内存和寄存器变化。)