鱼C论坛

 找回密码
 立即注册
查看: 6151|回复: 15

[争议讨论] 关于PUSH,POP指令

[复制链接]
发表于 2012-2-2 22:40:32 | 显示全部楼层 |阅读模式
2鱼币
记得小甲鱼在一集视频中提到,pop指令只是将数据复制出去,那说明经过pop指令后数据不变。
可是,在实验五第一题和第二题中,(图中以第二题为例)为什么经过pop指令后栈中数据会变化?难道是CPU背后又给栈中进行了push指令改变的吗?

4.rar

18.89 KB, 下载次数: 25

最佳答案

查看完整内容

汇编语言 第61页,栈里面的数据是不会变的。 拿OD调试程序也可以证明不会变。 看来是和 debug 有关了,debug 在调试的时候影响了堆栈。 执行T命令时,tf if入栈,cs ip入栈,栈里面的数据会受到影响。 哦,这4步是在网上查的,debug的原理不太清楚。 我认为是这样的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-2 22:40:33 | 显示全部楼层

汇编语言 第61页,栈里面的数据是不会变的。
拿OD调试程序也可以证明不会变。
看来是和 debug 有关了,debug 在调试的时候影响了堆栈。
debug中的t命令

书上说是用了单步中断的原理

1.取得中断码
2.tf if入栈
3.cs ip入栈
4.响应中断

执行T命令时,tf if入栈,cs ip入栈,栈里面的数据会受到影响。
哦,这4步是在网上查的,debug的原理不太清楚。
我认为是这样的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-2-2 22:42:47 | 显示全部楼层
图中的0C0D:000C~000F,应该是56 04 23 01。可是却被覆盖了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-2-3 00:08:09 | 显示全部楼层
:L你不应该去看栈中(ss)的数据,pop出来  数据应该在 DS:BX段中 跟以前 逆序存放的。。。   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-2-3 00:31:38 | 显示全部楼层
为什么经过pop指令后栈中数据会变化?

pop指令执行后栈顶指针变了,指向的数据变了,当然会变,不然后面的数据怎么办:L
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-2-3 14:26:18 | 显示全部楼层
小军 发表于 2012-2-3 00:08
你不应该去看栈中(ss)的数据,pop出来  数据应该在 DS:BX段中 跟以前 逆序存放的。。。

恩,这个我知道,我就是不明白自己没有改变栈中的数据,他为什么会变~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-2-3 14:28:23 | 显示全部楼层
Seely 发表于 2012-2-3 00:31
pop指令执行后栈顶指针变了,指向的数据变了,当然会变,不然后面的数据怎么办

我觉得可能你没有搞清楚我的问题,就是说经过POP指令后,是把栈中的数据复制出去,那应该栈中数据不变化,而这里变化了。请问这是为什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-2-3 17:40:31 | 显示全部楼层
本帖最后由 Seely 于 2012-2-3 23:58 编辑
8023az 发表于 2012-2-3 14:28
我觉得可能你没有搞清楚我的问题,就是说经过POP指令后,是把栈中的数据复制出去,那应该栈中数据不变化, ...


debug的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-2-3 21:38:38 | 显示全部楼层
Seely 发表于 2012-2-3 17:40
不知道是小甲鱼说的不清楚还是你理解错了,是把数据弹出而不是复制。
如果只是复制的话,就相当于没 ...

请问POP指令数据弹出的意思是仅仅把数据拿出来吗?那原来在栈中的数据会根据内存的需求自己改变吗?是这个意思吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-2-4 11:03:28 | 显示全部楼层
Seely 发表于 2012-2-4 00:03
汇编语言 第61页,栈里面的数据是不会变的。
拿OD调试程序也可以证明不会变。
看来是和 debug 有关了, ...

也就是说,pop指令把数据复制出来,栈中数据开始没有变化,可是因为debug的t命令使得栈中数据发生了变化。懂了!多谢不厌其烦的教导!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-2-5 18:55:25 | 显示全部楼层
当栈中的数据被pop出的时候  SP也发生变化 懂吧  也就是指针不在原来那地址了。
你把 SP该回来应该能看见以前的数据。。汇编视频里有讲的。前提是 以前的数据没被覆盖。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-2-6 10:51:42 | 显示全部楼层
Seely 发表于 2012-2-2 22:40
汇编语言 第61页,栈里面的数据是不会变的。
拿OD调试程序也可以证明不会变。
看来是和 debug 有关了, ...

2是标志寄存器入栈,TF=0,IF=0
目的是保存原来的标志寄存器,完成中断后恢复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-2-9 18:03:26 | 显示全部楼层
指针变了,所以看到的数据变了。你只要查看pop钱栈指针位置的数据,肯定是不变的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-10-8 21:58:03 | 显示全部楼层
感谢楼主谢谢你 学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-10-8 22:00:56 | 显示全部楼层
感谢楼主谢谢你 学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-10-14 10:31:17 | 显示全部楼层
来学习一下,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-27 00:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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