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没有正确解释#
键时,在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
'ingah
输出后,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
工作到目前为止完全是巧合。该睡觉了。。。