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

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

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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值