📄 3-6.asm
字号:
stack segment para stack 'stack'
db 256 dup(0)
top label word
stack ends
data segment
buffer db 16h dup(0)
bufpt1 dw 0
bufpt2 dw 0
kbflag db 0
flag dw 0
prompt db '--kbd_io program begin--',0dh,0ah,'$'
scantab db 0,0,'1234567890-=',0,0
db 'qwertyuiop[]',0dh,0
db 'asdfghjkl;',0,0,0,0
db 'zxcvbnm,./',0,0,0
db ' ',0,0,0,0,0,0,0,0,0,0,0,0,0
db '789-456+1230.'
scantab2 db 0,0,'!@#$%^&*()_+',0,0
db 'QWERTYUIOP{}',0dh,0
db 'ASDFGHJKL:"',0,0,0
db 'ZXCVBNM<>?',0,0,0
db ' ',26 dup (0)
oldcs9 dw ?
oldip9 dw ?
data ends
code segment
start proc far
assume cs:code,ds:data,ss:stack
push ds
mov ax,0
push ax
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,top
cli
mov al,09
mov ah,35h
int 21h
mov oldcs9,es
mov oldip9,bx
push ds
mov dx,offset kbint
mov ax,seg kbint
mov ds,ax
mov al,09
mov ah,25h
int 21h
pop ds
in al,21h
and al,0fdh
out 21h,al
mov dx,offset prompt
mov ah,9
int 21h
sti
forever:
call kbget
test kbflag,80h
jnz endint
push ax
call dispchar
pop ax
cmp al,0dh
jnz forever
mov al,0ah
call dispchar
jmp forever
endint:
mov dx,oldip9
mov ax,oldcs9
mov ds,ax
mov al,09h
mov ah,25h
int 21h
mov ax,4c00h
int 21h
start endp
kbget proc near
push bx
cli
mov bx,bufpt1
cmp bx,bufpt2
jnz kbget2
cmp kbflag,0
jnz kbget3
sti
pop bx
jmp kbget
kbget2:
mov al,[buffer+bx]
inc bx
cmp bx,16h
jc kbget3
mov bx,0
kbget3:
mov bufpt1,bx
pop bx
ret
kbget endp
dispchar proc near
push bx
mov bx,0
mov ah,0eh
int 10h
pop bx
ret
dispchar endp
kbint proc far
push bx
push ax
push dx
in al,60h
push ax
in al,61h
or al,80h
out 61h,al
and al,7fh
out 61h,al
pop ax
mov ah,0
test al,80h
jnz kbint1
cmp al,2ah
jz left_shift
cmp al,36h
jz right_shift
mov dx,flag
and dx,3
jnz shift
mov bx,offset scantab
xlat scantab
jmp next
shift:
mov bx,offset scantab2
xlat scantab2
next:
cmp al,0
jnz kbint4
mov kbflag,80h
jmp kbint2
kbint4:
mov bx,bufpt2
mov [buffer+bx],al
inc bx
cmp bx,16h
jc kbint3
mov bx,0
kbint3:
cmp bx,bufpt1
jz kbint2
mov bufpt2,bx
jmp kbint2
left_shift:
or flag,1
jmp kbint2
right_shift:
or flag,2
jmp kbint2
kbint1:
and al,7fh
cmp al,2ah
jnz next1
and flag,0feh
next1:
cmp al,36h
jnz kbint2
and flag,0fdh
kbint2:
cli
mov al,20h
out 20h,al
pop dx
pop ax
pop bx
sti
iret
kbint endp
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -