编写了一个除法溢出的中断。中断标号为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