⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 change.asm

📁 这是使用汇编语言编写的一个从键盘接受输入
💻 ASM
字号:
;-----------------------------------
stack segment para stack 'stack'
  db 256 dup(0)
stack ends
;-----------------------------------
data segment para public 'data'
buffer db 16h dup(0)
bufpt1 dw 0
bufpt2 dw 0
kbflag db 0
prompt db '--- kbd-io- program begin ---',0dh,0ah,'$'
scantab db 0,0,'1234567890-=',8,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'
shiftab db 0,0,'!@#$%^&*()_+',0,0
        db 'QWERTYUIOP{}',0dh,0
        db 'ASDFGHJKL:"',0,0,0
        db 'ZXCVBNM<>?',0,0,0
        db ' ',26 dup(0)
even
oldcs9 dw ?
oldip9 dw ?
data   ends
;--------------------------------------------------
code segment para public 'code'
start proc far
      assume cs:code,ds:data
      push ds
      mov ax,0
      push ax
      mov ax,data
      mov ds,ax

      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

      ret 
start endp
;--------------------------------------
kbget proc near
      push bx
      cli
      mov bx,bufpt1
      cmp bx,bufpt2
      jnz kbget2
;-----------------
      cmp kbflag,80h
      jz kbget3
      sti
      pop bx
      jmp kbget
kbget2:
      mov al,[buffer+bx]
      inc bx
      cmp bx,16
      jc kbget3
      mov bx,0
kbget3:
      mov bufpt1,bx
      pop bx
      ret
kbget endp
;--------------------------------------
kbint proc far
      push bx
      push ax

      in al,60h
      push ax
      in al,61h
      or al,80h
      out 61h,al
      and al,7fh
      out 61h,al

      pop ax
;---------------------------------
      LSP:
      cmp al,00101010b
      jnz LSR
      mov bl,kbflag
      or bl,00000001b
      mov kbflag,bl
      jmp kbint2

      LSR:
      cmp al,10101010b
      jnz RSP
      mov bl,kbflag
      and bl,00000000b
      mov kbflag,bl
      jmp kbint2
  
      RSP:
      cmp al,00110110b
      jnz RSR
      mov bl,kbflag
      or bl,00000010b
      mov kbflag,bl
      jmp kbint2
 
      RSR:
      cmp al,10110110b
      jnz next1
      mov bl,kbflag
      and bl,00000000b
      mov kbflag,bl
      jmp kbint2

      next1:
      test al,80h
      jnz kbint2
      mov bl,kbflag
      test bl,00000011b
      jz s2
s1:
      mov bx,offset shiftab
      xlat shiftab
      jmp next2
s2:
      mov bx,offset scantab
      xlat scantab
next2:
      cmp al,0
      jnz kbint4
      mov kbflag,80h
      jmp kbint2
kbint4:
      mov bx,bufpt2
      mov [buffer+bx],al
      inc bx
      cmp bx,16
      jc kbint3
      mov bx,0
kbint3:
      cmp bx,bufpt1
      jz kbint2
      mov bufpt2,bx
kbint2:
      cli
      mov al,20h
      out 20h,al
      pop ax
      pop bx
      sti 
      iret
kbint endp
;----------------------------------
dispchar proc near
      push bx
      mov bx,0
      mov ah,0eh
      int 10h
      pop bx
      ret
dispchar endp
;-----------------------------------
code ends
     end start
       

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -