能力值:
( LV2,RANK:10 )
|
-
-
2 楼
如果进行了push,或者pop操作,esp的值就会变化,那样变量的偏移也要变化,用esp存取变量不稳定。ebp相当于一个固定的参照物。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
当然可以 用ebp 是为了减化编译器的工作量
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
同意2楼的说法,esp在函数调用的过程中随时会因为push和pop操作变掉的,如下面的代码:
00401B20 push ebp
00401B21 mov ebp,esp
00401B23 push 0FFh
00401B25 push offset __ehhandler$?InitInstance@CTmp2App@@UAEHXZ (004044fc)
00401B2A mov eax,fs:[00000000]
00401B30 push eax
00401B31 mov dword ptr fs:[0],esp
00401B38 sub esp,0A8h
00401B3E push ebx
00401B3F push esi
00401B40 push edi
00401B41 push ecx
00401B42 lea edi,[ebp-0B4h]
00401B48 mov ecx,2Ah
00401B4D mov eax,0CCCCCCCCh
00401B52 rep stos dword ptr [edi]
00401B54 pop ecx
00401B55 mov dword ptr [ebp-10h],ecx
00401B58 push 0
00401B5A call AfxEnableControlContainer (00403190)
00401B5F add esp,4
00401B62 mov ecx,dword ptr [ebp-10h]
00401B65 call CWinApp::Enable3dControls (00402c9e)
00401B6A push offset string "Local AppWizard-Generated Applic"... (00416394)
00401B6F mov ecx,dword ptr [ebp-10h]
00401B72 call CWinApp::SetRegistryKey (00402c98)
00401B77 push 4
00401B79 mov ecx,dword ptr [ebp-10h]
|
能力值:
( LV12,RANK:250 )
|
-
-
5 楼
ebp 中的 bp,就是 Base Pointer 的缩写,貌似专门设计用来 存取变量的;
而 esp 是专门的 Stack 操作寄存器,经常变化的
如果你保证 esp 不会变,也可以用来存取变量。
说白了:那么多寄存器,随便你用。但别冲撞了 寄存器的默认规则。
|
|
|