调试了好久才得到想要的结果,分享下:
assume cs:codesg
codesg segment
; move the code to the 0:200
start: mov ax,cs
mov ds,ax ; source segment in the cs segment
mov si,offset d0
mov ax,0
mov es,ax
mov di,200h ; di can be assign a value directly
mov cx, offset d0end - offset d0
cld
rep movsb
; set the interupt table
mov ax,0
mov es,ax
mov word ptr es:[0*4],200h
mov word ptr es:[0*4+2],0
mov ax,4c00h
int 21h
d0: jmp short d0start
db "Divid Overflow!"
d0start:mov ax,cs
mov ds,ax
mov si,202h ; si point to the 'Divid Overflow!'
mov bx,0b800h
mov es,bx
mov di,160*12+33*2 ; di point to the video memory
mov cx,15
s: mov ax,[si]
mov ah,02
mov es:[di],ax
inc si
add di,2
loop s
mov ax,4c00h
int 21h
d0end: nop
codesg ends
end start
NOTE:
1.用到[寄存器]取数据的时候,最好源用si(source) 目的用si(destination)这样在使用时候不容易混淆源和目的的指针。
2.在显示的时候是12*160+33*2(显示在第十二行33列),写的时候要清楚含义。