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

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

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

Программа работает, но загадывает число не от 1 до 99. Помогите исправить ошибку
Листинг программы
  1. .MODEL SMALL
  2. .STACK 100h
  3. .DATA
  4. ; сегмент даных ==================================
  5. ; блок сообщений для вывода на экран
  6. Msg_Rules db 10,'Number in the range [0..65535]',10,'Q - Quit',10,'$'
  7. Msg_Enter db 'Enter number: $'
  8. Msg_less db 'Smaller',10,'$'
  9. Msg_More db 'More',10,'$'
  10. Msg_Equally db 'You got it!!!',10,'Continue (y/n)? $'
  11. Msg_No_Digit db 'Put no digit',10,'$'
  12. ; структура для ввода номера в символьном виде
  13. Number db 6 ; максимальная длина строки +1
  14. Len db ? ; реальная длина введеной строки
  15. String db 6 dup(?) ; введеная строка + код возрата каретки
  16. .CODE
  17. ; сегмент кода ===================================
  18. Start:
  19. mov ax,@data ; настройка сегмента даных
  20. mov ds,ax555
  21. cld ; сброс флага направления
  22. Begin_:
  23. ; вывод "правил"
  24. mov ah,9 ; функция вывода сообщения на экран
  25. lea dx,Msg_Rules ; адрес сообщения
  26. int 21h ; прерывание ДОС
  27. ; "загадывание" числа
  28. in al,42h ; ввод в AL первого байта счетчика таймера
  29. mov ah,al ; сохраняем как старший байт
  30. in al,42h ; ввод в AL второго байта счетчика таймера
  31. mov di,ax ; в DI - случайное загаданое число
  32. loop_:
  33. ; цикл отгадывания
  34. ; вывод приглашения к вводу числа
  35. lea dx,Msg_Enter
  36. mov ah,9
  37. int 21h
  38. ; ввод числа в символьной форме
  39. mov ah,0ch ; функция очистки буфера ввода
  40. mov al,0ah ; затем ввод строки
  41. lea dx,Number ; структура для ввода
  42. int 21h ; очистить буфер и ввести строку
  43. ; перевести строку
  44. mov ah,2 ; функция вывода символа
  45. mov dl,10 ; код перевода строки
  46. int 21h
  47. ; проверка ввода 'Q' - признак выхода
  48. cmp String,'q' ; сравнение с q
  49. je quit ; выход при совпадении
  50. cmp String,'Q' ; сравнение с Q
  51. je quit ; выход при совпадении
  52. ; перевод введеного числа из символьного предмтавления в числовое
  53. lea si,String ; адрес введеной строки
  54. mov dx,0 ; число
  55. string_to_number:
  56. mov ax,10 ; основание системы счисления
  57. mul dx ; умножить ранее выделенное число на 10
  58. mov dx,ax ; результат сохранить в DX
  59. lodsb ; закрузить символ в AL<-[SI], SI=SI+1
  60. cmp al,'0' ; если символ меньше 0
  61. jb no_digit ; переход
  62. cmp al,'9' ; если символ больше 9
  63. ja no_digit ; переход
  64. sub al,'0' ; перевод кода цифры(символа) в цифру
  65. mov ah,0 ; старший байт установить в 0
  66. add dx,ax ; добавить цифру к числу
  67. dec Len ; уменьшить кол-во оставшихся символов
  68. jnz string_to_number ; если не 0 - перейти к дальнейшему разбору
  69. ; в DX введеное число, DI - загаданое
  70. cmp di,dx ; сравнить числа
  71. jb less ; перейти если загаданое меньше
  72. je equally ; перейти если угадали
  73. lea dx,Msg_More ; иначе загаданое больше - адрес соотв. сообщения
  74. jmp print ; переход к выводу сообщения на экран
  75. ; введен не цифровой символ
  76. no_digit:
  77. lea dx,Msg_No_Digit ; адрес выводимого сообщения
  78. jmp print ; вывод сообщения
  79. ; загаданое меньше
  80. less:
  81. lea dx,Msg_Less ; адрес сообщения
  82. ; вывод сообщения, адрес которого находится в DX
  83. print:
  84. mov ah,9 ; функция вывода сообщения на экран
  85. int 21h ; вывод сообщения
  86. jmp loop_ ; переход к вводу следующего числа
  87. ; число угадано
  88. equally:
  89. mov ah,9 ; функция вывода сообщения
  90. lea dx,Msg_Equally ; адрес сообщения
  91. int 21h ; вывод сообщения
  92. mov ah,0ch ; функция очистки буфера
  93. mov al,1 ; с вводом нажатого символа
  94. int 21h ; ожидание нажатия клавиши
  95. cmp al,'n' ; введеный символ n
  96. je Quit ; тогда переход
  97. cmp al,'N' ; введеный символ N
  98. je Quit ; тогда переход
  99. jmp Begin_ ; иначе переход - еще один раунд
  100. ; окончание выполнения программы
  101. Quit:
  102. mov ah,4ch ; функция завершения программы
  103. int 21h
  104. END start ; точка входа - начало выполнения программы

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

textual
Листинг программы
  1.         mov bl, 99
  2.         div bl
  3.         mov al, ah
  4.         mov ah, 0
  5.         inc ax
  6.         mov di, ax

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

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

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


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

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

12   голосов , оценка 4.167 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы