;==========================================================================
;编写0号中断的处理程序,使得在除法溢出发生时,
;在屏幕中间显示字符串"devideerror!",然后返回DOS.
;==========================================================================
ASSUME CS:CODE
DATA SEGMENT
DATA ENDS
CODE SEGMENT
START:
;0号中断的安装程序
MOV AX,CS ;让DS代表CODE段的段地址
MOV DS,AX ;以从CODE段复制中断处理程序
MOV SI,OFFSET DO0 ;(SI)=传送原始位置的起始偏移地址
MOV AX,0
MOV ES,AX ;(ES)=0
MOV DI,200H ;(DI)=200H,一段不会被使用的空间,用来存放中断处理程序
MOV CX,OFFSET DO0END-OFFSET DO0 ;(CX)=要复制的中断处理程序的长度
CLD ;DF标志位置零,正向传送
REP MOVSB ;将CX个字节的内容从DS:SI复制到ES:DI
;(将中断处理程序从CS段复制到0:200H处)
;设置中断向量表
MOV AX,0
MOV ES,AX ;(ES)=0
MOV WORD PTR ES:[0*4],200H ;设置0号中断的偏移地址为200H
MOV WORD PTR ES:[0*4+2],0 ;设置0号中断的段地址为0
;测试新的0号中断
MOV AX,DATA ;
MOV DS,AX
MOV AX,100H
MOV CL,0
DIV CL
MOV AH,07H ;获取键盘输入(无回显),获得显示结果用
INT 21H
MOV AX,4C00H
INT 21H
;0号中断处理程序
;这是要复制到0:200H处的
;以0:200H处的视角看待这段程序,而不要以CODE段的视角看待这段程序
DO0:
JMP DO0START
DB "devide error!" ;要输出的字符串,存放在这里而不能存放在DS段,
;因为可能被别的信息覆盖
DO0START:
MOV AX,0 ;(DS)=0
MOV DS,AX
MOV SI,202H ;DS:SI指向字符串
MOV AX,0B800H
MOV ES,AX ;(ES)=显示缓冲区段地址
MOV DI,12*160+33*2 ;屏幕的中间位置
MOV CX,13 ;字符串长度=13
S: ;输出字符串
MOV AL,[SI] ;字符=(AL)=[SI]
MOV ES:[DI],AL ;输出到屏幕
INC SI ;SI+1,指向下一个字符
ADD DI,2 ;DI+2,指向屏幕的下一个位置
LOOP S ;输出下一个字符
MOV AX,4C00H ;中断处理程序结束,返回DOS
INT 21H
DO0END:
NOP
CODE ENDS
END START