为什么DOS没有处理'#'正确(INT 21 / AH = 01h)

时间:2017-05-24 20:51:39

标签: assembly nasm dos

当我发现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,并跳转到最后。和大多数其他角色一样。但是,当我输入以下一个或多个字符时:DLHX,它会输出1并循环播放。这显然不是预期的。

注意我使用Dosbox进行测试可能很重要。

通过测试,它适用于'#'0x230x010x1b(最后两个扫描码来自this pdf的第二页,通过随机搜索)。

究竟是什么发生在这里?

1 个答案:

答案 0 :(得分:2)

test a,b计算按位和ab,设置标志并丢弃结果。 test通常不能用于比较两个值的相等性,为此目的使用cmp

cmp al, '#'