每当我运行这段代码时,程序只接受我的第一个输入,然后在第二个输入中发送一个垃圾值,然后打印一个完全随机的垃圾值。
.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
来获取输入,但也不起作用。
2条答案
按热度按时间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。cwdobuhd2#
您在AL与AH的比较中没有遇到这个错别字,因为AH寄存器仍然保存着之前的值01 h。
虽然在每个数字后按Enter键确实会扰乱程序中的计算,但这也意味着,在程序终止很久之后,您还要输入第二个数字及其伴随的Enter键!第二个数字应该出现在DOS提示符下。
示例:1输入2输入
我最好的猜测是,你可能是使用数字键盘,但没有数字锁定亮起。
在这些情况下,如果按下例如1,它实际上是结束,并且DOS.GetKeyboardInputWithEcho函数01 h将在AL中返回零,并且同一函数的第二次调用也将在AL中返回扫描码。
示例:12个
第一个
int 21h
返回0并回显““第二个
int 21h
返回4Fh并回显大写“O”程序计算0 + 4Fh - 48 = 1Fh并显示“▼”
如果NumLock未亮起,2实际上将为↓,不会在DOS提示符下显示