assembly MASM在第一次输入后不接受输入

vcirk6k6  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(192)

每当我运行这段代码时,程序只接受我的第一个输入,然后在第二个输入中发送一个垃圾值,然后打印一个完全随机的垃圾值。

.model small
.stack 100h
.data

.code 
main proc

mov ah , 1      ;input 1
int 21h

mov bl,al

mov al , 1        ;input 2
int 21h

add bl , al

sub bl , 48

mov dl , bl

mov ah , 2
int 21h

mov ah , 4ch
int 21h

main endp
end main

我试过将mov al , 1更改为mov ah , 1来获取输入,但也不起作用。

j1dl9f46

j1dl9f461#

这看起来像是两个个位数的加法器。
READ CHARACTER FROM STANDARD INPUT不等待Enter。显然,当您尝试3+4时,您按了3Enter4****Enter,并且您的;input 2返回AL格式的0Dh,这不是第二个十进制数字。
尝试按两个数字而不按Enter键,它应该类似于347
您可以完全忽略mov al , 1 ;input 2行,中断不会从先前的输入中删除AH=1,但会用第二个输入字符覆盖AL。

cwdobuhd

cwdobuhd2#

mov al , 1      ;input 2
int 21h

您在AL与AH的比较中没有遇到这个错别字,因为AH寄存器仍然保存着之前的值01 h。
虽然在每个数字后按Enter键确实会扰乱程序中的计算,但这也意味着,在程序终止很久之后,您还要输入第二个数字及其伴随的Enter键!第二个数字应该出现在DOS提示符下。
示例:1输入2输入

C:\>prog
♫
C:\>2
Bad command or Filename

我最好的猜测是,你可能是使用数字键盘,但没有数字锁定亮起
在这些情况下,如果按下例如1,它实际上是结束,并且DOS.GetKeyboardInputWithEcho函数01 h将在AL中返回零,并且同一函数的第二次调用也将在AL中返回扫描码。
示例:12个

C:\>prog
 O▼
C:\>

第一个int 21h返回0并回显““
第二个int 21h返回4Fh并回显大写“O”
程序计算0 + 4Fh - 48 = 1Fh并显示“▼”
如果NumLock未亮起,2实际上将为↓,不会在DOS提示符下显示

相关问题