汇编语言笔记12

编程处理0号中断

中断处理程序应该放在内存中,在中断向量表中,许多单元是空的。从0000:0200到0000:02FF这256个字节对应的中断向量表都是空的,那么我们可以把中断处理程序放在这一段内存中。

编程处理0号中断的过程如下:

  1. 编写中断处理程序do0
  2. 将do0送入0000:0200处,使其常驻内存
  3. 将do0的入口地址存到中断向量表的0号表项中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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-do0 ;通过do0end-do0来计算出do0部分代码所占字节
cld ;设置传输方向为正向
rep movsb ;循环移入

;设置中断向量
mov ax,0
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,202 ;设置ds:si指向字符串,jmp short do0Start占两个字节

mov ax,0B800H
mov es,ax
mov di 12*160+36*2 ;设置es:si指向显示缓冲的中间位置:一行160字节,12*160+36*2

mov cx,9 ;字符串长度为9
s: mov al,[si]
mov es:[di],al
inc si
add di,2
loop s

mov ax,4C00H
int 21H

do0end:nop ;中断处理程序结束

完成安装后,下次出现除法错误将调用我们编写的中断处理程序