首页
社区
课程
招聘
[求助]想不明白为什么存取局部变量要用ebp来做指针
发表于: 2008-8-29 01:27 5899

[求助]想不明白为什么存取局部变量要用ebp来做指针

2008-8-29 01:27
5899
push ebp
mov ebp,esp
我一直都想不明白为什么存取局部变量要用ebp来做指针
罗书上说esp在程序的执行过程中可能随时用到,不可能用esp做指针来存取局部变量。
什么叫esp随时都可能用到,有个列子来说明一下吗,为什么不可以拿esp来存取局部变量呢?
比如局部变量local aaa,bbb:dword

add esp,FFFFFFFC
mov eax,dword ptr [esp]   ;将bbb移动到eax
mov ebx,dword ptr [esp+4] ;将aaa移动到ebx
add esp,8
ret

;;;;;;象这样不好吗,为什么非要拿ebp当指针呢,搞不懂.

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 197
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
如果进行了push,或者pop操作,esp的值就会变化,那样变量的偏移也要变化,用esp存取变量不稳定。ebp相当于一个固定的参照物。
2008-8-29 07:43
0
雪    币: 952
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
当然可以 用ebp 是为了减化编译器的工作量
2008-8-29 13:23
0
雪    币: 200
活跃值: (10)
能力值: ( 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]
2008-8-29 16:36
0
雪    币: 305
活跃值: (36)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
5
ebp 中的 bp,就是 Base Pointer 的缩写,貌似专门设计用来 存取变量的;
而 esp 是专门的 Stack 操作寄存器,经常变化的

如果你保证 esp 不会变,也可以用来存取变量。

说白了:那么多寄存器,随便你用。但别冲撞了 寄存器的默认规则。
2008-9-2 11:39
0
游客
登录 | 注册 方可回帖
返回
//