00401053 sub esp,44h
00401056 push ebx
00401057 push esi
00401058 push edi
00401059 lea edi,[ebp-44h]
0040105C mov ecx,11h
00401061 mov eax,0CCCCCCCCh
00401066 rep stos dword ptr [edi]
8: int a;
9:
10: a = Print(3, 4);
00401068 push 4
0040106A push 3
0040106C call @ILT+0(Print) (00401005)
00401071 add esp,8
00401074 mov dword ptr [ebp-4],eax
11:
12: return 0;
00401077 xor eax,eax
13: }
00401079 pop edi
0040107A pop esi
0040107B pop ebx
0040107C add esp,44h
0040107F cmp ebp,esp
00401081 call __chkesp (004010a0)
00401086 mov esp,ebp
00401088 pop ebp
00401089 ret
请问刚开始的时候 esp ebp指向的是同一个地址?
ss es 选择符是不是同一个
------解决方案--------------------------------------------------------
用 ollydbg 载入,然后动态查看。一般初始时(in win32)esp <> ebp,es==ss
------解决方案--------------------------------------------------------
在一般的汇编程序中:
esp只用来保栈顶
而使用ebp来临时保存子函数的基地址,它们在函数开始处一般不同
------解决方案--------------------------------------------------------
ESP是你的堆栈地址,而EBP是一个寄存器,通常用来临时保存堆栈地址,保持一个相对固定的基地址,然后用[EBP+0x00]来定位访问某个变量。
------解决方案--------------------------------------------------------
ebp和esp都是以堆栈段为默认数据段的,所以都可以用来做指针,但是在子函数中,由于esp可能随时要用到(子函数也可能要push pop 啊),所以不能用esp来做指针,要用ebp,初始化完成之后esp是等于ebp的,但是你要是在子函数中有push,pop等等 esp就变了。在子函数中,是不能对ebp进行修改,否则程序就挂了。
函数结束以后,一般会用 mov esp,ebp,然后pop ebp这样堆栈就正确了(其实反汇编时一般碰到的不是这两个指令,而是用一个leave来代替)