当我发现DOS没有正确解释;#
密钥时,我曾计划在DOS中为#
提交一个简短快速的解释器作为代码高尔夫挑战。
最好通过一个同样表现出这种行为的小例子开始解剖它:
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
在程序中输入#
将使其测试为false,并跳转到最后。和大多数其他角色一样。但是,当我输入以下一个或多个字符时:D
,L
,H
,X
,它会输出1
并循环播放。这显然不是预期的。
注意我使用Dosbox进行测试可能很重要。
通过测试,它适用于'#'
,0x23
,0x01
,0x1b
(最后两个扫描码来自this pdf的第二页,通过随机搜索)。
究竟是什么发生在这里?
答案 0 :(得分:2)
test a,b
计算按位和a
和b
,设置标志并丢弃结果。 test
通常不能用于比较两个值的相等性,为此目的使用cmp
:
cmp al, '#'