修改int 0中断后,用iret返回会进入死循环是怎么回事呢?

lxslove 2010-06-09 01:56:06
我尝试修改了int 0中断的处理例程,如果用iret做返回的话,则程序会不断打印“div error!”,请问是怎么回事 呢?
测试程序如下:
assume cs:code
code segment
start:
int 0

code ends
end start

修改int 0中断的代码如下:
assume cs:code
code segment
start:
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 ds,ax
mov word ptr ds:[0], 200h
mov word ptr ds:[2], 0h

mov ax,4c00h
int 21h
;以下是新的int 0中断例程
do0:jmp short do0Start
msg:db "div error!$"
do0Start:
mov ax,cs
mov ds,ax
mov dx, 202h
mov ah, 09h
int 21
iret ;如果这儿用mov ax,4c00, int 21h是没有问题的。

do0end:
nop
code ends
end start
...全文
141 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
1cctv 2010-06-09
  • 打赏
  • 举报
回复
学习了。
  • 打赏
  • 举报
回复
楼上正解,看几本基础的汇编书吧,都是这么讲的
  • 打赏
  • 举报
回复
从286开始,ex0是fault型异常,中断发生在指令边界,这意味着iret返回之后会重启发生异常的指令,当然就死循环了。
你需要在异常处理中修改栈中的返回值,指向产生除以0异常的那条指令的下一条指令。
1cctv 2010-06-09
  • 打赏
  • 举报
回复
呵呵。
1 进入中断首先要保存用到的寄存器。
2 在int 0 中断例程中你用 int 10 输出字符串试试。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧