我曾經計劃在DOS下爲;#
提交一個簡短而快速的解釋程序,當我發現DOS不解釋#
鍵正確。爲什麼DOS不能正確處理'#'(INT 21/AH = 01h)
它可能會更好,開始通過小的例子,也表現出行爲的解剖它:
org 0x100
L:
mov ah, 01h ; new input -> al
int 21h
test al, '#' ; check if the hash key was pressed
jnz end ; if it wasn't, jump to the end of program
mov dl, '1'
mov ah, 02h
int 21h ; otherwise, output `1`
jmp L ; and loop to the beginning
end:
mov ah, 00h ; end the program
int 21h
進入#
加入該計劃,將導致其測試爲假,並跳轉到結束。和大多數其他角色一樣。但是,當我輸入一個或多個以下字符:D
,L
,H
,X
時,它輸出1
和循環。這顯然不是預期的。
請注意,我使用Dosbox進行測試可能很重要。
從測試中,它發生了'#'
,0x23
,0x01
,0x1b
(最後兩個掃描碼分別來自兩個this pdf頁面,通過隨機搜索發現)。
究竟發生了什麼?
什麼al'的'當你進入''#的價值? Keryboard掃描碼不一定匹配相同字符的編碼,尤其是對於擴展鍵。 –
''''''''出來後,debugx告訴我'ax'是'0x0023'。這部分是我爲什麼如此困惑的原因。 –
嗯,我在類似的問題(https://stackoverflow.com/a/15182488)中查看了這個確切的主題。本質上,你濫用'test'和'jnz'指令。他們有非常具體的用途,你對他們應該如何表現的解釋是不正確的。 –