首页
社区
课程
招聘
关于ebp和esp的关系
发表于: 2015-10-7 20:51 14262

关于ebp和esp的关系

2015-10-7 20:51
14262
那是很久很久以前,刚开始学汇编,那时候还在看鱼c论
坛的视频,听到他讲x86汇编的ebp和esp这两个玩
意的时候,真把我搞的头都大了,也不知道这究竟是什
么玩意,没办法只得搁下了,不过后来为了调试一些
程序,不得不重新抄起OD,刚开始也不会用OD这玩
意,幸好网上视频资料很多,看着看着也就会了.玩的
时间长了才发现,应用程序中大多数call调用的子程
序,都是55打头,5D结尾,这才恍然大悟,ESP永远是
和SS配对的,理所当然EBP就成了孤家寡人,哼,既然
是孤家寡人,那随便找个什么代替也好,比如用个什
么EBW,EBZ也好,干吗要搞个EBP好像与ESP有多
大关系一样,真是误人子弟,我也是被坑了

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (25)
雪    币: 995
活跃值: (669)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
。。呵呵
2015-10-7 21:17
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
。。呵呵
2015-10-7 22:09
0
雪    币: 393
活跃值: (224)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
4
。。呵呵
2015-10-7 23:17
0
雪    币: 204
活跃值: (911)
能力值: (RANK:1324 )
在线值:
发帖
回帖
粉丝
5
ESP:Extended Stack Pointer
EBP:Extended Base Pointer
呵呵
2015-10-7 23:34
0
雪    币: 39
活跃值: (2901)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
后面可以用[bp+n]以及[bp-n]引用参数或局部变量,
而sp是起不到bp的作用的。
2015-10-8 00:37
0
雪    币: 118
活跃值: (72)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
。。呵呵
2015-10-8 06:48
0
雪    币: 69
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
push ebp
mov ebp, esp
...
pop ebp
ret

看来我记忆力还不错
2015-10-8 09:11
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我都是把EBP当作基址,ESP在EBP上盖楼来理解的。所以某个函数或者进程什么的要崩溃,你就崩到EBP就好了,超过EBP就不是你的东西了。当然EBP,ESP要存放到一个安全的地方,不那么容易丢失的地方,所以才会有那么多的push ebp  mov ebp,esp.

简单说,就是这两个寄存器保存着你程序在哪段内存上运行的信息。
2015-10-8 10:20
0
雪    币: 6
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
esp还是很厉害的
2015-10-8 10:23
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
好家伙。
2015-10-8 13:47
0
雪    币: 108
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
对啊,就是这样
2015-10-8 19:05
0
雪    币: 108
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
[QUOTE=NutCracker;1395592]后面可以用[bp+n]以及[bp-n]引用参数或局部变量,
而sp是起不到bp的作用的。[/QUOTE]

嘿嘿,我就是从8086学过来的,就因为是这样,才被ebp和esp这两个玩意搞晕了,允不允许那样做到不是关键,关键是为什么要把另一个东东弄成ebp,就算弄个"ebw"也好啊,哈哈
2015-10-8 19:10
0
雪    币: 108
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
呵呵,被这鸟文弄的晕头转向的
2015-10-8 19:15
0
雪    币: 108
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
还是这个管用,一目了然
push ebp
mov ebp, esp
...
pop ebp
ret
2015-10-8 19:19
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
只能说 lz 太嫩了,自己学不精就不要喷:
(1) ebp 的默认段也是 SS,这方面和 esp 一样
     在处理栈变量时,它们是分工合作的:esp 负责开辟空间,ebp 负责保存上一级的栈桢:
     push ebp
     mov ebp, esp                ; 保存调用链中的上一级函数的栈桢
     sub esp, 0xc0                ; 分配本地栈变量空间

     ... ...
     mov [ebp-4], ecx           ; 使用本地栈空间

     ... ...
     mov esp, ebp               ; 恢复上一级栈桢
   pop ebp
     ret
---------------------------
  在这里, ebp 默认是使用 SS 段的,这和 esp 是一样的!所以 ebp 才被叫做 stack-frame base pointer (栈桢基指针),目的和初衷是辅助 esp 处理栈变量的!

(2) ebp 在处理 local 变量时,优势以及作用, esp 是不能代替的,
     例如,如果编译器需要将 栈对齐在 16 字节后再分配空间,那么,编译会大概会类似这样做:
        push ebp
        mov ebp, esp
        and esp, 0xfffffff0              ;; 注意,这需要对齐在 16 字节
        sub esp, 0xc0                             ;; 注意,然后再分配空间

    ... ...

        mov esp, ebp                       ;;  最后返回前,编译器并不需要记住 esp 对齐前的值
        pop ebp
        ret
-----------------------
  那么,如果只使用 esp 处理栈变量的话,如何方便优雅地做到 "栈对齐" 这一要求呢?
     
(3) 另外,连这么简单的英文都不懂,干脆别学计算机!还说“鸟文”,英文是世界通行的语言好不好!
2015-10-8 20:00
0
雪    币: 108
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
我的意思是push指令和pop指令没有用到ebp,至于你说英文通行世界,那只是历史问题,单从语言本身来讲,我认为语法逻辑方面没有中文强,典型的就是,他一般把中心语放在前面,修饰语放在后面,而中国的文化是喜欢"绕一大个圈圈才回到原点",给人一种悬念,一步步引你走向结果,中心语一般放在后面,所以我才说那什么是鸟文!!!
还有,你说什么默认段寄存器,哈哈,windows是平坦模型的,好像内存保护也交给了分页机制了,所以我早就把默认段寄存器这东东忘记了,就当他都不存在那也没什么区别,哈哈
2015-10-8 20:19
0
雪    币: 39
活跃值: (2901)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
看来你的英文是真的不行。
只要学过C就知道,bp的p是指针的意思。
把ebp改成ebw明显是不恰当的。
2015-10-8 21:53
0
雪    币: 108
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
扯淡,我没学过C?,p不就是pointer么,可是,凭什么就一定要用它呀,随便拿个通用寄存器同样也能完成同样的功能,为什么一定要把它说成是一个指针,难道ebw有什么不好
2015-10-8 22:46
0
雪    币: 135
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
叫什么名字 对于机器 是无所谓的,
只是为了方便 人类理解 而已。

8086 的指令集 是 intel 规定的,他说是什么就是什么,大家都默认如此,方便交流。

你另起别的名字也可,只是大家不知道你的 ebw 是个什么玩意了~
2015-10-9 03:27
0
雪    币: 39
活跃值: (2901)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
因为8086中,通用寄存器是不能拿来作指针的(bx是例外,它用来替补sp,因为
sp不可用于间接寻址)。
前面你说你熟悉8086,了解历史。
我看你是思维比较混乱啊。
2015-10-10 23:26
0
雪    币: 341
活跃值: (143)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
22
我也不懂 讲得很好,学习了
2015-10-10 23:34
0
雪    币: 108
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
不是我比叫乱,是我认为学习本身就是要从不同的东西里面找相同,而知识本身就是就是以逻辑来描述现象,就好像:千变万化的物质(普通物质)最终由质子,中子,电子组成,他们之间也就是数量的区别而已.然而人类却是先看见千变万化的物质,然后才意识到几种基本离子.如果,你没见过这千变万化的物质,首先就给你质子,中子,电子这三个东西,让你把它组成各种个样的物质,你能吗?
所以我认为学习的过程是重万变到不变的,一开始就把ebp和esp混在一起,实在让人头疼,一本好书应该是易学易懂,怎么能够故作高深呢,而说书的也跟着吓起哄,这不是很滑稽吗?
你说通用寄存器不能当指针,你随便拿个exe用OD打开看看能还是不能
2015-10-11 07:22
0
雪    币: 39
活跃值: (2901)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
你不仅是逻辑混乱,而且看贴还不仔细。
我说的是8086,注意到这个前提了吗?
既然bp在8086中主要用作堆栈中的指针,而不是做通用寄存器的用途,
请问它的名字带有p有何不妥?
而ebp来自于bp,请问为啥要把p去掉?
我想这问题已经讲得够清楚了,你若还要再纠结于把ebp改成ebw什么的,
还是先把思维理一理再说。
2015-10-11 10:17
0
雪    币: 108
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
哈哈,原来如此,看来我对intel的历史真不了解,不过我说他误人子弟却是没错,最少我是被坑了
2015-10-11 10:26
0
游客
登录 | 注册 方可回帖
返回
//