自定义0号中断

来源:互联网 发布:铁甲衣 知乎 编辑:程序博客网 时间:2024/05/20 07:18

调试了好久才得到想要的结果,分享下:

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列),写的时候要清楚含义。



原创粉丝点击