0

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

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

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

4

1 回答 1

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 是否跨调用保留?如果没有,您需要push bx在调用任何 int21 函数之前以及pop bx它返回时进行。否则你的计数将是......“未定义”。

于 2011-04-14T04:14:25.423 回答