;①编写中断处理函数 do0,并存放到地址0:200h~0:2ff处
;②设置中断向量:(覆盖原中断向量地址)
assume cs:code
code segment
start:
mov ax,cs
mov ds,ax ;设置源传送段地址
mov ax,0
mov es,ax ;设置目的传送段地址
mov si,offset do0
mov di,200h
mov cx,offset do0end-offset do0
cld
rep movsb ;上面是传送中断处理函数到0:200h处
mov ax,0 ;接下来四行是设置中断向量地址
mov es,ax
mov word ptr es:[0*4],200h
mov word ptr es:[0*4+2],0
mov ax,1000h
mov bh,10h
div bh
mov ah,4ch
int 21h
do0:
jmp begin
db 'sucker you have make a mistake : div overflow',0
begin:
mov dh,10 ;行号
mov dl,15 ;列号
mov ax,0 ;等同于mov ax,cs,因为 这些数据要传送到段地址0处
mov ds,ax
mov di,202h ;这里是202h为什么不是200h?因为jmp begin占两个字节
call show_str ;显示处理函数
mov ah,4ch
int 21h
show_str:
mov ax,0
mov al,160
mul dh
mov bx,ax
mov ax,0
mov al,2
mul dl
add ax,bx
mov si,ax
mov ax,0b800h
mov es,ax
mov bl,00001000b
s:
mov cl,ds:[di]
mov es:[si],cl
inc si
inc di
mov es:[si],bl
inc si
mov ch,0
jcxz ok
jmp s
ok:
ret
do0end:
nop
code ends
end start
;另一种解法,比我的好哈
assume cs:code
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset do0
mov ax,0
mov es,ax
mov di,200h
mov cx,offset do0end-offset do0
cld
rep movsb
mov ax,0
mov es,ax
mov word ptr es:[0],200h
mov word ptr es:[0*4+2],0
mov ax,1000h
mov bh,10h
div bh
mov ah,4ch
int 21h
do0:
jmp do0start
dat:
db 'sucker you make a mistake:dived!'
do0start:
mov ax,0
;mov ax,dat
mov ds,ax
;mov si,0
mov si,202h
mov ax,0b800h
mov es,ax
mov di,12*160+16*2
mov cx,32
s:
mov al,ds:[si]
inc si
mov es:[di],al
inc di
mov es:[di],00001001b
inc di
loop s
mov ah,4ch
int 21h
do0end:
nop
code ends
end start