Assembly 为什么DOS不处理'#';正确(INT 21/AH=01h)

Assembly 为什么DOS不处理'#';正确(INT 21/AH=01h),assembly,nasm,dos,Assembly,Nasm,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,

我计划为
提交一个简短而快速的翻译##
键时,在DOS中code>是一个代码高尔夫挑战

也许最好通过一个较小的例子来分析它,这个例子也展示了这种行为:

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
(最后两个扫描码来自第2页,通过随机搜索找到)


这里到底发生了什么?

测试a、b
计算
a
b
的按位and,设置标志并丢弃结果<代码>测试通常不能用于比较两个值是否相等,为此,请使用
cmp

cmp al, '#'

测试a、b
计算
a
b
的位与,设置标志并丢弃结果<代码>测试通常不能用于比较两个值是否相等,为此,请使用
cmp

cmp al, '#'

当您输入
#
时,
al
的值是多少?Keryboard扫描码不一定与同一字符的编码相匹配,特别是对于扩展键。在
xor
'ing
ah
输出后,debugx告诉我
ax
0x0023
。这就是为什么我如此困惑的部分原因。嗯,我在一个类似的问题()中讨论了这个主题。本质上,您误用了
测试
jnz
指令。它们有非常具体的用途,你对它们应该如何表现的解释是不正确的。在打高尔夫球时,使用
测试
实际上有时可能会揭示一些有趣的东西,比如如果输入可以是
(0x23)或数字(0x30-0x39),那么
测试al,0x0C
会告诉你输入是散列还是数字0-3(ZF=1)或数字4-9(ZF=0)使用单次测试等…但要测试特定值,您需要
cmp
。当您输入
#
时,
al
的值是多少?Keryboard扫描码不一定与同一字符的编码匹配,尤其是使用扩展键。在
xor
ah
输出后,debugx告诉我
ax
0x0023
。这就是为什么我如此困惑的部分原因。嗯,我在一个类似的问题()。本质上,您误用了
测试
jnz
指令。它们有非常具体的用途,您对它们的行为方式的解释是不正确的。在打高尔夫球时,使用
测试
实际上有时可能会显示一些有趣的信息,比如输入可以是
#
(0x23)或数字(0x30-0x39),然后,
test al,0x0C
将告诉您输入是散列还是数字0-3(ZF=1)或数字4-9(ZF=0)进行单一测试,等等……但要测试特定值,您需要
cmp
。这并不能回答问题,因为:A)
test
可以很好地比较我抛出的所有其他字符(它可以检测哪个字符被按下的精度与
cmp
相同),而B)将其更改为使用
cmp
并不能解决问题。您可能需要阅读
test
cmp
之间的差异(只有一个细微的差别)@FinnO'leary如果它工作得“很好”,那么你就做错了。
test
仅在两个参数的按位and中没有设置位时返回零,如果两个参数都相等(即,除非两个参数都为零),则通常不会返回零。你似乎在其他地方犯了某种错误。@FinnO'leary你似乎从根本上误解了你链接的答案。计算
与计算
sub
有很大区别。哎呀,看起来我测试了
0x32
,而不是
0x23
。使用
cmp al,0x23
可以d工作。我猜
测试
工作到目前为止完全是巧合。睡眠时间…这并不能回答问题,因为:A)
测试
可以很好地比较我扔给它的所有其他字符(它检测到哪个字符被按下的精度与
cmp
相同),B)将其改为使用
cmp
并不能解决问题。您可能想了解
test
cmp
之间的区别(只有细微的区别)@FinnO'leary如果它工作“很好”,那么您就做错了
test
仅在两个参数的按位and中未设置位时返回零,如果两个参数都相等(即,除非两个参数都为零),则通常不会返回零。你似乎在其他地方犯了某种错误。@FinnO'leary你似乎从根本上误解了你链接的答案。计算
与计算
sub
有很大区别。哎呀,看起来我测试的是
0x32
,而不是
0x23
。使用CMPAL,0x23确实有效。我想
test
工作到目前为止完全是巧合。该睡觉了。。。