我在考试中是如何做到的:)计算按键的数量

|| 我今天在考试中遇到了这个问题,并且为此写了一些代码。我想让你告诉我我哪里出错了。 问题:对于8086微处理器,请编写执行以下任务的代码。它要求用户输入数据并计算按键数。 在执行ALP时,获得第一条消息“正在计数按键,请按Esc键以停止。”(不带引号),如果用户输入了退出代码,则会显示第二条消息“计数按键”。计数值存储在BX中,并以二进制显示。还要按下键(在输入数据时),输入键应在下一行中回显。 解决方案:(我写的)
.model tiny
.data
text1 db \"counting keypresses,press escape to stop $\"
text2 db \"counting keypresses\"
.code
.startup
mov dx,offset text1 ;displaying text1 (i guess so) mov ah,09h
int 21h
and bx,00h
label1 mov ah,01h ;(getting input from user and incrementing bx on every click) int 21h
inc bx
cmp al,1bh ;comparing with \'escape\' np label1
mov dx,offset text2 ;if zero then do this i.e display text2 mov ah,09h
int 21h
mov dx,offset bx ;display bx mov ah,09h
int 21h
.exit
end
我不确定添加的评论是否合适。 我知道我的代码将是不正确的,事实上它根本是不正确的,但是我在一天的准备工作的基础上设法写了这个。所以如果有人能告诉我,我做错了什么,那么我将非常感谢。因为我真的需要在下一次考试中表现出色。     
已邀请:
尽管有一些细节,但是您已经有了基本的想法。 首先,您有:
cmp al, 1bh
np label1
我不确定ѭ2what是什么意思。您想要的指令可能是
jnz label1
。如果未设置“ 4”标志,则该分支将分支,这意味着用户未按ESC。 您将显示以下内容:
mov dx,offset bx ;display bx
mov ah,09h
int 21h
那是行不通的。实际上,这不应该编译,因为您无法获取寄存器的偏移量。您需要将BX中的值存储到内存中,然后将该内存地址传递给输出函数。因此,在您的数据区域中定义一个2字节的值:
count dw 0  ; counter for output
      db \'$\' ; terminate output
然后您可以编写:
move [count],bx
mov dx, offset count
mov ah, 09h
int 21h
您确实说过要以二进制形式输出计数,但是我不确定您是否知道其后果。如果用户仅按两个键,则输出将是二进制0和二进制2,它们可能显示为方框,或者什么都没有显示,或者可能是时髦的字符。我不记得int21函数是如何解释所有控制字符的。但是,可以肯定的是,如果用户按下13键,您将获得的只是回车符。并且,如果用户按36个字符,则输出将为...。因为36是\'$ \'的ASCII代码,所以这是输出终止符。 如果您想更好地进行输出,则需要将BX中的值转换为十六进制或十进制(更容易使用十六进制)转换为ASCII字符,然后将其输出。我手头没有样品。 最后,我不记得int21函数保存寄存器的约定是什么。 BX是否在通话中保留?如果不是,则在调用任何int21函数之前需要先
push bx
,并且在返回时需要returns9。否则,您的计数将为... \“ undefined \”。     

要回复问题请先登录注册