鱼C论坛

 找回密码
 立即注册
查看: 2091|回复: 8

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

[复制链接]
发表于 2012-11-1 16:25:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
刚刚看小甲鱼做的视频教程零基础学汇编的第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了...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-11-1 17:45:49 | 显示全部楼层
描述有点乱哈~

CPU只会直接执行指令,不会自动帮你清除栈里的数据的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-11-1 17:48:31 | 显示全部楼层
描述的简单点。。。  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-11-1 18:08:00 | 显示全部楼层

额,打个比方,不是说栈的数据弹出之后,CPU仅仅只是把栈顶元素的位置改变一下,指向下一个吗.原先的数据并不会消失...但是我试验发现弹出栈之后..原先的数据也消失了   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-11-1 20:58:59 | 显示全部楼层
我跟你说了多少遍了?看教程一定要认真 偏不听 现在知道错了吧~~:@:@:@

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

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-11-1 22:09:54 | 显示全部楼层
huise865 发表于 2012-11-1 20:58
我跟你说了多少遍了?看教程一定要认真 偏不听 现在知道错了吧~~

把栈设大点(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指令后的图如下:

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-11-1 22:10:30 | 显示全部楼层
huise865 发表于 2012-11-1 20:58
我跟你说了多少遍了?看教程一定要认真 偏不听 现在知道错了吧~~

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

求大神告知....能否加我QQ? 274898516;麻烦了 ,再次感谢;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-11-1 23:19:40 | 显示全部楼层

                               
登录/注册后可看大图


补图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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号码貌似忘了  不知道写在那里 有时间帮你找找!
刚才看海贼王去了 哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 13:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表