Перевод курсора на следующую строку (текстовый режим) - Assembler
Формулировка задачи:
Здравствуйте, недавно начал изучать Assembler (MASM), тренируюсь пока что на DOS, возникла необходимость перевести курсор на следующую строку, попытался использовать видео сервис BIOS, но при переводе курсора затирается видеобуфер, вместе с предыдущим выводом. Подскажите, как установить курсор на следующую строку и при этом не потерять предыдущий вывод?
Скорее всего, я где-то ошибся в коде, см. процедуру endline.
Заранее спасибо
Листинг программы
- ;Начало сегмента
- CSEG segment
- ;Смещение по которому необходимо загрузить программу
- ;В DOS программы загружаются по смещению 100h
- org 100h
- Start:
- ;Загружаем адрес строки ASCIIZ, содержащую путь к файлу в регистр DX
- mov dx, offset File
- ;Вызов процедуры получения описателя файла
- call fopen
- ;Перевод курсора на следующую строку
- ;call endline - НЕ РАБОТАЕТ, ЗАТИРАЕТ ВИДЕОБУФЕР
- ;Ожидание ввода одного символа
- call wait_key
- ;Передача управления в DOS
- mov ah, 4ch
- int 21h
- ;Подпрограммы
- ;================================================================
- ;Получение описателя файла с помощью сервиса DOS
- ;[Выход] BX - описатель файла
- ;[Вход] DX - ссылка на строку ASCIIZ содержащую путь к файлу
- ;ВНИМАНИЕ! Затрагиваются регистры: AX, DX
- fopen PROC
- mov ah, 3Dh
- ;Открываем файл для чтения (режим 0)
- mov al, 0
- int 21h
- ;Переходим на метку в соответствии с флагом переноса (при ошибке CF = 1)
- jc ifcarry
- jnc nocarry
- ;Описатель файла успешно получен
- nocarry: mov dx, offset Success
- mov bx, ax
- jmp exit
- ;Произошла ошибка при попытке получить описатель
- ifcarry: mov dx, offset Failure
- jmp exit
- exit:
- mov ah, 09h
- int 21h
- ret
- fopen ENDP
- ;================================================================
- ;Ожидание ввода одного символа с выводом сообщения
- ;[Выход] AX - код нажатой клавиши
- wait_key PROC
- push dx
- mov dx, offset Message
- mov ah, 09h
- int 21h
- mov ah, 10h
- int 16h
- pop dx
- ret
- Message db "Press any key to continue...$"
- wait_key ENDP
- ;================================================================
- ;Перевод курсора на следующую строку с помощью видео сервиса BIOS
- endline PROC
- ;Используется нулевая видеостраница
- mov bh, 0
- ;Используем сервис для чтения позиции курсора
- mov ah, 03h
- int 10h
- ;Прибавляем к текущей строке 1, для перехода на следующую
- inc dh
- ;На следующей строке курсор будет находиться в первой колонке
- mov dl, 0
- ;Используем сервис для установки позиции курсора
- mov ah, 02h
- int 10h
- ret
- endline ENDP
- File db "textfile.txt", 0
- Failure db "Failure!$"
- Success db "Success!$"
- ;Конец сегмента
- CSEG ends
- ;Конец программы
- END start
Решение задачи: «Перевод курсора на следующую строку (текстовый режим)»
textual
Листинг программы
- Message db 13,10,"Press any key to continue...$"
Объяснение кода листинга программы
- В первой строке кода
Message db 13,10,
Press any key to continue...$`` указывается сообщение, которое будет выводиться на экран при завершении работы программы. 13
- код символа возврата каретки, который указывает на перевод курсора на следующую строку.10
- код символа перевода строки, который указывает на переход на новую строку.Press any key to continue...$
- строка сообщения, которая будет выводиться на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д