鱼C论坛

 找回密码
 立即注册
查看: 1933|回复: 4

第30讲关于push和pop的问题

[复制链接]
发表于 2012-8-7 15:54:14 | 显示全部楼层 |阅读模式
1鱼币
监测点6.1 第二题,我想弄清  push以后,内存里面究竟发生了什么,所以我在这句后面多加了几个字来标识
dw 0,0,0,0,0,0,0,0,0,0,12,45,78
然后我用debug中的d 来观看这段内存,并且在push后重新查看,

问题就是,当我push后,我发现除了push进的字之外,堆栈中还多了很多其他内容,包括段地址的数值也在栈中,
更要命的是,这个push后,因为我多加了3个数,导致前面
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h 中的内容被覆盖,
我请问这些多出来的字是什么,是不是固定的大小

最佳答案

查看完整内容

学到后面的中断就会懂啦。debug中的t命令会产生单步中断,系统的中断过程的压栈是: 这些数据要压入栈段中。 另外补充一下,t命令的压栈比系统的一般中断过程多两个字的压栈,具体为: 你发现的多出来的数据应该就是这5个字,也就是10个字节的值被压入栈,覆盖掉了你原来的数据,这些数据随着程序的运行会产生改变的,至少cs和ip肯定每次都不一样。 这也就解释了p136页第6小题,为什么用栈写的程序不能使用t命令单步调 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-8-7 15:54:15 | 显示全部楼层
本帖最后由 lukelqz 于 2012-8-7 16:53 编辑

学到后面的中断就会懂啦。debug中的t命令会产生单步中断,系统的中断过程的压栈是:
pushf
push cs
push ip
这些数据要压入栈段中。

另外补充一下,t命令的压栈比系统的一般中断过程多两个字的压栈,具体为:
pushf
push cs
push ip
push bp
push ax

你发现的多出来的数据应该就是这5个字,也就是10个字节的值被压入栈,覆盖掉了你原来的数据,这些数据随着程序的运行会产生改变的,至少cs和ip肯定每次都不一样。


这也就解释了p136页第6小题,为什么用栈写的程序不能使用t命令单步调试,单步调试就会出现错误。因为t单步调试会产生中断,会把标志寄存器、cs、ip、bp、ax 压入栈 导致栈顶超界的问题。
用g命令直接跳到mov ax,4c00h
就不会产生报错了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-7 23:57:56 | 显示全部楼层
还没学到这里......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-8 17:06:36 | 显示全部楼层
解释太详细了,谢谢lukelqz 了,正好在做这个136页的第六题,我倒没有用t来调试,直接用p是可以的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-8 17:23:41 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-20 13:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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