时间没有定义 发表于 2012-11-1 16:25:45

关于栈的试验------弹出堆栈后,原先栈中的数据不会发生改变?

刚刚看小甲鱼做的视频教程零基础学汇编的第16课,小甲鱼老师说当一个元素被弹出栈的时候 如pop ax
CPU做了两个动作:
1.把SS:SP指向的内存空间中的元素送入ax中;
2.sp = sp + 2

我想这个大家应该都有映像,然后小甲鱼老师形象的举了一个格式化硬盘的例子来说明,CPU仅仅只是把数据复制到ax中,并不会把原先栈中的数据给清除;于是我在Debug中做了如下实验:

我把10000H~1000FH这段内存空间当作栈来使用,把SS更改为1000,SP更改为10;
接着在20000H内存空间处写入如下代码:
mov ax,2423H      //赋值,执行完毕之后AX = 2423H
push ax               //压入堆栈,此时SP = E
add ax,20H          //这里仅仅是一个花指令,不必理会,执行完毕之后AX = 2443H;
pop ax                //执行完毕之后,AX = 2423H,SP = 10
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<从这里开始,我做了一个实验,我把SP人为的减去2(造成压入堆栈的假象),然后再弹出堆栈,那么如果结果是2423H,那么证明CPU不会把原先栈中的数据给清除,否则........
mov ax,EH
mov sp,ax
pop bx
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<实验到这里就结束了,但是我发现执行完毕之后...bx的值并不是等于2423H;那么是结论错误,还是我实验步骤有错误?
菜鸟求教导................
我在执行完pop ax之后使用D指令查看10000这块内存区,发现1000EH~1000FH已经不是等于2423H了...

小甲鱼 发表于 2012-11-1 17:45:49

描述有点乱哈~

CPU只会直接执行指令,不会自动帮你清除栈里的数据的。

hackbs 发表于 2012-11-1 17:48:31

描述的简单点。。。

时间没有定义 发表于 2012-11-1 18:08:00

hackbs 发表于 2012-11-1 17:48 static/image/common/back.gif
描述的简单点。。。

额,打个比方,不是说栈的数据弹出之后,CPU仅仅只是把栈顶元素的位置改变一下,指向下一个吗.原先的数据并不会消失...但是我试验发现弹出栈之后..原先的数据也消失了   

huise865 发表于 2012-11-1 20:58:59

我跟你说了多少遍了?看教程一定要认真 偏不听 现在知道错了吧~~:@:@:@

把栈设大点(10000H~10030H)SP指向20-30之内      :D
每执行一条指令用D查看一下内存里面的值有什么变化

然后执行完后看看数据丢失了没有 如果丢失了...那一定是你没认真看:lol:lol
(数据不会自动删除但会覆盖!貌似指令在内存中用机器码表示...忘了 你自己去看下吧)   

时间没有定义 发表于 2012-11-1 22:09:54

huise865 发表于 2012-11-1 20:58 static/image/common/back.gif
我跟你说了多少遍了?看教程一定要认真 偏不听 现在知道错了吧~~

把栈设大点(10000H~10030H)S ...

我的指令如下:
MOV AX,1000
MOV SS,AX
MOV SP,0031       ;<<<我把栈设置为10000H~10030H
MOV AX,1234
PUSH AX
ADD AX,0020
POP AX

未执行POP AX指令前与执行完POP AX指令后的图如下:
http://b122.photo.store.qq.com/psb?/f9f3ebcb-487e-41e5-9efb-27af9ee05840/icGNhgZwy9rMEwWGCY*1aPWKRVBNDD91qwjbFdUBer4!/b/dOHGukjLCwAA&bo=hgIwAQAAAAABAJI!

时间没有定义 发表于 2012-11-1 22:10:30

huise865 发表于 2012-11-1 20:58 static/image/common/back.gif
我跟你说了多少遍了?看教程一定要认真 偏不听 现在知道错了吧~~

把栈设大点(10000H~10030H)S ...

求大神告知....能否加我QQ? 274898516;麻烦了 ,再次感谢;

时间没有定义 发表于 2012-11-1 23:19:40

http://priv.hiphotos.baidu.com/album/s%3D1000%3Bq%3D90/sign=2ce102330ad162d981ee661c21ef929d/9358d109b3de9c82ffb1b5786c81800a18d84374.jpg?psign=ed1485c49245d688f0d9b698a4ebb27fd21b0ef418d504d1

补图

huise865 发表于 2012-11-2 00:57:19

比如mov ax,1234H
      push ax
      pop ax
此时ax的值是1234H,如果这时候你把SP+2,然后在POP BX    bx肯定不等于1234H啊,甲鱼哥只是说他还在内存中,但是没说他在栈中啊,你查看内存一样可以看到这个值,但是不是在栈中了!

叫你不仔细听,跟你说了多少遍了:curse::curse::curse::curse:

补充内容 (2012-11-2 00:59):
QQ号码貌似忘了不知道写在那里 有时间帮你找找!
刚才看海贼王去了 哈哈
页: [1]
查看完整版本: 关于栈的试验------弹出堆栈后,原先栈中的数据不会发生改变?