这是问题的要求
第一个玩家被要求从键盘上输入一个从0到9的十进制数字,而不是在屏幕上显示。第二个玩家必须通过在键盘上输入来猜测第一个玩家想到的数字。输入后,总是会打印一个消息,告诉玩家这个数字是否太高,太低或正确的数字。2玩家必须输入数字直到他猜出正确的数字。3如果数字正确,这将被显示,游戏停止。
提示:参见INT 21h的功能8”
这就是我试过的。。它工作正常,但当数字较少时显示我双倍“numarul este mic”,和grater“numarul este mare”,我该怎么办?
.model small
.stack 100h
.data
prompt db 'Introduceti o valoare intre 0 si 9:' ,0DH,0AH,'$'
mesaj_1 db 'Numarul este mic' ,0DH,0AH,'$'
mesaj_2 db 'Numarul este mare' ,0DH,0AH,'$'
mesaj_3 db 'Numarul este corect!' ,0DH,0AH,'$'
mesaj_4 db 'Player introdu' ,0DH,0AH,'$'
.code
start:
Mov ax, @data
Mov ds, ax
mov dx, offset mesaj_4
mov ah, 9h
int 21h
mov ah, 8h
int 21h
mov cl, al
mov dx, offset prompt
bucla:
mov ah, 9h
int 21h
mov ah, 01h
int 21h
mov ch, al
cmp ch, cl
jl maiMic
jg maiMare
je corect
maiMic:
mov dx, offset mesaj_1
mov ah, 9h
int 21h
jl bucla
maiMare:
mov dx, offset mesaj_2
mov ah, 9h
int 21h
jmp bucla
corect:
mov dx, offset mesaj_3
mov ah, 9h
int 21h
jmp tipareste
tipareste:
mov ah, 9
int 21h
mov ax, 4c00h
int 21h
1条答案
按热度按时间iqih9akk1#
“双重打印”的问题来自于将
mov dx, offset prompt
指令置于循环之外,就像@Peter Cordes在注解中注意到的那样,每次代码跳回到 bucla 时,DX要么指向 mesaj_1,要么指向 mesaj_2。你的麻烦“重复打印”的最后信息是一个简单的问题,不重复自己。
我写了你的代码的下一个优化版本。它更短,跳跃更少。特别是
很明显,第三个条件跳转是多余的。2如果条件既不是“小于”也不是“大于”,那么“等于”就是剩下的唯一一种情况。3重新安排你的代码,这样它就可以在剩下的情况下失败。