ASSUME CS:codesg
codesg SEGMENT
start:
MOV AX,CS
MOV DS,AX ;程序段地址
MOV SI,OFFSET DIV_s
MOV AX,0
MOV ES,AX
MOV DI,0200H ;保持中断处理程序的内存地址
MOV CX,OFFSET DIV_ok - OFFSET DIV_s ;得到中断处理程序的长度
CLD ;正向传送
REP MOVSb
MOV AX,0
MOV ES,AX
MOV WORD PTR ES:[0*4],0200h
MOV WORD PTR ES:[0*4+2],0000h ;设置中断向量表
MOV AX,4c00h
INT 21h
DIV_s: JMP SHORT DIV_s1
DB "divide error!"
DIV_s1: MOV AX,0b800h
MOV ES,AX ;显存缓冲区
MOV DI,12*160+38*2 ;显存缓冲区大约中间位置
;25/2=12(取整行数)*160(每行的字节数)+80/2=40(这里取用38列)*2(每列字符所占2位,低位存放ASCII码.高位存放属性)
MOV AX,CS
MOV DS,AX ;当中断处理程序加载时,CS必然等于该处理程序的段地址0000:0200,
;而字符串"divide error!"的段地址也是它
MOV SI,202h ;JMP SHORT DIV_s1 占位2个机器码,所以偏移地址是0200+2
MOV CX,12 ;字符串"divide error!"的长度
DIV_s2: MOV AL,DS:[SI] ;读取字符串
MOV ES:[DI],AL ;显示字符串
INC SI
ADD DI,2 ;一个字符占两个字节,低位存放ASCII码.高位存放属性
LOOP DIV_s2
MOV AX,4c00h
INT 21h
DIV_ok: NOP
codesg ENDS
END start