Перевод курсора на следующую строку (текстовый режим) - Assembler

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

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

Здравствуйте, недавно начал изучать Assembler (MASM), тренируюсь пока что на DOS, возникла необходимость перевести курсор на следующую строку, попытался использовать видео сервис BIOS, но при переводе курсора затирается видеобуфер, вместе с предыдущим выводом. Подскажите, как установить курсор на следующую строку и при этом не потерять предыдущий вывод? Скорее всего, я где-то ошибся в коде, см. процедуру endline. Заранее спасибо
Листинг программы
  1. ;Начало сегмента
  2. CSEG segment
  3. ;Смещение по которому необходимо загрузить программу
  4. DOS программы загружаются по смещению 100h
  5. org 100h
  6. Start:
  7. ;Загружаем адрес строки ASCIIZ, содержащую путь к файлу в регистр DX
  8. mov dx, offset File
  9. ;Вызов процедуры получения описателя файла
  10. call fopen
  11. ;Перевод курсора на следующую строку
  12. ;call endline - НЕ РАБОТАЕТ, ЗАТИРАЕТ ВИДЕОБУФЕР
  13. ;Ожидание ввода одного символа
  14. call wait_key
  15. ;Передача управления в DOS
  16. mov ah, 4ch
  17. int 21h
  18. ;Подпрограммы
  19. ;================================================================
  20. ;Получение описателя файла с помощью сервиса DOS
  21. ;[Выход] BX - описатель файла
  22. ;[Вход] DX - ссылка на строку ASCIIZ содержащую путь к файлу
  23. ;ВНИМАНИЕ! Затрагиваются регистры: AX, DX
  24. fopen PROC
  25. mov ah, 3Dh
  26. ;Открываем файл для чтения (режим 0)
  27. mov al, 0
  28. int 21h
  29. ;Переходим на метку в соответствии с флагом переноса (при ошибке CF = 1)
  30. jc ifcarry
  31. jnc nocarry
  32. ;Описатель файла успешно получен
  33. nocarry: mov dx, offset Success
  34. mov bx, ax
  35. jmp exit
  36. ;Произошла ошибка при попытке получить описатель
  37. ifcarry: mov dx, offset Failure
  38. jmp exit
  39. exit:
  40. mov ah, 09h
  41. int 21h
  42. ret
  43. fopen ENDP
  44. ;================================================================
  45. ;Ожидание ввода одного символа с выводом сообщения
  46. ;[Выход] AX - код нажатой клавиши
  47. wait_key PROC
  48. push dx
  49. mov dx, offset Message
  50. mov ah, 09h
  51. int 21h
  52. mov ah, 10h
  53. int 16h
  54. pop dx
  55. ret
  56. Message db "Press any key to continue...$"
  57. wait_key ENDP
  58. ;================================================================
  59. ;Перевод курсора на следующую строку с помощью видео сервиса BIOS
  60. endline PROC
  61. ;Используется нулевая видеостраница
  62. mov bh, 0
  63. ;Используем сервис для чтения позиции курсора
  64. mov ah, 03h
  65. int 10h
  66. ;Прибавляем к текущей строке 1, для перехода на следующую
  67. inc dh
  68. ;На следующей строке курсор будет находиться в первой колонке
  69. mov dl, 0
  70. ;Используем сервис для установки позиции курсора
  71. mov ah, 02h
  72. int 10h
  73. ret
  74. endline ENDP
  75. File db "textfile.txt", 0
  76. Failure db "Failure!$"
  77. Success db "Success!$"
  78. ;Конец сегмента
  79. CSEG ends
  80. ;Конец программы
  81. END start

Решение задачи: «Перевод курсора на следующую строку (текстовый режим)»

textual
Листинг программы
  1. Message  db  13,10,"Press any key to continue...$"

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

  1. В первой строке кода Message db 13,10,Press any key to continue...$`` указывается сообщение, которое будет выводиться на экран при завершении работы программы.
  2. 13 - код символа возврата каретки, который указывает на перевод курсора на следующую строку.
  3. 10 - код символа перевода строки, который указывает на переход на новую строку.
  4. Press any key to continue...$ - строка сообщения, которая будет выводиться на экран.

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


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

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

7   голосов , оценка 4.286 из 5

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

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

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