Функции dos


Операционная система MS-DOS

1.5. Обзор прерываний DOS

DOS предоставляет программе набор системных вызовов, реализованных с использованием механизма программных прерываний. Эти вызовы открывают прикладной программе доступ к системной информации, к системе консольного ввода/вывода, файловой системе, к подсистеме управления программами и памятью, позволяют организовать обращение к драйверам устройств ввода/вывода и т.д.

Все основные функции DOS вызываются с помощью прерывания INT 21h, однако DOS использует и другие прерывания:

INT 20h завершение работы программы;
INT 25h/26h чтение/запись на диск с абсолютной адресацией секторов;
INT 27h завершение работы программы с оставлением ее резидентной в памяти;
INT 28h прерывание зарезервировано для DOS, может быть использовано для составления резидентных программ;
INT 2Eh выполнение команды DOS;
INT 2Fh прерывание мультиплексора, используется для спулера печати PRINT.COM.

Функции прерывания INT 21h можно разделить на следующие группы:

  • получение системной информации;
  • символьный ввод/вывод;
  • работа с файловой системой;
  • управление программами;
  • управление памятью;
  • связь с драйверами устройств;
  • прочий системный сервис.

В данном обзоре мы кратко рассмотрим эти группы, делая акцент в основном на составе функций. Полностью информация об использовании функций прерывания DOS INT 21h (и других прерываний DOS) будет приводиться в соответствующих разделах книги.

Номер функции задается при вызове прерывания INT 21h в регистре AH.

Получение системной информации.

Функция 30h возвращает в регистре AX номер версии DOS. Например, для версии MS-DOS 5.00 содержимое регистра AH равно 00, регистра AL — 05.

Дополнительно через регистр BH функция возвращает программе серийный номер фирмы-производителя ОЕМ (IBM — 00, DEC — 16h, 0FFh — Microsoft и т.п.), а в регистрах BL:CX после вызова функции находится серийный номер пользователя.

Эта информация может применяться для анализа возможности использования таких средств операционной системы, которые поддерживаются не всеми версиями DOS, или для настройки программы на конкретный серийный номер пользователя.

Функции 2Ah и 2Ch позволяют программе узнать системную дату и время.

Есть функции, возвращающие текущий диск и текущий каталог. Номера этих функций — 19h и 47h.

Функция 2Fh позволяет программе узнать адрес текущей области DTA (Disk Transfer Area). Эта область используется, например, при поиске файлов в каталоге.

Важная информация находится в блоке PSP (Programm Segment Prefix). Этот блок располагается в памяти непосредственно перед выполняющейся программой. В нем находятся, в частности, параметры, передаваемые программе при запуске. Функция 62h возвращает адрес текущего блока PSP.

Кратко перечислим некоторые другие функции для получения системной информации:

35h получить значение вектора прерывания с заданным номером;
4Dh узнать код завершения процесса;
59h получить расширенный код ошибки;
54h узнать, используется ли проверка при записи на диск;
33h узнать, используется ли проверка на CTRL-BREAK.

Символьный ввод/вывод.

Эти функции применяются для работы со всеми символьными устройствами, такими как консоль, принтер, последовательный порт, и называются функциями стандартного ввода/вывода.

Ввод/вывод программы, использующей стандартные функции, может быть переназначен.

Приведем обзор основных функций стандартного символьного ввода/вывод в виде таблицы:

Код Назначение Описание
01h Ввод с клавиатуры Выполняется ввод символа со стандартного ввода и эхо-вывод символа на стандартное устройство вывода. Выполняется проверка на нажатие комбинации клавиш CTRL/C и CTRL-BREAK
06h Ввод с клавиатуры Ввод символа со стандартного ввода без ожидания и вывод его на устройство стандартного вывода. Комбинации CTRL/C и CTRL-BREAK не проверяются.
07h Прямой ввод Ввод символа со стандартного с клавиатуры устройства ввода. Комбинации клавиш CTRL/C и CTRL-BREAK не проверяются.
08h Ввод с клавиатуры Аналогично функции 07h, но проверяются комбинации клавиш CTRL/C и CTRL-BREAK.
02h Отобразить символ Отображаемый символ посылается на стандартное устройство вывода.
09h Отобразить строку На стандартное устройство вывода символов посылается строка, закрытая символом ‘$’.
03h Ввод из последовательного порта Вводится символ из последовательного порта
04h Вывод в последовательный порт Выводится символ на последовательный порт
05h Вывод на принтер Выводится символ на принтер.

Из таблицы видно, что для ввода с клавиатуры можно использовать несколько функций. Ввод без эхо-вывода удобен для такой информации, как пароли. Если логика работы программы не допускает прерывания по нажатию комбинаций клавиш CTRL-C или CTRL-BREAK, нужно использовать функции, которые не проверяют эти комбинации.

Для вывода строки символов можно использовать функцию 09h, но выводимая строка не может содержать символ ‘$’, так как этот символ используется в качестве признака конца строки.

Работа с файловой системой.

DOS предоставляет программам обширный сервис для работы с файлами и дисками. Практически все файловые операции можно выполнять с помощью специально предназначенных для этого функций, только в некоторых случаях (защита данных от копирования, например) приходится использовать прямое обращение к диску.

С помощью файловых функций DOS можно создавать и удалять файлы и каталоги, открывать и закрывать файлы, создавать временные файлы. Ввод/вывод может быть буферизован, можно получить как последовательный доступ к содержимому файла, так и произвольный.

Мы не будем приводить сейчас конкретные примеры или номера функций, отложим это до книги 3, посвященной файловой системе.

Управление программами.

DOS предоставляет программам возможность организовать запуск других программ или загрузку и выполнение программных оверлеев. Для этого служит функция 4Bh.

Для завершения работы программа должна также использовать одну из специальных функций DOS. Функция 4Ch, завершая работу программы, позволяет передать операционной системе некоторое число, называемое кодом завершения программы. Это число может быть затем проанализировано в пакетном файле командой IF ERRORLEVEL. Если одна программа запускает другую, то первая может получить код завершения второй с помощью функции 4Dh.

Для того чтобы завершающаяся программа осталась в оперативной памяти (т.е. стала резидентной), она должна вызвать прерывание INT 27h или воспользоваться функцией 31h.

Мы приведем различные примеры запуска программ из программ и научимся составлять резидентные программы.

Управление памятью.

DOS управляет распределением памяти с помощью блоков управления памятью MCB (Memory Control Block). Вся память разбивается на блоки различного размера, которым предшествует блок MCB, содержащий характеристики данного блока памяти (например, его размер).

Программа может динамически получать и освобождать области памяти с помощью функций 48h и 49h соответственно. Кроме того, можно изменять размер блока, выделенного операционной системой программе. Это делает функция 4Ah.

Детально механизм управления памятью будет рассмотрен в главе 2 при описании векторной таблицы связи DOS.

Связь с драйверами устройств.

Мы уже обращали Ваше внимание на то, что программы не могут обращаться непосредственно к драйверам устройств ввода/вывода. Все обращения к драйверам имеют либо неявный характер (ввод/вывод с помощью функций прерывания INT 21h), либо используют специальную функцию DOS с кодом 44h. Эта функция используется для обмена управляющей информацией между драйвером и программой.

Другие функции.

Существуют функции, позволяющие переопределять прерывания, работать с системными часами и календарем, функции для работы в сети и некоторые другие. Эти функции будут описаны позже в соответствующих разделах книги.

Функции DOS вывода данных на экран

DOS предоставляет следующие способы вывода данных на экран:

использование функций Int 21h (02h, 06h, 09h), обеспечивающих посимвольный ввод с клавиатуры в разных режимах;

обращение к экрану, как к файлу, с помощью функции 40h.

¨ Функция 02h. Вывод одиночного символа.

Выводит символ, находящийся в регистре DL, на экран, после чего курсор сдвигается на одну позицию вправо. Для вывода строки функцию следует использовать в цикле. Допустимо перенаправление вывода. Выполняет обработку при вводе этой комбинации с клавиатуры перед выводом каждого 64-го символа. Эта функция выводит и управляющие ASCII-символы с кодами 07h, 08h, 09h, 0Ah, 0Dh. Символ с кодом 07h (bell, звонок) вызывает звуковой сигнал, с кодом 08h (backspace, забой) – возвращает курсор на одну позицию влево, с кодом 09h (tab, табуляция) – смещает курсор на одну позицию вправо, кратную 8. Действия управляющих клавиш с кодами 0Ah и 0Dh рассматривались ранее.

Вызов: AH = 02h, Int 21h.

Выход: DL = ASCII – код символа,

AL = код последнего записанного символа (кроме случая, когда DL = 09, тогда возвращается значение 20h).

Использование данной функции рассмотрим на примере процедуры перехода на новую строку.

mov ah,2 ;Запрос функции 02h

mov dl,13 ;Возврат каретки

int 21h ;Вызов DOS

mov dl,10 ;перевод строки

int 21h ;Второй вызов DOS

¨ Функция 09h.Вывод строки.

Выводит строку символов на устройство стандартного вывода (используется в системных программах для вывода на экран информационных сообщений). Строка должна заканчиваться символом $ (код 24h), который служит признаком конца строки, и сам не выводится. Допустимо перенаправление вывода. В сообщение могут быть включены и управляющие коды (07h, 08h, 09h, 0Ah, 0Dh), которые вызывают соответствующие им действия (см. функцию 02h). Допустимо использование Exc-последовательностей. Функция выполняет обработку при вводе этой комбинации с клавиатуры перед выводом каждого 64-го символа.

lea dx,[Promt] ;Адрес строки Promt: DS:DX

mov ah,09h ;Запрос функции 09h


int 21h ;Вызов DOS

¨ Функция 40h.Вывод данных в файл или в устройство.

Универсальная функция вывода данных из буфера пользователя в сегменте данных в файл или на устройство, дескриптор которого указывается в регистре BX. Дескриптор 1, закреплённый за стандартным устройством вывода, обеспечивает перенаправление вывода. Значение регистра CX определяет число байтов, которые должны быть выведены, а пара регистров DS:DX указывает адрес выводимых данных. Управляющие коды 08h, 0Ah, 0Dh и некоторые другие приводят к выполнению соответствующих им действий. После завершения вывода при CF = 0 регистр AX содержит число действительно выведенных байтов, а при CF =1 – возвратный код ошибки. Как и при использовании функции 3Fh, это коды ошибок 5 или 6. Пример использования.

Out_Area DB 20 DUP(?)

mov ah,40h ;Запрос функции 40h

mov bx,01 ;Дескриптор дисплея

mov cx,20 ;Число пересылаемых байт

lea dx,[Out_Area] ;Адрес буфера для выводимого сообщения

int 21h ;Вызов DOS

Дата добавления: 2014-11-10 ; просмотров: 828 . Нарушение авторских прав

На тему: Базовые функции MS-DOS

студент гр. ВТ2-С10

Обнинск 2013

Цель работы: получить навыки выполнения операций над файлами средствами MS-DOS (без использования средств сервисных надстроек).

Ответы на контрольные вопросы:

Что такое операционная система?

Операционная система (супервизорная, мониторная, исполнительная) – это организационная совокупность программ (систем), которые действуют как интерфейс между аппаратурой ЭВМ и пользователем. Она обеспечивает пользователей набором средств для облегчения проектирования, программирования, отладки и сопровождения программ и в то же время управляет распределением ресурсов для обеспечения эффективной работы.

Каковы основные функции, выполняемые MS-DOS?

1) Функция ввода информации с клавиатуры и вывода информации на экран или на принтер. Передача данных по линиям связи (последовательный порт).

2) Функции высокого уровня, в частности, файловый ввод и вывод. В терминологии DOS – это «традиционные файловые функции», и они базируются на использовании системы, называемой Управлением блоками файлов или FCB.

3) Ряд универсальных функций, например, чтение и установка текущей даты и текущего времени.

4) Функция, сообщающая номер версии DOS, под управлением которой выполняется программа пользователя.

5) Функции для работы со структурами: функции для создания и уничтожения каталогов, перемещения файлов из каталога в каталог и т.д.

6) Функции, позволяющие программам пользователя работать непосредственно с устройствами компьютера, не выходя из рамок DOS, например, определение отсутствия дискеты в дисководе, переключение с одного диска на другой и т.д.

7) Функции для работы с памятью, позволяющие программам пользователя, выполняемым под управлением DOS, захватывать или освобождать оперативную память.

8) Функции, позволяющие программе загрузить и выполнить подпрограмму и оверлейную программу как самостоятельные модули.

9) Специальные функции, касающиеся локальных сетей, обеспечивают общий доступ к одному и тому же файлу нескольких компьютеров (через локальную сеть), занимающихся управлением и переадресацией вывода на принтер в локальной сети.

Какие составные части содержит MS-DOS?

1) Блок начальной загрузки ОС (Boot Record) – это очень короткая программа (512 байт), находящаяся в первом секторе каждой дискеты с ОС MS-DOS. Функция этой программы заключается в считывании в память еще двух модулей ОС, которые и завершают процесс загрузки MS-DOS. На жестком диске загрузчик ОС состоит из двух частей. Это связано с тем, что жесткий диск может быть разбит на несколько разделов (логические диски). Первая часть загрузчика находится в первом секторе жесткого диска; она выбирает, с какого из разделов жесткого диска следует продолжить загрузку. Вторая часть загрузчика находится в первом секторе этого раздела; она считывает в памяти модули MS-DOS и передает им управление.

2) Дисковый файл IO.SYS (для MS-DOS) или IBMBIO.COM (для PC-DOS) – модуль расширения базовой системы ввода-вывода.

3) Дисковый файл MSDOS.SYS (для MS-DOS) или IBMDOS.COM (для PC-DOS) – модуль обработки прерываний. Он реализует основные высокоуровневые услуги MS-DOS.

4) Командный процессор MS-DOS (COMMAND.COM) обрабатывает команды, вводимые пользователем. Командный процессор находится в дисковом файле COMMAND.COM на диске, с которого загружается ОС. Некоторые команды пользователя командный процессор выполняет сам. Такие команды называются внутренними. Для выполнения остальных (внешних) команд пользователя командный процессор ищет на дисках программу с соответствующим именем и, если находит ее, загружает в память и передает ей управление. По окончании работы программы командный процессор удаляет программу из памяти и выводит сообщение о готовности к выполнению команд (Приглашение MS-DOS).

5) Внешние команды MS-DOS – это программы, поставляемые вместе с ОС в виде отдельных файлов, выполняют действия обслуживающего характера, например, форматирование дискет, проверку дисков и т.д.

6) Драйверы устройств – это специальный программы, которые дополняют BIOS и обеспечивают обслуживание новых или нестандартное использование имеющихся устройств. Например, с помощью драйверов возможна работа с «электронным диском», т.е. частью памяти компьютера, с которой можно работать так же, как с диском. Драйверы загружаются в память компьютера при загрузке ОС, их имена указываются в специальном файле CONFIG.SYS. Такая схема облегчает добавление новых устройств и позволяет делать это, не затрагивая системные файлы MS-DOS.

Илон Маск рекомендует:  Iis использование списка доверенных сертификатов

Какую функцию выполняет каждая из составных частей?

1) Блок начальной загрузки ОС — функция этой программы заключается в считывании в память еще двух модулей ОС, которые и завершают процесс загрузки MS-DOS.

2) Дисковый файл IO.SYS (для MS-DOS) или IBMBIO.COM (для PC-DOS) – его функция в расширении базовой системы ввода-вывода.

3) Дисковый файл MSDOS.SYS (для MS-DOS) или IBMDOS.COM (для PC-DOS) – его функция в обработке прерываний и в реализации основных высокоуровневых услуг MS-DOS.

4) Командный процессор MS-DOS (COMMAND.COM) — его функция в обработке команд, вводимых пользователем.

5) Внешние команды MS-DOS – выполняют обслуживающее действие (форматирование дискет, проверка дисков и т.д.).

6) Драйверы устройств – дополняют BIOS и обеспечивают обслуживание новых или нестандартное использование имеющихся устройств.

Где размещается блок параметров BIOS?

Блок параметров BIOS размещается в постоянной памяти компьютера.

Какие действия выполняются при загрузке MS-DOS?

Начальная загрузка MS-DOS выполняется автоматически в следующих случаях:

• при включении электропитания компьютера;

• при нажатии на клавишу RESET на корпусе компьютера; 8

• при одновременном нажатии клавиш CTRL+ALT+DEL на

Для выполнения начальной загрузки MS-DOS необходимо, чтобы на дисководе А для гибких дисков была установлена дискета с записанной ОС MS-DOS или компьютер имел жесткий диск (винчестер) с записанной на нем ОС MS-DOS.

Базовая система ввода-вывода (BIOS – Basic Input/Output System) находится в постоянной памяти (постоянном запоминающем устройстве – ПЗУ) компьютера. Эта часть ОС является «встроенной» в компьютер. Ее назначение состоит в выполнении наиболее простых и универсальных услуг ОС, связанных с осуществлением ввода-вывода. Базовая система ввода-вывода содержит также тест функционирования компьютера, проверяющий работу памяти и устройств компьютера при включении электропитания. Кроме того, базовая система ввода-вывода содержит программу вызова загрузчика операционной системы.

После того как с диска, с которого загружается ОС, прочитана программа-загрузчик ОС, эта программа считывает в память компьютера модули ОС (IO.SYS и MS-DOS.SYS) и передает им управление.

Далее с этого же диска читается файл конфигурации системы CONFIG.SYS и в соответствии с указаниями, содержащимися в этом файле, загружаются драйверы устройств и устанавливаются параметры ОС. Если файл CONFIG.SYS отсутствует, все параметры устанавливаются по умолчанию.

Затем с диска, с которого загружается ОС, читается командный процессор COMMAND.COM и ему передается управление. Командный процессор выполняет командный AUTOEXEC.BAT, если этот файл имеется в корневом каталоге диска, с которого загружается ОС. В файле AUTOEXEC.BAT указывают команды и программы, выполняемые при каждом запуске компьютера. Если файл AUTOEXEC.BAT не найден в корневом каталоге диска, с которого загружается ОС, то DOS запрашивает у пользователя текущую дату и время.

После выполнения файла AUTOEXEC.BAT процесс загрузки ОС заканчивается. DOS выдает приглашение, показывающее, что она готова к приему команд.

С каких устройств осуществляется загрузка MS-DOS?

Загрузка MS-DOS осуществляется с загрузочной дискеты или с жесткого диска.

Функции прерывания DOS INT 21H

Ниже приведены базовые функции для прерывания DOS INT 21H. Код функции устанавливается в регистре AH:

Завершение программы (аналогично INT 20H).

Ввод символа с клавиатуры с эхом на экран.

Вывод символа на экран.

Ввод символа из асинхронного коммуникационного канала.


Вывод символа на асинхронный коммуникационный канал.

Вывод символа на печать (гл.19).

Прямой ввод с клавиатуры и вывод на экран.

Ввод с клавиатуры без эха и без проверки Ctrl/Break.

Ввод с клавиатуры без эха с проверкой Ctrl/Break.

Вывод строки символов на экран.

Ввод с клавиатуры с буферизацией.

Проверка наличия ввода с клавиатуры.

Очистка буфера ввода с клавиатуры и запрос на ввод.

Установка текущего дисковода.

Открытие файла через FCB.

Закрытие файла через FCB.

Начальный поиск файла по шаблону.

Поиск следующего файла по шаблону.

Удаление файла с диска.

Последовательное чтение файла.

Последовательная запись файла.

Внутренняя операция DOS.

Определение текущего дисковода.

Установка области передачи данных (DTA).

Получение таблицы FAT для текущего дисковода.

Получение FAT для любого дисковода.

Чтение с диска с прямым доступом.

Запись на диск с прямым доступом.

Определение размера файла.

Установка номера записи для прямого доступа.

Установка вектора прерывания.

Создание программного сегмента.

Чтение блока записей с прямым доступом.

Запись блока с прямым доступом.

Преобразование имени файла во внутренние параметры.

Получение даты (CX-год,DН-месяц,DL-день).

Получение времени (CH-час,CL-мин,DН-с,DL-1/100с).

Установка/отмена верификации записи на диск.

Получение адреса DTA в регистровой паре ES:BX.

Получение номера версии DOS в регистре АХ.

Завершение программы, после которого она остается резидентной в памяти.

Получение вектора прерывания (адреса подпрограммы).

Получение размера свободного пространства на диске.

Получение государственно зависимых форматов.

Создание подкаталога (команда MKDIR).

Удаление подкаталога (команда RMDIR).

Установка текущего каталога (команда CHDIR).

Создание файла без использования FCB.

Открытие файла без использования FCB.

Закрытие файла без использования FCB.

Чтение из файла или ввод с устройства.

Запись в файл или вывод на устройство.

Удаление файла из каталога.

Установка позиции для последовательного доступа.

Изменение атрибутов файла.

Управление вводом-выводом для различных устройств.

Дублирование файлового номера.

«Склеивание» дублированных файловых номеров.

Получение текущего каталога.

Выделение памяти из свободного пространства.

Освобождений выделенной памяти.

Изменение длины блока выделенной памяти.

Загрузка/выполнение программы (подпроцесса).

Завершение подпроцесса с возвратом управления.

Получение кода завершения подпроцесса.

Начальный поиск файла по шаблону.


Поиск следующего файла по шаблону.

Получение состояния верификации.

Получение/установка даты и времени изменения файла.

Получение расширенного кода ошибки.

Создание временного файла.

Создание нового файла.

Блокирование/разблокирование доступа к файлу.

Получение адреса префикса программного сегмента (PSP).

Порты

Порт представляет собой устройство, которое соединяет процессор с внешним миром. Через порт процессор получает сигналы с устройств ввода и посылает сигналы на устройство вывода. Теоретически процессор может управлять до 65 536 портами, начиная с нулевого порта. Для управления вводом-выводом непосредственно на уровне порта используются команды IN и OUT:

uКоманда IN передает данные из входного порта в регистр AL (байт) или в регистр АХ (слово). Формат команды:

uКоманда OUT передает данные в порт из регистра AL (байт) или из регистра АХ (слово). Формат команды:

Номер порта можно указывать статически или динамически:

1. Статическое указание порта возможно при непосредственном использовании значения от 0 до 255:

Ввод: IN AL.порт# ;Ввод одного байта

Вывод: OUT порт#,АХ ;Вывод одного слова

2. Динамическое указание порта устанавливается в регистре DX от 0 до 65535. Этот метод удобен для последовательной обработки нескольких портов. Значение в регистре DX в этом случае увеличивается в цикле на 1. Пример ввода байта из порта 60Н:

MOV DX,60H ;Порт 60Н (клавиатура)

IN AL,DX ;Ввод байта

Ниже приведен список некоторых портов (номера в шестнадцатеричном представлении):

Регистры маски прерывании.

Ввод с клавиатуры

Звуковой порт (биты 0 и 1)

Монохромный дисплей и параллельный адаптер печати

В случае, если, например, программа запрашивает ввод с клавиатуры, то она выдает команду прерывания INT 16H. В этом случае система устанавливает связь с BIOS, которая с помощью команды IN вводит байт с порта 60Н.

На практике рекомендуется пользоваться прерываниями DOS и BIOS.

Однако можно также успешно обойтись без BIOS при работе с портами 21, 40. 42, 60 и 201.

Вывод на экран средствами DOS

DOS предоставляет следующие возможности вывода текстовой информации на экран:

-обращение к экрану как к файлу, с помощью прерывания DOS Int 21h с

-использование группы функций DOS из диапазона l. Ch (прерывание Int

21h) , реализующих посимвольный вывод, а также вывод строк.

Вывод на экран средствами файловой системы (Int 21h, функция 40h) осуществляется точно так же, как и запись в файл. Используются предопределенные дескрипторы 1 или 2, закрепленные за стандартными устройствами вывода и ошибки, соответственно (по умолчанию — экраном). Число выводимых символов указывается в регистре СХ, а адрес выводимой строки — в регистре DX. Коды 08h (забой), 0Ah (перевод строки), 0Dh (возврат каретки) и некоторые другие рассматриваются, как управляющие и приводят к выполнению соответствующих им действий. Число выводимых символов передается через регистр СХ, однако, если в строке встречается /Z (код 26), вывод прекращается. Дескриптор 1, закрепленный за стандартным устройством вывода, обеспечивает перенаправление вывода. Пусть, например, программа FILTXT содержит строки вывода через дескриптор 1. При запуске программы командой

ее вывод появится на экране, однако команда

приведет к автоматическому образованию файла MYFILE.DOC и записи в него всего вывода программы (на экран ничего не поступит); команда

направит вывод программы FILTXT в тот же файл MYFILE.DOC, при этом новая запись добавится к уже сущест­вующим, увеличив тем самым длину файла MYFILE.TXT.

Предопределенный дескриптор 2 (стандартная ошибка) всегда связан с экраном и не может быть перенаправлен.

Если требуется исключить для каких-то операторов вывода или для всей программы в целом возможность перенаправле­ния, то, помимо использования дескриптора стандартной ошиб­ки, можно открыть экран, как файл (с именем CON) функци­ей 3Dh, получить выделенный системой дескриптор, а затем использовать его в операциях вывода 40h:

screen db ‘CON’,0 ;Имя устройства

handlscr dw 0 ;Новый дескриптор

;Откроем новый дескриптор

mov АН,3Dh ;Функция открытия

mov AL.1 ;Доступ для записи

mov DX,off set screen ;Адрес имени устройства

mov handlscr,AX ;Получили дескриптор

Второй способ вывода на экран текстовой информации реализуется с помощью трех функций прерывания Int 21h:

02h — вывод символа;

06h — прямой ввод-вывод;

09h — вывод строки.

Функция 09h широко используется в системных программах (например, в драйверах) для вывода на экран информационных и диагностических сообщений. Перед вызовом прерывания адрес сообщения засылается в регистр DX; заканчивается сообщение символом «$». В сообщение могут быть включены управляющие коды (возврата каретки, перевода строки, забоя и др.), а также Esc-последовательности. Так же, как и при выводе через дескриптор 1 (функция 40h), вывод функцией 09h поступает на стандартное устройство вывода и при запуске программы может быть перенаправлен на другие внешние устройства с помощью операторов перенаправления.

Если в процессе вывода сообщения на экран с клавиатуры поступает код /C, срабатывает стандартная процедура обработки этого прерывания и вывод завершается (как и вся программа в целом). Для надежной обработки прерывания по /C следует включать режим BREAK (командой DOS BREAK ON).

Функция 02h вызывает передачу на экран (точнее — на стандартное устройство вывода) одного символа, помещаемого в регистр DL. Для вывода строки функцию следует использовать в цикле. В остальном она не отличается от функции 09h (перенаправление, обработка управляющих кодов, реакция на ввод с клавиатуры /C).

Функция 06h (прямой ввод-вывод через консоль) используется в тех случаях, когда надо исключить стандартную реакцию системы на ввод с клавиатуры /C. В остальном она действует так же, как функции 09h и 02h, однако обеспечивает не только вывод, но ввод. В случае вывода код ASCII передаваемого символа засылается в регистр DL; при вводе DL=FFh.

Средства DOS «в чистом виде» позволяют выводить на экран только черно-белый текст; возможности позиционирования текста на экране ограничиваются использованием символов возврата каретки (0Dh) и перевода строки (0Ah). Для вывода на экран средствами DOS цветных изображений следует использовать управляющие Esc-последовательности, реализуемые драйвером ANSI.SYS.

Дата добавления: 2015-07-13 ; Просмотров: 890 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Системные функции MS DOS и BIOS

Обращение к системным функциям DOS и BIOS осуществляется с помощью программных прерываний (команда int).

В начале оперативной памяти от адреса OOOOh до 03ffh располагается таблица векторов прерываний, в которой под каждый вектор прерывания отводится 4 байта, содержащих адрес программы обработки прерывания (ПОП). В два старших байта каждого вектора записывается сегментный адрес ПОП, в два младших — относительный адрес точки входа в ПОП в сегменте. Векторы, как и соответствующие им прерывания, имеют номера, называемые типами, причем вектор с номером 0 (вектор типа 0) располагается начиная с адреса 0, вектор типа 1 — с адреса 4, вектор типа 2 — с адреса 8 и т.д. Вектор с номером N занимает, таким образом, байты памяти от Nx 4 до #х 4 + 3. Всего в выделенной на векторы прерывания области памяти помещаются 256 векторов.

Получив сигнал на выполнение процедуры прерывания с определенным номером, процессор сохраняет в стеке выполняемой программы слово флагов, а также сегментный и относительный адрес сегмента команд (содержимое CS и IP) и загружает CS и IP из соответствующего вектора прерываний, осуществляя тем самым переход на ПОП (рис. 7.6).

Программа обработки прерывания обычно заканчивается командой возврата из прерывания iret, выполняющей обратные действия — загрузку CS и IP и регистра флагов из стека, что приводит к возврату в основную программу, в точку, где она была прервана.


Запросы на выполнение процедуры прерываний могут иметь различную природу. Прежде всего различают аппаратные прерывания от периферийных устройств или других компонентов системы и программные прерывания, вызываемые командой int, которая ис-

Рис. 7.6. Процедура прерывания

пользуется, в частности, для обращения к функциям DOS и BIOS. Сигналы, вызывающие аппаратные прерывания, могут инициироваться самим процессором, например, при попытке деления на О, а могут приходить и от внешних устройств. Независимо от источника прерывания процедура обработки прерывания, описанная выше, всегда выполняется одинаково как для аппаратных, так и для программных прерываний.

Большая часть векторов прерываний зарезервирована для выполнения определенных действий, часть из них автоматически заполняется адресами системных программ при запуске системы.

Векторы прерываний можно условно разбить на следующие группы:

  • • векторы аппаратных прерываний (08h—OFh, 70h—77h);
  • • функции BIOS (lOh, 13h, 16h и т.д.);
  • • функции DOS (2lh, 22h, 23h и т.д.);
  • • адреса системных таблиц BIOS (1 Dh, 1 Eh, 43h и т.д.).

Системные программы, адреса которых хранятся в векторах прерываний, в большинстве своем являются всего лишь диспетчерами, открывающими доступ к большим группам программ, реализующих системные функции, например вектор 21h, через который осуществляется практически вызов всех функций DOS.

Обращение из прикладной программы к системным функциям осуществляется единообразно. В регистр АН записывается номер функции (не путать с типом прерывания), а в другие регистры — исходные данные, необходимые для выполнения конкретной системной функции. После этого выполняется команда int с числовым аргументом, указывающим тип (номер) прерывания, например int 21h.

Большинство функций DOS и многие функции BIOS возвращают в флаге переноса CF код завершения. Если функция выполнена успешно, CF = 0, в случае же любой ошибки CF = 1. В последнем случае в одном из регистров (чаще всего в АХ) возвращается еще и код ошибки. Таким образом, типичная процедура обращения к системным функциям выглядит следующим образом:

Илон Маск рекомендует:  Как восстановить пароль в контакте

MOV АН, funk ; funk — номер функции

; Заполнение тех или иных регистров (AL, ВХ, ES, ВР и др.)

; параметрами, необходимыми для выполнения данной функции

INT 21h ; переход в DOS

JC error ; Строка выполняется сразу

; после возврата из DOS ; Продолжение программы

error: CMP АХ, 1 ; Анализ кода завершения

JE errl CMP АХ, 2 JE err2

Аналогично вызываются и функции BIOS. Справочный материал по функциям DOS и BIOS описан в большом числе различной литературы.

Функция DOS 02h

1.1 Функция DOS 02h.

Функция DOS 02h — Записать символ в STDOUT с проверкой на Ctrl-Break

DL = ASCII-код символа

Вывод: Никакого, согласно документации, но на самом деле: AL = код последнего записанного символа (равен DL, кроме случая, когда DL = 09h (табуляция), тогда в AL возвращается 20h).

Эта функция при выводе на экран обрабатывает некоторые управляющие символы — вывод символа BEL (07h) приводит к звуковому сигналу, символ BS (08h) приводит к движению курсора влево на одну позицию, символ НТ (09h) заменяется на несколько пробелов, символ LF (0Ah) опускает курсор на одну позицию вниз, и CR (0Dh) приводит к переходу на начало текущей строки.

Если в ходе работы этой функции была нажата комбинация клавиш Ctrl-Break, вызывается прерывание 23h, которое по умолчанию осуществляет выход из программы.

Простой пример работы функции DOS 02h.

. model tiny ; модель памяти в которой сегменты кода, данных и стека объединены.
. code ; сегмент кода, который содержит данные.
org 100h ; начало СОМ-файла
begin: ; метка начала кода программы
mov dl, ; заносим в регистр 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

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.

. 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.

. model tiny ; модель памяти в которой сегменты кода, данных и стека объединены.
. code ; сегмент кода, который содержит данные.
org 100h ; начало СОМ-файла
begin: ; метка начала кода программы
mov ax, ; заносим в регистр ax — любой ASCII-код символа
int 29h ; вызов прерывания DOS — вызов символа;
ret ; функция DOS «завершить программу»
end begin ; метка окончания кода программы

В большинстве случаев INT 29h просто немедленно вызывает функцию BIOS «вывод символа на экран в режиме телетайпа», так что никаких преимуществ, кроме экономии байт при написании как можно более коротких программ, она не имеет.

2. Средства BIOS

Функции DOS вывода на экран позволяют перенаправить вывод в файл, но не позволяют вывести текст в любую позицию экрана и не позволяют изменить цвет текста. DOS предполагает, что для более тонкой работы с экраном программы должны использоваться видеофункции BIOS. BIOS — обеспечивает доступ к некоторым устройствам, в частности к видеоадаптеру. Все функции видеосервиса BIOS вызываются через прерывание 10h.

ProgrammWS

Все для начинающего программиста

Меню сайта


Информация

Programm.ws — это сайт, на котором вы можете почитать литературу по языкам программирования , а так-же посмотреть примеры работающих программ на С++, ассемблере, паскале и много другого..

Программирование — в обычном понимании, это процесс создания компьютерных программ.
В узком смысле (так называемое кодирование) под программированием понимается написание инструкций — программ — на конкретном языке программирования (часто по уже имеющемуся алгоритму — плану, методу решения поставленной задачи). Соответственно, люди, которые этим занимаются, называются программистами (на профессиональном жаргоне — кодерами), а те, кто разрабатывает алгоритмы — алгоритмистами, специалистами предметной области, математиками.
В более широком смысле под программированием понимают весь спектр деятельности, связанный с созданием и поддержанием в рабочем состоянии программ — программного обеспечения ЭВМ. Более точен современный термин — «программная инженерия» (также иначе «инженерия ПО»). Сюда входят анализ и постановка задачи, проектирование программы, построение алгоритмов, разработка структур данных, написание текстов программ, отладка и тестирование программы (испытания программы), документирование, настройка (конфигурирование), доработка и сопровождение.

Глава 5. Работа с консолью в программах на ассемблере

Функции MS DOS для работы с консолью

Ценность программы прямо пропорциональна
весу ее «выдачи».
Прикладная Мерфология

Функции MS DOS для работы с консолью сосредоточены в обработчике прерывания int 21h. Они представляют собой набор средств работы с консолью, занимающий промежуточное положение между программами пользователя и средствами BIOS. Для достижения большей эффективности некоторые из функций BIOS можно комбинировать с функциями MS DOS. Как пример такого полезного взаимодействия можно привести использование возможностей BIOS по работе с курсором. Как будет видно из приведенного ниже материала, среди функций MS DOS подобные средства отсутствуют. При выполнении конкретных практических заданий можно найти и другие полезные примеры взаимодействия.

Функции MS DOS для ввода данных с клавиатуры

Для ввода данных с клавиатуры можно использовать два вида функций: универсальную функцию 3fh (ввод из файла) и группу специализированных функций MS DOS ввода с клавиатуры.
Подробно использование функции 3fh для ввода данных рассматривается в главе 7, а здесь сосредоточимся на второй группе функций, в которую входит семь функций, отличающихся друг от друга следующими характеристиками:

  • ожиданием ввода при отсутствии символа в буфере клавиатуры или только проверкой буфера на наличие символов для ввода;
  • количеством вводимых символов;
    наличием эха при вводе, то есть дублированием вводимого с клавиатуры символа на экране;
  • восприимчивостью к сочетанию клавиш Ctrl+C (код 03h).

Чтение с эхом символа с клавиатуры (10h int 21h)

Функция 01h позволяет ввести один символ с клавиатуры. Если символа нет, то функция ожидает его ввода. Вводимый символ отображается на экране (эхо).
Вход: АН = 01h — чтение символа с эхом. »
Выход: AL = ASCII-код символа или 0.
На выходе функция помещает в регистр AL ASCII-код символа или 0. Наличие нуля в регистре AL говорит о том, что в буфере клавиатуры находится расширенный ASCII-код и необходимо повторить вызов функции с тем, чтобы прочитать его второй байт. Также функция 01h проверяет наличие в буфере символов нажатия комбинации Ctrl+C (Ctrl+Break), при обнаружении которых производится вызов прерывания int 23h.
Для ввода нескольких символов данную функцию необходимо использовать в цикле.

:prg05_06.asm — программа ввода нескольких символов функцией 01h 21h
;.
.data
string db 5 dup (0)
len_string =$-string
adr_string dd string
.code
. movcx.len_sthng
lesdi.adr_string ml: mov ah.01h
int 21h
cmpal.0 расширенный код.
jnem2
обрабатываем расширенный код
jmp m3
ni2: stosb .формируем строку символов
mЗ: loop ml

Проверяя работу программы, вместо ввода очередного символа введите комбинацию Ctrl+C и посмотрите реакцию программы.

Прямой ввод с эхом символа с клавиатуры (06h int 21h)

Функция 06h также позволяет ввести один символ с клавиатуры. Но в отличие от функции 01h она не ожидает ввода при отсутствии символа в буфере. Вводимый символ отображается на экране (эхо).
Вход: АН = 06h — чтение символа с эхом без ожидания; DL = 0ffn — признак того, что функция 06h используется для ввода; если DL <> 0ffn, то функция используется для вывода символа (см. ниже).
Выход: если ZF=O, то AL = ASCII-код символа; если ZF-1, то символа в буфере нет. Результаты работы этой функции необходимо оценивать прежде всего по значению флага ZF. Если ZF=O, то функция поместила в регистр AL ASCII-код символа или 0. Наличие нуля в регистре AL говорит о том, что в буфере клавиатуры находится расширенный ASCII-код и необходимо повторить вызов функции с тем, чтобы прочитать его второй байт. Функция 06h не проверяет наличие в буфере символов нажатия комбинации Ctrl+C (Ctrl+Break).

Чтение без эха символа с клавиатуры (07h int 21h)

Функция 07h аналогична функции 01h, за исключением того, что вводит символ с клавиатуры без ожидания его ввода, без эха и без проверки нажатия комбинации Ctrl+C (Ctrl+Break). Вход: АН = 07h — чтение символа без эха. Выход: AL = ASCII-код символа или 0 (см. описание функции 01h int 21h).
Наличие нуля в регистре AL говорит о том, что в буфере клавиатуры находится расширенный ASCII-код и необходимо повторить вызов функции с тем, чтобы прочитать его второй байт.

Чтение без эха символа с клавиатуры (08h int 21h)

Функция 08h аналогична функции 01h, за исключением того, что вводит символ
с клавиатуры без отображения его на экране (без эха).
Вход: АН = 08h — чтение символа без эха.
Выход: AL = ASCII-код символа или 0 (см. описание функции 01h int 21h).
Наличие нуля в регистре AL говорит о том, что в буфере клавиатуры находится расширенный ASCII-код и необходимо повторить вызов функции с тем, чтобы прочитать его второй байт. Функция производит проверку нажатия комбинации Ctrl+C (Ctrl+Break), при наличии которого вызывается прерывание int 23h.

Ввод строки символов с клавиатуры (0ah int 21h)

Функция 0ah вводит строку символов в буфер памяти специального формата. Если символов в буфере клавиатуры нет, то функция ожидает их ввода. Конец ввода — нажатие клавиши Enter (0dh). Формат буфера:

  • первый байт буфера содержит количество символов для ввода с учетом символа 0dh, завершающего процесс ввода;
  • второй байт содержит реальное число введенных символов, но уже без учета завершающего символа 0dh;
  • начиная с третьего байта содержится строка введенных символов с завершающим символом 0dh, максимальная длина строки — 254 символа.

Вход: АН = 0ah — ввод строки в буфер (до 254 символов); DS:DX — адрес буфера, первый байт которого должен содержать количество символов для ввода.
Выход: введенная строка начиная с третьего байта буфера по адресу в DS:DX, длина строки во втором байте буфера.
Перед вызовом функции 0ah в первый байт буфера необходимо поместить значение максимальной длины строки. Если первый байт равен нулю, то вызов функции игнорируется и программа продолжает выполнение без ожидания ввода строки. Функция производит проверку нажатия комбинации Ctrl+C (Ctrl+Break), при наличии которого вызывается прерывание int 23h. Вводимая строка отображается на экране. Буфер ввода для данной функции лучше оформлять в виде структуры.

;prg05_07.asm — программа ввода строки функцией OAh int 21h
buf_Oahstruc
len_bufdb 11 :длина buf_0ah
len_in db 0 действительная длина введенного слова (без учета Odh)
buf_in db 11 dup (20h) ;буфер для ввода (с учетом Odh)
ends
.data
buf buf_0ah<>
adr_bufdd buf
.code
.
:вводим 10 символов с клавиатуры
Ids dx,adr_buf
movah.Oah
int 21h обработка введенной строки

Получить состояние клавиатуры (0Bh int 21h)

Функция 0Bh проверяет наличие в буфере символа для ввода.
Вход: АН = 0Bh — проверка состояния клавиатуры.
Выход: AL = 0ffh — буфер клавиатуры содержит символ для ввода; AL = 0 — буфер клавиатуры пуст.
Данная функция формирует только логический результат — присутствует символ в буфере или буфер пуст, поэтому вызов функции 0Bh необходимо комбинировать с одной из функций извлечения символа из буфера ввода. Использование этой функции удобно для программ, управление которыми производится с клавиатуры, — типа командного процессора. В процессе своей работы они постоянно ожидают ввода пользователем управляющих команд, в связи с чем периодически проверяют входной буфер.
Функция производит проверку нажатия комбинации Ctrl+C (Ctrl+Break), при наличии которого вызывается прерывание int 23h.

Илон Маск рекомендует:  Вёрстка сайтов

Ввод с клавиатуры с предварительной очисткой буфера (ОСh int 21h)

функция 0Ch выполняет ввод, предварительно очищая буфер клавиатуры. Это удобно для предотвращения чтения из буфера оставшихся там символов, возможно, введенных ошибочно или случайно. Функция гарантирует, что программа получит именно те данные, которые ввел оператор. Важно отметить, что функция 0Ch выполняет только очистку буфера, ввод символа осуществляет одна из функций, номер которой указывается в регистре AL при вызове этой функции/ Вход: АН = 0Ch — ввод с клавиатуры с предварительной очисткой; AL = номер
функции (01h, 06h, 07h, 08h, 0ah). Выход: определяется функцией, указанной в AL при вызове функции.
Функция производит проверку нажатия комбинации Ctrl+C (Ctrl+Break), при наличии которого вызывается прерывание int 23h.

Функции MS DOS для вывода данных на экран

Для вывода данных на экран можно использовать два вида функций: универсальную функцию 40h (вывод в файл) и группу специализированных функций MS DOS вывода на экран.
Использование функции 40h уже рассматривалось в разделе, посвященном работе с файлами. Материал, представленный ниже, посвящен второй группе функций — функциям MS DOS для вывода символов на экран. В группу входят три функции. Рассмотрим их.

Вывод символа на экран (02h int 21h)

Функция 02h позволяет вывести один символ на экран. Вход: АН » 02h — вывод символа; DL = символ для вывода.
Функция 02h проверяет наличие в клавиатурном буфере символов нажатия комбинации Ctrl+C (Ctrl+Break), при обнаружении которых производится вызов прерывания int 23h. В процессе вывода функция реагирует на управляющие символы, такие как 0dh (возврат каретки), 0ah (перевод строки), 08h (курсор назад на один символ), 07h (звуковой сигнал) и т. д.
Для того чтобы вывести строку, необходимо использовать цикл.

;выводим строку string на экран
mov ex.len_string :длину строки
lea si.string ;адрес строки
mov ah. 02h ml: mov dl.byte ptr [si]
int 21h
inc si
loop ml

Прямой вывод символа на экран (06h int 21h)

Функция 06h выводит один символ на экран. Эта функция универсальна, так как «используется и для ввода (см. выше), и для вывода символа.
Вход: АН = 06h — вывод символа на экран; DL = символ для вывода (за исключением 0ffn).
Функция 06h не проверяет наличие в буфере символов нажатия комбинации Ctrl+C (Ctrl+Break). Порядок использования данной функции аналогичен порядку использования функции 02h.

Вывод строки на экран (09h int 21h)

Функция 09h выводит строку символов на экран. Строка должна обязательно заканчиваться символом $. Данную функцию удобно использовать для вывода на экран различных диагностических сообщений. Если требуется организовать вывод строк, длина которых формируется динамически, то лучше либо использовать упомянутую выше функцию 40h, либо выводить их в цикле, тело которого содержит одну из функций 02h или 06h.
Вход: АН = 09h — вывод строки на экран; DS: DX — адрес строки для вывода с завершающим символом $.
Функция 09h проверяет наличие в клавиатурном буфере символов нажатия комбинации Ctrl+C (Ctrl+Break), при обнаружении которых производится вызов прерывания int 23h. В процессе вывода функция реагирует на управляющие символы, такие как 0dh (возврат каретки), 0ah (перевод строки), 08h (курсор назад на один символ), 07h (звуковой сигнал) и т. д.
Приведенный ниже фрагмент показывает порядок применения функции 09h.

Группа дисковых функций MS-DOS

В эту группу входят прерывания, предназначенные для выполнения основных функций операционной системы, в том числе для выполнения операций с логическими дисками, файлами и каталогами [3, 10]. Дисковые функции DOS обладают достаточной полнотой и универсальностью для решения любых задач в реальном режиме DOS. Они могут применяться и в режиме линейной адресации памяти, но информацию в расширенную память приходится пересылать через промежуточный буфер в первом мегабайте адресного пространства процессора. Впрочем, дополнительные пересылки не особенно замедляют работу: поиск данных на диске и передача информации между диском и процессором занимает гораздо больше времени, чем копирование такого же объема данных с одного участка оперативной памяти в другой.’

Ниже описаны функции DOS, выполняющие основные операции над логическими дисками, каталогами и файлами. При описании используются следующие термины:

• строка ASCIIZ — текстовая строка в ASCII-коде, которая завершается нулевым значением;

• дескриптор файла — уникальный номер, который операционная система присваивает создаваемому или открываемому файлу в качестве идентификатора (чтобы потом обращаться к файлу по этому номеру вплоть до его закрытия).

Классические функции для работы с дисками

К этой группе относятся функции, появившиеся в ранних версиях операционной системы MS-DOS и сохранившиеся с тех пор практически без изменений. Такие функции отличаются крайне примитивной обработкой ошибок:

• в случае успешного завершения операции флаг CF сбрасывается в 0;

• в случае ошибки флаг CF устанавливается в 1.

Для обращения к дисковым функциям DOS используется прерывание Int 21h.

Прерывание Int 21 h, функция OEh: сменить текущий логический диск

Функция позволяет выбрать логический диск. Перед вызовом прерывания требуется записать в регистры следующие значения:

• в АН — значение OEh;

• в AL — код логического диска (0 — А:, 1 — В: и т. д.).

После завершения операции функция возвращает в регистре AL максимально возможный в данной системе номер логического дисковода (определяется параметром LASTDRIVE в файле CONFIG.SYS).

Прерывание Int 21 h, функция 19h: определить номер текущего дисковода

Функция определяет номер дисковода, который в данный момент считается текущим, то есть используется по умолчанию.

Перед вызовом прерывания требуется записать в регистр АН значение 19h.

После завершения операции функция возвращает в регистре AL код логического диска (0 — А:, 1 — В: и т. д.).

Прерывание Int 21 h, функция 1Ah: изменить адрес области обмена с диском

Функция устанавливает адрес буфера, используемого в операциях ввода-вывода и поиска в каталогах.

Перед вызовом прерывания требуется записать в регистры следующие значения:


• в АН — значение lAh;

• в DS: DX — указатель на новый адрес буфера обмена DTA. ПРИМЕЧАНИЕ

При запуске программы ее область DTA первоначально установлена по адресу PSP:0080h.

Прерывание Int 21 h, функция 2Fh: получить адрес области обмена с диском

Функция определяет текущий адрес буфера, используемого в операциях ввода-вывода и поиска в каталогах.

Перед вызовом прерывания требуется записать в регистр АН значение 2Fh.

После завершения операции функция возвращает в ES: ВХ указатель на адрес буфера обмена DTA.

Прерывание Int 21 h, функция 36h: определить объем свободного места на диске

Функция определяет объем свободного места на заданном логическом диске.

Перед вызовом прерывания требуется записать в регистры следующие значения:

• в АН — значение 36h;

• в AL — код логического диска (0 — А:, 1 — В: и т. д.).

В случае ошибки в регистре АХ будет возвращен код OFFFFh (недопустимый код логического диска).

В случае успешного завершения операции функция возвращает:

• в АХ — число секторов в кластере;

• в ВХ — число свободных кластеров;

• в СХ — число байтов в секторе;

• в DX — полное число кластеров на диске.

Объем свободного пространства определяется произведением содержимого регистров АХ, ВХ и СХ, а полный объем диска в байтах — произведением АХ, СХ и DX.

Улучшенные функции для работы с дисками

По мере развития MS-DOS в набор функций постоянно вносились дополнения, упрощающие выполнение тех или иных операций и улучшающие контроль за их выполнением. Для вызова функций данной группы также используется прерывание Int 21h.

Перечисленные ниже функции DOS имеют усовершенствованные средства контроля: в случае ошибки, кроме установки флага CF, выдают в регистре АХ код ошибки, по которому можно определить причину ее возникновения. Возможные значения кодов ошибок приведены в табл. 6.1. Однако следует учитывать, что содержимое регистра АХ в случае успешного завершения данных функций не сохраняется.

Таблица 6.1. Значения расширенных кодов ошибки

Функции ввода/вывода DOS.

Дата добавления: 2014-11-27 ; просмотров: 837 ; Нарушение авторских прав

Все функции DOS вызываются прерыванием 21h, при этом в AH содержится номер функции. Ниже везде, где есть слова «стандартный ввод», под ними подразумевается клавиатура, однако ввод может быть переопределен (например, из файла). Аналогично, «стандартный вывод» – экран, но вывод также может быть переопределен (например, в файл). ASCIIZ-строка (нуль-терминированная строка) – это строка символов, заканчивающаяся нулевым символом (код 00h).

1. Ввод символа с отображением. Прерывание 21h функция 01h. Вызов: AH=01h. Возвращает: AL=введенный символ. Действие: читает символ (возвращаемый в AL) со стандартного ввода (клавиатуры) и выводит его на стандартный вывод (экран). Если ввод был перенаправлен, то невозможно обнаружить EOF.

— если при вводе нажата Ctrl+C и BREAK=ON, то вызывается прерывание 23h;

— чтобы прочитать расширенные коды (например, клавиш F1-F12), надо вызвать функцию дважды. Первый раз возвращается 00h, затем – код клавиши.

2. Вывод символа. Прерывание 21h функция 02h. Вызов: AH=02h; DL=выводимый символ. Возвращает: ничего. Действие: выводит символ на стандартный вывод. Если вывод был перенаправлен, то невозможно обнаружить, что нет места на диске.

— если Ctrl+C после вывода символа, то вызавается прерывание 23h;

— если стандартный вывод не был перенаправлен, то символ Backspace (08h) перемещает курсор влево на одну позицию.

3. Прямой консольный ввод/вывод. Прерывание 21h функция 06h. Вызов: AH=06h; DL=действие: если DL=00h-FEh, то вывод; если DL=FFh, то ввод. Возвращает:

если вызов с DL=00h-FEh, то ничего;

если вызов с DL=FFh, то: если есть символ – ZF=0, AL=введенный символ

если нет символа – ZF=1.

Действие: используется, если нужно прочитать или записать все возможные символы и управляющие коды без действий ОС. Читает символ со стандартного ввода или записывает символ на стандартный вывод. Если вывод был перенаправлен, то невозможно обнаружить EOF или что нет места на диске.

— Никакой реакции на Ctrl+C;

— чтобы прочитать расширенные коды (например, клавиш F1-F12), надо вызвать функцию дважды. Первый раз возвращается 00h, затем – код клавиши.

4. Ввод символа без отображения. Прерывание 21h функция 07h. Вызов: AH=07h. Возвращает: AL=введенный символ. Действие: читает символ (возвращаемый в AL) со стандартного ввода (клавиатуры) без отображения на стандартном выводе (экране). Если нет символа, то ждет его появления. Если ввод был перенаправлен, то невозможно обнаружить EOF.

— Никакой реакции на Ctrl+C. Нужно использовать функцию 08h, если реакция требуется;

— чтобы прочитать расширенные коды (например, клавиш F1-F12), надо вызвать функцию дважды. Первый раз возвращается 00h, затем – код клавиши.

5. Ввод символа без отображения. Прерывание 21h функция 08h. Вызов: AH=08h. Возвращает: AL=введенный символ. Действие: читает символ (возвращаемый в AL) со стандартного ввода (клавиатуры) без отображения на стандартном выводе (экране). Если нет символа, то ждет его появления. Если ввод был перенаправлен, то невозможно обнаружить EOF.

— если при вводе нажата Ctrl+C и BREAK=ON, то вызывается прерывание 23h. Нужно использовать функцию 08h, если реакции не требуется;

— чтобы прочитать расширенные коды (например, клавиш F1-F12), надо вызвать функцию дважды. Первый раз возвращается 00h, затем – код клавиши.

6. Вывод строки. Прерывание 21h функция 09h. Вызов: AH=09h, DS:DX=сегмент:смещение строки. Возвращает: ничего. Действие: посылает строку символов на стандартный вывод. Если вывод был перенаправлен, то невозможно обнаружить, что нет места на диске.

— Строка должна заканчиваться на символ $(код 24h), который не выводится. Любые другие символы ASCII, включая управляющие, могут содержаться в строке. Для перевода курсора на начало новой строки нужно вывести строку, содержащую символы «перевод строки»/»возврат каретки»:

string DB 10,13,’$’

или использовать прерывание 10h функцию 02h (см. 6.8.2.).

— Если Ctrl+C нажата на клавиатуре, то вызывается прерывание 23h.

7. Буферизованный ввод с клавиатуры. Прерывание 21h функция 0Ah. Вызов: AH=0Ah, DS:DX=сегмент:смещение буфера. Возвращает: ничего. Действие: читает строку символов со стандарного ввода, до появления символа возврата каретки (0Dh) и помещает в буфер (включая завершающий 0Dh). Символы отображаются на стандартном выводе. Если ввод был перенаправлен, то невозможно обнаружить EOF.

— Буфер, используемый этой функцией, имеет формат(см. табл. 6.4.):

Байт Описание
Максимальное количество символов (устанавливается перед вызовом)
Количество реально прочитанных символов (устанавливается функцией после ее вызова)
2 и след. Прочитанная строка, заканчивающаяся 0Dh

— Если буфер заполнился (больше символов, чем максимум), последующий ввод игнорируется и подается сигнал до тех пор, пока не нажата клавиша ENTER;

— Если при вводе нажата Ctrl+C и BREAK=ON, то вызывается прерывание 23h.

8. Проверка состояния ввода.Прерывание 21h функция 0Bh. Вызов: AH=0Bh. Возвращает: AL=00h, если нет символа; AL=FFh, если есть один или более символовhр. Действие: проверяет, есть ли в буфере стандартного ввода символ.

— Если при вводе нажата Ctrl+C и BREAK=ON, то вызывается прерывание 23h.

— Если есть символ, эта функция будет возвращать FFh, пока символ не считан функциями ввода (01h, 07h, и т.д.).

9. Очистка буфера и ввод. Прерывание 21h функция 0Ch. Вызов: AH=0Ch; AL=номер фунции, которая вызывается после очистки буфера; для AL=0Ah –DS:DX=сегмент:смещение буфера. Возвращает: если вызов с AL=01h, 07h, 08h то AL=прочитанный символ; если вызов с AL=0Ah, то ничего. Действие: очищает буфер стандартного ввода, затем вызывает одну из функций ввода (заданную в AL).

— Реакция на Ctrl+C (игнорирует или нет) зависит от вызываемой функции;

— Вызов с AL отличным от 01h, 06h, 07h, 08h, 0Ah просто очищает буфер.

10. Запись в файл или устройство. Прерывание 21h функция 40h. Действие: берет корректный дескриптор файла (от предыдущей операции создания или открытия файла), адрес буфера, длину в байтах, передает данные из буфера в файл и затем обновляет положение указателя в файле. Вызов: AH=40h; BX=дескриптор файла; CX=количество байт, которое надо записать; DS:DX=сегмент:смещение буфера. Возвращает: если нет ошибки: CF=0, AX=количество реально переданных байт; иначе – CF=1, AX=код ошибки.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL