2017-05-24 27 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

相关问题