装配 - I / O控制器(键盘驱动程序)

时间:2012-03-09 12:54:57

标签: assembly

我读了一本关于大会的书。它给出了键盘I / O驱动程序的示例:

section .data
ESC_KEY EQU 1BH         ; ASCII code for ESC key
KB_DATA  EQU 60H        ; 8255 port PA

section .text 
global _start
_start: 
key_up_loop:
    ;Loops until a key is pressed i.e., until PA7 = 0.
    ; PA7 = 1 if a key is up.
    in AL,  KB_DATA     ; read keyboard status & scan code
    test AL, 80H            ; PA7 = 0?
    jnz key_up_loop      ; if not, loop back
and AL,7FH      ; isolate the scan code

..Translate scan code to ASCII code in AL..

cmp AL,0        ; ASCII code of 0 => uninterested key
je key_down_loop

cmp AL,ESC_KEY  ; ESC key---terminate program
je done

display_ch:
     ; char is now in AL
..Print character AL to screen..
key_down_loop:
    in AL,KB_DATA       
    test AL, 80H        ; PA7 = 1?
    jz key_down_loop    ; if not, loop back

    mov AX,0C00H                   ; clear keyboard buffer
    int 21H                                ; (System interrupt)

    jmp key_up_loop
Done:
    mov AX,0C00H                   ; clear keyboard buffer
    int 21H           

..Exit Program..

我没有理解说明:test AL, 80H,目的是什么以及如何检查PA7 = 0?

编辑:我也很高兴有关key_down_loop部分的解释。为什么我们需要那个?我们可以做出下一个改变:

cmp AL,0        ; ASCII code of 0 => uninterested key
je key_up_loop

然后key_down_loop的所有部分都是无用的。我错过了什么?

感谢。

1 个答案:

答案 0 :(得分:0)

test指令对操作数执行逻辑and,并根据结果设置标志。操作数不会改变。 test and指示cmp指示sub指示80H

由于一些奇怪的原因,“让我谷歌那个为你”不再允许堆栈溢出(可能是冒犯?),所以直接链接:http://www.google.de/search?q=test+x86+instruction

PA7显然位于某处。我将其留给您了解如何转换为{{1}}。