Программа случайным образом загадывает число от 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
Объяснение кода листинга программы
- Переменная
bl
получает значение 99. - Выполняется деление
bl
на 99. - Результат деления сохраняется в регистре
al
. - Значение регистра
ah
устанавливается равным 0. - Регистр
ax
увеличивается на 1. - Значение регистра
ax
сохраняется в переменнойdi
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д