我读了一本关于大会的书。它给出了键盘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
的所有部分都是无用的。我错过了什么?
感谢。
答案 0 :(得分:0)
test
指令对操作数执行逻辑and
,并根据结果设置标志。操作数不会改变。 test
and
指示cmp
指示sub
指示80H
。
由于一些奇怪的原因,“让我谷歌那个为你”不再允许堆栈溢出(可能是冒犯?),所以直接链接:http://www.google.de/search?q=test+x86+instruction
PA7显然位于某处。我将其留给您了解如何转换为{{1}}。