汇编语言 实验12 编写0号中断的处理程序

汇编语言 实验12 编写0号中断的处理程序


1.需要的基础知识

中断:
CPU收到某种特殊信号之后,停下手头的工作,转向处理发出这种特殊信号的程序。而这种特殊的信号,就叫做中断。
一共有四种中断类型:
    1.除数为0的错误
    2.单步执行(标志寄存器TF位=1时执行,如t指令)
    3.执行into指令
    4.执行int指令
        我们之前写的程序的结尾一般都是mov ax,4c00h int 21h
        后面这个int 21h就是中断指令,21h代表的就是中断向量表中的第21h个中断处理程序,所以int 21h连起来的意思就是,执行21h号中断处理程序。
中断向量表:
当CPU处理中断的时候,需要将CS:IP指向对应的中断处理程序。而中断处理程序的入口地址(段地址:偏移地址)是放在一张表中的。入口地址叫做中断向量(即段地址+偏移地址一共四个字节的信息,前两个字节代表中断处理程序的偏移地址,后两个字节代表的是段地址),而这张表就叫做中断向量表。
中断的过程:
1.获得中断类型码N
2.pushf(flag寄存器入栈)
3.TF=0(见上面的中断类型2),IF=0
4.push CS
5.push IP
6.IP=N*4,CS=N*4+2

2.自己编写一个0号中断的处理程序!(即上面的中断类型1:除法出错)

assume cs:code
code segment
start:  mov ax,0
    mov ds,ax
    mov word ptr ds:[0],200h
    mov word ptr ds:[2],0

    mov ax,cs
    mov ds,ax
    mov si,offset do0
    mov ax,0
    mov es,ax
    mov di,200h
    mov cx,offset do0_end-offset do0
    cld
    rep movsb

    ;test
    mov ax,1
    mov cx,0
    div cx

    mov ax,4c00h
    int 21h

do0:    
    jmp do0_start
    db "divide error!"
do0_start:
    mov ax,0b800h
    mov es,ax
    mov di,1680

    mov ax,0
    mov ds,ax
    mov si,203h
    mov cx,13
s:  mov al,ds:[si]
    mov es:[di],al
    inc si
    add di,2
    loop s

    mov ax,4c00h
    int 21h

do0_end:nop

code ends
end start
输出结果:

中断处理程序的输出结果见第四行中间: )

原文地址:https://www.cnblogs.com/litlife/p/7512770.html