读书人

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

发布时间: 2012-12-28 10:29:05 作者: rapoo

关于中断返回的问题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


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



引用:
上面code看不出问题

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

你的中断程序代码应该有问题。
我是debug div_err.exe后-g运行,然后-a,在里面写1L提到语句测试的。改的地方就是上面代码最后的,iret部分,直接用iret或者用mov ax,4c00h int 21h返回。

读书人网 >汇编语言

热点推荐