编写0号中断的处理程序,使得在除法溢出发生时,在屏幕中间显示字符串"divide error!",然后返回到DOS。
要求:仔细跟踪调试,在理解整个过程之前,不要进行后面课程的学习。
;sy12.asm 实验12 编写0号中断的处理程序
;编写0号中断的处理程序,使得在除法溢出发生时,在屏幕中间显示字符串"divide error!",
;然后返回到DOS。assume cs:code
code segment
start: ;do0安装程序mov ax,cs mov ds,ax mov si, offset do0 ;设置ds:si指向源地址mov ax,0mov es,ax mov di,200h ;设置es:di指向目的地址mov cx,offset do0end - offset do0 ;设置cx为传输长度cld ;设置传输方向为正rep movsb ;设置中断向量表mov ax,0mov es,ax ;设置段地址为0mov word ptr es:[0*4],200h ;低位存放偏移值0: [0]=200hmov word ptr es:[0*4+2],0 ;高位存放段地址0:[2] = 0mov ax,4c00h int 21h do0: jmp short do0startdb "divide error!"do0start: mov ax,csmov ds,ax mov si,0202h ;设置ds:si指向字符串mov ax,0b800h mov es,ax mov di,12*160+34*2 ;设置es:di指向显存空间的中间位置mov cx,13 ;设置cx为字符串长度s: mov al,[si]mov es:[di],al inc si ;下面两行为设置文字显示的颜色mov al,02h ;设置颜色值mov es:[di+1],al add di,2loop s mov ax,4c00h int 21hdo0end: nop code ends
end start
编译成生sy12.exe
测试源码
;p12_0try.asm 除法溢出测试
assume cs:codesg ;这条伪指令的含义为“假设”,用assume cs:codesg将用作代码段的段codesg和CPU中的段寄存器cs联系起来codesg segment ;定义一个段,段的名称为"codesg",这个段从此开始mov ax,1000hmov bh,1div bh mov ax,4c00hint 21hcodesg ends ;名称为"codesg"的段到此结束end
编译生成p12_0try.exe
这个程序得在XP系统测试才有效果
打开cmd,运行sy12.exe
再debug p12_0try.exe调试