汇编语言笔记12
编程处理0号中断
中断处理程序应该放在内存中,在中断向量表中,许多单元是空的。从0000:0200到0000:02FF这256个字节对应的中断向量表都是空的,那么我们可以把中断处理程序放在这一段内存中。
编程处理0号中断的过程如下:
- 编写中断处理程序do0
- 将do0送入0000:0200处,使其常驻内存
- 将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 ;中断处理程序结束
|
完成安装后,下次出现除法错误将调用我们编写的中断处理程序