assume cs:codesg
codesg segment
start:
mov ax,0
mov es,ax
mov di,0200h ;将es:di 指向 divError中断处理程序的要存放的起始地址 设置目的地址 即代码段存放到0:200处
mov ax,codesg ;或者使用mov ax,cs 效果相同
mov ds,ax
mov si,offset divError ;将ds:si 指向 divError中断处理程序的起始地址 设置目的地址
cld ;设置DF=0 正向传送
mov cx,offset divErrEnd - offset divError;计算整个中断程序的长度 注意这里要用divError
rep movsb ;将中断处理程序放到0200:0000的内存段中
mov ax,0
mov ds,ax
mov word ptr ds:[0],200h ;设置中断向量表 就是中断程序执行的起始地址的IP 偏移地址
mov word ptr ds:[2],0 ;设置中断向量表 就是中断程序执行的起始地址的CS 段地址
mov dx,3
mov ax,1
mov cx,1
div cx ;测试除法溢出 div指令格式 div reg 或 div 内存单元
mov ax,4c00h
int 21h
divError: ;除法溢出时显示"divide error!" 也就是说divError的功能是在屏幕上显示 divide error!
jmp short divErr1 ;注意"divide error!" 是不可执行代码 所以要在其前面加上,jmp指令 跳过它 转而执行可执行代码
db "divide error!" ;屏幕要显示的内容
divErr1:mov ax,0b800h ;注意这条指令为中断程序的执行开始,而上面的数据域费程序的入口 参照codesg
mov es,ax
mov di,12*160 ;要在屏幕上显示的位置
mov ax,cs ;此时cs:ip已经指向到了中断程序内
mov ds,ax ;找到要显示的字符串地址
mov bx,202h ;设置ds:si指向字符串 bx指向字符串的起始地址 jmp short divErr1指令占了两个字节
mov cx,13 ;要显示的字符串的长度
s: mov al,[bx]
mov byte ptr es:[di],al
mov byte ptr es:[di+1],00001011b;设置字体颜色为绿色高亮
inc bx
add di,2
loop s
mov ax,4c00h
int 21h ;中断程序执行完成后返回DOS
divErrEnd: nop ;nop 占一个字节
codesg ends
end start
小结: 一定要区分开主程序,和中断处理程序 中断处理程序中使用的寄存器与主程序中使用的寄存器是完全独立的,两者之间没有任何的影响。