Программа случайным образом загадывает число от 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д