我曾经计划在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'指令。他们有非常具体的用途,你对他们应该如何表现的解释是不正确的。 –