版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ma2595162349/article/details/91125739
中断是指CPU不再接着向下执行,而是转去处理这个特殊信息,这个特殊信息可以是CPU外部发过来的或内部产生的一种特殊信息,CPU在收到中断信息后,应该转去执行该中断信息的处理程序。发生中断时, CPU会收到中断信息,中断信息中包含有标识中断源的类型码,通过中断类型码可以在中断向量表中找到对应的中断处理程序的入口地址。对于8086pc机,中断向量表指定放在内存地址的0处。中断处理完成后,CPU会去执行前面发生中断指令的对应的下一跳指令,所以发生中断时要先保存当前程序的运行环境,再跳到中断处理程序。
assume cs:code,ss:stack
stack segment
dw 4 dup (0)
stack ends
code segment
;安装中断处理程序,将中断处理程序安在0000:0200
start: mov ax,cs
mov ds,ax ;设置ds:si指向源地址
mov si,offset do0 ;offset do0相当于取do0的偏移地址
mov ax,0
mov es,ax
mov di,200h ;设置es:di指向目的地址
mov cx,offset do0end-offset do0 ;设置传输的长度
cld ;设置传输的方向为正,告诉程序向前移动
rep movsb ;将do0的代码送到0:200处,rep是循环传送
;设置中断向量表,我们的中断处理程序就加载在这个地址,div产生的中断类型码为0
mov word ptr es:[0*4],200h
mov word ptr es:[0*4+2],0
;写检测程序
mov dx,152
mov ax,0
mov cx,2
div cx
;编写中断处理程序
do0: jmp short do0start
db 'divide error!'
do0start:mov ax,cs
mov ax,cs
mov ds,ax
mov si,202h ;设置ds:si指向字符串,前提是我们把程序安装在200h开始的内存中
mov ax,0b800h ;设置es:di指向显存中的位置,下面的指令是对字符串做显色处理
mov es,ax
mov di,160*12+34*2
mov cx,13 ;设置字符串的长度
dnext: mov al,[si]
mov es:[di],al
mov byte ptr es:[di+1],81h
inc si
add di,2
loop dnext
mov ah,4ch
int 21h
do0end:nop
code ends
end start
下面来debug一下上面的程序。
上面是rep movsb执行完后,内存0000:02000的结果,可以看到程序已经被送到这里了。
上面是设置了中断向量表之后的结果,00 00 02 00刚好是中断程序对应的段地址和偏移地址。
执行到div发生了中断,调用了中断处理程序。