assume cs:code,ss:stack
data segment
dw 128 dup(0)
data ends
stack segment
db 128 dup (0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,128
mov ax,data
mov ds,ax
call show_set
call sav_old_int9
call cpy_i9
call new_int9
mov ax,4c00h
int 21h
;=============================================show
show_set: push ax
push bx
mov bx,0
mov ax,0b800h
mov es,ax
mov bl,'a'
show_screen: mov es:[160*10+40*2],bl
call delayed
inc bl
cmp bl,'z'
jna show_screen
pop bx
pop ax
ret
;===========================================delayed
delayed: push ax
push dx
mov dx,10h
mov ax,0
dela: sub ax,1
sbb dx,0
cmp ax,0
jne dela
cmp dx,0
jne dela
pop dx
pop ax
ret
;===========================================
sav_old_int9: push ax
mov ax,0
mov es,ax
push es:[9*4]
pop ds:[0]
push es:[9*4+2]
pop ds:[2]
mov word ptr es:[9*4],200h
mov word ptr es:[9*4+2],0
pop ax
ret
;=======================================================
new_int9: in al,60h
pushf
call dword ptr ds:[0]
cmp al,1h
jne bc
mov ax,0b800h
mov es,ax
inc byte ptr es:[160*10+40*2+1]
bc: iret
;==============================================================
cpy_i9: push ax
push di
push si
push es
push ds
mov ax,0
mov es,ax
mov di,200h
mov ax,cs
mov ds,ax
mov si,offset new_int9
mov cx,offset new_int9-offset bc
cld
rep movsb
pop ds
pop es
pop si
pop di
pop ax
ret
code ends
end start
不知道是哪里出了错没反应,求大神谢谢 |