实验12编写0号中断为什么在中断处理程序加入iret后,出错
程序出现了字符串“divide error!” 但中断程序返回后 无法输入任何命令了
我在中断处理程序末尾加上了 iret 而不是 mov ax,4c00h int 21h
mov ax,0
mov es,ax
mov word ptr es:,200h
mov word ptr es:,0
mov dx,0ffffh
mov bx,1 ;测试一下
div bx
mov ax,4c00h
int 21h
程序没有预想那样,div bx 后发生溢出 转到处理中断程序后没有返回到12.exe程序里继续执行 mov ax,4c00h,
程序没有正常退出
int 0 引发的中断属于自陷,此时栈中的ip是指向引起中断的下一条指令。
而 div 引发的除零中断为故障,栈中的ip指向引起故障的指令本身,
所以如果在故障处理程序中不处理的话,iret返回后系统仍然会执行那条引起故障的指令
并再次引发除法中断,从而无休无止。
你的源代码运行后,系统CPU占用百分之百,也就是这个原因,死循环了。
推荐你阅读下面的文章:
http://blog.chinaunix.net/uid-49717-id-2392896.html
我改后的代码:
do0: jmp short s
db "divide error!"
s: mov bp,sp ;把当前sp赋给bp
add word ptr ss:,2;把当前栈中ip值改为+2,指向故障的下一条指令
push ds
push si
push cx
push es
push di
mov ax,cs
mov ds,ax
mov si,202h
mov ax,0b800h
mov es,ax
mov di,12*160+36*2
mov cx,13
s0: mov al,
mov es:,al
inc si
add di,2
loop s0
pop di
pop es
pop cx
pop si
pop ds
iret
;mov ax,4c00h
;int 21h
do0end: nop
下面是调试部分截图:
PS:你那个除法中断改成直接调用int0的话,你那个程序也可以正常运行。
看到int中断章后,感觉溢出中断,没有将cs、ip进行压栈,导致中断处理程序没法恢复cs、ip {:2_26:}可以把完整代码贴出来吗 整个代码有利于别人看的 assume cs:codesg
codesg segment
begin: mov ax,cs
mov ds,ax
mov si,offset do0
mov ax,0
mov es,ax
mov di,200h
mov cx,offset do0end - offset do0
cld
rep movsb
mov ax,0
mov es,ax
mov word ptr es:,200h
mov word ptr es:,0
mov dx,0ffffh
mov bx,1 ;测试一下
div bx
mov ax,4c00h
int 21h
do0: jmp short s
db "divide error!"
s: push ds
push si
push cx
push es
push di
mov ax,cs
mov ds,ax
mov si,202h
mov ax,0b800h
mov es,ax
mov di,12*160+36*2
mov cx,13
s0: mov al,
mov es:,al
inc si
add di,2
loop s0
pop di
pop es
pop cx
pop si
pop ds
iret ;mov ax,4c00h
;int 21h
do0end: nop
codesg ends
end begin
不好意思,补上我的全部代码 麻烦各位大牛了 lukelqz 发表于 2012-12-11 09:44 static/image/common/back.gif
你的源代码运行后,系统CPU占用百分之百,也就是这个原因,死循环了。
推荐你阅读下面的文章:
非常感谢 说的很到位您应该是个高手吧,以后还请多多指教啊 wawa 发表于 2012-12-12 09:10 static/image/common/back.gif
非常感谢 说的很到位您应该是个高手吧,以后还请多多指教啊
{:7_148:}俺是菜鸟,也就是用用百度加上自己理解而已了 今天遇到了同样的问题,终于解决了,谢谢各位大神
页:
[1]