鱼C论坛

 找回密码
 立即注册
查看: 5431|回复: 8

实验12编写0号中断为什么在中断处理程序加入iret后,出错

[复制链接]
发表于 2012-12-11 09:44:30 | 显示全部楼层 |阅读模式
5鱼币
11.jpg
程序出现了字符串“divide error!” 但中断程序返回后 无法输入任何命令了
我在中断处理程序末尾加上了 iret 而不是 mov ax,4c00h int 21h

                 mov ax,0
                 mov es,ax
                 mov word ptr es:[0],200h
                 mov word ptr es:[2],0
                 
                 mov dx,0ffffh
                mov bx,1 ;测试一下
               div bx

                 mov ax,4c00h
                 int 21h
程序没有预想那样,div bx 后发生溢出 转到处理中断程序后没有返回到12.exe程序里继续执行 mov ax,4c00h,
程序没有正常退出

最佳答案

查看完整内容

你的源代码运行后,系统CPU占用百分之百,也就是这个原因,死循环了。 推荐你阅读下面的文章: http://blog.chinaunix.net/uid-49717-id-2392896.html 我改后的代码: 下面是调试部分截图: PS:你那个除法中断改成直接调用int0的话,你那个程序也可以正常运行。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-12-11 09:44:31 | 显示全部楼层
int 0 引发的中断属于自陷,此时栈中的ip是指向引起中断的下一条指令。
而 div 引发的除零中断为故障,栈中的ip指向引起故障的指令本身,
所以如果在故障处理程序中不处理的话,iret返回后系统仍然会执行那条引起故障的指令
并再次引发除法中断,从而无休无止。
你的源代码运行后,系统CPU占用百分之百,也就是这个原因,死循环了。

推荐你阅读下面的文章:
http://blog.chinaunix.net/uid-49717-id-2392896.html

我改后的代码:
  1. do0: jmp short s
  2. db "divide error!"
  3. s: mov bp,sp ;把当前sp赋给bp
  4. add word ptr ss:[bp],2;把当前栈中ip值改为+2,指向故障的下一条指令
  5. push ds
  6. push si
  7. push cx
  8. push es
  9. push di

  10. mov ax,cs
  11. mov ds,ax
  12. mov si,202h

  13. mov ax,0b800h
  14. mov es,ax
  15. mov di,12*160+36*2

  16. mov cx,13
  17. s0: mov al,[si]
  18. mov es:[di],al
  19. inc si
  20. add di,2
  21. loop s0

  22. pop di
  23. pop es
  24. pop cx
  25. pop si
  26. pop ds
  27. iret
  28. ;mov ax,4c00h
  29. ;int 21h
  30. do0end: nop
复制代码

下面是调试部分截图:

12.11.15.07.jpg
12.11.15.17.jpg





PS:你那个除法中断改成直接调用int0的话,你那个程序也可以正常运行。
12.11.15.18.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-11 11:08:16 | 显示全部楼层
看到int中断章后,感觉溢出中断,没有将cs、ip进行压栈,导致中断处理程序没法恢复cs、ip
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-11 13:16:32 | 显示全部楼层
{:2_26:}可以把完整代码贴出来吗
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-11 13:32:02 | 显示全部楼层
整个代码有利于别人看的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-11 14:16:16 | 显示全部楼层
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:[0],200h
                 mov word ptr es:[2],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,[si]
         mov es:[di],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
不好意思,补上我的全部代码 麻烦各位大牛了                 
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-12 09:10:36 | 显示全部楼层

非常感谢 说的很到位  您应该是个高手吧,以后还请多多指教啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-12 11:58:06 | 显示全部楼层
wawa 发表于 2012-12-12 09:10
非常感谢 说的很到位  您应该是个高手吧,以后还请多多指教啊

{:7_148:}俺是菜鸟,也就是用用百度加上自己理解而已了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-1-29 21:46:13 | 显示全部楼层
今天遇到了同样的问题,终于解决了,谢谢各位大神
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-7 08:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表