鱼C论坛

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

寄存器问题3.10求解

[复制链接]
发表于 2011-7-22 21:19:14 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 哮月苍狼 于 2011-7-22 22:48 编辑

书上66页 ,问题3.10
理论实现的程序不能在DEBUG中运行
完成的程序:
mov ax,2000H    (因为10000有系统数据,所以我改成20000)
mov ss,ax
mov sp,2
mov ax,2266H
push ax
file:///C:/DOCUME~1/chongzi/LOCALS~1/Temp/ksohtml/wps_clip_image-7487.png
执行到MOV AX,2266,再执行T命令就报错退出。
file:///C:/DOCUME~1/chongzi/LOCALS~1/Temp/ksohtml/wps_clip_image-7552.png
我把MOV SP,2,改成MOV SP,4,同样也是执行到这一步就报错退出了。
file:///C:/DOCUME~1/chongzi/LOCALS~1/Temp/ksohtml/wps_clip_image-7604.png
把mov sp,4改成mov sp,6执行到PUSH AX就报错退出了
但是让人纠结的是把mov sp,6改成mov sp,8,不管T多少下,DEBUG都不会报错退出,这究竟是为什么呢?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-22 21:43:14 | 显示全部楼层
lz图片貌似没有上传成功  = =
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-22 21:57:53 | 显示全部楼层

在网上搜了一下,顺便分享一下比较靠谱的解释,经测试后执行结果成功。
错误在于堆栈设置的太小,sp=4时,如果发生硬件中断(如每秒18.2次的时钟中断),会导致堆栈空间不够用,sp跨段,中断处理程序中的iret指令没法返回正确的地址,也就是跑飞了,运行到一个存在非法指令的地址上去了,所以才会有你看到的结果。

只有sp=4时才出现错误,sp=0,sp=2的情况不出现错误,试验一下确实如此。
硬件中断产生时,需要压入堆栈内6个字节。
调用中断的命令int x
相当于下面这四句:
pushf
push cs
push ip
jmp **X:**X ;**:**x是从中断向量表中查出的地址。
只有在sp=4时导致压入的cs和ip不在一起,无**确返回。
如果让sp=3,在我的机器上,会让debug直接退出,并不会出现错误。

摘自:http://zhidao.baidu.com/question/137924225.html

结论,避免出现这种错误的方法就是让sp足够大,绝对不能小于6。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-22 21:59:05 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-7-25 08:50:34 | 显示全部楼层
这贴别让他沉了呀,我还没搞清楚呢,大家多帮忙哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-19 02:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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