哮月苍狼 发表于 2011-7-22 21:19:14

寄存器问题3.10求解

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

书上66页 ,问题3.10理论实现的程序不能在DEBUG中运行完成的程序:mov ax,2000H    (因为1000:0有系统数据,所以我改成2000:0)mov ss,axmov sp,2mov ax,2266Hpush axfile:///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都不会报错退出,这究竟是为什么呢?

bevin 发表于 2011-7-22 21:43:14

lz图片貌似没有上传成功= =

linha0 发表于 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。

linha0 发表于 2011-7-22 21:59:05

linha0 发表于 2011-7-22 21:57 static/image/common/back.gif
在网上搜了一下,顺便分享一下比较靠谱的解释,经测试后执行结果成功。
错误在于堆栈设置的太小,sp=4时 ...

上面是引用
http://bbs.fishc.com/forum.php?mod=viewthread&tid=3135&highlight=6.3
中的,Pino 的回答

哮月苍狼 发表于 2011-7-25 08:50:34

这贴别让他沉了呀,我还没搞清楚呢,大家多帮忙哈
页: [1]
查看完整版本: 寄存器问题3.10求解