注册 登录
编程论坛 汇编论坛

关于DIV溢出

xiaojihua20 发布于 2010-07-13 08:20, 957 次点击
CPU是如何得知DIV中断的,中断时会对PSW寄存器状态有影响吗?
以下是我写的一个DIV中断安装程序

assume cs:code
code segment

  start: mov ax,cs
         mov ds,ax
         mov si,offset r0
         
         mov ax,0
         mov es,ax
         mov di,0200H
         
         mov cx,offset r0_end - offset r0
         cld
         rep movsb
         
         mov ax,0
         mov es,ax
         mov word ptr es:[0],0200H
         mov word ptr es:[2],0
         
         mov ax,4c00H
         int 21H
         
     r0: jmp short r0_st
         db "divide error!"
         db 0
         
  r0_st: mov ax,cs
         mov ds,ax
         mov si,0202H
         mov ax,0B800H
         mov es,ax
         mov di,12*160+36*2
         
   show: mov cl,[si]
         mov ch,00H
         jcxz show_en
         mov es:[di],cx
         inc di
         mov cx,01000010B
         mov es:[di],cx
         inc di
         inc si
         jmp short show
         
show_en: iret

 r0_end: nop
 
 code ends
 end start

我把此中断程序放在0000:0200处,如果产生DIV中断,则会执行此中断程序,程序执行完后用 iret 返回。
但是实际情况却是一直在执行此中断程序,无法结束。我认为用 iret 时已经返回了调用些中断的程序,但是返回后又执行了此中断程序,所以此中断程序会一直执行下去。对此很不解,请高手指点。谢谢!
4 回复
#2
东海一鱼2010-07-13 11:30
恕我眼拙,不知道楼主怎莫确定div中断处理要放在0000:0200处哪。
很久不玩dos TSR了,不过隐约记得前1024字节是中断向量表区啊。
#3
xiaojihua202010-07-13 18:09
回复 2楼 东海一鱼
是的,前1024B是放中断向量表的,但是这1024B不会被用完,0200H-0300H是空闲的。所以只是我试着把新的中断程序放在那里,这并不是问题的重点。
#4
东海一鱼2010-07-14 09:34
汗一个,我是说你并没有截获div中断的原地址,怎莫能确定div中断会跳到你这里来哪。
1