assembly 猜emu8086中的数字

o4tp2gmn  于 2023-01-09  发布在  其他
关注(0)|答案(1)|浏览(143)

这是问题的要求
第一个玩家被要求从键盘上输入一个从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
iqih9akk

iqih9akk1#

mov dx, offset prompt
bucla:
   mov ah, 9h
   int 21h

“双重打印”的问题来自于将mov dx, offset prompt指令置于循环之外,就像@Peter Cordes在注解中注意到的那样,每次代码跳回到 bucla 时,DX要么指向 mesaj_1,要么指向 mesaj_2

jmp tipareste
tipareste: 
   mov ah, 9
   int 21h

你的麻烦“重复打印”的最后信息是一个简单的问题,不重复自己。
我写了你的代码的下一个优化版本。它更短,跳跃更少。特别是

jl maiMic
jg maiMare
je corect

很明显,第三个条件跳转是多余的。2如果条件既不是“小于”也不是“大于”,那么“等于”就是剩下的唯一一种情况。3重新安排你的代码,这样它就可以在剩下的情况下失败。

bucla:
  mov  dx, offset prompt
  mov  ah, 09h
  int  21h
  mov  ah, 01h
  int  21h
  mov  ch, al
  cmp  ch, cl
  mov  dx, offset mesaj_1
  jl   mesaj
  mov  dx, offset mesaj_2
  jg   mesaj
  mov  dx, offset mesaj_3
mesaj:
  mov  ah, 09h          ; Prints any of the 3 messages
  int  21h
  cmp  ch, cl
  jne  bucla            ; Repeat while not correct answer
  mov  ax, 4C00h
  int  21h

相关问题