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

📄 3-6.asm

📁 几个汇编小程序。能实现电话号码本的管理
💻 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 + -