wawa 发表于 2012-12-11 09:44:30

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


程序出现了字符串“divide error!” 但中断程序返回后 无法输入任何命令了
我在中断处理程序末尾加上了 iret 而不是 mov ax,4c00h int 21h

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

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

lukelqz 发表于 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:,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,
mov es:,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
下面是调试部分截图:








PS:你那个除法中断改成直接调用int0的话,你那个程序也可以正常运行。

wawa 发表于 2012-12-11 11:08:16

看到int中断章后,感觉溢出中断,没有将cs、ip进行压栈,导致中断处理程序没法恢复cs、ip

lukelqz 发表于 2012-12-11 13:16:32

{:2_26:}可以把完整代码贴出来吗

shdfsbgfjks 发表于 2012-12-11 13:32:02

整个代码有利于别人看的

wawa 发表于 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:,200h
               mov word ptr es:,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,
         mov es:,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
不好意思,补上我的全部代码 麻烦各位大牛了               

wawa 发表于 2012-12-12 09:10:36

lukelqz 发表于 2012-12-11 09:44 static/image/common/back.gif
你的源代码运行后,系统CPU占用百分之百,也就是这个原因,死循环了。

推荐你阅读下面的文章:


非常感谢 说的很到位您应该是个高手吧,以后还请多多指教啊

lukelqz 发表于 2012-12-12 11:58:06

wawa 发表于 2012-12-12 09:10 static/image/common/back.gif
非常感谢 说的很到位您应该是个高手吧,以后还请多多指教啊

{:7_148:}俺是菜鸟,也就是用用百度加上自己理解而已了

suyu 发表于 2015-1-29 21:46:13

今天遇到了同样的问题,终于解决了,谢谢各位大神
页: [1]
查看完整版本: 实验12编写0号中断为什么在中断处理程序加入iret后,出错