1.1 Функция DOS 02h.
Функция DOS 02h - Записать символ в STDOUT с проверкой на Ctrl-Break
Ввод: | АН = 02h DL = ASCII-код символа |
Вывод: | Никакого, согласно документации, но на самом деле: AL = код последнего записанного символа (равен DL, кроме случая, когда DL = 09h (табуляция), тогда в AL возвращается 20h). |
Эта функция при выводе на экран обрабатывает некоторые управляющие символы - вывод символа BEL (07h) приводит к звуковому сигналу, символ BS (08h) приводит к движению курсора влево на одну позицию, символ НТ (09h) заменяется на несколько пробелов, символ LF (0Ah) опускает курсор на одну позицию вниз, и CR (0Dh) приводит к переходу на начало текущей строки.
Если в ходе работы этой функции была нажата комбинация клавиш Ctrl-Break, вызывается прерывание 23h, которое по умолчанию осуществляет выход из программы.
Простой пример работы функции DOS 02h.
Пример № 1.1
. model tiny | ; модель памяти в которой сегменты кода, данных и стека объединены. |
. code | ; сегмент кода, который содержит данные. |
org 100h | ; начало СОМ-файла |
begin: | ; метка начала кода программы |
mov dl,< ASCII-код символа > | ; заносим в регистр dl - любой ASCII-код символа |
mov ah,2 | ; номер функции DOS "вывод символа" |
int 21h | ; вызов DOS |
ret | ; функция DOS "завершить программу" |
end begin | ; метка окончания кода программы |
Эта программа, выводит на экран любой ASCII-символ, в установленную позицию курсора.
Все функции DOS вывода на экран используют устройство STDOUT, стандартный вывод. Это позволяет перенаправлять вывод программы в файл или на стандартный ввод другой программы. Например, если откомпилировать приведен пример (создать файл cod.com) и написать в командной строке
cod.com > cod. out
то на экран ничего выдано не будет, а в текущем каталоге появится файл cod. out, содержащий ASCII-код символа.
Функция DOS 06h.
Функция DOS 06h - Записать символ в STDOUT без проверки на Ctrl-Break
Ввод: | АН = 06h DL = ASCII-код символа (кроме FFh) |
Вывод: | Никакого, согласно документации, но на самом деле: AL = код записанного символа (копия DL) |
Эта функция не обрабатывает управляющие символы (CR, LF, HT и BS выполняют свои функции при выводе на экран, но сохраняются при перенаправлении вывода в файл) и не проверяет нажатие Ctrl-Break.
Заменим в примере № 1.1 MOV АН,2 на MOV АН,6 и перекомпилируем этот пример. Работу откомпилированного примера смотрим в операционной системе MS-DOS.
Функция DOS 09h
Функция DOS 09h - Записать строку в STDOUT с проверкой на Ctrl-Break
Ввод: | АН = 09h DS: DX = адрес строки, заканчивающейся символом $ (24h) |
Вывод: | Никакого, согласно документации, но на самом деле: AL = 24h (код последнего символа) |
Действие этой функции полностью аналогично действию функции 02h, но выводится не один символ, а целая строка (смотри лабораторную работу №2).
1.4 Функция DOS 40h
Функция DOS 40h - Записать в файл или устройство
Ввод: | АН = 40h ВХ = 1 для STDOUT или 2 для STDERR DS: DX = адрес начала строки СХ = длина строки |
Вывод: | CF = 0, АХ = число записанных байт |
Эта функция предназначена для записи в файл, но, если в регистр ВХ поместить число 1, функция 40h будет выводить данные на STDOUT, а если ВХ = 2 - на устройство STDERR. STDERR всегда выводит данные на экран и не перенаправляется в файлы. На этой функции основаны используемые в С функции стандартного вывода - фактически функция С fputs () просто вызывает это прерывание, помещая свой первый аргумент в ВХ, адрес строки (второй аргумент) - в DS: DX и длину - в СХ.
Простой пример работы функции DOS 40h.
Пример № 1.2
. model tiny | ; модель памяти в которой сегменты кода, данных и стека объединены. |
. code | ; сегмент кода, который содержит данные. |
org 100h | ; начало СОМ-файла |
begin: | ; метка начала кода программы |
mov ah,40h | ; номер функции DOS |
mov bx,2 | ; указываем устройство STDERR |
mov dx,offset message | ; DS: DX - адрес строки |
mov cx,25 | ; CX - длина строки |
int 21h | ; вызов DOS |
ret | ; функция DOS "завершить программу" |
message db "This function can print $" | ; cтрока с содержащая выводимые данные. |
end begin | ; метка окончания кода программы |
Если скомпилировать этот пример и запустить ее командой
dosout.com > dosout. out
то сообщение появится на экране, а файл dosout2. out окажется пустым.
Прерывание INT 29H
INT 29h: Быстрый вывод символа на экран
Ввод: | AL = ASCII-код символа |
Простой пример работы прерывания INT 29h.
Пример № 1.3
. model tiny | ; модель памяти в которой сегменты кода, данных и стека объединены. |
. code | ; сегмент кода, который содержит данные. |
org 100h | ; начало СОМ-файла |
begin: | ; метка начала кода программы |
mov ax, < ASCII-код символа > | ; заносим в регистр ax - любой ASCII-код символа |
int 29h | ; вызов прерывания DOS - вызов символа; |
ret | ; функция DOS "завершить программу" |
end begin | ; метка окончания кода программы |
В большинстве случаев INT 29h просто немедленно вызывает функцию BIOS "вывод символа на экран в режиме телетайпа", так что никаких преимуществ, кроме экономии байт при написании как можно более коротких программ, она не имеет.
2. Средства BIOS
Функции DOS вывода на экран позволяют перенаправить вывод в файл, но не позволяют вывести текст в любую позицию экрана и не позволяют изменить цвет текста. DOS предполагает, что для более тонкой работы с экраном программы должны использоваться видеофункции BIOS. BIOS - обеспечивает доступ к некоторым устройствам, в частности к видеоадаптеру. Все функции видеосервиса BIOS вызываются через прерывание 10h.
0 комментариев