能力值:
( LV2,RANK:10 )
|
-
-
2 楼
。。呵呵
|
能力值:
( LV3,RANK:30 )
|
-
-
3 楼
。。呵呵
|
能力值:
( LV8,RANK:140 )
|
-
-
4 楼
。。呵呵
|
能力值:
(RANK:1324 )
|
-
-
5 楼
ESP:Extended Stack Pointer
EBP:Extended Base Pointer
呵呵
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
后面可以用[bp+n]以及[bp-n]引用参数或局部变量,
而sp是起不到bp的作用的。
|
能力值:
( LV4,RANK:50 )
|
-
-
7 楼
。。呵呵
|
能力值:
( LV3,RANK:20 )
|
-
-
8 楼
push ebp
mov ebp, esp
...
pop ebp
ret
看来我记忆力还不错
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
我都是把EBP当作基址,ESP在EBP上盖楼来理解的。所以某个函数或者进程什么的要崩溃,你就崩到EBP就好了,超过EBP就不是你的东西了。当然EBP,ESP要存放到一个安全的地方,不那么容易丢失的地方,所以才会有那么多的push ebp mov ebp,esp.
简单说,就是这两个寄存器保存着你程序在哪段内存上运行的信息。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
esp还是很厉害的
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
好家伙。
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
对啊,就是这样
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
[QUOTE=NutCracker;1395592]后面可以用[bp+n]以及[bp-n]引用参数或局部变量,
而sp是起不到bp的作用的。[/QUOTE]
嘿嘿,我就是从8086学过来的,就因为是这样,才被ebp和esp这两个玩意搞晕了,允不允许那样做到不是关键,关键是为什么要把另一个东东弄成ebp,就算弄个"ebw"也好啊,哈哈
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
呵呵,被这鸟文弄的晕头转向的
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
还是这个管用,一目了然
push ebp
mov ebp, esp
...
pop ebp
ret
|
能力值:
( 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) 另外,连这么简单的英文都不懂,干脆别学计算机!还说“鸟文”,英文是世界通行的语言好不好!
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
我的意思是push指令和pop指令没有用到ebp,至于你说英文通行世界,那只是历史问题,单从语言本身来讲,我认为语法逻辑方面没有中文强,典型的就是,他一般把中心语放在前面,修饰语放在后面,而中国的文化是喜欢"绕一大个圈圈才回到原点",给人一种悬念,一步步引你走向结果,中心语一般放在后面,所以我才说那什么是鸟文!!!
还有,你说什么默认段寄存器,哈哈,windows是平坦模型的,好像内存保护也交给了分页机制了,所以我早就把默认段寄存器这东东忘记了,就当他都不存在那也没什么区别,哈哈
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
看来你的英文是真的不行。
只要学过C就知道,bp的p是指针的意思。
把ebp改成ebw明显是不恰当的。
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
扯淡,我没学过C?,p不就是pointer么,可是,凭什么就一定要用它呀,随便拿个通用寄存器同样也能完成同样的功能,为什么一定要把它说成是一个指针,难道ebw有什么不好
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
叫什么名字 对于机器 是无所谓的,
只是为了方便 人类理解 而已。
8086 的指令集 是 intel 规定的,他说是什么就是什么,大家都默认如此,方便交流。
你另起别的名字也可,只是大家不知道你的 ebw 是个什么玩意了~
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
因为8086中,通用寄存器是不能拿来作指针的(bx是例外,它用来替补sp,因为
sp不可用于间接寻址)。
前面你说你熟悉8086,了解历史。
我看你是思维比较混乱啊。
|
能力值:
( LV7,RANK:110 )
|
-
-
22 楼
我也不懂 讲得很好,学习了
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
不是我比叫乱,是我认为学习本身就是要从不同的东西里面找相同,而知识本身就是就是以逻辑来描述现象,就好像:千变万化的物质(普通物质)最终由质子,中子,电子组成,他们之间也就是数量的区别而已.然而人类却是先看见千变万化的物质,然后才意识到几种基本离子.如果,你没见过这千变万化的物质,首先就给你质子,中子,电子这三个东西,让你把它组成各种个样的物质,你能吗?
所以我认为学习的过程是重万变到不变的,一开始就把ebp和esp混在一起,实在让人头疼,一本好书应该是易学易懂,怎么能够故作高深呢,而说书的也跟着吓起哄,这不是很滑稽吗?
你说通用寄存器不能当指针,你随便拿个exe用OD打开看看能还是不能
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
你不仅是逻辑混乱,而且看贴还不仔细。
我说的是8086,注意到这个前提了吗?
既然bp在8086中主要用作堆栈中的指针,而不是做通用寄存器的用途,
请问它的名字带有p有何不妥?
而ebp来自于bp,请问为啥要把p去掉?
我想这问题已经讲得够清楚了,你若还要再纠结于把ebp改成ebw什么的,
还是先把思维理一理再说。
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
哈哈,原来如此,看来我对intel的历史真不了解,不过我说他误人子弟却是没错,最少我是被坑了
|
|
|