鱼C论坛

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

实验12编写0号中断为什么在中断处理程序加入iret后,出错

[复制链接]
发表于 2012-12-11 09:44:30 | 显示全部楼层 |阅读模式
5鱼币
11.jpg
程序出现了字符串“divide error!” 但中断程序返回后 无法输入任何命令了
我在中断处理程序末尾加上了 iret 而不是 mov ax,4c00h int 21h

                 mov ax,0
                 mov es,ax
                 mov word ptr es:[0],200h
                 mov word ptr es:[2],0
                 
                 mov dx,0ffffh
                mov bx,1 ;测试一下
               div bx

                 mov ax,4c00h
                 int 21h
程序没有预想那样,div bx 后发生溢出 转到处理中断程序后没有返回到12.exe程序里继续执行 mov ax,4c00h,
程序没有正常退出

最佳答案

查看完整内容

你的源代码运行后,系统CPU占用百分之百,也就是这个原因,死循环了。 推荐你阅读下面的文章: http://blog.chinaunix.net/uid-49717-id-2392896.html 我改后的代码: 下面是调试部分截图: PS:你那个除法中断改成直接调用int0的话,你那个程序也可以正常运行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-12-11 09:44:31 | 显示全部楼层
int 0 引发的中断属于自陷,此时栈中的ip是指向引起中断的下一条指令。
而 div 引发的除零中断为故障,栈中的ip指向引起故障的指令本身,
所以如果在故障处理程序中不处理的话,iret返回后系统仍然会执行那条引起故障的指令
并再次引发除法中断,从而无休无止。
你的源代码运行后,系统CPU占用百分之百,也就是这个原因,死循环了。

推荐你阅读下面的文章:
http://blog.chinaunix.net/uid-49717-id-2392896.html

我改后的代码:
do0: jmp short s
db "divide error!"
s: mov bp,sp ;把当前sp赋给bp
add word ptr ss:[bp],2;把当前栈中ip值改为+2,指向故障的下一条指令 
push ds
push si
push cx
push es
push di

mov ax,cs
mov ds,ax
mov si,202h

mov ax,0b800h
mov es,ax
mov di,12*160+36*2

mov cx,13
s0: mov al,[si]
mov es:[di],al
inc si
add di,2
loop s0

pop di
pop es
pop cx
pop si
pop ds 
iret
;mov ax,4c00h
;int 21h
do0end: nop
下面是调试部分截图:

12.11.15.07.jpg
12.11.15.17.jpg





PS:你那个除法中断改成直接调用int0的话,你那个程序也可以正常运行。
12.11.15.18.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-11 11:08:16 | 显示全部楼层
看到int中断章后,感觉溢出中断,没有将cs、ip进行压栈,导致中断处理程序没法恢复cs、ip
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-12-11 13:16:32 | 显示全部楼层
{:2_26:}可以把完整代码贴出来吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-12-11 13:32:02 | 显示全部楼层
整个代码有利于别人看的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-11 14:16:16 | 显示全部楼层
assume cs:codesg

codesg segment
  begin: mov ax,cs
         mov ds,ax
                 mov si,offset do0
                 
                 mov ax,0
                 mov es,ax
                 mov di,200h
                 
                 mov cx,offset do0end - offset do0
                 cld
                 rep movsb
                 
                 mov ax,0
                 mov es,ax
                 mov word ptr es:[0],200h
                 mov word ptr es:[2],0
                 
                 mov dx,0ffffh
         mov bx,1 ;测试一下
         div bx

                 mov ax,4c00h
                 int 21h
                 
        do0: jmp short s
             db "divide error!"
          s: push ds
             push si
                 push cx
                 push es
                 push di
                 
             mov ax,cs
             mov ds,ax
                 mov si,202h
                 
                 mov ax,0b800h
                 mov es,ax
                 mov di,12*160+36*2
                 
                 mov cx,13
         s0: mov al,[si]
         mov es:[di],al
         inc si
         add di,2
         loop s0
                 
                 pop di
                 pop es
                 pop cx
                 pop si
                 pop ds
                 
                 iret ;mov ax,4c00h
                      ;int 21h
do0end: nop
codesg ends
end begin
不好意思,补上我的全部代码 麻烦各位大牛了                 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-12 09:10:36 | 显示全部楼层

非常感谢 说的很到位  您应该是个高手吧,以后还请多多指教啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-12-12 11:58:06 | 显示全部楼层
wawa 发表于 2012-12-12 09:10
非常感谢 说的很到位  您应该是个高手吧,以后还请多多指教啊

{:7_148:}俺是菜鸟,也就是用用百度加上自己理解而已了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-1-29 21:46:13 | 显示全部楼层
今天遇到了同样的问题,终于解决了,谢谢各位大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-7 00:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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