;实验12 编写0号中断的处理程序,使得除法溢出发生时,在屏幕中间显示字符窜"divide error"然后返回到dos.
;分析:本题重点 1.改写向量表中 0中断码 表项地址,使其指向目标程序 2.编写目标程序 作用为把"divide error"发送到显存,后返回dos
;不设置颜色可能会看不出来。。因为都黑色..
assume cs:code
code segment
mov ax,0
mov es,ax
mov word ptr es:[0],200H
mov word ptr es:[2],0 ;0中断码入口地址指向0:200H
mov ax,code
mov ds,ax
mov si,offset err_show ;ds:si指向源地址
mov ax,0
mov es,ax
mov di,200H ;es:di指向 0:200H
cld
mov cx,offset err_end-offset err_show
rep movsb ;开始复制
mov ax,4c00H
int 21H
err_show:mov ax,cs
mov ds,ax
mov si,offset err_char-offset err_show+200H
;ds:si指向源地址 offset err_char-offset err_show表示2个标号间的差,由于 err_show是从0段的200开始 所以最后切记加上200H
mov ax,0B800H
mov es,ax
mov di,12*160+36*2 ;es:di指向显存地址
mov cx,12 ;字符窜长度
cld ;DF 正向
sl:movsb ;复制到显存
mov byte ptr es:[di],2 ;设置颜色
add di,1
loop sl
mov ax,4c00H
int 21H
err_char:db "divide error"
err_end:nop
code ends
end
;开始的时候犯了几个错误1. 200H是偏移地址不是段地址 2.数值要以数字开头 3.标号 代表的是偏移地址 不是段地址 4.显存地址每2个内存单元表示一个字符 5.标号仅仅代表一个固定的偏移地址 6.写代码要仔细,不要求出了偏差值,却忘记加上初始值. |