实验12 添加0号中断处理程序

实验12 添加0号中断处理程序

代码

;实验12 编写0号中断的处理程序

assume cs:code

code segment
start:
    mov ax,cs
    mov ds,ax
    mov si,offset do0   ;ds:si指向源地址

    mov ax,0
    mov es,ax
    mov di,200h         ;es:di指向目的地址
    
    mov cx,offset do0end-offset do0  ;将内存中的中断处理程序的机器码,移动到 0000:0200处(处在中断向量表的空间范围,一般别的程序不使用)
    				     
    cld                              
    rep movsb                        ;串传送指令执行完毕 0000:0200就是中断处理程序的入口
    
     

    mov ax,0        ;设置0号中断 的表向为0:0 0:0字单元存放偏移地址,0:2字单元存放段地址
    mov es,ax
    mov word ptr es:[0*4],200h   
    mov word ptr es:[0*4+2],0

    mov ax,4c00h
    int 21h

    do0: jmp short do0start
        db "overflow!"

    do0start:
        mov ax,cs
        mov ds,ax
        mov si,202h     ;ds:si指向字符串,复制到0:200处

        mov ax,0b800h
        mov es,ax
        mov di,12*160+36*2  ;显示位置

        mov cx,9
        s:
            mov al,[si]
            mov es:[di],al
            inc si
            add di,2
            loop s
        mov ax,4c00h
        int 21h
    do0end:nop
code ends
end start

2. 在dos虚拟机中测试

一,先编译连接并安装中断程序

安装后的0号中断截图

  • 0号中断指向中断处理程序的地址,当中断触发 cs:ip会设置成该地址
    实验12 添加0号中断处理程序
  • 中断处理程序处的机器码
    实验12 添加0号中断处理程序
  • 中断处理程序的反汇编
    实验12 添加0号中断处理程序

二,然后编译连接并运行测试程序

  • 执行效果如下
    实验12 添加0号中断处理程序

三,int 0测试

事实上,不管是不是除法溢出,直接执行 int 0中断,就可以显示 "overflow"

  • 在debug ,在当前指令处,执行汇编代码 int 0
    实验12 添加0号中断处理程序
  • debug 单步跟踪显示 cs:ip 执行了 中断的入口程序地址 0000:0200
    实验12 添加0号中断处理程序