1.什么是中断?
中断是指cpu停止当前指令,转而去执行其他指令或代码的一种机制,其中中断的信息被保存在中断向量表中。
80x86中断向量
I/O ADDR
|
INT TYPE(16进制)
|
FUNCTION
|
00 ~ 03
|
0
|
除法溢出中断
|
04 ~ 07
|
1
|
单步(用于DEBUG)
|
08 ~ 0B
|
2
|
非屏蔽中断(NMI)
|
0C ~ 0F
|
3
|
断点中断(用于DEBUG)
|
10 ~ 13
|
4
|
溢出中断
|
14 ~ 17
|
5
|
打印屏幕
|
18 ~ 1F
|
6/7
|
保留
|
2.我们来模拟0号中断,即除法溢出中断
DATAS SEGMENT
DATAS ENDS
STACKS SEGMENT
dw 8 dup(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:mov ax,0
mov es,ax ;标记目标内存段地址
mov di,0200h ;标记目标地址偏移量
mov ax,cs ;标记源段地址
mov ds,ax
mov si,offset do0 ;标记源地址偏移地址
mov cx,offset do0end-offset do0 ;标记字符处理函数代码长度
mov word ptr es:[0],di
mov word ptr es:[2],es
cld
rep movsb
int 00h ;模拟0号中断
do0:jmp do1
db 'overflow'
do1:mov bx,cs
mov ds,bx
mov si,0202h ;因为jmp指令占2字节,所以di偏移量为202h
mov di,12*160+5*2
mov ax,0b800h ;标记显存地址
mov es,ax
mov cx,8
s:mov byte ptr al,ds:[si] ;高位地址记录字符属性,低位地址记录字符ASCII码
mov byte ptr es:[di],al
inc si
add di,2
loop s
mov ax,4c00h
int 21h
do0end:nop ;标记结束以方便记录指令长度
CODES ENDS
END START