关于中断返回的问题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,再试试呢?
[其他解释]
修改中断向量了吗?
建议使用虚拟机测试
[其他解释]
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
push ds
push es
push si
push di
push cx
mov ax,cs
mov ds,ax
mov si,202h
mov ax,0b800h
mov es,ax
mov di,23*160+20*2
mov cx,13
s: mov al,[si]
mov ah,03
mov word ptr es:[di],ax
inc si
add di,2
loop s
pop cx
pop di
pop si
pop es
pop ds
pop ax
iret
div_err_end:nop
code ends
end start