Программа случайным образом загадывает число от 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.