代码
;实验12 编写0号中断的处理程序
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-offset do0 ;将内存中的中断处理程序的机器码,移动到 0000:0200处(处在中断向量表的空间范围,一般别的程序不使用)
cld
rep movsb ;串传送指令执行完毕 0000:0200就是中断处理程序的入口
mov ax,0 ;设置0号中断 的表向为0:0 0:0字单元存放偏移地址,0:2字单元存放段地址
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,202h ;ds:si指向字符串,复制到0:200处
mov ax,0b800h
mov es,ax
mov di,12*160+36*2 ;显示位置
mov cx,9
s:
mov al,[si]
mov es:[di],al
inc si
add di,2
loop s
mov ax,4c00h
int 21h
do0end:nop
code ends
end start
2. 在dos虚拟机中测试
一,先编译连接并安装中断程序
安装后的0号中断截图
- 0号中断指向中断处理程序的地址,当中断触发 cs:ip会设置成该地址
- 中断处理程序处的机器码
- 中断处理程序的反汇编
二,然后编译连接并运行测试程序
- 执行效果如下
三,int 0测试
事实上,不管是不是除法溢出,直接执行 int 0中断,就可以显示 "overflow"
- 在debug ,在当前指令处,执行汇编代码 int 0
- debug 单步跟踪显示 cs:ip 执行了 中断的入口程序地址 0000:0200