当前位置: 代码迷 >> 汇编语言 >> 关于中断返回的有关问题int N
  详细解决方案

关于中断返回的有关问题int N

热度:2687   发布时间:2013-02-26 00:00:00.0
关于中断返回的问题int N
编写了一个除法溢出的中断。中断标号为0.
返回语句用mov ax,4c00h 
         int 21h(返回到DOS)
的时候能正常返回。
但用iret(功能介绍说能返回当前语句,继续向下执行)的时候。
我这样写 mov ax,1000h
        mov dh,1
        div dh(单步执行的时候,会直接跳出div_err的警告。不会进入中断程序)
        mov ax,2000H
        ...
前面三句为了产生除法溢出中断,能引起中断,但返回不到当前程序,继续往下执行mov ax,2000H,而是跳到其他的CS:IP执行其他代码。
而我直接写int 0(进入中断程序单步执行)
         mov ax,2000H
         ...
的时候,可以产生中断,并且正确返回到当前程序,继续执行mov ax,2000H

有没有高手帮忙解释下,这两种进入中断方式有什么区别啊?为什么会这样?
------最佳解决方案--------------------------------------------------------
.DIV   无符号数除法指令
格式:    DIV   SRC
执行的操作:
  字节操作:(AL)<-(AX)/(SRC)的商
            (AH)<-(AX)/(SRC)的余数
   字操作:   (AX)<-(DX,AX)/(SRC)的商
            (AX)<-(DX,AX)/(SRC)的余数

div dh 会使用dx,这条指令应该不能用吧. 我从来没有try过. 这样会不会导致cpu异常,所以没有返回

lz把dh改为ch,再试试呢? 
------其他解决方案--------------------------------------------------------
修改中断向量了吗?
建议使用虚拟机测试
------其他解决方案--------------------------------------------------------
引用:
修改中断向量了吗?
建议使用虚拟机测试

中断还是除法溢出中断,中断号是0,改的是它的入口地址,让它产生中断的时候去执行的处理程序变成自己写的那个,而不是原来的。
------其他解决方案--------------------------------------------------------
还是一样的,做的是8位除法 ,应该没有用到DX的
------其他解决方案--------------------------------------------------------
上面code看不出问题

你写的中断程序代码确认正确吗?
1. int 0调用引起的中断:会自动保存返回地址
2. div dh 引起的int0,不会自动保存返回地址,需要你从x86保存的发生异常的cs:eip来恢复执行,x86不会自动处理的。

你的中断程序代码应该有问题。
------其他解决方案--------------------------------------------------------
assume cs:code
code segment
start:mov ax,0
      mov es,ax
      mov di,200h
      mov ax,cs
      mov ds,ax
      mov si,offset div_err
      mov cx,offset div_err_end-offset div_err
      cld
      rep movsb
      mov ax,0
      mov ds,ax
      mov word ptr ds:[0],200h
      mov word ptr ds:[2],0

      mov ax,4c00h
      int 21h
 div_err:jmp short div_err_start
         db'divide error!'
stack segment
 dw 16 dup(0)
stack ends
div_err_start:
              mov ax,stack
              mov ss,ax
              mov sp,32

              push ax
  相关解决方案