asm汇编源代码之按键处理相关函数

提供5个子程序:

1. 发送按键 sendkey

2. 检测是否有按键 testkey

3. 读取按键 getkey

4. 判断键盘缓冲区是否为空 bufempty

5. 判断键盘缓冲区是否已满 buffull

具体功能及参数描述如下

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| sendkey proc  far ; ax=charcode testkey proc  far ; out: ;   zf=1 buff empty; ;   zf=0 ax=key code getkey proc  far ; out: ;   ax=key code ; if buf empty, it will wait bufempty proc  far  ; test key buffer be empty or not ; out: ;   zf=0 not empty;  zf=1 empty buffull proc  far  ; test key buffer be full or not ; out: ;   zf=0 not full;  zf=1 full   |

复制代码
; more source code at http://www.ahjoe.com/source/srcdown.asp

.286
        public  sendkey, getkey, testkey, buffull, bufempty
code    segment
        assume  cs:code, ds:code

sendkey proc    far
;  ax=charcode
        push    ax
        push    bx
        push    si
        push    di
        push    ds
        cmp     ah, 0
        jnz     sendkj0
        mov     ah, 30h
sendkj0:
        mov     bx, 40h
        mov     ds, bx
        mov     di, ds:[1ch]

        mov     bx, di
        call    incptr
        cmp     bx, ds:[1ah]
        jz      fullk

        mov     ds:[di], ax
        mov     ds:[1ch], bx
fullk:
        pop     ds
        pop     di
        pop     si
        pop     bx
        pop     ax
        retf
sendkey endp                              

getkey  proc    far
; out:
;     ax=key code
; if buf empty, it will wait

        push    bx
        push    si
        push    ds

        mov     ax, 40h
        mov     ds, ax
getkeyrep:
        mov     si, ds:[1ah]
        cmp     si, ds:[1ch]
        jz      getkeyrep
        mov     ax, [si]
        mov     bx, si
        call    incptr
        mov     ds:[1ah], bx
        pop     ds
        pop     si
        pop     bx
        retf	
getkey  endp

testkey proc    far
; out:
;      zf=1  buff empty;
;      zf=0  ax=key code
        push    si
        push    ds

        mov     ax, 40h
        mov     ds, ax
        mov     si, ds:[1ah]
        mov     ax, [si]
        cmp     si, ds:[1ch]

        pop     ds
        pop     si
        retf    
testkey endp


bufempty proc    far    ; test key buffer be empty or not
; out:
;      zf=0  not empty;   zf=1  empty
        push    si
        push    ds

        mov     si, 40h
        mov     ds, si
        mov     si, ds:[1ah]
        cmp     si, ds:[1ch]

        pop     ds
        pop     si
        retf
bufempty endp

buffull  proc    far    ; test key buffer be full or not
; out:
;      zf=0  not full;    zf=1  full
        push    ds
        push    bx
        mov     bx, 40h
        mov     ds, bx
        mov     bx, ds:[1ch]
        call    incptr
        cmp     bx, ds:[1ah]
        pop     bx
        pop     ds
        retf
buffull  endp

incptr  proc    near
        inc     bx
        inc     bx
        cmp     bx, 3eh
        jb      incok
        mov     bx, 1eh
incok:
        retn
incptr  endp

decptr  proc    near
        dec     bx
        dec     bx
        cmp     bx, 1ch
        ja      decok
        mov     bx, 3ch
decok:
        retn
decptr  endp

code    ends
        end     sendkey
相关推荐
small_wh1te_coder2 天前
GCC深度剖析:从编译原理到嵌入式底层实战
汇编·c++·面试·嵌入式·状态模式·c
白书宇3 天前
5.从零开始写LINUX内核--从实模式到保护模式的过渡实现
linux·汇编·数据库·开源
浩浩测试一下3 天前
02高级语言逻辑结构到汇编语言之逻辑结构转换 if (...) {...} else {...} 结构
汇编·数据结构·数据库·redis·安全·网络安全·缓存
蚰蜒螟4 天前
JVM安全点轮询汇编函数解析
汇编·jvm·安全
要记得喝水8 天前
汇编中常用寄存器介绍
开发语言·汇编·windows·c#·.net
技术领导力10 天前
华为开源CANN,再次释放“昇腾转向”信号
汇编
DONG91314 天前
Python 中的可迭代、迭代器与生成器——从协议到实现再到最佳实践
开发语言·汇编·数据结构·python·算法·青少年编程·排序算法
embrace9917 天前
【C语言学习】scanf函数
c语言·开发语言·汇编·学习·青少年编程·c#·编辑器
麦兜*17 天前
【算法】十大排序算法超深度解析,从数学原理到汇编级优化,涵盖 15个核心维度
java·汇编·jvm·算法·spring cloud·ai·排序算法
会掉头发18 天前
x86_64汇编
汇编