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つ以上を入力すると、1
とループを出力します。これは明らかに意図されたものではありません。
私はテストにDosboxを使用したことに注意することが重要です。テストから
は、それが'#'
、0x23
、0x01
、0x1b
(最後の二つのスキャンコードがランダム探索を経て見つけ、2 this pdfのページからのものであった)のために起こります。
正確には、ここでは何が起こっていますか?
あなたが '#'を入力してくださいal' 'の値は何ですか? Keryboardスキャンコードは、必ずしも同じ文字のエンコード、特に拡張キーのエンコードと一致するとは限りません。 –
'xor''' ah'を実行した後、debugxは 'ax'が' 0x0023'であることを知らせます。これは部分的に私が困惑している理由です。 –
ええと、似たような質問(https://stackoverflow.com/a/15182488)でこの正確なトピックを調べました。基本的に、あなたは 'test'と' jnz'命令を悪用しています。彼らは非常に特殊な使い方をしており、どのように行動すべきかについてのあなたの解釈は正しくありません。 –