王爽汇编 实验12编写0号中断处理程序

来源:互联网 发布:ios看图软件 编辑:程序博客网 时间:2024/05/16 07:35

ASSUME    CS:codesg
              codesg SEGMENT
              start:  
                       MOV       AX,CS
                       MOV       DS,AX         ;程序段地址
                       MOV       SI,OFFSET DIV_s
                       MOV       AX,0
                       MOV       ES,AX
                       MOV       DI,0200H      ;保持中断处理程序的内存地址
                       MOV       CX,OFFSET DIV_ok - OFFSET DIV_s  ;得到中断处理程序的长度
                       CLD                     ;正向传送
                       REP       MOVSb
                       MOV       AX,0
                       MOV       ES,AX
                       MOV       WORD PTR ES:[0*4],0200h
                       MOV       WORD PTR ES:[0*4+2],0000h  ;设置中断向量表
                       MOV       AX,4c00h
                       INT       21h
         DIV_s:   JMP       SHORT DIV_s1
                       DB        "divide error!"
         DIV_s1:  MOV       AX,0b800h
                       MOV       ES,AX         ;显存缓冲区
                       MOV       DI,12*160+38*2 ;显存缓冲区大约中间位置

                 ;25/2=12(取整行数)*160(每行的字节数)+80/2=40(这里取用38列)*2(每列字符所占2位,低位存放ASCII码.高位存放属性)
                       MOV       AX,CS
                       MOV       DS,AX         ;当中断处理程序加载时,CS必然等于该处理程序的段地址0000:0200,

                                                       ;而字符串"divide error!"的段地址也是它
                       MOV       SI,202h       ;JMP       SHORT DIV_s1 占位2个机器码,所以偏移地址是0200+2
                       MOV       CX,12         ;字符串"divide error!"的长度
         DIV_s2:  MOV       AL,DS:[SI]   ;读取字符串
                       MOV       ES:[DI],AL   ;显示字符串
                       INC       SI
                       ADD       DI,2          ;一个字符占两个字节,低位存放ASCII码.高位存放属性
                       LOOP      DIV_s2
                       MOV       AX,4c00h
                       INT       21h
              DIV_ok:  NOP
              codesg ENDS
              END       start

原创粉丝点击