这是一个显示键盘扫描码的汇编程序
.model small
.stack
.data
old_ip09 dw ?
old_cs09 dw ?
old_ip0f dw ?
old_cs0f dw ?
count dw ?
buffer db 20h dup('?')
buf_p dw ?
start_msg db 0ah,0dh,'RUN!'0ah,0dh,'$'
end_msg db 0ah,0dh,'end!'0ah,0dh,'$'
full_msg db 'buffer full !'0ah,0dh,'$'
.code
main proc far
start:
mov ax,@data
mov ds,ax
lea ax,buffer
mov buf_p ,ax
mov count,0
;save old interrupt 09h
mov al,09h
mov ah,35
int 21h
mov old_cs09,es
mov old_ip09,bx
push ds
;set new interrupt
lea dx,kdbint
mov ax,seg kdbint
mov ds,ax
mov al,09h
mov ah,25h
int 21h
pop ds
;set keyboard interrupt mask bits
in al,21h
and al,0fdh
out 21h,al
sti
mov di,20000
delay: mov si,30000
delay1: dec si
jnz delay1
dec di
jnz delay
mov di,20000
dey: mov si,30000
dey1: dec si
jnz dey1
dec di
jnz dey
mov di,20000
de: mov si,30000
de1: dec si
jnz de1
dec di
jnz de
mov di,20000
d: mov si,30000
d1: dec si
jnz d1
dec di
jnz d
cli
;save old
push ds
mov dx,old_ip09
mov ax,old_cs09
mov ds,ax
mov al,09h
mov ah,25h
int 21h
pop ds
;enable
in al,21h
and al,0fdh
out 21h,al
sti
mov ax,4c00h
int 21h
main endp
;...................
kdbint proc near
push ax
push bx
cld
in al,60h
push ax
in al,61h
mov ah,al
or al,80h
out 61h,al
xchg ah,al
out 61h,al
pop ax
test al,80h
jnz return1
mov bx,buf_p
mov [bx] ,al
call display_hex
inc bx
inc count
mov buf_p,bx
check:
cmp count ,20h
jb return1
return1:
cli
mov al,20h
out 20h,al
pop bx
pop ax
iret
kdbint endp
display_hex proc near
push ax
push cx
push dx
mov ch,2
mov cl,4
nextb:
rol al,cl
push ax
mov dl,al
and dl,0fh
or dl,30h
cmp dl,3ah
jl dispit
add dl,7h
dispit:
mov ah,2
int 21h
pop ax
dec ch
jnz nextb
mov ah,2
mov dl,','
int 21h
pop dx
pop cx
pop ax
ret
display_hex endp
end start