2017-05-24 72 views
0

我曾經計劃在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進行測試可能很重要。

從測試中,它發生了'#'0x230x010x1b(最後兩個掃描碼分別來自兩個this pdf頁面,通過隨機搜索發現)。

究竟發生了什麼?

+0

什麼al'的'當你進入''#的價值? Keryboard掃描碼不一定匹配相同字符的編碼,尤其是對於擴展鍵。 –

+0

''''''''出來後,debugx告訴我'ax'是'0x0023'。這部分是我爲什麼如此困惑的原因。 –

+0

嗯,我在類似的問題(https://stackoverflow.com/a/15182488)中查看了這個確切的主題。本質上,你濫用'test'和'jnz'指令。他們有非常具體的用途,你對他們應該如何表現的解釋是不正確的。 –

回答

2

test a,b計算按位和ab,設置標誌並放棄結果。 test一般可以不被用來爲相等比較兩個值,使用cmp用於這一目的:

cmp al, '#' 
+0

這並沒有回答這個問題,因爲:A)''test'對於比較所有其他角色(它會檢測哪一個被按下的精度與'cmp'相等)是完全正確的,並且B)改變它使用'cmp'不能解決問題。 –

+0

您可能想要閱讀[this](https://stackoverflow.com/questions/13064809/the-point-of-test-eax-eax)以瞭解'test'和'cmp'之間的區別(只有一個邊際差異) –

+2

@ FinnO'leary如果它的工作「好」,那麼你做錯了什麼。如果兩個參數都不相等(即除非兩者都爲零),那麼'test'只返回零,當兩個參數都沒有設置時,通常不會發生這種情況。你似乎在其他地方犯了一些錯誤。 – fuz

相關問題