王爽《汇编语言》实验12——编写0号中断的处理程序

时间:2022-06-22 01:14:10

;==========================================================================

;编写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