Программа случайным образом загадывает число от 1 до 99, а пользователь должен угадать число - Assembler

Узнай цену своей работы

Формулировка задачи:

Программа работает, но загадывает число не от 1 до 99. Помогите исправить ошибку
.MODEL SMALL
 
.STACK 100h
 
.DATA
; сегмент даных ==================================
; блок сообщений для вывода на экран
Msg_Rules db    10,'Number in the range [0..65535]',10,'Q - Quit',10,'$'
Msg_Enter db    'Enter number: $'
Msg_less  db    'Smaller',10,'$'
Msg_More  db    'More',10,'$'
Msg_Equally db  'You got it!!!',10,'Continue (y/n)? $'
Msg_No_Digit db 'Put no digit',10,'$'
; структура для ввода номера в символьном виде
Number    db    6               ; максимальная длина строки +1
Len       db    ?               ; реальная длина введеной строки
String    db    6 dup(?)        ; введеная строка + код возрата каретки
 
.CODE
; сегмент кода ===================================
Start:
          mov   ax,@data        ; настройка сегмента даных
          mov   ds,ax555
          cld                   ; сброс флага направления
          
Begin_:
          ; вывод "правил"
          mov   ah,9            ; функция вывода сообщения на экран
          lea   dx,Msg_Rules    ; адрес сообщения
          int   21h             ; прерывание ДОС
          ; "загадывание" числа
          in    al,42h          ; ввод в AL первого байта счетчика таймера
          mov   ah,al           ; сохраняем как старший байт
          in    al,42h          ; ввод в AL второго байта счетчика таймера
          mov   di,ax           ; в DI - случайное загаданое число
loop_:
; цикл отгадывания
          ; вывод приглашения к вводу числа
          lea   dx,Msg_Enter    
          mov   ah,9
          int   21h
          ; ввод числа в символьной форме
          mov   ah,0ch          ; функция очистки буфера ввода
          mov   al,0ah          ; затем ввод строки
          lea   dx,Number       ; структура для ввода
          int   21h             ; очистить буфер и ввести строку
          ; перевести строку
          mov   ah,2            ; функция вывода символа  
          mov   dl,10           ; код перевода строки
          int   21h       
          ; проверка ввода 'Q' - признак выхода
          cmp   String,'q'      ; сравнение с q
          je    quit            ; выход при совпадении
          cmp   String,'Q'      ; сравнение с Q
          je    quit            ; выход при совпадении
          ; перевод введеного числа из символьного предмтавления в числовое
          lea   si,String       ; адрес введеной строки
          mov   dx,0            ; число
string_to_number:
          mov   ax,10           ; основание системы счисления
          mul   dx              ; умножить ранее выделенное число на 10
          mov   dx,ax           ; результат сохранить в DX
          lodsb                 ; закрузить символ в AL<-[SI], SI=SI+1 
          cmp   al,'0'          ; если символ меньше 0
          jb    no_digit        ; переход
          cmp   al,'9'          ; если символ больше 9
          ja    no_digit        ; переход
          sub   al,'0'          ; перевод кода цифры(символа) в цифру
          mov   ah,0            ; старший байт установить в 0
          add   dx,ax           ; добавить цифру к числу
          dec   Len             ; уменьшить кол-во оставшихся символов
          jnz   string_to_number  ; если не 0 - перейти к дальнейшему разбору
          ; в DX введеное число, DI - загаданое
          cmp   di,dx           ; сравнить числа
          jb    less            ; перейти если загаданое меньше
          je    equally         ; перейти если угадали
          lea   dx,Msg_More     ; иначе загаданое больше - адрес соотв. сообщения
          jmp   print           ; переход к выводу сообщения на экран
          ; введен не цифровой символ
no_digit:                   
          lea   dx,Msg_No_Digit ; адрес выводимого сообщения
          jmp   print           ; вывод сообщения
          ; загаданое меньше
less:   
          lea   dx,Msg_Less     ; адрес сообщения
          ; вывод сообщения, адрес которого находится в DX
print:
          mov   ah,9            ; функция вывода сообщения на экран
          int   21h             ; вывод сообщения
          jmp   loop_           ; переход к вводу следующего числа
          ; число угадано
equally:
          mov   ah,9            ; функция вывода сообщения
          lea   dx,Msg_Equally  ; адрес сообщения
          int   21h             ; вывод сообщения
          mov   ah,0ch          ; функция очистки буфера
          mov   al,1            ; с вводом нажатого символа
          int   21h             ; ожидание нажатия клавиши
          cmp   al,'n'          ; введеный символ n
          je    Quit            ; тогда переход 
          cmp   al,'N'          ; введеный символ N
          je    Quit            ; тогда переход
          jmp   Begin_          ; иначе переход - еще один раунд
          
; окончание выполнения программы
Quit:
          mov   ah,4ch            ; функция завершения программы
          int   21h                  
          END   start             ; точка входа - начало выполнения программы

Решение задачи: «Программа случайным образом загадывает число от 1 до 99, а пользователь должен угадать число»

textual
Листинг программы
        mov bl, 99
        div bl
        mov al, ah
        mov ah, 0
        inc ax
        mov di, ax

Объяснение кода листинга программы

  1. Переменная bl получает значение 99.
  2. Выполняется деление bl на 99.
  3. Результат деления сохраняется в регистре al.
  4. Значение регистра ah устанавливается равным 0.
  5. Регистр ax увеличивается на 1.
  6. Значение регистра ax сохраняется в переменной di.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5
Похожие ответы