我是怎么在我的考试中做的:)计算按键的数量

时间:2011-04-14 03:27:42

标签: x86 microprocessors

我今天在考试中得到了这个问题,我为它写了一些代码。我希望你告诉我哪里出错了。

问题:对于8086微处理器,编写执行以下任务的代码。它要求用户输入数据并计算按键次数。
在执行ALP时,第一条消息是“计算按键,按下逃逸停止”。 (不带引号),如果用户输入转义,则显示第二条消息“计数按键”,计数结果存储在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

我不确定我添加的评论是否合适。 我知道我的代码不正确,事实上它根本不正确,但我设法在我的一夜准备的基础上写这个。如果有人能告诉我,我在做什么错,那么我将非常感激。因为我真的需要在下次考试中表现良好。

1 个答案:

答案 0 :(得分:1)

你有基本的想法,虽然有一些细节。

首先,你有这个:

cmp al, 1bh
np label1

我不确定np应该是什么意思。你想要的指令可能是jnz label1。如果未设置Z标志,那将分支,这意味着用户没有按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,并且在返回时需要pop bx。否则你的计数将是......“未定义”。