Dos fn 30h дать номер версии 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. Эта функция используется для обмена управляющей информацией между драйвером и программой.

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

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

Иллюстрированный самоучитель по задачам и примерам Assembler

Работа с файлами в MS DOS (длинные имена)

Перечисленные выше функции работают в различных версиях «чистой» системы MS DOS, вплоть до версии 6.22 включительно. Операционные системы Windows 95/98/Mil также поддерживают свою версию MS DOS, которая имеет номер 7.0. Операционная система Windows 95/98/Mil организует для программ MS DOS специальную среду для работы, называемую сеансом DOS.

Система MS DOS 7.0, будучи созданной для работы в среде Windows 95/98/Mil, имеет в своем составе средства для работы с файловой системой Windows. Эта файловая система, как известно, отличается тем, что полное имя файла может достигать длины 255 символов. MS DOS 7.0 также умеет работать с длинными именами файлов. В данном разделе мы рассмотрим предназначенные для работы с файловой системой Windows средства среды MS DOS, работающей под управлением Windows.

Определить факт того, в какой системе работает программа, можно по результатам работы функций 30h – получить версию DOS (прерывания 21п) и 4аЗЗп (прерывания 2fh).

Вход: АН = 30h; AL = определяет значение, возвращаемое в ВН: 00h– OEM-номер (как для DOS 2.0-4.0x);01h – номер версии.

Выход: AL = главный номер версии; АН – младший номер версии; BL:CX = 24-битный серийный номер пользователя (необязательно).

В регистрах AL и АН возвращаются главный и младший номера версии MS DOS. При функционировании под Windows эти номера равны 07h и Oah соответственно. Задание значения AL = 01 дает такой же эффект.

Последняя функция возвращает 0 для MS DOS версии 7.0 и выше. Установить факт того, что система поддерживает длинные имена файлов, можно вызовом функции 71a0h прерывания 21п – получить информацию о томе. Если она возвращает ошибку (CF = 1), то текущая файловая система не поддерживает длинных имен файлов. Для вызова этой функции необходимо указать корневой каталог тома, о котором необходимо получить информацию.

Вход: АХ = 71A0h; DS:SI – ASCIZ-имя корневого каталога тома, о котором необходимо получить информацию (например, «С:\»); ES:DI – буфер для имени файловой системы; СХ ¦= размер буфера, адрес которого задан в ES: DI (32 байта).

Выход: CF = 0 в случае успеха, следующие регистры установлены: ВХ = флаги файловой системы: 0 – при поиске учитывать регистр букв в именах файлов; 1 – сохранять регистр букв в элементах каталога; 2 – использование символов Unicode в именах каталогов и файлов; 3-13 – резерв (0); 14 – поддержка DOS-функций для длинных имен файлов; 15 – сжатый том; СХ = максимальная длина файловых имен (обычно 255); DX = максимальная длина пути (обычно 260); ES: DI – в буфере по этому адресу ASCIZ-имя файловой системы, например «FAT», «FAT32», «NTFS», «CDFS»; CF = 1 в случае неудачи, при этом АХ = код ошибки или AX=7100h, если функция не поддерживается.

В Windows 95/98 появились дополнительные возможности как самой файловой системы, так и средств по ее управлению. Основное нововведение – поддержка длинных имен файлов. Основа файловой системы та же – таблица разрешения файлов FAT, но любой файл в этой системе имеет два имени – длинное имя и его псевдоним, который соответствует формату 8.3. Данный псевдоним создается системой Windows 95/98 автоматически.

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

Длинное имя файла представляет собой ASCIIZ-строку длиной до 255 символов. Система формирует псевдоним для этого имени форматом 8.3 в соответствии со следующим правилом: берутся первые 6 символов длинного имени, после них добавляется символ тильда (), за тильдой ставится некий порядковый номер. Для первого имени формата 8.3 это 1. Если такой псевдоним уже существует, то порядковый номер очередного псевдонима будет на 1 больше. Расширение псевдонима формируется из первых трех символов расширения длинного имени (если оно существует). Если похожих имен много, то номер в псевдониме может быть двузначным, при этом первая (символьная) часть псевдонима сокращается до 5 символов, и т. д.

Версии DOS

1981 г (Microsoft)- первая версия ОС для компьютера IBM PC — MS DOS 1.0

В дальнейшем по мере совершенствования компьютеров IBM PC выпускались новые версии DOS, учитывающие новые возможности компьютеров и предоставляющие дополнительные удобства пользователю.

1987 г. фирма Microsoft разработала версию 3.3 (3.30) ОС MS DOS, которая стала фактическим стандартом на последующие 3-4года. Эта версия весьма компактна и обладает достаточным набором возможностей.

MS DOS 5.0 и 6.0 имеют средства для эффективного использования оперативной памяти сверх 640 Кбайт, позволяют работать с логическими дисками, большими 32 Мбайт, переносить DOS и драйверы устройств в расширенную память, освобождая место в обычной памяти для прикладных программ, и т.д.

Версия 6.0 MS DOS включает средства сжатия информации на дисках (DoubleSpace), программы создания резервных копий, антивирусную программу и другие мелкие усовершенствования. (не всегда работали корректно — выпустили версию MS DOS 6.20 )

Многие пользователи применяют операционную систему DR DOS версии 6.0 или 7.0 фирмы Digital Research (в настоящее время — это подразделение фирмы Novell), или PC DOS фирмы IBM. Эти версии DОS обеспечивают несколько большие удобства, чем MS DOS, однако не все с ней совместимы. Так, средства сжатия информации на дисках, используемые в них, не совместимы друг с другом

Версии DOS до 3.3 сейчас уже практически не используются.

Windows 3.1/3.11

Первая версия Windows вышла в свет в конце 80-х годов и осталась совершенно незамеченной. Аналогичная участь постигла и следующую версию- лишь версия Windows 3.0 (1992) сумела понравиться пользователям и стать «продуктом года». А ещё через два года на свет появились версии 3.1 и 3.11, окончательно утвердившие господство Windows.

1. Многозадачность (хотя не более 2-3 приложений из-за малого кол-ва ОП)

2. Возможность использования всей установленной ОП

3. Часто «зависала», много ошибок, что связано с упрощенной многозадачностью.

Windows 95 (август 1995)

1. 32-разрядная (ранее были 16-разрядные), но в целях совместимости ее ядро содержало 16-разрядные модули.

2. Новый графический интерфейс

3. В эту ОС впервые был интегрирован программно-драйверный комплекс DirectX

4. Автоматически распознавала большое число комплектующих и обладала значительно совершенным механизмом настройки и конфигурации.

5. Не отличается стабильностью

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Да какие ж вы математики, если запаролиться нормально не можете. 8426 — | 7330 — или читать все.

188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

assembly — Прерывание 30H дает неправильную версию DOS

Я запускаю 32-битную копию Windows 8 на 64-разрядном процессоре AMD. Я беру курс сборки 8086, и в книге приведен пример того, как получить номер версии DOS. Когда я запускаю cmd.exe, он говорит мне, что это версия 6.2.9200. Кроме того, когда я запускаю команду «VER» DOS, она говорит мне то же самое. Однако, когда я выполняю процедуру прерывания 30H для получения номера версии DOS, он сообщает мне, что я запускаю DOS версии 5.0. Что может объяснить это различие?

Кстати, я собрал код ниже в MASM6, используя команду ML/Fl DOSVER.ASM .

    2 1
  • 11 май 2020 2020-05-11 01:09:58
  • JJBladester

1 ответ

Номер версии, который вы видите в верхней части интерфейса командной строки и который возвращается командой VER , представляет собой версию Windows, а не версию DOS . Насколько я понимаю, интерфейс командной строки Windows является эмулятором DOS, а не фактическим экземпляром MS-DOS. Похоже, что системы на базе Windows NT, которые будут включать Windows 8, будут эмулировать версию MS-DOS версии 5.0 (это, кажется, предлагается здесь и здесь), что, похоже, согласуется с тем, что вы описываете.

Выходим в DOS, в нормальный, чистый DOS

Иногда нужно заргузится в DOS, например для того чтобы запустить систему диагностики hdd (типа mhdd) или посмотреть 256 байтную демку. Но не нужно судорожно перерывать чердак в поисках старой дискетки и продувать дисковод, не нужно даже переразмечать разделы на hdd для fat16, даже не надо портить болванку и искать олдскульного друга с чернобелым монитором, 386 процессором и большой бородой.
Дос вполне можно загрузить через memdisk.

1) Ставим пакет syslinux
2) Находим файл memdisk из этого пакета (у меня он был в /usr/share/syslinux)
3) Копируем memdisk в /boot
4) Берём образ дискетки с msdos (можно у меня, уже с mhdd и демкой puls)
5) Копируем образ тоже в /boot
6) Дополняем /boot/grub/menu.lst таким пунктом:
title MSDOS
root(hd0,0) # Номер диска изменить на нужный
kernel /memdisk
initrd /Dos6.22.img
7) Перезагружаемся и ностальгируем

UPD: Я знаю что есть 9000 способов загрузится в дос сидюка, флешки, зипа, стриммера, перфокарты, однако это всё требует дополнительного оборудования и носителей. Данный способ не требует ничего, кроме установленного grub и интернета.

UPD/2: Таким способом можно диагностировать винт на котором находится сам образ mhdd.

30-летие MS-DOS 4.0 с графическим интерфейсом и поддержкой мыши

17 июня 1988 года состоялся выпуск MS-DOS 4.0 (точнее — IBM PC DOS) — продвинутой на тот момент операционной системы, которая впервые получила встроенную поддержку мыши и оболочку Shell. Все окна и элементы в нём могли отрисовываться текстовыми знаками — так называемой псевдографикой, а на VGA-мониторах работал более богатый графический интерфейс.

Псевдографический интерфейс DOS Shell

Основным разработчиком платформы выступала IBM, но Microsoft тоже принимала активное участие. Хотя ОС отличалась множеством ошибок и проблемами с совместимостью, большим шагом стала интеграция файлового менеджера DOS Shell, вызываемого из командной строки с помощью команды dosshell и имевшего поддержку смены цветов и стилей. DOS Shell был одним из первых файловых менеджеров для DOS с графическим интерфейсом и стал прообразом для оболочки Windows.

Shell предлагал общие возможности, которые до сих пор можно встретить в других файловых менеджерах: копирование, перемещение и переименование файлов, запуск приложений по двойному щелчку мыши, отображение директорий в двух панелях, вывод списка файлов с атрибутами и так далее. По сути, это был прародитель Windows Explorer.

Графический интерфейс DOS Shell

Версия MS DOS 4.0 также впервые поддерживала разделы жёсткого диска объёмом более 32 Мбайт (максимум — до 2 Гбайт). За счёт EMS 4.0 могла использоваться отображаемая память для буферов ОС и структур данных команды FASTOPEN. ОС позволяла задействовать для размещения резидентных программ первые 64 Кбайт расширенной памяти (HMA-память). Обеспечивалась улучшенная поддержка национальных языков, а также полная совместимость с EGA- и VGA-мониторами.

Командная строка MS-DOS 7.1

В декабре 1988 года Microsoft переписала версию 4.00 и выпустила платформу уже под именем MS-DOS 4.0.1. Это была первая версия, выводившая серийный номер тома при форматировании жёстких дисков и флоппи-накопителей. Были и другие мелкие новшества, но главное — исправлены основные ошибки версии 4.0. А для наших краёв эта версия знаменательна выходом на рынке СССР первой официальной русифицированной локализации. Вот репортаж по этому случаю, в котором среди прочего детально демонстрируется оболочка DOS Shell:

Ещё пару слов стоит сказать об отдельной «экспериментальной» версии MS-DOS 4.0, вышедшей ещё в 1985 году и имеющей мало общего с MS-DOS 4.0 1988 года. Преимуществом этой ветки DOS была вытесняющая многозадачность в реальном времени, предназначенная для семейства процессоров 8086. Включала перемещаемые и выгружаемые сегменты памяти для кода и перемещаемые сегменты данных (впоследствии менеджер памяти Windows стал развитием именно версии менеджера памяти MS-DOS 4.0 1985 года). Имелась возможность динамического переключения экранов. К сожалению, эта система так и не поступила в массовую продажу из-за отсутствия интереса со стороны ключевого потребителя — IBM, желавшего просто улучшенной версии MS-DOS 3.x. Платформу, впрочем, лицензировали несколько крупных европейских компаний вроде SMT Goupil и International Computers Limited, и вышла даже версия MS-DOS 4.1.

Приложение Б Функции DOS (INT 21h)

Приложение Б Функции DOS (INT 21h)

DOS, функция 00h

CS – сегмент PSP завершающегося процесса

Описание. Передает управление на вектор завершения в PSP (выходит в родительский процесс). Идентична функции INT 20h (Terminate). Регистр CS должен указывать на PSP. Восстанавливает векторы прерываний DOS 22h-24h (Завершение, Ctrl-Break и Критическая ошибка), устанавливая значения, сохраненные в родительском PSP. Выполняет сброс файловых буферов. Файлы должны быть предварительно закрыты, если их длина изменилась.

Данная функция не рекомендуется к использованию. Для выхода из программы лучше использовать функцию DOS 4Ch.

DOS, функция 01h Считать со стандартного устройства ввода

Выход: AL – символ, полученный из стандартного ввода

Описание. Считывает (ожидает) символ со стандартного входного устройства. Отображает этот символ на стандартное выходное устройство (эхо). При обнаружении Ctrl-Break выполняется INT 23h.

Ввод расширенных клавиш ASCII (F1-F12, PgUp, курсор и другие) требует двух обращений к этой функции. Первый вызов возвращает AL=0. Второй вызов возвращает в AL расширенный код ASCII.

DOS, функция 02h Записать в стандартное устройство вывода

DL – символ, выводимый в стандартный вывод

Посылает символ из DL в стандартное устройство вывода. Обрабатывает символ Backspace (ASCII 8), перемещая курсор влево на одну позицию и оставляя его в новой позиции. При обнаружении Ctrl-Break выполняется INT 23h.

DOS, функция 03h Считать символа со стандартного вспомогательного устройства

Выход: AL – символ, введенный со стандартного вспомогательного устройства

Описание. Считывает (ожидает) символ со стандартного вспомогательного устройства, COM1 или AUX и возвращает этот символ в AL.

Ввод не буферизуется и должен опрашиваться (не управляется прерываниями). При запуске DOS порт AUX (COM1) инициализируется так: 2400 бод, без проверки на четность, 1 стоп-бит, 8-битные слова. Команда DOS MODE используется для установки иных характеристик.

DOS, функция 04h Записать символ в стандартное вспомогательное устройство

DL – символ, выводимый в стандартное вспомогательное устройство

Посылает символ, находящийся в регистре DL, на стандартное вспомогательное устройство, COM1 или AUX.

DOS, функция 05h Вывести на принтер

DL – символ, записываемый на стандартный принтер

Посылает символ в DL на стандартное устройство печати, обычно LPT1.

DOS, функция 06h Консольный ввод-вывод

DL=00h-FEh – символ, посылаемый на стандартный вывод

DL=FFh – запрос ввода со стандартного ввода

ZF=0, если осуществлялся ввод символа и символ готов при запросе ввода

AL – считанный символ

ZF=1, если осуществлялся ввод символа и символа в консоли нет

При DL=0FFh выполняет ввод с консоли «Без ожидания», возвращая включенный флаг нуля ZF, если на консоли нет готового символа. Если символ готов, сбрасывает флаг ZF и возвращает считанный символ в AL. Если DL не равен 0FFh, то DL направляется на стандартный вывод.

DOS, функция 07h Нефильтрующий консольный ввод без эха

Выход: AL – символ, полученный через стандартный ввод

Описание. Считывает (ожидает) символ со стандартного входного устройства и возвращает этот символ в AL. Не проверяет на Ctrl-Break, BackSpace и другие.

Для ввода расширенного символа ASCII должна быть вызвана дважды. Для проверки статуса используется функция DOS 0Bh (чтобы не ожидать нажатия клавиши).

DOS, функция 08h Консольный ввод без эха

Выход: AL – символ, полученный через стандартный ввод

Описание. Считывает (ожидает) символ со стандартного входного устройства и возвращает этот символ в AL. При обнаружении Ctrl-Break выполняется прерывание INT 23h.

Для ввода расширенного символа ASCII должна быть вызвана дважды.

DOS, функция 09h Запись строки на стандартный вывод

DS:DX – адрес строки, заканчивающейся символом «$» (ASCII 24h)

Строка, исключая завершающий ее символ «$», посылается на стандартный вывод. Символы Backspace обрабатываются как в функции 02h (вывод на дисплей). Чтобы перейти на новую строку, обычно включают в текст пару CR/LF (ASCII 0Dh и ASCII 0Ah). Строки, содержащие «$», можно передать на стандартное устройство вывода с помощью функции 40h (BX=0).

DOS, функция 0Ah Ввод строки в буфер

DS:DX – адрес входного буфера (Таблица Б-1)

Таблица Б-1. Формат входного буфера

Буфер содержит введенные данные, в конце – символ CR (ASCII 0Dh)

DOS, функция 0Bh Проверка статуса ввода

Выход: AL=FFh, если символ доступен со стандартного ввода AL=00h, если нет доступного символа

Описание. Проверяет состояние стандартного ввода. При распознавании Ctrl-Break выполняется INT 23h.

Используется перед функциями 01h, 07h и 08h, чтобы избежать ожидания нажатия клавиши.

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

DOS, функция 0Ch Ввод с очисткой

AL – номер функции ввода DOS:

AL=01h – ввод с клавиатуры


AL=06h – ввод с консоли

AL=07h – нефильтрующий без эха

AL=08h – ввод без эха

AL=0Ah – буферизованный ввод

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

DOS, функция 0Dh Сброс диска

Сбрасывает диск (записывает на диск все файловые буферы). Файл, размер которого изменился, должен быть предварительно закрыт (при помощи функций 10h или 3Eh).

DOS, функция 0Eh Установить текущий диск DOS

DL – номер диска (0 – A, 1 – B и так далее), который становится текущим

Выход: AL – общее число дисководов в системе

Описание. Диск, указанный в DL, становится текущим. Проверка: используется функция 19h (дать текущий диск). В регистре AL возвращается число дисководов всех типов, включая жесткие диски и «логические» диски (как диск B: системе с одним гибким диском).

AL имеет то же значение, что и LASTDRIVE, указанное в файле CONFIG.SYS, и по умолчанию равно 5.

DOS, функция 0Fh Открыть файл через FCB

DS:DX – адрес неоткрытого FCB (Таблица Б-2)

Таблица Б-2. Формат FCB

AL=00h, если функция выполнена успешно (FCB заполнен)

AL=FFh, если файл не найден или доступ к файлу не разрешен

Файл, описываемый неоткрытым FCB, должен существовать в текущем оглавлении на диске, специфицированном в FCB (0 – текущий, 1 – A, 2 – B и так далее). Если файл не существует, возвращается AL=0FFh. Файл открывается в режиме совместимости. Если поле «Номер диска» в FCB равно нулю в момент вызова, то оно заполняется номером текущего дисковода (1 – A, 2 – B и так далее). Поле FCB «Номер текущего блока» устанавливается в ноль. Поле FCB «Размер логической записи» устанавливается в 80h. Поля даты и размера файла в FCB устанавливаются из оглавления.

DOS, функция 10h Закрыть файл через FCB

DS:DX – адрес открытого FCB (Таблица Б-2)

AL=00h, если функция выполнена успешно

AL=FFh, если файл не найден там, где он находился при открытии с помощью функции 0Fh

Закрывает файл, открытый функцией 0Fh. Файл должен находиться на своем первоначальном месте в текущем оглавлении диска, на котором он был открыт. Если файл найден, оглавление обновляется, файловые буфера сбрасываются и возвращается AL=00h. Если файл не найден, оглавление не обновляется и возвращается AL=FFh.

DOS, функция 11h Найти первый совпадающий файл через FCB

DS:DX – адрес неоткрытого FCB (Таблица Б-2)

AL=00h, если подходящее имя найдено

AL=FFh, если подходящего имени нет

В текущем оглавлении DOS происходит поиск файлов с именем, соответствующим заданному шаблону. При неудаче возвращается AL=0FFh. Если имя найдено, AL очищается, в первый байт DTA помещается номер дисковода (A – 1, B – 2 и так далее), а в следующие 32 байта помещается элемент оглавления для найденного файла.

Можно использовать при вызове расширенный FCB, чтобы выбирать файлы с указанными атрибутами. В этом случае в DTA помещаются: байт FFh, 7 байт нулей, номер диска и элемент оглавления.

DOS, функция 12h Найти следующий совпадающий файл через FCB

DS:DX – адрес неоткрытого FCB (Таблица Б-2)

AL=00h, если подходящее имя найдено

DTA заполнен AL=FFh, если подходящего имени нет

Используется после вызова функции 11h (Найти первый совпадающий файл через FCB) с обобщенным именем файла. Каждый последующий вызов заполняет DTA очередным подходящим элементом оглавления и возвращает AL=00h. Если подходящих имен больше нет, возвращается AL=FFh.

Резервируемая область в FCB сохраняет информацию, необходимую для продолжения поиска. Поэтому не стоит открывать и изменять FCB между вызовами.

DOS, функция 13h Удалить файл через FCB

DS:DX – адрес неоткрытого FCB (Таблица Б-2)

AL=00h, если функция выполнена успешно

AL=FFh, если файл не найден или доступ к файлу не разрешен

Эта функция удаляет все подходящие файлы в текущем оглавлении указанного диска согласно спецификации в FCB. Если подходящие файлы не найдены или если доступ отвергнут (как при попытке удалить файл с атрибутом Read-Only), функция возвращает в регистре AL значение FFh.

DOS, функция 14h Последовательное чтение из файла через FCB

DS:DX – адрес открытого FCB (Таблица Б-2)

AL=00h, если чтение было успешным и DTA содержит данные

AL=01h, если достигнут конец файла (EOF) и данные не считаны

AL=02h, если произошел выход за сегмент (чтения не было)

AL=03h, если EOF и считана усеченная запись (дополнена нулями)

Функция читает файл, специфицированный в FCB. Затем соответственно увеличивает значения полей в FCB.

Перед началом последовательной обработки файла нужно сбрасывать CurRec в ноль, так как функция 0Fh не инициализирует это поле.

DOS, функция 15h Последовательная запись в файл через FCB

DS:DX – адрес открытого FCB (Таблица Б-2)

AL=00h, если запись была успешной

AL=01h, если ошибка переполнения диска (данные не записаны)

AL=02h, если произошел выход за сегмент (записи не было)

Функция записывает файл, специфицированный в FCB. Затем соответственно увеличивает значения полей в FCB.

Перед началом последовательной обработки файла нужно сбрасывать «Номер текщей записи» в ноль, так как функция 0Fh не инициализирует это поле.

DOS буферизует данные, записывая полный сектор за один раз.

DOS, функция 16h Создание файла через FCB

DS:DX – адрес неоткрытого FCB (Таблица Б-2)

AL=00h, если функция выполнена успешно FCB заполнен

AL=FFh, если при выполнении функции возникли ошибки

Описание. Файл, специфицированный неоткрытым FCB, создается на диске, указанном в FCB (0 – текущий, 1 – A и так далее). Он открывается в текущем оглавлении этого диска. FCB заполняется аналогично функции 0Fh. Если файл существует в момент вызова, его элемент оглавления перекрывается новым файлом, а длина файла сбрасывается в ноль.

Handle-ориентированные функции DOS 2.0+ гораздо удобнее в работе.

DOS, функция 17h Переименовать файл через FCB

DS:DX – адрес измененного FCB (Таблица Б-2)

AL=00h, если функция выполнена успешно

AL=FFh, если при выполнении функции возникли ошибки

Переименовывает файл в текущем оглавлении.

DOS, функция 19h Получить текущий диск DOS

Выход: AL – номер текущего диска (0 – A, 1 – B, и так далее)

Возвращает номер дисковода текущего диска DOS.

DOS, функция 1Ah Установить адрес DTA

DS:DX – адрес DTA

Устанавливает адрес DTA. Все FCB-ориентированные операции работают с DTA. DOS не позволяет операциям ввода/вывода пересекать границу сегмента. Функции поиска 11h, 12h, 4Eh и 4Fh помещают данные в DTA. DTA глобальна, поэтому надо проявлять осторожность при назначении ее в рекурсивной процедуре. При запуске программы ее DTA устанавливается по смещению 80h относительно PSP.

DOS, функция 1Bh Получить информацию FAT для текущего диска

DS:BX – адрес байта FAT ID, отражающего тип диска (Таблица Б-3)

DX – всего кластеров (единиц распределения) на диске

AL – секторов на кластер

CX – байт на сектор

Таблица Б-3. Значения >

Возвращает информацию о размере и типе текущего диска. Размер диска (в байтах) равен DX*AL*CX. Свободную память можно найти функциями 36h или 32h.

Версии: DOS 1.x держит FAT в памяти и возвращает DS:BX => FAT. DOS 2.0+ может держать в памяти лишь часть всей FAT.

Эта функция изменяет содержимое регистра DS.

DOS, функция 1Ch Получить информацию FAT для указанного диска

DL – номер диска (0 – текущий, 1 – A и так далее)

DS:BX – адрес байта FAT ID, отражающего тип диска (приведен в описании функции 1Bh)

DX – всего кластеров (единиц распределения)

AL – секторов на кластер

CX – байт на сектор

Аналогична функции 1Bh с той разницей, что регистр DL указывает диск, для которого нужно получить информацию.

DOS, функция 21h Считать произвольную запись файла

DS:DX – адрес открытого FCB (Таблица Б-2)

AL=00h, если чтение было успешным и DTA заполнена данными

AL=01h, если достигнут конец файла (EOF) и чтения не было

AL=02h, если произошел выход за сегмент (чтения нет)

AL=03h, если встречен EOF и усеченная запись дополнена нулями

Данная функция читает из файла с текущей позиции как с указанной в полях FCB «Запись с текущей позиции» и «Номер записи при непосредственном доступе к файлу».

DOS, функция 22h Писать произвольную запись файла

DS:DX – адрес открытого FCB (Таблица Б-2)

AL=00h, если запись была успешной

AL=01h, при переполнении диска

AL=02h, если DTA+FCB выходит за сегмент (нет записи)

Данная функция записывает в файл с текущей позиции как с указанной в полях FCB «Запись с текущей позиции» и «Номер записи при непосредственном доступе к файлу».

DOS, функция 23h Получить размер файла через FCB

DS:DX – адрес неоткрытого FCB (Таблица Б-2)

AL=00h, если функция выполнена успешно

AL=FFh, если при выполнении функции возникли ошибки

Проще определить размер файла при помощи функции 3Dh с последующим выполнением 42h (при AL=2).

DOS, функция 24h Установить адрес произвольной записи в файле

DS:DX – адрес открытого FCB (Таблица Б-2)

Устанавливает поле «Номер записи при непосредственном доступе к файлу» в FCB на файловый адрес, соответствующий значениям полей «Текущий блок» и «Запись с текущей позиции».

DOS, функция 25h Установить вектор прерывания

AL – номер прерывания

DS:DX – вектор прерывания – адрес программы обработки прерывания

Описание. Устанавливает значение элемента таблицы векторов прерываний для прерывания с номером AL, равным DS:DX. Это равносильно записи 4-байтового адреса в 0000:(AL*4), но, в отличие от прямой записи, DOS знает, что происходит, и гарантирует, что в момент записи прерывания будут заблокированы.

Восстановить DS (если необходимо) после этого вызова.

DOS, функция 26h Создать новый PSP

DX – адрес сегмента (параграфа) для нового PSP

CS – сегмент PSP, используемый как шаблон для нового PSP (Таблица Б-4)

Описание. Устанавливает PSP для порождаемого процесса по адресу DX:0000. Текущий PSP (100h байт, начиная с CS:0) копируется в DX:0000h, поле MemTop соответственно корректируется, векторы Terminate, Ctrl-Break и Critical Error копируются в PSP из векторов прерываний INT 22h, INT 23h и INT 24h. После этого можно загрузить программу с диска и передать ей управление посредством FAR JMP.

Если перехватывается INT 21h, нужно позаботиться о помещении в стек корректного CS: IP. Еще лучше использовать функцию 4Ch.

Таблица Б-4. Формат PSP

DOS, функция 27h Читать произвольный блок файла

DS:DX – адрес открытого FCB (Таблица Б-2)

CX – число считываемых записей

Выход: AL=00h, если чтение успешно и DTA заполнена данными AL=01h если достигнут конец файла (EOF) и данные не считаны AL=02h, если при чтении произошел выход за границу сегмента AL=03h, если EOF и считана усеченная порция (дополнена нулями) CX – действительное число считанных записей

Читает несколько записей из файла, начиная с файлового адреса, указанного полем «Номер записи при непосредственном доступе к файлу» в FCB. Помещает данные в память, начиная с адреса DTA. Соответствующие поля FCB корректируются, чтобы указывать на следующую запись (первую за прочитанными).

DOS, функция 28h Писать произвольный блок файла

DS:DX – адрес открытого FCB (Таблица Б-2)

CX – число записываемых блоков (если CX равен нулю, то размер файла усекается до указанного в поле FCB «Номер записи при непосредственном доступе к файлу»)

AL=00h, если запись успешна

AL=01h, при переполнении диска

AL=02h, если при записи произошел выход за границу сегмента

CX – действительное число сделанных записей

Описание. Записывает несколько блоков в файл, начиная с файлового адреса, указанного полем «Номер записи при непосредственном доступе к файлу» в FCB. Читает данные из памяти, начиная с адреса DTA. Соответствующие поля FCB корректируются, чтобы указывать на следующую запись (первую за прочитанными).

DOS, функция 29h Разобрать имя файла

DS:SI – адрес исходной текстовой строки для разбора

ES:DI – адрес буфера для результирующего неоткрытого FCB (Таблица Б-2)

AL – битовые флаги, указывающие опции разбора (Таблица Б-5).

AL=00h, если результирующий FCB не содержит обобщенных символов

AL=01h, если результирующий FCB содержит обобщенные символы

AL=FFh, если неверно обозначение диска в имени файла

DS:SI – изменен – указывает на символ сразу вслед за именем файла

ES:DI – не изменен – указывает на неоткрытый FCB

Создает неоткрытый FCB из строки текста или параметра команды. Текст, начиная с DS:SI, анализируется как имя файла в формате D: FILENAME.EXT, и буфер по адресу ES:DI заполняется как соответственно форматированный FCB.

Таблица Б-5. Битовые флаги

DOS, функция 2Ah Получить системную дату

AL – день недели (0 – воскресенье, 1 – понедельник, … 6 – суббота), DOS 3.0+

CX – год (от 1980 до 2099)

DH – месяц (1 до 12)

DL – день (1 до 31)

Описание. Возвращает текущую дату, которая известна системе.

DOS 2.x не гарантирует возврата в AL значения дня.

DOS 1.0+ возвращает правильный день недели.

Версии до 2.1 имеют проблемы с переходом через дату.

DOS, функция 2Bh Установить системную дату

CX – год (от 1980 до 2099)

DH – месяц (от 1 до 12)

DL – день (от 1 до 31)


AL=00h, если дата корректна

AL=FFh, если дата некорректна и не изменена

Устанавливает системную дату DOS.

DOS, функция 2Ch Получить время DOS

CH – часы (от 0 до 23)

CL – минуты (от 0 до 59)

DH – секунды (от 0 до 59)

DL – сотые доли секунды (от 0 до 99)

Описание. Возвращает текущее время, которое известно системе.

Поскольку системные часы имеют частоту 18.2 Гц (интервал 55мс), DL имеет точность примерно 0.04 сек.

DOS, функция 2Dh Установить время DOS

CH – часы (от 0 до 23)

CL – минуты (от 0 до 59)

DH – секунды (от 0 до 59)

DL – сотые доли секунды (от 0 до 99)

AL=00h, если время корректно

AL=FFh, если время некорректно и не изменено

Устанавливает системное время DOS.

DOS, функция 2Eh Установить/сбросить переключатель верификации

AL=00h – отключить верификацию

AL=01h – включить верификацию

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

DOS, функция 2Fh Получить адрес текущей DTA

Выход: ES:BX – адрес начала текущей DTA

Описание. Возвращает адрес начала области ввода-вывода (DTA). Поскольку DTA глобальна для всех процессов, в рекурсивной процедуре (например, при проходе по дереву оглавления) может потребоваться сохранить адрес DTA, а впоследствии восстановить его посредством функции 1Ah.

Примечание. Эта функция изменяет сегментный регистр ES.

Версии: DOS 2.00 и выше DOS, функция 30h Получить номер версии DOS

AL – старший номер версии

AH – младший номер версии

BL:CX – 24-битный серийный номер (большинство версий не поддерживают этот параметр)

Описание. Возвращает в AX значение текущего номера версии DOS. Например, для DOS 3.20 в AL возвращается 03h, в AH – 14h.

Примечание. Если в AL возвращается 00h, можно предполагать, что работает DOS более ранней версии, чем DOS 2.0.

Версии: DOS 2.00 и выше. DOS, функция 31h Завершиться и остаться резидентным

DX – объем памяти, оставляемой резидентной (в параграфах)

Описание. Выходит в родительский процесс, сохраняя код выхода в AL. Код выхода можно получить через функцию 4Dh. DOS устанавливает начальное распределение памяти, как специфицировано в DX, и возвращает управление родительскому процессу, оставляя указанную память резидентной (число байт равно DX*16). Эта функция перекрывает функцию INT 27h, которая не возвращает код выхода и не способна установить резидентную программу, размер которой превышает 64 Кбайт.

indbooks

Читать онлайн книгу

Приложение Б Функции DOS (INT 21h)

DOS, функция 00h

CS – сегмент PSP завершающегося процесса

Описание. Передает управление на вектор завершения в PSP (выходит в родительский процесс). Идентична функции INT 20h (Terminate). Регистр CS должен указывать на PSP. Восстанавливает векторы прерываний DOS 22h-24h (Завершение, Ctrl-Break и Критическая ошибка), устанавливая значения, сохраненные в родительском PSP. Выполняет сброс файловых буферов. Файлы должны быть предварительно закрыты, если их длина изменилась.

Данная функция не рекомендуется к использованию. Для выхода из программы лучше использовать функцию DOS 4Ch.

DOS, функция 01h Считать со стандартного устройства ввода

Выход: AL – символ, полученный из стандартного ввода

Описание. Считывает (ожидает) символ со стандартного входного устройства. Отображает этот символ на стандартное выходное устройство (эхо). При обнаружении Ctrl-Break выполняется INT 23h.

Ввод расширенных клавиш ASCII (F1-F12, PgUp, курсор и другие) требует двух обращений к этой функции. Первый вызов возвращает AL=0. Второй вызов возвращает в AL расширенный код ASCII.

DOS, функция 02h Записать в стандартное устройство вывода

DL – символ, выводимый в стандартный вывод

Посылает символ из DL в стандартное устройство вывода. Обрабатывает символ Backspace (ASCII 8), перемещая курсор влево на одну позицию и оставляя его в новой позиции. При обнаружении Ctrl-Break выполняется INT 23h.

DOS, функция 03h Считать символа со стандартного вспомогательного устройства

Выход: AL – символ, введенный со стандартного вспомогательного устройства

Описание. Считывает (ожидает) символ со стандартного вспомогательного устройства, COM1 или AUX и возвращает этот символ в AL.

Ввод не буферизуется и должен опрашиваться (не управляется прерываниями). При запуске DOS порт AUX (COM1) инициализируется так: 2400 бод, без проверки на четность, 1 стоп-бит, 8-битные слова. Команда DOS MODE используется для установки иных характеристик.

DOS, функция 04h Записать символ в стандартное вспомогательное устройство

DL – символ, выводимый в стандартное вспомогательное устройство

Посылает символ, находящийся в регистре DL, на стандартное вспомогательное устройство, COM1 или AUX.

DOS, функция 05h Вывести на принтер

DL – символ, записываемый на стандартный принтер

Посылает символ в DL на стандартное устройство печати, обычно LPT1.

DOS, функция 06h Консольный ввод-вывод

DL=00h-FEh – символ, посылаемый на стандартный вывод

DL=FFh – запрос ввода со стандартного ввода

ZF=0, если осуществлялся ввод символа и символ готов при запросе ввода

AL – считанный символ

ZF=1, если осуществлялся ввод символа и символа в консоли нет

При DL=0FFh выполняет ввод с консоли «Без ожидания», возвращая включенный флаг нуля ZF, если на консоли нет готового символа. Если символ готов, сбрасывает флаг ZF и возвращает считанный символ в AL. Если DL не равен 0FFh, то DL направляется на стандартный вывод.

DOS, функция 07h Нефильтрующий консольный ввод без эха

Выход: AL – символ, полученный через стандартный ввод

Описание. Считывает (ожидает) символ со стандартного входного устройства и возвращает этот символ в AL. Не проверяет на Ctrl-Break, BackSpace и другие.

Для ввода расширенного символа ASCII должна быть вызвана дважды. Для проверки статуса используется функция DOS 0Bh (чтобы не ожидать нажатия клавиши).

DOS, функция 08h Консольный ввод без эха

Выход: AL – символ, полученный через стандартный ввод

Описание. Считывает (ожидает) символ со стандартного входного устройства и возвращает этот символ в AL. При обнаружении Ctrl-Break выполняется прерывание INT 23h.

Для ввода расширенного символа ASCII должна быть вызвана дважды.

DOS, функция 09h Запись строки на стандартный вывод

DS:DX – адрес строки, заканчивающейся символом «$» (ASCII 24h)

Строка, исключая завершающий ее символ «$», посылается на стандартный вывод. Символы Backspace обрабатываются как в функции 02h (вывод на дисплей). Чтобы перейти на новую строку, обычно включают в текст пару CR/LF (ASCII 0Dh и ASCII 0Ah). Строки, содержащие «$», можно передать на стандартное устройство вывода с помощью функции 40h (BX=0).

DOS, функция 0Ah Ввод строки в буфер

DS:DX – адрес входного буфера (Таблица Б-1)

Таблица Б-1. Формат входного буфера

Буфер содержит введенные данные, в конце – символ CR (ASCII 0Dh)

DOS, функция 0Bh Проверка статуса ввода

Выход: AL=FFh, если символ доступен со стандартного ввода AL=00h, если нет доступного символа

Описание. Проверяет состояние стандартного ввода. При распознавании Ctrl-Break выполняется INT 23h.

Используется перед функциями 01h, 07h и 08h, чтобы избежать ожидания нажатия клавиши.

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

DOS, функция 0Ch Ввод с очисткой

AL – номер функции ввода DOS:

AL=01h – ввод с клавиатуры

AL=06h – ввод с консоли

AL=07h – нефильтрующий без эха

AL=08h – ввод без эха

AL=0Ah – буферизованный ввод

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

DOS, функция 0Dh Сброс диска

Сбрасывает диск (записывает на диск все файловые буферы). Файл, размер которого изменился, должен быть предварительно закрыт (при помощи функций 10h или 3Eh).

DOS, функция 0Eh Установить текущий диск DOS

DL – номер диска (0 – A, 1 – B и так далее), который становится текущим

Выход: AL – общее число дисководов в системе

Описание. Диск, указанный в DL, становится текущим. Проверка: используется функция 19h (дать текущий диск). В регистре AL возвращается число дисководов всех типов, включая жесткие диски и «логические» диски (как диск B: системе с одним гибким диском).

AL имеет то же значение, что и LASTDRIVE, указанное в файле CONFIG.SYS, и по умолчанию равно 5.

DOS, функция 0Fh Открыть файл через FCB

DS:DX – адрес неоткрытого FCB (Таблица Б-2)

Таблица Б-2. Формат FCB

AL=00h, если функция выполнена успешно (FCB заполнен)

AL=FFh, если файл не найден или доступ к файлу не разрешен

Файл, описываемый неоткрытым FCB, должен существовать в текущем оглавлении на диске, специфицированном в FCB (0 – текущий, 1 – A, 2 – B и так далее). Если файл не существует, возвращается AL=0FFh. Файл открывается в режиме совместимости. Если поле «Номер диска» в FCB равно нулю в момент вызова, то оно заполняется номером текущего дисковода (1 – A, 2 – B и так далее). Поле FCB «Номер текущего блока» устанавливается в ноль. Поле FCB «Размер логической записи» устанавливается в 80h. Поля даты и размера файла в FCB устанавливаются из оглавления.

DOS, функция 10h Закрыть файл через FCB

DS:DX – адрес открытого FCB (Таблица Б-2)

AL=00h, если функция выполнена успешно

AL=FFh, если файл не найден там, где он находился при открытии с помощью функции 0Fh

Закрывает файл, открытый функцией 0Fh. Файл должен находиться на своем первоначальном месте в текущем оглавлении диска, на котором он был открыт. Если файл найден, оглавление обновляется, файловые буфера сбрасываются и возвращается AL=00h. Если файл не найден, оглавление не обновляется и возвращается AL=FFh.

DOS, функция 11h Найти первый совпадающий файл через FCB

DS:DX – адрес неоткрытого FCB (Таблица Б-2)

AL=00h, если подходящее имя найдено

AL=FFh, если подходящего имени нет

В текущем оглавлении DOS происходит поиск файлов с именем, соответствующим заданному шаблону. При неудаче возвращается AL=0FFh. Если имя найдено, AL очищается, в первый байт DTA помещается номер дисковода (A – 1, B – 2 и так далее), а в следующие 32 байта помещается элемент оглавления для найденного файла.

Можно использовать при вызове расширенный FCB, чтобы выбирать файлы с указанными атрибутами. В этом случае в DTA помещаются: байт FFh, 7 байт нулей, номер диска и элемент оглавления.

DOS, функция 12h Найти следующий совпадающий файл через FCB

DS:DX – адрес неоткрытого FCB (Таблица Б-2)

AL=00h, если подходящее имя найдено

DTA заполнен AL=FFh, если подходящего имени нет

Используется после вызова функции 11h (Найти первый совпадающий файл через FCB) с обобщенным именем файла. Каждый последующий вызов заполняет DTA очередным подходящим элементом оглавления и возвращает AL=00h. Если подходящих имен больше нет, возвращается AL=FFh.

Резервируемая область в FCB сохраняет информацию, необходимую для продолжения поиска. Поэтому не стоит открывать и изменять FCB между вызовами.

DOS, функция 13h Удалить файл через FCB

DS:DX – адрес неоткрытого FCB (Таблица Б-2)

AL=00h, если функция выполнена успешно

AL=FFh, если файл не найден или доступ к файлу не разрешен

Эта функция удаляет все подходящие файлы в текущем оглавлении указанного диска согласно спецификации в FCB. Если подходящие файлы не найдены или если доступ отвергнут (как при попытке удалить файл с атрибутом Read-Only), функция возвращает в регистре AL значение FFh.

DOS, функция 14h Последовательное чтение из файла через FCB

DS:DX – адрес открытого FCB (Таблица Б-2)

AL=00h, если чтение было успешным и DTA содержит данные

AL=01h, если достигнут конец файла (EOF) и данные не считаны

AL=02h, если произошел выход за сегмент (чтения не было)

AL=03h, если EOF и считана усеченная запись (дополнена нулями)

Функция читает файл, специфицированный в FCB. Затем соответственно увеличивает значения полей в FCB.

Перед началом последовательной обработки файла нужно сбрасывать CurRec в ноль, так как функция 0Fh не инициализирует это поле.

DOS, функция 15h Последовательная запись в файл через FCB

DS:DX – адрес открытого FCB (Таблица Б-2)

AL=00h, если запись была успешной

AL=01h, если ошибка переполнения диска (данные не записаны)

AL=02h, если произошел выход за сегмент (записи не было)

Функция записывает файл, специфицированный в FCB. Затем соответственно увеличивает значения полей в FCB.

Перед началом последовательной обработки файла нужно сбрасывать «Номер текщей записи» в ноль, так как функция 0Fh не инициализирует это поле.

DOS буферизует данные, записывая полный сектор за один раз.

DOS, функция 16h Создание файла через FCB

DS:DX – адрес неоткрытого FCB (Таблица Б-2)

AL=00h, если функция выполнена успешно FCB заполнен

AL=FFh, если при выполнении функции возникли ошибки

Описание. Файл, специфицированный неоткрытым FCB, создается на диске, указанном в FCB (0 – текущий, 1 – A и так далее). Он открывается в текущем оглавлении этого диска. FCB заполняется аналогично функции 0Fh. Если файл существует в момент вызова, его элемент оглавления перекрывается новым файлом, а длина файла сбрасывается в ноль.

Handle-ориентированные функции DOS 2.0+ гораздо удобнее в работе.

DOS, функция 17h Переименовать файл через FCB

DS:DX – адрес измененного FCB (Таблица Б-2)

AL=00h, если функция выполнена успешно

AL=FFh, если при выполнении функции возникли ошибки

Переименовывает файл в текущем оглавлении.

DOS, функция 19h Получить текущий диск DOS


Выход: AL – номер текущего диска (0 – A, 1 – B, и так далее)

Возвращает номер дисковода текущего диска DOS.

DOS, функция 1Ah Установить адрес DTA

DS:DX – адрес DTA

Устанавливает адрес DTA. Все FCB-ориентированные операции работают с DTA. DOS не позволяет операциям ввода/вывода пересекать границу сегмента. Функции поиска 11h, 12h, 4Eh и 4Fh помещают данные в DTA. DTA глобальна, поэтому надо проявлять осторожность при назначении ее в рекурсивной процедуре. При запуске программы ее DTA устанавливается по смещению 80h относительно PSP.

DOS, функция 1Bh Получить информацию FAT для текущего диска

DS:BX – адрес байта FAT ID, отражающего тип диска (Таблица Б-3)

DX – всего кластеров (единиц распределения) на диске

AL – секторов на кластер

CX – байт на сектор

Таблица Б-3. Значения ID

Возвращает информацию о размере и типе текущего диска. Размер диска (в байтах) равен DX*AL*CX. Свободную память можно найти функциями 36h или 32h.

Версии: DOS 1.x держит FAT в памяти и возвращает DS:BX => FAT. DOS 2.0+ может держать в памяти лишь часть всей FAT.

Эта функция изменяет содержимое регистра DS.

DOS, функция 1Ch Получить информацию FAT для указанного диска

DL – номер диска (0 – текущий, 1 – A и так далее)

DS:BX – адрес байта FAT ID, отражающего тип диска (приведен в описании функции 1Bh)

DX – всего кластеров (единиц распределения)

AL – секторов на кластер

CX – байт на сектор

Аналогична функции 1Bh с той разницей, что регистр DL указывает диск, для которого нужно получить информацию.

DOS, функция 21h Считать произвольную запись файла

DS:DX – адрес открытого FCB (Таблица Б-2)

AL=00h, если чтение было успешным и DTA заполнена данными

AL=01h, если достигнут конец файла (EOF) и чтения не было

AL=02h, если произошел выход за сегмент (чтения нет)

AL=03h, если встречен EOF и усеченная запись дополнена нулями

Данная функция читает из файла с текущей позиции как с указанной в полях FCB «Запись с текущей позиции» и «Номер записи при непосредственном доступе к файлу».

DOS, функция 22h Писать произвольную запись файла

DS:DX – адрес открытого FCB (Таблица Б-2)

AL=00h, если запись была успешной

AL=01h, при переполнении диска

AL=02h, если DTA+FCB выходит за сегмент (нет записи)

Данная функция записывает в файл с текущей позиции как с указанной в полях FCB «Запись с текущей позиции» и «Номер записи при непосредственном доступе к файлу».

DOS, функция 23h Получить размер файла через FCB

DS:DX – адрес неоткрытого FCB (Таблица Б-2)

AL=00h, если функция выполнена успешно

AL=FFh, если при выполнении функции возникли ошибки

Проще определить размер файла при помощи функции 3Dh с последующим выполнением 42h (при AL=2).

DOS, функция 24h Установить адрес произвольной записи в файле

DS:DX – адрес открытого FCB (Таблица Б-2)

Устанавливает поле «Номер записи при непосредственном доступе к файлу» в FCB на файловый адрес, соответствующий значениям полей «Текущий блок» и «Запись с текущей позиции».

DOS, функция 25h Установить вектор прерывания

AL – номер прерывания

DS:DX – вектор прерывания – адрес программы обработки прерывания

Описание. Устанавливает значение элемента таблицы векторов прерываний для прерывания с номером AL, равным DS:DX. Это равносильно записи 4-байтового адреса в 0000:(AL*4), но, в отличие от прямой записи, DOS знает, что происходит, и гарантирует, что в момент записи прерывания будут заблокированы.

Восстановить DS (если необходимо) после этого вызова.

DOS, функция 26h Создать новый PSP

DX – адрес сегмента (параграфа) для нового PSP

CS – сегмент PSP, используемый как шаблон для нового PSP (Таблица Б-4)

Описание. Устанавливает PSP для порождаемого процесса по адресу DX:0000. Текущий PSP (100h байт, начиная с CS:0) копируется в DX:0000h, поле MemTop соответственно корректируется, векторы Terminate, Ctrl-Break и Critical Error копируются в PSP из векторов прерываний INT 22h, INT 23h и INT 24h. После этого можно загрузить программу с диска и передать ей управление посредством FAR JMP.

Если перехватывается INT 21h, нужно позаботиться о помещении в стек корректного CS: IP. Еще лучше использовать функцию 4Ch.

Таблица Б-4. Формат PSP

DOS, функция 27h Читать произвольный блок файла

DS:DX – адрес открытого FCB (Таблица Б-2)

CX – число считываемых записей

Выход: AL=00h, если чтение успешно и DTA заполнена данными AL=01h если достигнут конец файла (EOF) и данные не считаны AL=02h, если при чтении произошел выход за границу сегмента AL=03h, если EOF и считана усеченная порция (дополнена нулями) CX – действительное число считанных записей

Читает несколько записей из файла, начиная с файлового адреса, указанного полем «Номер записи при непосредственном доступе к файлу» в FCB. Помещает данные в память, начиная с адреса DTA. Соответствующие поля FCB корректируются, чтобы указывать на следующую запись (первую за прочитанными).

DOS, функция 28h Писать произвольный блок файла

DS:DX – адрес открытого FCB (Таблица Б-2)

CX – число записываемых блоков (если CX равен нулю, то размер файла усекается до указанного в поле FCB «Номер записи при непосредственном доступе к файлу»)

AL=00h, если запись успешна

AL=01h, при переполнении диска

AL=02h, если при записи произошел выход за границу сегмента

CX – действительное число сделанных записей

Описание. Записывает несколько блоков в файл, начиная с файлового адреса, указанного полем «Номер записи при непосредственном доступе к файлу» в FCB. Читает данные из памяти, начиная с адреса DTA. Соответствующие поля FCB корректируются, чтобы указывать на следующую запись (первую за прочитанными).

DOS, функция 29h Разобрать имя файла

DS:SI – адрес исходной текстовой строки для разбора

ES:DI – адрес буфера для результирующего неоткрытого FCB (Таблица Б-2)

AL – битовые флаги, указывающие опции разбора (Таблица Б-5).

AL=00h, если результирующий FCB не содержит обобщенных символов

AL=01h, если результирующий FCB содержит обобщенные символы

AL=FFh, если неверно обозначение диска в имени файла

DS:SI – изменен – указывает на символ сразу вслед за именем файла

ES:DI – не изменен – указывает на неоткрытый FCB

Создает неоткрытый FCB из строки текста или параметра команды. Текст, начиная с DS:SI, анализируется как имя файла в формате D: FILENAME.EXT, и буфер по адресу ES:DI заполняется как соответственно форматированный FCB.

Таблица Б-5. Битовые флаги

DOS, функция 2Ah Получить системную дату

AL – день недели (0 – воскресенье, 1 – понедельник, … 6 – суббота), DOS 3.0+

CX – год (от 1980 до 2099)

DH – месяц (1 до 12)

DL – день (1 до 31)

Описание. Возвращает текущую дату, которая известна системе.

DOS 2.x не гарантирует возврата в AL значения дня.

DOS 1.0+ возвращает правильный день недели.

Версии до 2.1 имеют проблемы с переходом через дату.

DOS, функция 2Bh Установить системную дату

CX – год (от 1980 до 2099)

DH – месяц (от 1 до 12)

DL – день (от 1 до 31)

AL=00h, если дата корректна

AL=FFh, если дата некорректна и не изменена

Устанавливает системную дату DOS.

DOS, функция 2Ch Получить время DOS

CH – часы (от 0 до 23)

CL – минуты (от 0 до 59)

DH – секунды (от 0 до 59)

DL – сотые доли секунды (от 0 до 99)

Описание. Возвращает текущее время, которое известно системе.

Поскольку системные часы имеют частоту 18.2 Гц (интервал 55мс), DL имеет точность примерно 0.04 сек.

DOS, функция 2Dh Установить время DOS

CH – часы (от 0 до 23)

CL – минуты (от 0 до 59)

DH – секунды (от 0 до 59)

DL – сотые доли секунды (от 0 до 99)

AL=00h, если время корректно

AL=FFh, если время некорректно и не изменено

Устанавливает системное время DOS.

DOS, функция 2Eh Установить/сбросить переключатель верификации

AL=00h – отключить верификацию

AL=01h – включить верификацию

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

DOS, функция 2Fh Получить адрес текущей DTA

Выход: ES:BX – адрес начала текущей DTA

Описание. Возвращает адрес начала области ввода-вывода (DTA). Поскольку DTA глобальна для всех процессов, в рекурсивной процедуре (например, при проходе по дереву оглавления) может потребоваться сохранить адрес DTA, а впоследствии восстановить его посредством функции 1Ah.

Примечание. Эта функция изменяет сегментный регистр ES.

Версии: DOS 2.00 и выше DOS, функция 30h Получить номер версии DOS

AL – старший номер версии

AH – младший номер версии

BL:CX – 24-битный серийный номер (большинство версий не поддерживают этот параметр)

Описание. Возвращает в AX значение текущего номера версии DOS. Например, для DOS 3.20 в AL возвращается 03h, в AH – 14h.

Примечание. Если в AL возвращается 00h, можно предполагать, что работает DOS более ранней версии, чем DOS 2.0.

Версии: DOS 2.00 и выше. DOS, функция 31h Завершиться и остаться резидентным

DX – объем памяти, оставляемой резидентной (в параграфах)

Описание. Выходит в родительский процесс, сохраняя код выхода в AL. Код выхода можно получить через функцию 4Dh. DOS устанавливает начальное распределение памяти, как специфицировано в DX, и возвращает управление родительскому процессу, оставляя указанную память резидентной (число байт равно DX*16). Эта функция перекрывает функцию INT 27h, которая не возвращает код выхода и не способна установить резидентную программу, размер которой превышает 64 Кбайт.

Версии: DOS 2.00 и выше. DOS, функция 32h Получить информацию DOS о диске (Официально не документирована)

DL – номер диска (0 – текущий, 1 – A и так далее)

AL=00h, если в DL был задан корректный диск

DS:BX – адрес блока информации о диске для запрошенного устройства (Таблица Б-6)

AL=FFh, если в DL был задан некорректный диск

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

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

Версии: DOS 2.00 и выше. Таблица Б-6. Формат блока информации о диске

DOS, функция 33h Установить/опросить статус Ctrl-Break

AL=00h – опросить текущий статус контроля Ctrl-Break

AL=01h – установить статус контроля Ctrl-Break

DL – требуемый статус (0 – выключен, 1 – включен)

Выход: DL – текущий статус (0 – выключен, 1 – включен)

Если AL=00h, в DL возвращается текущий статус контроля Ctrl-Break.

Если AL=01h, в DL возвращается новый текущий статус.

Когда статус «включен», DOS при выполнении большинства функций (исключая 06h и 07h) проверяет, нажаты ли клавиши Ctrl-Break. Если это обнаружено, выполняется прерывание INT 23h (если оно не перехватывается, то процесс снимается).

При статусе «выключен» DOS проверяет на нажатие Ctrl-Break лишь при выполнении операций стандартного ввода/вывода, стандартной печати и стандартного AUX.

Версии: DOS 2.00 и выше. DOS, функция 34h Получить адрес флага активности DOS (Официально не документирована)

Выход: ES:BX – адрес флага активности DOS

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

Если ES: [BX] не нулевой, фоновая программа (TSR либо popup) не должна использовать никаких функций DOS.

Версии: DOS 2.00 и выше. DOS, функция 35h Получить вектор прерывания

AL – номер прерывания (00h до FFh)

Выход: ES:BX – адрес обработчика прерывания

Описание. Возвращает значение вектора прерывания для INT (AL), то есть загружает в BX 0000:[AL*4], а в ES – 0000:[(AL*4)+2].

Примечание. Эта функция изменяет сегментный регистр ES.

Версии: DOS 2.00 и выше. DOS, функция 36h Получить свободную память диска

DL – номер диска (0 – текущий, 1 – A и так далее)

AX=FFFFh, если AL содержал неверный номер диска

Если функция выполнена успешно:

AX – число секторов на кластер

BX – число доступных кластеров

CX – байт на сектор


DX – всего кластеров на диске

Описание. Возвращает данные, полезные для подсчета общей и доступной дисковой памяти. Если в AX возвращено FFFFh, значит задан неверный диск. Иначе свободная память (в байтах) составляет (AX*BX*CX), всего памяти (AX*CX*DX) байт.

Версии: DOS 2.00 и выше. DOS, функция 37h Установить/опросить символ-переключатель (Официально не документирована)

AL=00h – опросить текущий переключатель

AL=01h – установить символ-переключатель

AL=00h, если функция выполнена успешно

DL – текущий символ-переключатель DOS (если при вызове AL=00h)

AL=FFh, если использована неподдерживаемая подфункция

Описание. Устанавливает или опрашивает «Глобальный переключатель» DOS. Переключатель (SWITCHAR) – это символ, используемый в командной строке как признак опции. По умолчанию принимается «/» (например, DIR /w/p), но его можно изменить на «-» (DIR – w-p), если нужно, чтобы система была больше похожа на UNIX. Общепринято опрашивать значение SWITCHAR перед разбором области неформатированных параметров в PSP для выделения опций команды.

Примечание. Эта недокументированная команда может измениться в будущих версиях DOS. Не рекомендуется изменять SWITCHAR.

Версии: DOS 2.00 и выше. DOS, функция 38h Получить/установить информацию о стране

AL=00h – получить данные для текущей страны

DS:DX – адрес локального буфера для чтения блока данных страны (Таблица Б-7)

AL=01h-FEh – установить данные для указанной страны 255

BX – 16-битный код страны (Таблица Б-8)

CF=0, если функция выполнена успешно

CF=1, если при выполнении функции возникли ошибки

Описание. Если DX=FFFFh, то текущий код страны устанавливается равным AL (если AL=FFh, то код страны устанавливается равным BX). Обычно код страны устанавливается в файле CONFIG.SYS. Если DX Таблица Б-7. Формат блока данных страны

DOS, функция 39h Создать новое оглавление

DS:DX – адрес строки ASCIZ с именем оглавления

CF=0, если функция выполнена успешно

CF=1, если при выполнении функции возникли ошибки

Таблица Б-8. Коды некоторых стран

Если диск и/или корневой путь не указаны, то новое оглавление создается в текущей директории. Поддиректория создается и связывается с существующим деревом. Если флаг CF установлен при возврате, то AX содержит код ошибки, и оглавление не создается.

Версии: DOS 2.00 и выше. DOS, функция 3Ah Удалить оглавление

DS:DX – адрес строки ASCIZ с именем оглавления

CF=0, если функция выполнена успешно

CF=1, если при выполнении функции возникли ошибки

Описание. Если диск и/или корневой путь не указаны, принимаются значения по умолчанию. Поддиректория удаляется из структуры оглавлений. Если флаг CF установлен при возврате, то AX содержит код ошибки, и оглавление не удаляется.

Примечание. Оглавление не должно содержать файлов и поддиректорий, оно не должно попадать под влияние возможных ограничений DOS (например, не должно быть задействовано в активных командах JOIN или SUBST).

Версии: DOS 2.00 и выше. DOS, функция 3Bh Установить текущую директорию

DS:DX – адрес строки ASCIZ с именем оглавления

CF=0, если функция выполнена успешно

CF=1, если при выполнении функции возникли ошибки

Описание. Если диск и/или корневой путь не указаны, принимаются значения по умолчанию. Указанная поддиректория становится текущим оглавлением DOS для этого (или текущего) диска. Если флаг CF установлен при возврате, то AX содержит код ошибки, и текущее оглавление для выбранного диска не изменяется.

Версии: DOS 2.00 и выше. DOS, функция 3Ch Создать файл через описатель

DS:DX – адрес строки ASCIZ с именем файла

CX – атрибут файла (атрибуты приведены в описании функции DOS 43h)

CF=0, если функция выполнена успешно

AX – описатель файла

CF=1, если при выполнении функции возникли ошибки

Описание. Если диск и/или путь не указаны, принимаются значения по умолчанию.

Версии: DOS 2.00 и выше. DOS, функция 3Dh Открыть описатель файла

DS:DX – адрес строки ASCIZ с именем файла

AL – режим открытия:

AL=00h, чтобы открыть для чтения

AL=01h, чтобы открыть для записи

AL=02h, чтобы открыть для чтения и записи

CF=0, если функция выполнена успешно

AX – описатель файла

CF=1, если при выполнении функции возникли ошибки

Описание. Файл открывается в выбранном режиме доступа (режиме открытия). Если диск и/или путь не указаны, принимаются указанные по умолчанию. Файл должен существовать. Указатель чтения/записи устанавливается в ноль.

Версии: DOS 2.00 и выше. DOS, функция 3Eh Закрыть описатель файла

BX – описатель файла

CF=0, если функция выполнилась успешно

CF=1, если при выполнении функции возникли ошибки

Описание. BX содержит описатель файла (handle), возвращенный при открытии. Файл, представленный этим описателем, закрывается, его буферы сбрасываются и оглавление обновляется корректными размером, временем и датой. Из-за недостатка описателей файлов (максимум 20, по умолчанию установлено 8), возможно, придется закрыть часть текущих описателей, как, например, описатель 3 (стандартный AUX).

Версии: DOS 2.00 и выше. DOS, функция 3Fh Читать файл через описатель

BX – описатель файла

DS:DX – адрес буфера для чтения данных

CX – число считываемых байт

CF=0, если функция выполнена успешно

AX – число действительно прочитанных байт

CF=1, если при выполнении функции возникли ошибки

Описание. CX байт данных считываются из файла или устройства с описателем, указанным в BX. Данные читаются с текущей позиции указателя чтения/записи файла и помещаются в буфер вызывающей программы, адресуемый через DS:DX. Если необходимо установить позицию чтения/записи, можно использовать функцию 42h. Эта функция обновляет указатель чтения/записи файла, чтобы подготовиться к последующим операциям чтения или записи.

Версии: DOS 2.00 и выше. DOS, функция 40h Писать в файл через описатель

BX – описатель файла

DS:DX – адрес буфера, содержащего записываемые данные

CX – число записываемых байт

CF=0, если функция выполнена успешно

AX – число действительно записанных байт

CF=1, если при выполнении функции возникли ошибки

Описание. CX байт данных записываются в файл или на устройство с описателем, заданным в BX. Данные берутся из буфера, адресуемого через DS:DX, и записываются, начиная с текущей позиции указателя чтения/записи файла. Чтобы установить указатель файла, если необходимо, можно использовать функцию 42h. Обновляет указатель чтения/записи файла, чтобы подготовиться к последующим операциям чтения или записи.

Версии: DOS 2.00 и выше. DOS, функция 41h Удалить файл

DS:DX – адрес строки ASCIZ с именем файла

CF=0, если функция выполнена успешно

CF=1, если при выполнении функции возникли ошибки

Описание. Файл удаляется из оглавления заданного диска. Если диск и/или путь не указаны, принимаются значения по умолчанию. Имя файла не может содержать обобщенные символы («?» и «*»). Если файл имеет атрибут «только чтение», то перед удалением необходимо изменить этот атрибут через функцию 43h.

Версии: DOS 2.00 и выше. DOS, функция 42h Переместить указатель файла

BX – описатель файла

CX:DX на сколько передвинуть указатель: (CX*65536)+DX

AL=00h переместить относительно начала файла +CX:DX

AL=01h переместить относительно текущей позиции +CX:DX

AL=02h переместить относительно конца файла +CX:DX

CF=0, если функция выполнена успешно

DX:AX новая позиция указателя файла (если нет ошибки)

CF=1, если при выполнении функции возникли ошибки

Описание. Перемещает логический указатель чтения/записи к нужной позиции. Очередная операция чтения или записи начнется с этого адреса.

Вызов с AL=2, CX=0, DX=0 возвращает длину файла в DX:AX.

Действительная длина файла равна (DX*65536)+AX.

Версии: DOS 2.00 и выше. DOS, функция 43h Установить/опросить атрибуты файла

DS:DX – адрес строки ASCIZ с именем файла

AL=00h – извлечь текущий атрибут файла

AL=01h – установить атрибут файла

CX – новый атрибут файла (для подфункции 01h)(Таблица Б-9)

CF=0, если функция выполнена успешно

CX – текущий атрибут файла (для подфункции 00h)(Таблица Б-9)

CF=1, если при выполнении функции возникли ошибки

Таблица Б-9. Атрибуты файла

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

Примечание. Чтобы скрыть оглавление, нужно использовать CX=02h (а не 12h, как можно было ожидать).

Версии: DOS 2.00 и выше. DOS, функция 44h Управление устройством ввода/вывода

AL – код подфункции:

AL=00h – получить информацию об устройстве

AL=01h – установить информацию об устройстве

AL=02h – читать с символьного устройства

AL=03h – писать на символьное устройство

AL=04h – читать с блочного устройства

AL=05h – писать на блочное устройство

AL=06h – дать статус ввода

AL=07h – дать статус вывода

AL=08h – запрос съемного носителя

AL=09h – запрос удаленного устройства

AL=0Ah – запрос удаленного описателя

AL=0Bh – счет повторов разделения

AL=0Ch – кодовые страницы 3.3

AL=0Dh – общий IOCTL

AL=0Eh – получить логическое устройство

AL=0Fh – установить логическое устройство

Версии: DOS 2.00 и выше. DOS, функция 45h Дублировать описатель файла

BX – существующий описатель файла

CF=0, если функция выполнена успешно

AX – новый описатель файла, дублирующий оригинал

CF=1, если при выполнении функции возникли ошибки

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

Версии: DOS 2.00 и выше. DOS, функция 46h Переназначить описатель

BX – целевой описатель файла (должен уже существовать)

CX – исходный описатель файла (должен уже существовать)

CF=0, если функция выполнена успешно

CF=1, если при выполнении функции возникли ошибки

Описание. Заставляет описатель файла (handle) ссылаться на другой файл или устройство. Если описатель в CX (источник) открыт, он закрывается, а затем становится дубликатом описателя в BX (назначения). Иными словами, описатели в CX и BX будут ссылаться на один и тот же физический файл или устройство.

Версии: DOS 2.00 и выше. DOS, функция 47h Получить текущее оглавление DOS

DS:SI – адрес локального буфера для результирующего пути – 64 байта

DL – номер диска (0 – текущий, 1 – A и так далее)

CF=0, если функция выполнена успешно

CF=1, если при выполнении функции возникли ошибки

Описание. В буфер по адресу DS:SI помещается в форме ASCIZ путь текущего оглавления для диска, указанного в DL. Путь возвращается в формате: «путь\оглавление»,0. Впереди не подставляется буква диска, а сзади не подставляется символ «\». Например, если текущим является корневое оглавление, эта функция вернет пустую строку (DS: [SI]=0).

Версии: DOS 2.00 и выше. DOS, функция 48h Выделить память

BX – запрошенное количество памяти в 16-байтных параграфах

CF=0, если функция выполнена успешно

AX – сегментный адрес распределенного блока

CF=1, если при выполнении функции возникли ошибки

BX – размер максимального доступного блока памяти (в параграфах)

Описание. Распределяет блок памяти длиной BX параграфов, возвращая сегментный адрес этого блока в AX (блок начинается с AX:0000). Если распределение неудачно, устанавливается флаг CF, в AX возвращается код ошибки, а BX содержит максимальный размер доступной для распределения памяти (в параграфах). Чтобы определить наибольший доступный блок, общепринято устанавливать BX=FFFFh перед вызовом. Распределение завершится с ошибкой, возвратив размер максимального блока памяти в BX.

Версии: DOS 2.00 и выше. DOS, функция 49h Освободить блок памяти

ES – сегментный адрес освобождаемого блока памяти

CF=0, если функция выполнена успешно

CF=1, если при выполнении функции возникли ошибки

Описание. Освобождает блок памяти, начинающийся с адреса ES:0000. Этот блок становится доступным для других запросов системы. Вообще говоря, нужно освобождать лишь те блоки памяти, которые получены через функцию 48h (распределить память). Родитель отвечает за освобождение памяти порожденных процессов. Тем не менее, ничто не препятствует освобождать память чужих процессов.

Версии: DOS 2.00 и выше. DOS, функция 4Ah Изменить размер блока памяти

ES – сегмент распределенного блока памяти

BX – нужный размер блока в 16-байтных параграфах

CF=0, если функция выполнена успешно

CF=1, если при выполнении функции возникли ошибки

BX – размер максимального доступного блока памяти (в параграфах)

Описание. Изменяет размер существующего блока памяти. Когда программа получает управление, функция 4Bh уже распределила блок памяти, начиная с PSP, который содержит всю доступную память. Чтобы освободить память для запуска порождаемых процессов, блок памяти, начинающийся с PSP, необходимо сначала сжать.

Функция 31h и INT 27h (TSR) сжимают блок по адресу PSP.


Версии: DOS 2.00 и выше.

DOS, функция 4Bh Выполнить или загрузить программу

DS:DX – адрес строки ASCIZ с именем файла, содержащего программу

ES:BX – адрес EPB (блока параметров EXEC)

AL=00h – загрузить и выполнить

AL=01h – загрузить, но не выполнять

AL=03h – загрузить программный оверлей

CF=0, если функция выполнена успешно

BX, DX не сохранены

CF=1, если при выполнении функции возникли ошибки

Описание. Данная функция загружает в память и запускает программу, имя которой указано в регистрах DS:DX. Запущенная программа после завершения работы возвратит управление запускаемой. Если диск или путь не указаны, принимаются значения по умолчанию. ES:BX указывает на блок памяти, подготовленный как EPB, формат которого зависит от запрошенной подфункции в AL.

Версии: DOS 2.00 и выше. DOS, функция 4Ch Завершить программу

Описание. Возвращает управление от порожденного процесса его родителю, устанавливая код выхода (его можно опросить функцией 4Dh). Управление передается по адресу завершения в PSP завершающейся программы. Векторы Ctrl-Break и Critical Error восстанавливаются к старым адресам, сохраненным в родительском PSP.

Примечание. Значение ERRORLEVEL (используемое в пакетных файлах DOS) можно использовать для проверки кода выхода самой последней программы.

Версии: DOS 2.00 и выше. DOS, функция 4Dh Получить код выхода программы

AH – код выхода последнего завершившегося процесса

AH=00h – нормальное завершение

AH=01h – завершение через Ctrl-Break INT 23h

AH=02h – завершение по критической ошибке устройства INT 24h

AH=03h – завершение через функцию 31h

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

Версии: DOS 2.00 и выше. DOS, функция 4Eh Найти первый совпадающий файл

DS:DX – адрес строки ASCIZ с именем файла (допускается использовать символы «?» и «*»)

CX – атрибут файла для сравнения

CF=0, если функция выполнена успешно

DTA заполнена данными (Таблица Б-10)

CF=1, если при выполнении функции возникли ошибки

Описание. Если диск и/или путь не указаны, принимаются значения по умолчанию. Обобщенные символы «*» и «?» допускается использовать в имени файла и расширении.

Версии: DOS 2.00 и выше. DOS, функция 4Fh Найти следующий совпадающий файл

DS:DX – адрес данных, возвращенных предыдущей 4Eh (Найти первый файл)

Таблица Б-10. Формат данных в DTA

CF=0, если функция выполнена успешно

DTA заполнена данными

CF=1, если при выполнении функции возникли ошибки

Описание. Эту функцию можно использовать после вызова 4Eh. Следующее имя файла, совпадающее по обобщенному имени и атрибуту файла, копируется в буфер по адресу DS:DX вместе с другой информацией (Таблица Б-10).

Примечание. Параметр DS:DX добавлен в DOS 3.0.

Версии: DOS 2.00 и выше. DOS, функция 52h Получить адрес векторной таблицы связи (Официально не документирована)

Выход: ES:BX – адрес векторной таблицы связи (Таблица Б-11)

Описание. Данная функция возвращает адрес векторной таблицы связи.

Версии: DOS 2.00 и выше. DOS, функция 54h Получить переключатель верификации DOS

AL=00h, если верификация выключена (OFF)

AL=01h, если верификация включена (ON)

Описание. Возвращает текущий статус верификации записи DOS. Если в AL возвращается 1, то DOS считывает обратно каждый сектор, записываемый на диск, чтобы проверить правильность записи. Функция DOS 2Eh позволяет установить/изменить режим верификации.

Версии: DOS 2.00 и выше. Таблица Б-11. Формат векторной таблицы связи

DOS, функция 56h Переименовать/переместить файл

DS:DX – адрес старого ASCIZ имени (путь/имя существующего файла)

ES:DI – адрес нового ASCIZ имени (новые путь/имя)

CF=0, если функция выполнена успешно

CF=1, если при выполнении функции возникли ошибки

Описание. Старое имя DS:DX должно существовать и не может содержать обобщенных символов. Диск и путь необязательны (если они не указаны, принимаются значения по умолчанию). Новое имя ES:DI должно описывать несуществующий файл. Если указан диск, он должен быть тем же, что и в старом имени. Если диск или путь не указаны, принимаются текущие. Если старое и новое имя содержат разные пути (явные или принятые по умолчанию), то элемент оглавления для файла перемещается в оглавление, указанное в новом имени.

Версии: DOS 2.00 и выше. DOS, функция 57h Установить/опросить дату/время файла

AL=00h – получить дату/время файла

AL=01h – установить дату/время файла

BX – описатель файла (handle)

CX (если AL=1) – новая отметка времени в формате время файла

DX (если AL=1) – новая отметка даты в формате дата файла

CF=0, если функция выполнена успешно

CX – (если при вызове AL=0) отметка времени файла в формате время/дата файла (Таблица Б-12)

Таблица Б-12. Формат времени файла

DX – (если при вызове AL=0) отметка даты файла в формате время/дата файла (Таблица Б-13)

Таблица Б-13. Формат даты файла

CF=1, если при выполнении функции возникли ошибки

Описание. BX должен содержать описатель открытого файла (см. 3Ch или 3Dh). DX и CX задаются в формате памяти (например, младшие 8 бит даты находятся в DH).

Версии: DOS 2.00 и выше. DOS, функция 59h Получить расширенную информацию об ошибке

BX=0000h (номер версии: 0000h для DOS 3.0, 3.1 и 3.2)

AX – расширенный код ошибки (0, если ошибки не было)

BH – класс ошибки

BL – предлагаемое действие

CH – сфера (где произошла ошибка)

Описание. Эту функцию можно использовать, чтобы уточнить, что предпринять после сбоя функции DOS по ошибке (только DOS 3.0+). Ее можно вызывать: в обработчике критических ошибок INT 24h, после любой функции INT 21h, возвратившей флаг переноса после вызова FCB-функции, возвратившей AL=FFh.

Версии: DOS 3.00 и выше. DOS, функция 5Ah Создать уникальный временный файл

DS:DX – адрес строки ASCIZ с диском и путем (заканчивается символом «\»)

CX – атрибут файла

CF=0, если функция выполнена успешно

AX – описатель файла

DS:DX – (не изменяется) полное ASCIZ-имя нового файла

CF=1, если при выполнении функции возникли ошибки

Описание. Открывает (создает) файл с уникальным именем в каталоге, заданном строкой ASCIZ, на которую указывает DS:DX. COMMAND.COM вызывает эту функцию, когда создает временные «канальные» файлы, используемые при переназначении ввода-вывода. Описание пути должно быть готово к добавлению в его конец имени файла. Необходимо обеспечить минимум 12 байт в конце строки. Сама строка должна быть заполнена в одной из форм: «^: \путь\»,0 (указан диск и путь), «d:»,0 (текущее оглавление диска) или «d: \»,0 (корневое оглавление диска).

Версии: DOS 3.00 и выше. DOS, функция 5Bh Создать новый файл

DS:DX – адрес строки ASCIZ с именем файла

CX – атрибут файла

CF=0, если функция выполнена успешно

AX – описатель файла

CF=1, если при выполнении функции возникли ошибки

Описание. Файл открывается для чтения/записи в совместимом режиме доступа. Если диск и/или путь не указаны, принимаются значения по умолчанию. Этот вызов идентичен функции DOS 3Ch с тем исключением, что он вернет ошибку, если файл с заданным именем уже существует.

Версии: DOS 3.00 и выше. DOS, функция 5Ch Блокировать/разблокировать доступ к файлу

AL=00h – заблокировать область файла

AL=01h – разблокировать ранее заблокированную область

BX – описатель файла

CX:DX – смещение ((CX*65536)+DX) от начала файла

SI:DI – длина блокируемой области ((SI*65536)+DI) байт

CF=0, если функция выполнена успешно

CF=1, если при выполнении функции возникли ошибки

Описание. Блокирует или освобождает доступ к участку файла, указанного в BX. Область файла с логическим смещением CX:DX и длиной SI:DI блокируется (захватывается) или разблокируется (освобождается). Смещение и длина обязательно должны быть указаны. Разделение файлов должно быть активизировано (командой SHARE), иначе функция вернет код ошибки «Неверный номер функции».

Версии: DOS 3.00 и выше (при обязательной загрузке SHARE). DOS, функция 62h Получить адрес PSP

Выход: BX – сегментный адрес PSP выполняющейся программы

Описание. Эта функция возвращает в BX адрес PSP текущей программы. Используется, для получения адреса параметров командной строки, адреса окружения DOS и другой полезной информации, содержащейся в PSP.

Версии: DOS 3.00 и выше. DOS, функция 65h Получить расширенную информацию страны

AL=01h – дать расширенную информацию страны DOS 3.3

AL=02h – дать таблицу преобразования строчных букв в прописные

AL=04h – то же для символов, допустимых в именах файлов

AL=06h – дать сопоставляющую последовательность

BX – кодовая страница (FFFFh – консоль)

CX – размер буфера возврата (должен быть минимум 5 байт)

ES:DI – адрес буфера возврата

CF=0, если функция выполнена успешно

ES:DI – адрес возвращенной информации

CF=1, если при выполнении функции возникли ошибки:

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

Версии: DOS 3.30 и выше. DOS, функция 66h Получить/установить глобальную кодовую страницу

AL=01h – запросить текущую глобальную кодовую страницу

AL=02h – установить активную кодовую страницу

BX – (при AL=02h) кодовая страница (Таблица Б-14)

DX – (при AL=02h) системная кодовая страница (устанавливаемая при загрузке)

CF=0, если функция выполнена успешно

Таблица Б-14. Значения кодовых страниц

BX – (если при вызове AL=01h) текущая активная кодовая страница

DX – (если при вызове AL=01h) системная кодовая страница (устанавливаемая при загрузке)

CF=1, если при выполнении функции возникли ошибки

Описание. Эта функция выбирает новую кодовую страницу или получает значение текущей активной кодовой страницы (страниц). Программа DOS NLSFUNC должна быть загружена до этого вызова. Функция используется в сочетании с 65h или 38h.

Примечание. Устанавливая новую активную кодовую страницу, DOS читает данные из файла COUNTRY.SYS.

Версии: DOS 3.30 и выше. DOS, функция 67h Установить число описателей файлов

BX – максимальное число описателей (до FFFFh)

CF=0, если функция выполнена успешно

CF=1, если при выполнении функции возникли ошибки

Описание. Эта функция устанавливает максимальное число описателей файлов, которые могут быть открыты одновременно. Если значение BX меньше 20, то принимается 20. Если значение BX меньше текущего максимума (нужно сократить число описателей), и в данный момент открыто более чем BX файлов, то изменение будет иметь место, когда число открытых файлов не будет превышать устанавливаемый максимум. Если BX больше текущего максимума (нужно увеличить число описателей), то DOS должна иметь доступную память, чтобы распределить ее под новые описатели. Функция 4Ah позволяет освободить память, чтобы она стала доступной DOS.

Версии: DOS 3.30 и выше. DOS, функция 68h Завершить файл

BX – описатель завершаемого файла

CF=0, если функция выполнена успешно

CF=1, если при выполнении функции возникли ошибки

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

Версии: DOS 3.3 и выше. В версиях DOS от 2.0 до 3.2 можно использовать функцию DOS 45h, чтобы создать и затем закрыть дубликат.

MS-DOS: появление, основные понятия и команды, версии

MS-DOS (Microsoft Disk Operating System) представляет собой дисковую операционную систему для компьютеров на базе процессора архитектуры х86. В период с начала восьмидесятых по девяностые годы двадцатого века MS-DOS стала самой популярной ОС для персональных компьютеров, способной работать с различными видами дисков, осуществлять ввод-вывод данных, производить операции с памятью и контролировать процессы.

В 1981 году Microsoft приобрела авторские права на ОС 86-DOS у Seattle Computer Products и начала ее модификацию и адаптацию под требования компании IBM. Спустя немного времени, IBM выпустила операционную систему под названием PC DOS 1.0 как единственный доступный вариант для использования на собственных компьютерах, лицензированный владельцем бренда. MS-DOS от Microsoft и IBM практически не отличались друг от друга, однако, в последние годы сотрудничества разработки обрели принципиальные отличия в совместимости с различными периферийными устройствами, синтаксисе команд и возможностях, предоставляемых конечному потребителю.

Как самостоятельный продукт, ОС MS-DOS за два десятилетия прошла ряд обновлений и переработок, после чего работу над ней прекратили. Каждая новая версия расширяла возможности, обеспечивая работоспособность новых носителей данных и файлов большего объема.

Для корпорации Microsoft разработка операционной системы стала основным видом деятельности, которая приносила стабильную прибыль и обеспечивала ресурсами для дальнейшего совершенствования и развития. На базе MS-DOS были разработаны и внедрены Windows 95 и 98, а сама система позиционировалась как гибкая и занимающая сравнительно малое место на диске.

Краткая история появления MS-DOS

Летом 1980 года вышла операционная система, написанная Тимом Паттерсоном из Seattle Computer Products и названная 86-DOS. У неё было три принципиальных отличия от CP/M — ОС прототипа от Гэрри Килдалла и компании Digital Research:

  1. Возможность работать с шестнадцатиразрядными процессорами (Intel x86) вместо восьмиразрядных (Intel 8080 и Zilog Z80);
  2. Инновационная (улучшенная) логика буферизации дисковых секторов;
  3. Новая файловая система FAT12.

Корпорация IBM не справлялась с разработкой ПО для планируемого к серийному выпуску компьютера, поэтому была вынуждена заключить контракт с Microsoft. По заключенному осенью 1980 года контракту, Microsoft была обязана завершить создание ПО для первого серийного ПК на базе Intel 8086.

Microsoft нанимает создателя 86-DOS Тима Паттерсона в мае 1981 года для завершения работы над проектом. А уже через два месяца выкупает авторские права на перспективную разработку Паттерсона.

С августа 1981 года пользователи персональных ЭВМ смогли в полной мере ощутить все возможности нового продукта. Загрузочные дискеты входили в комплектацию поставки с каждой машиной. Изначально в MS-DOS отсутствовал графический интерфейс. Работа сводилась к вводу команд пользователя в ручном режиме. После загрузки ОС на экране мигал белый курсор на темном фоне. Путем усовершенствования системы, разработчику удалость достичь высоких результатов.

Через несколько промежуточных вариантов ПО, выходит версия 2.0. Ее приурочили к запуску в серийное производство машины IBM PC/XT с HDD. Система значительно расширила функциональные возможности: появились подкаталоги и директории, взаимодействие и обмен между устройствами ввода-вывода, адресация запроса к периферийному оборудованию по имени.

Модульная операционная система комплектовалась минимумом драйверов. Все необходимое для стабильной работы ПО, периферии других моделей и марок становились доступным после загрузки MS-DOS на ПК. Microsoft поставляла различным разработчикам базовый комплект, на основе которого каждый вносил свои изменения в соответствии с возможностями оборудования.

Развитие компьютерной техники компании IBM привело к тому, что потребность в адаптации операционной системы под аппаратное обеспечение отпала. Все устройства, произведенные IBM, комплектовались PC DOS. Для прочих разработчиков персональных компьютеров была доступна базовая MS-DOS. Окончание срока действия контракта между IBM и Microsoft привело к тому, что с 1991 года между системами появились принципиальные различия.

Основные понятия

Дисковая операционная система — комплекс программных средств для обеспечения работы персонального компьютера.

Драйверы — программы, интегрированные с ОС и предназначенные для управления периферийными устройствами.

Файл — именованная область взаимосвязанных данных с набором определенных свойств, которая хранится на различных носителях и может быть обработана при помощи средств ПК. Имя файла состоит из двух частей, разделенных точкой: названия и расширения.

Каталог файлов (директория) — файлы, сгруппированные по одному или нескольким признакам (бывает и без признаков). Виды:

  1. Корневой . Содержит в себе все прочие директории и файлы системы. В командной строке при написании пути к файлу в корневом каталоге используется знак «\».
  2. Текущий , в командной строке обозначается «.». Директория, с которой непосредственно работает DOS в данный момент времени.
  3. Родительский , в командной строке обозначается «..». Директория, в которой находится текущий каталог.

Для завершения имени каталога используется символ «\». Для того, чтобы перейти к тому или иному файлу, необходимо ввести полный адрес:

  • D: — имя диска, корневой каталог;
  • \users\ — родительский каталог;
  • \1\ — текущий каталог;
  • 123_1.txt — имя файла, к которому обратился пользователь.

Основные компоненты системы


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

BootRecord — загрузчик системных файлов. Считывает в ОЗУ системные модули, они же файлы ядра, IO.SYS и MSDOS.SYS.

  • IO.SYS — модуль управления командами для периферийных устройств;
  • MSDOS.SYS — обработчик прерываний.

Командный процессор — средство для обработки команд пользователя, которые делятся на внутренние и внешние.

  • Внутренние команды выполняются непосредственно командным процессором;
  • Внешние команды представляют собой программы с одноименным названием, записанные в память диска. При вводе соответствующей команды, процессор загружает найденный файл в память и передает управление запущенной программе. По достижении результата ввода такой команды, она автоматически удаляется из памяти, а на экран пользователя выводится информация о том, что командный процессор готов к продолжению работы и реализации следующих программ. Код программы командной строки находится в модуле COMMAND.COM .

Драйверы и программы-утилиты — выполняют стандартные процедуры (форматирование HDD, запуск антивируса, диагностика ошибок, объем свободного пространства и прочие).

  • Драйвер ANSI.SYS отвечает за управление устройствами ввода-вывода (клавиатура и монитор).
  • Файл COUNTRY.SYS содержит таблицы локализации для различных стран, а именно, используемый в стране формат даты и времени, значок денежной единицы и кодовую страницу (кодировку).
  • DISPLAY.SYS . Обеспечивает загрузку и поддержку шрифтов. Является драйвером дисплея.
  • DBLSPACE.EXE — компрессор дисков, как жестких, так и гибких. Применялся в версиях MS-DOS 6.0 — 6.2.
  • DRVSPACE.EXE . Компрессор жестких и гибких дисков (версии MS-DOS 6.22 и выше).
  • DEFRAG.EXE . Программа дефрагментации дисков.
  • DOSSHELL.EXE . Файловый менеджер. Выпускался вместе с операционной системой в версиях MS-DOS 4.0 — 6.0. Поставка этой оболочки была прекращена после версии 6.0, но поддерживалась как часть «Supplemental Disk» вплоть до MS-DOS 6.22.
  • HIMEM.SYS . Драйвер дополнительной памяти. Координирует работу дополнительной памяти, в том числе ее начального участка.
  • HELP.COM . Руководство пользователя, доступное в интерактивном режиме.
  • EMM386.EXE . Драйвер расширенной памяти. Обеспечивает доступ к верхней памяти (UMA — Upper Memory Area, англ.), эмулирует дополнительную память при помощи расширенной.
  • INTERLNK.EXE , INTERSVR.EXE . Драйвера для организации обмена данными между компьютерами через порты асинхронного адаптера или через параллельные порты.
  • KEYB.COM . Конфигурация раскладки клавиатуры для конкретного языка (для настройки языков, отличных от американского английского).
  • Модуль KEYBOARD.SYS — обеспечивает пользователя набором допустимых языковых раскладок.
  • Файлы с расширением CPI — содержат информацию о кодовых страницах.
  • MEMMAKER.EXE — увеличивает объем оперативной памяти. Можно применять, если на компьютере имеется расширенная память и процессоры 80386, 80486, а также, Pentium.
  • Модуль MODE.COM содержит настройки параметров рабочего экрана, последовательных и параллельных портов.
  • MSAV.EXE и MWAV.EXE — базовые антивирусы, MSAV для MS-DOS, MWAV — для Windows.
  • MSD.EXE . Позволяет вывести на экран текущую конфигурацию системы и ПК.
  • MSBACKUP.EXE , MWBACKUP.EXE . Программы для резервного хранения и восстановления данных. MSBACKUP для MS-DOS, MWBACKUP — для Windows.
  • MWUNDEL.EXE . Программа для восстановления случайно удаленных пользователем файлов.
  • POWER.EXE осуществляет управление потреблением сетевых энергоресурсов.
  • RAMDRIVE.SYS — драйвер для создания логического электронного диска в расширенной памяти.
  • SCANDISK.EXE . Программа для диагностики и восстановления дисков.
  • SMARTDRV.EXE . Производит кэширование дисков.
  • VSAFE.COM . Модуль непрерывного слежения на предмет наличия в системе вирусов. При обнаружении вируса, выводит об этом сообщение.
  • UNDELETE.EXE . Восстановление удалённых файлов и данных.

Модули CONFIG.SYS и AUTOEXEC.BAT или файлы конфигурации . Осуществляют запуск конфигурации системы с сохраненными настройками пользователя для реализации определенных задач и автоматического запуска программ (драйверов).

Версии

Корпорация Microsoft в период с 1981 по 2000 годы выпускала версии своей дисковой операционной системы с разными названиями для различных машин. Операционная система фигурировала под названиями: 86-, COMPAQ-, Z-DOS.

Название Дата выхода в период с 1980 по 2000 годы Файловая система Подробная информация
QDOS version 0.10 Середина июля 80 года FAT12 Пилотный запуск продукта Тима Паттерсона, реализованного Seattle Computer Products.
86-DOS Август 80 года Адаптированная для микропроцессоров 8080/Z80 копия DigitalResearch CP/M. Изменения: буферизация данных, файловая система FAT12.
86-DOS version 0.3 Декабрь 80 года Версия от Microsoft под лицензией разработчика Seattle Computer Products.
86-DOS version 1.0 Апрель 81 года Релиз продукта. Основа для серийных машин IBM.
86-DOS version 1.10 Июль 81 года Microsoft выкупает авторские права на продукт у Seattle Computer Products, переименовывает ОС в MS-DOS. Версия аналогична PC-DOS 1.0.
Базовые функции:
— Поддержка исключительно односторонних восьмисекторных 5,25-дюймовых накопителей на гибких магнитных дисках объемом 160 КБайт;
— Фиксация даты последней сохраненной версии файла.
MS-DOS versions 1.10..1.14 Лето-осень 81 года Компания Microsoft выпускает сразу три продукта для IBM PC DOS 1.0. ОС становится универсальным решением для всех ПК с микропроцессором 8086, адаптируясь к различным аппаратным платформам.
Решения разработчика:
— Предустановленные драйверы для периферии;
— Основные модули ввода-вывода;
— Ядро, адаптируемое под периферийное оборудование.
MS-DOS version 1.24 Март 82 года Изменения:
Работа с двухсторонними дискетами 5,25 дюйма объемом до 320 Килобайт.
Запись даты и времени изменения файла.
MS-DOS version 1.25 Лето 82 года Версия для ПК, не имеющих отношения к IBM.
MS-DOS version 2.0 Весна 83 года Изменения:
— Обеспечение работы HDD до 15 МиБ;
— Поддержка односторонних и двухсторонних 5,25-дюймовых накопителей на гибких магнитных дисках 180 и 360 Килобайт соответственно;
— Поддержка древовидной структуры каталогов файлов (до этой версии все файлы размещались в корне диска, каталогов не существовало);
— Поддержка внешних драйверов аппаратного обеспечения;
— Организация фоновой печати при помощи команды PRINT;
— Обеспечение работы CGA — первой видеокарты, поддерживающей цветное изображение, выпущенной IBM в 1981 году.
MS-DOS version 2.01 Осень 83 года Отображение текущих параметров даты и времени, а также знака денежной единицы при помощи команды COUNTRY
MS-DOS version 2.10 Осень 83 года Версия для ПК PCjr компании IBM, носила название PC DOS 2.10.
MS-DOS version 2.11 Март 84 года Адаптация для ПК ACT-86C (Altos MS-DOS 2.11), TeleVideo (TeleVideo PC DOS 2.11) и T1000 (Toshiba MS-DOS 2.11, находилась на компакт-диске). Перевод на 10 языков.
MS-DOS version 3.00 Конец лета 84 года FAT16 Версия для ПК IBM PC/AT c HDD 20 МиБ. Работа с жёсткими дисками до 32 МиБ включительно. Появляется возможность указания маршрута для запуска программ, находящихся не в текущем каталоге. Обеспечение работы 5,25″ дискет объемом до 1,2 Мегабайт.
MS-DOS version 3.10 Конец осени 84 года Поддержка возможности работы в сетях Microsoft.
MS-DOS version 3.20 Январь 86 года Добавлена поддержка дисководов для накопителей на гибких магнитных дисках 3,5 дюйма объемом 720 килобайт.
MS-DOS version 3.30 Лето 87 года Появилась возможность разбивать HDD на логические диски объемом до 32 мегабайт. Добавлена поддержка накопителей на гибких магнитных дисках 3,5 дюйма 1,44 мегабайт.
MS-DOS version 3.31 Осень 87 года Версия 3.30, улучшенная Compaq Computer Corporation.
MS-DOS version 4.0 Лето 88 года Увеличен размер логического диска. Добавлена расширенная поддержка национальных языков. Полностью поддерживается EGA и VGA. Имеет множество ошибок.
MS-DOS version 4.01 Конец 88 года Исправлены ошибки предыдущей версии. Включает файловый менеджер, можно сказать, графическую оболочку, DOS Shell. Версия русифицирована.
MS-DOS version 5.0 Июнь 91 года Обеспечение работы 8 HDD одновременно. Поддержка накопителей на гибких магнитных дисках 3,5 дюйма EHD 2,88 Мегабайт. Добавлено: текстовый редактор Edit, QBASIC, интерактивная справка Help. Выпускалась русская версия ОС.
AST Premium Exec DOS 5.0 (OEM) 1991 год Версия для ноутбуков AST Premium Exec, содержащая пакет расширений.
MS-DOS version 5.0 1991 год Варианты DOS от IBM и Microsoft обретают принципиальное различие.
MS-DOS version 5.50 1991 год Часть 32-разрядной ОС Windows NT, NTVDM — NT Virtual DOS Machine (виртуальная машина DOS для системы NT).
MS-DOS version 6.0 Март 91 года Обеспечение работы CD-ROM. Сжатие и дефрагментация файлов. Проверка HDD антивирусной программой.
MS-DOS version 6.2 Ноябрь 1993 года Добавлена утилита тестирования жесткого диска ScanDisk. Исключена из поставки программа MS-DOS Shell.
MS-DOS version 6.21 Февраль 1994 года Из системы удалена программа сжатия дисков DoubleSpace. Изменениям подверглись компоненты, поддерживающие сжатие данных, а именно, ScanDisk и Microsoft Backup.
MS-DOS version 6.22 Лето 94 года Добавлен DriveSpace, который использует несовместимый с DoubleSpace формат хранения данных. Файлы могут быть преобразованы в новый формат. Microsoft Backup использует новую технологию сжатия, использованную в DriveSpace. В нелокализованной версии поддерживается работа с символами кириллицы, в том числе в именах файлов, а также представление даты и времени, ориентированных на Россию, Украину и Беларусь.
MS-DOS version 7.0 Конец лета 95 года Становится частью ОС Windows 95. Добавлен драйвер CD-ROM.
MS-DOS version 7.1 Конец лета 96 года FAT32 Становится частью ОС Windows 95 и Windows 98. Максимальный объем HDD — 2 ТиБ.
MS-DOS version 8.0 Осень 2000 года Становится частью Windows ME. Находится на загрузочной дискете, создаваемой Windows XP и более поздними версиями.

Файловые менеджеры MS-DOS

Программы-оболочки для MS-DOS позволили сделать работу пользователя более удобной и упростили визуальное отображение информации.

Norton Commander

Самая распространенная на территории РФ программа-оболочка. Визуально представляет собой экран, разделенный на две панели. Первоначально все операции с деревом каталогов и файлами выполнялись при помощи клавиш F1…F10. В более поздней версии добавилась мышь и панель меню.

Программа-оболочка Norton Commander легла в основу большинства графических интерфейсов — оболочек для множества различных ОС и программного обеспечения. Оболочка разработана группой программистов в составе Джона Соча, Линды Дидьяк, Питера Брэйдена, Кейт Эрмел, Брайана Йодера. Выпустил файловый менеджер бренд Peter Norton Computing. Позднее бренд стал частью концерна Symantec.

Работа над оболочкой велась в период с 1984 по 1986 годы. После релиза и выхода в свет Norton Commander мгновенно завоевал лидирующие позиции среди пользователей ПК. Версия 3.0 оболочки позволила окончательно вытеснить конкурентов с рынка и занять лидирующие позиции в отрасли.

В нашей стране (Россия) наиболее распространенными стали версии 2.0, 3.0 и 4.0. Длительное время популярность программы связывали с учебником по информатике для школьных и высших учебных заведений «IBM PC для пользователя» (автор Э. В. Фигурнов), в котором основная масса сведений содержала детальные принципы работы с оболочкой Norton Commander.

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

Не успев выйти, версия 4.0 провалилась. Увеличенный объем оперативной памяти, многочисленные ошибки стали решающим фактором, и Norton Commander стал терять позиции на рынке. Компания, купившая разработку, на протяжение почти 7 лет боролась за рынок: одна за другой выходили версии 5.0..5.51, приспособленная под Windows версия 2.01. Однако, за тот период, что на рынке господствовали практически идентичные копии оболочки: Volkov Commander, PIE Commander и DOS Navigator, файловый менеджер не смог справиться с нанесенным ущербом и потерял последних пользователей.

Функционал оболочки Norton Commander

Условно рабочий стол программы можно разделить на два основных блока по вертикали. В блоках — дерево каталогов и файлов, которые имеются на накопителях компьютера. Над блоками — меню настройки и управления базовыми операциями. Под блоками — меню основных операций. Управление Norton Commander с клавиатуры:

  • Клавиша F1 вызывает меню помощи;
  • Клавиша F2 — настройка меню;
  • Клавиша F3 — открытие и просмотр файла в текстовом режиме или в виде двоичного кода;
  • Клавиша F4 — редактирование текста;
  • Клавиша F5 — быстрое копирование элементов;
  • Клавиша F6 — позволяет переименовать или переместить текущий файл или каталог в другую директорию;
  • Клавиша F7 — создает новый подкаталог;
  • Клавиша F8 — удаляет выбранный(е) файл(ы) или директорию(и);
  • Клавиша F9 — переход в меню над блоками;
  • Клавиша F10 — выход из программы.

Управление осуществляется при помощи стрелок на клавиатуре, функциональных клавиш F1..F10, комбинаций «горячих клавиш», клавиши «Enter», поддерживается работа мыши. Основная задача Norton Commander — облегчить пользователю работу в MS-DOS и сэкономить время на вводе типовых команд. При этом, даже при работе под оболочкой Norton Commander, пользователь может ввести нужную команду в соответствующей строке.

Volkov Commander

Программа-оболочка является практически идентичной копией Norton Commander. Основное отличие — возможность задать имя файла или директории длиннее 8 стандартных символов.

Одно из преимуществ файлового менеджера — компактный вес. Дистрибутив включает саму программу, в которой реализован минимальный набор функций. Расширение функционала осуществляется за счет интеграции сторонних приложений, драйверов и программ. Написал программу Всеволод Волков, выходец из Украины. Volkov Commander относится к условно-бесплатному программному обеспечению.

Оболочка Volkov Commander 4.0 вышла в 1994 году и сразу завоевала множество симпатий за счет ряда преимуществ:

  • Вес утилиты в распаковке — 64 Килобайта. Полный аналог Norton Commander со слегка урезанным функционалом;
  • Может осуществлять полное копирование директорий;
  • Переносит директории со всем содержимым в пределах диска без копирования;
  • Реализовано 5 базовых операций с файлами: редактор (встроенный и внешний), сервис просмотра (встроенный и внешний), запуск по расширению файла;
  • Встроенный редактор способен загрузить большие по объему файлы (до 640 Кб, в сравнении с ним аналогичная версия Norton Commander осуществляет открытие файлов до 64 Кб);
  • При работе под DOS без кэширования диска характеризуется быстрым откликом на запросы пользователя;
  • Встроенный шестнадцатеричный редактор;
  • Сочетание клавиш Alt+F5 позволяет вызвать меню управления резидентными программами;
  • В версии 4.99 в оболочку встроен текстовый редактор, при помощи которого можно оперативно отредактировать файлы.

Среди недостатков были отмечены: ограниченный функционал, малый объем памяти, отсутствие обновлений с 2000 года (последняя версия — 4.99.08 альфа).

DOS Navigator

Еще одна программа-оболочка, которая стала улучшенной копией Norton Commander. Пользователи имеют возможность работать в меню с широким функционалом, увеличенным числом панелей, многозадачным интерфейсом для плагинов. Простая интеграция программного обеспечения, произведенного сторонними разработчиками.

DOS Navigator version 0.90 был разработан и выпущен в начале 90-х годов группой программистов в составе Стефана Тануркова, Андрея Заболотного, Сергея Мельникова. Более поздняя версия была переписана с использованием Turbo Vision Танурковым и Д. Доценко. В 1993 году группа разработчиков пополнилась С. Филимоновым, а оболочка обрела новые компоненты, графику и была оптимизирована под нужды пользователей. В 1995 году вышла версия 1.35, после чего несколько лет проводились улучшения, исправления ошибок и обновления версии до 1.39. В команде успели поучаствовать Илья Багдасарян и Максим Масютин.

С 1998 года команда переключилась на разработку почтового клиента The Bat!. Финальная версия DOS Navigator 1.50 вышла в 1999 году, после чего исходные коды ПО стали доступны всем желающим.

В 2020 году вышел релиз преемника оригинальной оболочки Dos Navigator — Dos Navigator III, написанного на мультипарадигменном языке программирования JavaScript.

Dos Navigator был одним из передовых по функционалу и эффективности файловым менеджером, который работал под OS/2 и DOS. Проект разработала и реализовала компания Ritlabs из Молдовы.

Визуальное исполнение внешне мало отличается от Norton Commander. Два блока с каталогами и файлами, верхнее и нижнее меню с функциями и часто используемыми командами. Достоинства: емкая память, драйвер для перемещения файлов в «корзину». Панели можно убирать и добавлять, формировать меню по собственным предпочтениям, воспроизводить большое число текстовых видеорежимов, создавать прямые ссылки на объекты в дереве каталога, архивировать информацию и осуществлять другие команды. Встроенные программы и приложения:

  • Табличный конструктор;
  • Редактор накопителей;
  • Текстовый редактор;
  • Калькулятор;
  • Форматирование дискового пространства;
  • Кодеры и декодеры;
  • Проигрыватель дисков;
  • Книга контактов;
  • Игровые приложения и многое другое.

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

Имена и расширения файлов

В MS-DOS можно встретить расширения:

  1. Расширение «*.bat» — пакетные;
  2. Расширения «*.exe» и «*.com» — исполняемые файлы.
  1. Расширения «*.txt» и «*.doc» — текстовые файлы;
  2. Расширение «*.dbf» — файлы базы данных;
  3. Расширение «*.sys» — системные файлы;
  4. Расширение «*.bak» — файлы резервного копирования.

Шаблонные операции

Для групповой сортировки пакетов по имени или расширению используются символы:

  • (*) любое количество любых символов в имени файла до расширения, принадлежащих к одной группе. Пример:
    *.txt – находит все именованные области данных текстового редактора с данным расширением в текущей директории.
    1.* — находит все файлы с именем 1 любого расширения в текущей директории
  • (?) любой символ, но один
    Пример:
    fox?.ехе — находит весь список файлов в каталоге с любым символом после fox и расширением ехе в текущем каталоге: foxp.ехе, foxh.ехе и так далее. Аналогичные операции можно совершать с поиском по расширению файлов.

Базовые команды для операций с файлами, директориями и накопителями

Перед началом операций с файлами, при работе в среде Microsoft Windows 10, необходимо запустить командную строку. Вызов: клавиша «Windows» + R, затем введите «cmd» и нажмите кнопку «OK» или клавишу «Enter».

Также можно нажать одновременно клавиши Ctrl + Alt + Del, затем выбрать «Диспетчер задач». В верхней вкладке «Файл» выбрать пункт «Запустить новую задачу» > «cmd» > «OK» или «Enter»

  • Команда ATTRIB изменяет свойства файла или группы.
    Синтаксис команды: ATTRIB [+R | -R] [+A | -A ] [+S | -S] [+H | -H] [диск:] [маршрут] [имя файла] [/S] [/D]
    + — поставить выбранное свойство
    — — снять выбранные свойства
    R — чтение без внесения изменений в область данных
    A — поместить в архив
    S — сделать системным
    H — скрыть
    Значок после слэша указывает над какими группами будет вестись работа:
    /S — с указанными именованными областями данных в текущей директории
    /D — и с файлами, и с папками
  • Команда COPY нужна для копирования выбранных файлов.
    Синтаксис: COPY [/D] [/V] [/N] [/Y | /-Y] [/Z] [/A | /B] источник [/A | /B] [+ источник [/A | /B] [[+ …]] [результат [/A | /B]]
    /D — указывает на возможность создания зашифрованного файла
    /V — проверка правильности копирования файлов
    /N — использование, если возможно, коротких имен при копировании файлов, чьи имена не удовлетворяют стандарту 8.3
    /Y — подавление запроса подтверждения на перезапись существующего конечного файла
    /-Y — обязательный запрос подтверждения на перезапись существующего конечного файла
    /Z — копирование сетевых файлов с возобновлением
    /A — файл является текстовым файлом ASCII
    /B — файл является двоичным файлом
    источник — имена одного или нескольких копируемых файлов
    результат — каталог и/или имя для конечных файлов
    Для объединения файлов, необходимо указать один конечный и несколько исходных файлов, используя подстановочные знаки или формат «файл1 + файл2 + файл3 + …».
  • Команды DEL и ERASE удаляют выбранные файлы.
    Синтаксис: [команда][диск:][путь][имя файла]/P
    /P — спрашивать подтверждение перед удалением каждого файла
    Пример: DEL C:\main\123.txt/P
    Если указать каталог, вместо имени файла, то все файлы из него будут удалены, сам же каталог останется, однако будет пустым.
  • Операторы REN и RENAME позволяют изменять имена файлов и каталогов.
    Синтаксис: [команда][путь]\[имя файла 1] [имя файла 2]
    [Имя файла 1] — название именованной области данных, которую необходимо переименовать
    [Имя файла 2] — новое имя именованной области данных, которое будет присвоено
    Примеры:
    REN C:\main\123.txt 1234.txt — поменяли имя файла 123.txt на 1234.txt
    REN C:\main second — поменяли имя каталога main на second

Операции с дисками и директориями

  • Команды CD или CHDIR осуществляют перемещение в указанную директорию.
    Синтаксис:
    CHDIR [диск:][путь]
    CD [диск:][путь]
    Пример: CHDIR C:\1\123 — набрав данную команду, пользователь совершит переход в каталог 123, который находится в каталоге 1 на локальном диске С.
  • Команда DIR показывает все файлы и каталоги, находящиеся в указанной директории.
    Синтаксис: DIR [диск:][путь][имя_файла] [/P] [/W] [/A[[:]атрибуты]] [/O[[:]сортировка]] [/S] [/B] [/L] [/C]
    [диск:][путь][имя файла] — диск, каталоги, файл для отображения, который можно не указывать. Если имя файла не указать, тогда будут показаны все файлы, находящиеся в указанном каталоге.
    /P — информация не выводится после заполнения экрана. Для продолжения необходимо нажать Enter.
    /W — вывод информации в компактном виде
    /A — файлы отображаются с указанными атрибутами
    Атрибуты:
    H — скрытые файлы;
    -H — файлы, не являющиеся скрытыми;
    S — системные файлы;
    -S — файлы, которые не являются системными;
    D — каталоги;
    -D — исключительно файлы (не каталоги);
    A — файлы, готовые к архивированию;
    -A — файлы, не измененные после последней архивации;
    R — доступные только для чтения файлы;
    -R — файлы не «только для чтения».
    /O — отображение информации в указанном порядке:
    N — по алфавиту (по имени);
    -N — в порядке, обратном алфавитному (Z — A);
    E — по расширению, в алфавитном порядке;
    -E — по расширению в порядке, обратном алфавитному;
    D — по дате и времени (начиная с более ранних);
    -D — по дате и времени, начиная с поздних;
    S — по возрастанию размера;
    -S — по убыванию размера;
    C — по коэффициенту компрессии, начиная с меньшего;
    -C — по коэффициенту компрессии, начиная с большего;
    G — сначала показывать каталоги;
    -G — сначала показывать файлы.
    /S — отображать список файлов в указанной директории и всех каталогах, которые в ней содержатся
    /B — выводить файлы и каталоги без какой-либо информации, кроме расширений
    /L — выводить все названия исключительно строчными буквами
  • Команды MD и MKDIR позволяют создать новый каталог.
    Синтаксис:
    MD [диск:]\[путь]\имя_ каталога(директории)
    MKDIR [диск:]\[путь]\имя каталога (директории)
    Пример: MD С:\123\1\2 — каталог 2 будет создан. В случае отсутствия в пути нужных каталогов, они также будут созданы.
  • Команды RD и RMDIR удаляют каталоги. Синтаксис:
    RD [диск:]\[имя каталога (директории)][/символ]
    RMDIR [диск:]\[имя каталога (директории)][/символ], где символами могут быть:
    S — удаляет дерево каталогов;
    Q — удаляет директории без подтверждения пользователя;
    ? — выводит справку.

Все команды можно писать как строчными, так и заглавными буквами, а также можно комбинировать буквы. Например, при вводе в команд TIME, time или TiMe, результат будет одинаковым.

Чтобы команда работала, необходимо после ее ввода и всех параметров нажать клавишу «Enter». Для удаления команды, до нажатия «Enter», следует нажать клавишу «Esc».

Список команд, актуальных для MS-DOS, являющейся частью Windows 10

  • CLS — очистка экрана.
  • COLOR — установка цветов переднего плана и фона, используемых по умолчанию.
  • DATE — вывод либо установка текущей даты.
  • DEL — удаление одного или нескольких файлов.
  • DIR — вывод списка файлов и подпапок из указанной папки.
  • ECHO — вывод сообщений и переключение режима отображения команд на экране.
  • ENDLOCAL — завершает локализацию изменений среды в пакетном файле.
  • ERASE — удаление одного или нескольких файлов.
  • EXIT — завершение работы интерпретатора командных строк CMD.EXE.
  • FC — сравнение двух файлов или двух наборов файлов и вывод различий между ними.
  • FIND — поиск текстовой строки в одном или нескольких файлах.
  • FINDSTR — поиск строк в файлах.
  • FORMAT — форматирование диска для работы с Windows.
  • HELP — выводит интегрированный справочник.
  • LABEL — создание, изменение и удаление меток тома для дисков.
  • MD — создание папки.
  • MKDIR — создание папки.
  • MKLINK — создание символьных ссылок.
  • MODE — конфигурирование системных устройств.
  • MORE — последовательный вывод данных по частям размером в один экран.
  • MOVE — перемещение одного или нескольких файлов, переименование файлов и папок.
  • PATH — отображает или устанавливает путь поиска исполняемых файлов.
  • PAUSE — приостанавливает выполнение пакетного файла и выводит сообщение: «Для продолжения нажмите любую клавишу. ».
  • POPD — переходит в каталог, сохраненный командой PUSHD.
  • PRINT — выводит на печать содержимое текстового файла.
  • PUSHD — сохраняет текущий каталог для использования командой POPD, а затем переходит в указанный каталог.
  • RD — удаляет папку.
  • RECOVER — восстанавливает данные, которые можно прочитать, с плохого или поврежденного диска.
  • REM — помещает комментарии в пакетные файл данных и файл CONFIG.SYS.
  • REN — переименовывает один или несколько файлов.
  • RENAME — переименовывает один или несколько файлов.
  • REPLACE — заменяет файлы.
  • RMDIR — удаление папки.
  • ROBOCOPY — Средство копирования файлов и деревьев каталогов.
  • SETLOCAL — начинает локализацию изменений среды в пакетном файле.
  • SHUTDOWN — завершение сеанса пользователя, выключение или перезагрузка компьютера.
  • SORT — сортировка ввода.
  • START — выполнение программы или команды в отдельном окне.
  • SUBST — сопоставление имени диска указанному пути.
  • TIME — вывод и установка системного времени.
  • TREE — графическое отображение структуры каталогов диска или папки.
  • TYPE — вывод на экран содержимого текстовых файлов.
  • VOL — вывод метки и серийного номера тома для диска.
  • XCOPY — копирование файлов и деревьев каталогов.

Для получения информации по команде, необходимо после её набора ввести комбинацию /?. Например: cls/?.

Библиотека Интернет Индустрии I2R.ru

Малобюджетные сайты.

Продвижение веб-сайта.

Контент и авторское право.

Программирование на Ассемблере под DOS

2.1. Проба молотка

#1. Теоретически гвозди можно забивать и голыми руками. Но намного быстрее и безболезненнее делать это с помощью молотка. Пользоваться им, как известно, каждый дурак умеет. Чего там сложного? Взял оный в руки — и молоти: раз по гвоздю, два раза по пальцам (понимание приходит с опытом). Молотки бывают разные: большие и маленькие, с длинной ручкой и с короткой ручкой, железные и деревянные, приспособленные для забивания гвоздей и приспособленные для пробивания черепов. Да и гвоздей разнообразие еще то! И разной длины, и разной толщины, и со шляпками разной формы, из разного материала сделанные. есть даже специализированные для прибивания рук к кресту! :(.
Так вот: виды молотков и особенности их использования мы пока что оставим в покое. Для начала просто возьмем гвоздь, который уже не раз забивали голыми руками (больно было?) и забьем его при помощи молотка! Помните, как мы программу, выводящую окошки, без компилятора одними мнемониками писали?
А теперь ее же, дуру, «под компилятор» перелопатим. В общем, настало время, братья, тайну нервную и страшную узнать. Сегодня мы познакомимся с компилятором.

#2. Нижеследующий текст набираем в текстовом редакторе:

Сохраняем получившуюся дуру под именем proga_1.asm.
Далее запускаем файл tasm.exe и в качестве параметра передаем ему имя файла с исходным текстом программы. То есть командная строка у вас (в том же Windows Commander’е) вот какая должна быть:

Если вы правильно набрали текст программы, то TASM должен выплюнуть вам вот что:

Самое тут главное — это чтоб «Error messages» был «None». Это значит, что ошибок в программе нет.
Поехали дальше. Если ошибок у вас действительно никаких не было, то в том же каталоге, что и proga_1.asm ищите файл proga_1.OBJ. Можете даже по F3 попробовать просмотреть его содержимое. Что-нибудь поняли? Если нет — отсылаю вас к «Введению в машинный код».
А теперь запускаем хорошую программу TLINK следующим образом:

Обратите внимание: линкуем мы именно файл с типом OBJ, а не ASM.
Что получилось? А получился файл proga_1.COM!! И этот .COM работает!
Посмотрите на его содержимое в DZEBUG’е :). Отличется ли оно чем от той проги, что мы делали ранее?
Нет, не отличается!
Медитируем.

#3. А теперь несколько слов о том, почему не стоит писать программы так, как мы это делали раньше:
1. Эти проклятые адреса! Пойди рассчитай на какой адрес прыгнуть нужно, с какого смещения подпрограмма начинается, с какого блок данных. В принципе, как мы уже убедились, в этом нет ничего сложного. просто занятие это очень уж муторное и неинтересное.
Как абсолютно верно заметил некто Евгений Олейников в RTFM_Helpers: «Когда я пишу программу, я не знаю точного адреса начала будущей подпрограммы».
2. Очень сложно было в том случае, когда возникала необходимость ВСТАВИТЬ ту или иную команду в середину кода. Приходилось перебивать код по новой. по новой пересчитывать адреса. ужас, в общем!
Так вот: основная и самая главная функция «ассемблерного компилятора» — это как раз и есть «просчитывание адресов»!
Смотрите, как хорошо и приятно: Мы готовим исходный текст в обыкновенном текстовом редакторе :). Просто набиваем строчка за строчкой — нам не важны адреса (мы их вообще не видим!), не важны «точки входа» в процедуру. Спокойненько вставляем какую надо команду, спокойненько удаляем. Без лишнего напряга!
Да вы посмотрите на блок 3 программы :). Там все те же хорошо знакомые команды :).
Особое внимание обратите на команду CALL, которая у нас, как известно, вызывает процедуру. После нее идет не привычный адрес начала процедуры, а всего лишь ее «имя собственное»! А сама процедура находится между строчками WINDOW proс (начало процедуры) и WINDOW endp (конец процедуры).
«WINDOW» — понятно, это «имя собственное». «Proc» — потому что процедура. «Endp» — потому что конец процедуры.
Тут еще один момент. подобные «словеса» КОМАНДАМИ АССЕМБЛЕРА НЕ ЯВЛЯЮТСЯ. Они называются инече — «директивами». Это не ПРИКАЗ делать то-то и то-то, а ЦЕННОЕ УКАЗАНИЕ компилятору (не процессору!), что и как ему делать с данным куском кода.
Процедуры — вещь хорошая! Все процедуры хороши, и в большой программе их чертовски много! Это вам не языки высокого уровня, где можно длиннющие простыни кода лабать и все будет работать! («Дельфи-компилятор не даст вам выстрелить себе в ногу, но будет так удивлен попыткой сделать это, что через некоторое время сделает это сам.» (С) DZ WhiteUnicorn).
Это ASM! Тут запутаться легче простого! Исходники неимоверно длинны и сложны! Все делается ручками (хоть и с помощью компилятора), а ошибки довольно трудно отслеживаются (для не-дZенствующих это вообще занятие безнадежное)! Вот и выкручиваются низкоуровневые программеры таким вот образом: всю программу (даже в тех случаях, когда это не обоснованно!) делят на меленькие кусочки-процедурки. Напишут процедурку, протестируют ее так и сяк. если работает — за следующую берутся.
Сии «методы проектирования» мы еще с вами еще не раз рассмотрим :). Пока что знайте вот что: любую прогу можно/нужно рассматривать как КУЧУ ПРОЦЕДУР, которые все между собой повязаны.
Но есть среди этих процедур САМАЯ ГЛАВНАЯ! Это та, С КОТОРОЙ НАЧИНАЕТСЯ ВЫПОЛЕНИЕ ПРОГРАММЫ! Ее никто не вызывает. Она — босс! Она всеми командует, все гребет под себя. Описывают ее те же самые директивы, что и прочие «подчиненные процедуры». Но есть у нас еще одна директивка, которая указывает, КАКАЯ ИМЕННО процедура ИЗ ВСЕХ вроде бы «равноправных» является ГЛАВНОЙ.
Видите строчку end MAIN в конце исходного текста программы? Именно она и указывает ГЛАВНУЮ ПРОЦЕДУРУ («MAIN» — ее имя собственное). Если бы мы написали end WINDOW, то выполнение программы у нас началось бы с первой строчки процедуры WINDOW, и ни одна строчка из MAIN выполнена не была бы.
Уф. в общем долго и упорно медитируйте.

#4. Наличие многочисленных директив — это своего рода плата за то, что компилятор избавляет нас от необходимости просчитывать адреса. Как говорит дZенская программерская мудрость «любишь кататься, люби и саночки возить».
Как и в DZEBUG’е, «в TASM’e» мы также должны четко инструктировать компилятор (дабы он в свою очередь также четко проинструктировал процессор) что у нас является кодом, а что — данными.
Посмотрите на исходник. Весь текст программы у нас хранится между директивами CODESG segment и CODESG ends. Где CODESG — это «имя собственное», «segment» — потому что «CODESG» он, собственно, и есть сегмент :), и «ends» — потому что конец сегмента. (сравните с процедурными директивами).
Но тут такой вопрос:
Директива ASSUME производит связывание сегментного решистра CS с «именем собственным».
Далее у нас следует директива org 100h. Нужна она нам для того, чтобы компилятор понял, что мы хотим получить именно COM-файл, который, как известно, помещается в сегмент памяти начиная со смещения 100 (в общем-то, это необходимое, но вовсе не достаточное условие для получения COM-файл). Директивка очень интересная, о ней мы, надеюсь, еще поговорим подробнее, когда коснемся вирмейкерства.

#5. Ладно. с директивами более-менее разобрались, исходник приготовили, пора разбираться че там дальше происходит.
Дальше происходит так называемое «ассемблирование», т.е. перевод команд в соответствующие машинные коды. При этом просчитываются адреса меток, адреса начала подпрограмм, адреса начала/конца сегментов. и многое другое.
Причем ассемблирование происходит как минимум в два приема. Посудите сами: откуда компилятору знать, с какого адреса начнется процедура WINDOW, если не известно, какая еще простыня команд ПОСЛЕ этого CALL’а будет? В DZEBUG’е мы это «в уме на листике» считали.
TASM это тоже аналогичным образом делает :).
При первом проходе он подсчитывает, сколько какая команда занимает места, с каких адресов начинаются процедуры и т. д. и только при втором проходе подставляет в call’ы КОНКРЕТНЫЕ АДРЕСА начала этих процедур. всего лишь. ну еще и ваши «d» и «b» в машинные «h» (которые на самом деле «b») переводит. (во завернул!).
А вообще TASM много еще чего делает. программеры народ ленивый.
В результате ассемблирования мы получаем так называемый «объектный файл».
«И что это за дрянь?» — спросте вы и правильно спросите.
А вы сравните шестнадцатеричное содержимое OBJ и COM файлов. В OBJ присутствует та же последовательность байтов, что и в OBJ. Но помимо этого и еще какая-то шестнадцатеричная ерунда присутствует: имя сассемблированного файла, версия ассемблера, «имя собственное» сегмента и т. д.
Это своего рода «служебная» информация, предназначенная для тех случаев, когда ваш исполнимый файл вы хотите собрать из нескольких. При разработке больших приложений исходный текст, как правило, хранится в нескольких файлах в каждом из них прописаны свои сегменты кода/данных/стека. А исполнимый получить нам нужно только один — с единым сегментом кода/данных/стека. Именно это TLINK и делает: завершает определение адресных ссылок и объединяет, если это требуется, несколько программных модулей в один.
И этот один у нас и является исполнимым. УРА!

#6. Итак, первую прогу с использованием компилятора мы написали. Теперь напишем вторую. Набиваем ее исходный текст, и компилим:

Итак, в этой программе мы использовали функцию 13h прерывания 10h (INT 10h, AH=13h).
Вот ее описание:

[INT 10h, ФУНКЦИЯ 13h] — записывает на экран символьную строку, начиная от указанной позиции.
ВХОДНЫЕ ПАРАМЕТРЫ:
AH = 13h;
AL — код формата(0-3):
AL=0, формат строки <симв., симв. симв.>и курсор не перемещается,
AL=1, формат строки <симв., симв. симв.>и курсор перемещается,
AL=2, формат строки <симв., атр. симв., атр.>и курсор не перемещается,
AL=3, формат строки <симв., атр. симв., атр.>и курсор перемещается;
BH — страница дисплея;
BL — атрибут (для режимов AL=0, AL=1);
CX — длина строки;
DX — позиция курсора для записи строки;
ES:BP — указатель строки.
ВЫХОДНЫЕ ПАРАМЕТРЫ: отсутствуют.

А еще мы использовали команду LEA, которая загружает в регистр адрес (смещение), с которого у нас начинается блок данных.

2.2. Несколько «тупых» процедурок

#1. Дабы сходу «обломать» нездоровую критику, сразу предупреждаем, что нами сознательно допущена некоторая излишняя «процедуризация» исходного кода. А по сему, прежде чем взяться за изучение нижеследующего материала, твердо уясните: в данном случае (как есть сейчас) дробление кода на процедуры — дурь полная. А обосновываем мы эту дурь только тем, что впоследствии будем совершенствовать эти процедуры до уровня, когда, собственно, сие «дробление» и будет обосновано.
И еще. Подобный модульный подход (это понятие немножко шире, чем просто «использование процедур») в некоторых случаях снижает быстродействие и увеличивает размер исполнимого файла, однако он же и значительно увеличивает «читабельность» исходника, что вполне обоснованно с точки зрения обучения. И с точки зрения «командной» разработки программ — тоже. (В общем, критика по этому поводу не принимается!).
Итак, для начала набиваем вот какой текст (исходник это!):

Здесь вам все должно быть понятно. INT 20h вынесен в отдельную процедуру и только. Плюс еще какие-то нездоровые заголовки добавлены, которые и весят-то больше, чем сам код. Это нормально. После точки с запятой в исходнике вы можете писать все, что угодно. Все равно при компиляции это будет проигнорированно и, следовательно, на размер исполнимого файла не повлияет. (Точно так, как и длина «имен собственных» процедур и меток).
Мы предлагаем использовать именно такую «шапку» комментария к каждой из ваших процедур. Все очень просто. Первая строчка — это «что делает процедура». Вторая — какие ей необходимо передать параметры. Третья — какие она возвращает параметры. Четвертая и пятая, соответственно, — какие в процедуре использовались прерывания и хм. ранее написанные процедуры :). Это намного облегчит понимание вашего исходника как вами самими, так и теми, кому вы его предоставите на поругание.
Для тех, кто в танке: последующие процедуры вставляйте между процедурами TESTING и EXIT_COM — не ошибетесь :-p.

#2. Следующая процедура также основана на одном-единственном прерывании. Все, что она делает — это возвращает текущие координаты курсора.

Прежде всего обратите внимание на цепочку push’ей и pop’ов (далее — просто «поп»), на очередность записи в стек (AX, BX, CX) и извлечения (CX, BX, AX — обратное то есть). Все регистры, которые мы собираемся изменять внутри процедуры, должны обязательно сохраняться в ее начале и восстанавливаться в ее конце. В важности соблюдения этого правила вы еще не раз убедитесь на своем горьком опыте. Те, кто медитировал над заданием из главы 1.10 #4, уже знают, о чем тут идет речь (а кто не пытался — самое время!).
Давайте посмотрим на нашу процедуру с точки зрения пушей и поп. AH мы изменяли для указания функции прерывания, которую мы хотим использовать. BH обнуляли для указания видеостраницы (пока будем только одну-единственную, нулевую, юзать). «А CX зачем» — спросите. — «Вроде мы его не трогали. «. И точно, мы — не трогали. А посмотрите в описании, что в этот регистр нам засунуло прерывание в «результате» своего выполнения. Посмотрели? Оно вам надо?? То, что нам надо — координаты — засунуты в DX (DH, DL), поэтому их значения мы не сохраняем. Если бы нам нужно было получить информацию о типе курсора — мы бы запушили DX, а CX бы оставили в покое.
Что? Без пива не разобраться?
Так в чем, черт подери, дело? Разбирайтесь под пиво!!
Вот вам еще одна аналогичная процедура, которая не определяет, а УСТАНАВЛИВАЕТ курсор в заданные коодинаты.

Если кто чего не понимает — смотрите комментарии к предыдущей процедуре (+ описание прерываний и команд! это обязательно!). Если кто не понял и предыдущую — снова отсылаю к главе 1.10

#3. На основе двух предыдущих процедур мы напишем третью «курсорную» :), которая будет сдвигать курсор на одну позицию вправо.

А здесь очень простая идеология :)). Из двух процедур мы собрали третью :)). Вызвали CURSOR_READ, получили в DX текущие координаты курсора. Ту координату, что столбец (DL, младшая часть DX), увеличили на единицу. А потом вызвали процедуру CURSOR_SET, которая у нас устанавливает координаты курсора. Новые координаты в нее передаются опять таки через тот же DX. Улавливаете?
Естественно, мы запросто можем отказаться от процедур CURSOR_SET и CURSOR_READ и решить данную задачу внутри одной процедуры. В общем, свой выбор вы сделаете сами. Страшна Сцилла оптимизации по быстродействию, еще страшнее — Харибда оптимизации по размеру, но тварь самая страшная — это Программер, который оптимизирует свой код по собственной «удобноваримости». (Хм. интересно, что бы сказали по этому поводу программеры Мелкософта. )
Обратите также внимание, на push/pop DX внутри процедуры. Мы просто сдвигаем курсор вправо. ПРОСТО СДВИГАЕМ на одну позицию. То, что в DX нам надо? Сто лет оно нам не надо. херим. А остальные регистры — еще процедурами CURSOR_SET и CURSOR_READ неоднократно «похерены». В каком смысле «похерены»?? А в таком, что состояние регистров ПОСЛЕ вызова CURSOR_RIGHT в точности такое же, как и было ДО. Хотя сами помните, что всю четверку регистров мы еще как юзали.
Вот теперь можно сделать паузу и (это мериканцы пускай свой пластмассовый твикс кушают) ПОМЕДИТИРОВАТЬ.

#4. Следующая процедура ну вааще элементарна:

Она символ на монитор выводит. Через 9-ю функцию 10-го прерывания. А потом (после вывода) курсор на позицию вправо перемещает. Догадайтесь сами, «путем вызова» какой процедуры. Ага, правильно :)), CURSOR_RIGHT.
Посмотрите на описание этого прерывания. Код символа должен быть в AL. А у нас в комментариях он в DL прописан. А перед INT 10h mov AL,DL нездоровый стоит. Нахрена он тут?? И правильно!! Этот mov можно удалить, и передавать значение через AL. Но я тварь вредная. Привык я, понимаете-ли, через DX передавать. привычка — сила страшная!! Лень с ней бороться. Лень, а поэтому и не буду. Кто-то в подобном мове может и более глубокий смысл найдет — наверняка найдет!! В общем — ищите сами. На блюдечке с голубой каемочкой вам это не преподнесу :)). Вредный.
mov BL,00000111b (не 07h) написано специально. Это чтоб вы посмотрели, как кодируется атрибут (фон, цвет) энтого символа. В одном из предыдущих номеров даже табличка есть, из справочника содранная.

#5. В языке «командного интерпретатора DOS» есть хорошая команда — CLS (то бишь очистка дисплея). Хорошая команда! Кто не поленится заглянуть, внутрь command.com’а, увидят приблизительно следующее (на самом деле все чуть-чуть навороченнее, но прерывание то же):

Короче, элементарный скроллинг, только заданы максимально возможные координаты скроллируемого окошка и CX=0. в общем, окошки рисовали, помните.

#6. Тестируем, штоль?? Дописываем процедуру TESTING:

Компилим. CLS тож тестируем. Все работает??

А теперь самое интересное :)) и благоприятно влияющее на нервную систему :). Прелесть модульного подхода вот в чем: написали процедуру, протестировали успешно — и МОЖЕТЕ ЗАБЫТЬ нафиг, как она у вас работает, какие функции там используются, какие хитроПОПые алгоритмы там применены.
Просто смотрите на заголовок, че она делает, чего ей надобно на входе, чего возвращает. а ее «внутренности» вам глубоко фиолетовы. Работает — и ладно. Ааааaaa?? Круто?
Уф. медитируйте!!

2.3. Печать «шестнадцатеричных циферек»

#1. Мы уже неоднократно юзали хорошую мнемоническую (aka ассемблерную) команду ADD :). Напомню, что в результате выполнения команд

в регистр AX у нас помещалась сумма (AX=AX+BX).

Мы смотрели на это дело под отладчиком, и, к своей неописуемой радости, убеждались в том, что эта дрянь действительно работает. Но толку нам знать, что она работает?? Программа ведь не только работать должна, но еще и диалог какой-нить между юзверем и компутером обеспечивать! Например, спрашивать у него эти два числа и выплевавать на монитор результат их сложения.
Вот именно — выводить на монитор, а не заносить в какой-то абстрактный регистр.
С клавиатурным вводом пока обождем, а вот с выводом (на монитор) разберемся прямо сейчас.

Как мы это сделаем? Вы уже неоднократно слышали, что «в ассемблере» все делается «ручками» :). Сейчас вы лишний раз убедитесь в том (некоторые замрут в ужасе), что это утверждение истинно. Для вывода значения регистра мы вовсе не «познакомимся с новым прерыванием». Даже такая простейшая операция, как «вывод на дисплей значения регистра (переменной)» — это целая процедура. И не одна, как вы скоро в этом убедитесь. Страшно?

#2.Задача: вывести на монитор значение регистра DL.
Народ! Давайте сразу расставим границы между КОДОМ СИМВОЛА и его НАЧЕРТАНИЕМ.
Например, у нас F3h в DL. Как мы хотим это вывести? Как символы ‘F3’ или же как ASCII символ, соответствующий коду F3h? Определяемся. Если в DL у нас F3h — то надо чтоб именно ‘F3’ у нас на монитор и выводилась. Не ‘э перевернутое’, не ’46 33′, а именно ‘F3’. Помедитируйте. Уловите разницу между ‘э’, ’46 33′ и ‘F3’.

Эту задачу мы немножко упростим :). Для начала напишем процедуру, которая выводит только младшую тетраду регистра DL (цифру «3» в нашем примере). Для этого мы обратимся к процедуре WRITE_CHAR из прошлого номера. Именно она печатает нам на монитор символ, ASCII-код которого находится в DL.
Но тут загвоздка: в DL-код, а печатается-то символ :). А нам, собственно, именно две циферки шестнадцатеричного кода, как два символа, и нужно напечатать. Ну, или хотя бы младшую циферку этого кода.
Решается эта задача элементарно :). Главное — это правильно ее сформулировать!
Вот что я тут «нарисовал»:

Только во второй колонке вместо вопросительных знаков должны быть соответствующие всякие символы (посмотрите в ASCII-таблице, какие они на вид страшные!).

Процедурка наша вот что должна делать — Всего-навсего перевести (конвертировать) тетраду в код соответствующего ей символа. Завернуто? Если разобраться, то не очень-то и завернуто.
Смотрите: в DL у нас 03h. Хотим мы эту ‘3’ на монитор вывести. Если вызовем WRITE_CHAR, то у нас символ «сердечко» выплюнется. А надо, чтоб символ ‘3’ вывелся, код которого 33h.
Соответственно и для остальных смотри по табличке.

А теперь обратите внимание, насколько «шестнадцатеричная циферка» (тетрада) отличается от ASCII-кода, этой «циферке» соответствующего. Сам скажу: на 30h для цифр от ‘1’ до ‘9’, и на 37h для цифр от ‘A’ до ‘F’. То есть «переконвертацию» мы запросто можем сделать командами add DL,30h (если тетрада в диапазоне 0. 9) и add DL,37h (если тетрада в диапазоне A. F).

Короче, вот код (пропиваю!):

Сначала, ессно, изменяемые регистры сохраняем (мы ж их изменяем!). (Ну, и восстанавливаем в конце процедуры (PUSH и POP соответственно)).
Потом у нас логическое ветвление организовано. Сравниваем значение DL с «общей границей» наших двух диапазонов (команда — CMP, «граница» — 0Ah). Если это значение больше или равно 0Ah, то прыжок на метку HEX_LETTER, прибавление к DL 37h и печать цифры (WRITE_CHAR). Иначе добавляем 30h и безо всяких условий перепрыгиваем на вызов WRITE_CHAR (минуя add DL,37h то бишь).
Все. Тестируем.

#3. Про тестирование — базар отдельный. В данном случае мы можем запросто проверить нашу процедуру на абсолютно всех возможных значениях этой тетрады (всего-то ничего 16 вариантов). Но намного правильнее, проанализировав алгоритм, установить своего рода «критические» значения, на которых целесообразно проводить проверку. Плюс, естественно, минимальное и максимальное значения.

Если сия «тестовая» (она же — главная) процедура выведет на монитор

значит мы с высокой долей вероятности можем быть уверенными, что процедура WRITE_HEX_DIGIT работает правильно на всех значениях младшей тетрады DL.
Кто не просто скопировал процедуру из буфера обмена, а действительно разобрался с тем, как она работает — сами знают, что значение старшей тетрады нашей процедуре НЕбезразлично. Оно должно быть равным 0.

#4. Что мы имеем? Процедуру для вывода на дисплей одной шестнадцатеричной циферки — младшей тетрады (в DL). Но нам-то нужно две вывести! Сначала старшую циферку-тетраду, и только потом — младшую!
Таким образом очередная задача разбивается на две части: печать старшей тетрады DL и печать младшей тетрады DL.
Первая «подзадача» решается легко: нужно просто старшую тетраду переместить на место младшей и вызывать процедуру (основательно протестированную и 99,9%-но работающую) WRITE_HEX_DIGIT.
А вторая подзадача — хм. заключается в восстановлении предыдущего (мы ж тетраду перенесли) значения DL и снова — вызове WRITE_HEX_DIGIT.
(Хе! Вот теперь-то вы уж точно почувствуете всю прелесть «дробления кода на процедуры»!)

Перенос тетрады мы осуществим при помощи команды SHR, которую в умных книжках обзывают как «логический сдвига разрядов операнда вправо». Объясню.
Представьте себе деревянную доску, длинной в 8 бутылок пива и шириной в одну. (В принципе, доску эту можно и в два раза длиннее представить, но тогда на ней надо «DX» написать, мы же пока только «DL» напишем). А еще дурня, у которого на лбу SHR написано. Так вот, если этому придурку стукнуть по хребту, то он слева от доски поставит ПУСТУЮ бутылку, а остальные сдвинет на одну позицию вправо, в результате чего самая правая бутылка, ессно, с доски упадет.
Бутылки, которые сразу стояли, могут быть пустыми или полными, а вот дурень SHR — только пустые ставит. И только слева.

Ну тут и ежу все понятно. Четыре раза дурню по хребту надо дать, чтоб старшая тетрада на место младшей переместилась.
(На самом деле самая правая бутылка перед тем как об землю разбиться, на некоторое время в воздухе зависает, но вы пока этим голову не забивайте).
Реализовывается этот сдвиг вот как:

В DL — наша цепочка битов. (11110011b = F3h, естественно).
В CL заносим «на сколько позиций» нам нашу цепочку сдвинуть.
Ну и SHR — это дурень, который сдвигает вправо, а слева нули дописывает.

#5. Думаете, это все?? Разогнались!! Не все так просто :).
WRITE_HEX_DIGIT у нас требует, чтобы первой тетрадой были только одни нули. Я заострял на этом ваше внимание.
При печати первой тетрады это условие соблюдается. SHR слева нули дописывает.
А вот при печати второй цифры нужно вот что: ничего никуда не сдвигая, обнулить старшую тетраду, а младшую (которая, собственно, и есть «цифра») оставить в покое.
Решим мы эту команду при помощи логической операции «и» (and по-аглицкому).

А теперь и для особо одаренных:

Смотрите, интересно как получается:
Если мы AND чего-либо (нуля или единички) с 0 делаем, то у нас в результате 0 и только 0 получается.
А если AND с единичкой — то ЧТО БЫЛО, ТО И ОСТАЕТСЯ.
(Это и есть потаенный дZенский смысл команды AND)

Решение нашей проблемы (обнулить старшую тетраду, а младшую оставить без изменений) таким образом сводится к тому, что старшую тетраду нужно «AND 0», а младшую — «AND 1».
То есть значению DL с 00001111b (оно же — 0Fh) «AND» сделать.

На ассемблере это вот как выглядеть будет:

Естественно, 00001111b = 0Fh

#6. Уфф. Вот что получиться в итоге должно:

Ну че тут объяснять?? Я уже объяснил все!! Единственное, что могу добавить — это про mov DH,DL. Этой командой мы значение регистра копируем перед тем как биты «ему» сдвинуть. А потом статус-кво mov DL,DH восстанавливаем, чтоб и младшую цифру напечатать.
Все. Тестируем. Вроде должно работать.

#7. Так сказать «к вопросу о шаблонах мышления».
Мы тут доооолго трахались с тетрадами. Вроде успешно.
Когда при тестировании понимаемости материала мы предложили пяти «подопытным» самостоятельно написать процедуру для вывода на монитор «большого» регистра (DX), они все как один начали сдвигать байты. :(
Народ!! Это не есть правильно!!

Команды xchg DL,DH и xchg DH,DL, кстати, работают абсолютно одинаково. Операнды просто меняются между собой значениями. В качестве одного из операндов может выступать память.

#8. Ну, и напоследок, — информация к размышлению:

Команду shr можно использовать для деления целочисленных операндов без знака на степени 2 :)).

Думаете эти «фокусники» который в уме офигенны уравнения считать умеют, шибко умные?? Нифига!! Они просто люди ЗНАЮЩИЕ. А делить на десять и вы умеете.
Над этим я настоятельно рекомендую дооооолго помедитировать. А еще над тем, что девушки весьма и весьма любят, когда им фокусы показывают. Впрочем, это (вычисления в уме) — тема отдельная. Мы ее тоже когда-нить коснемся :). MATRIX MUST DIE!!

2.4. Печать десятичных циферек

#1. Для тех, кто медитировал над главой 1.1 алгоритм должен быть понятен как 2+2=(вписать желаемое). Кто не въедит в алгоритм WRITE_DECIMAL — научитесь сначала переводить числа между радиксами на листике в клеточку.
Итак, ставим новую задачу. В DX у нас шестнадцатеричное число. Нам нужно напечатать его на монитор в «десятичном формате». Еще раз обращаю ваше внимание на то, что существует множество способов ее решения. Мы же выбрали способ, который:
а). Вам легче всего будет понять.
б). Требует минимального количества «новых» команд.
Кто скажет, что мы не правы — пусть первый кинет камень в эхо-конференцию RTFM_Helpers.

#2. Прежде всего посмотрите на процедуру WRITE_HEX_DIGIT и вспомните, какой алгоритм положен в основу ее работы. Вспомнили? Рад за вас!!
А теперь мы познакомимся к командой деления. Что будем делить?? Ну естественно, «регистры» :).

Новая команда называется «деление беззнаковое» (DIVide unsigned).
Что такое делимое/делитель/частное, я вас грузить не буду, это в учебнике арифметики для младших классов более чем понятно расжевано. Ну во всяком случае детишки это понимают.
(Кто скажет, что 10/3=3 а остаток 333 в периоде — тот дурак. Кто скажет, что остаток будет равен 1, скажет правильно.)

Следующий кусок кода демонстрирует деление значения регистра AX на значение регистра BL.

Обратите внимание: ДЕЛИМОЕ у нас может располагаться только в регистре AX (другими словами, делимое задается неявно), а ДЕЛИТЕЛЬ — в любом регистре.
Кто не верит — посмотрите под отладчиком.

1. Если делитель размером в байт, то после операции частное помещается в AL, а остаток — в AH.
2. Если делитель размером в слово, то делимое должно быть расположено в паре регистров DX:AX (младшая часть делимого в AX). После операции частное помещается в AX, а остаток — в DX.
2. Если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров EDX:EAX (младшая часть делимого находится в EAX.) После операции частное помещается в EAX, а остаток — в EDX.

Внимание, подводный камень! В следующем примере:

у вас вовсе не AX на BX делиться будет, а парочка DX:AX на BX.
Помедитируйте над этим :))

#3. А теперь, собственно, пропиваю саму процедуру вместа с традиционным расжевыванием оной:

Алгоритм простой: пока частное не равно 0, делим его, делим и еще раз делим на 10d, запихивая остатки в стек. Потом — извлекаем из стека. Вот и вся «конвертация» из HEX в BIN :). Это если в двух словах.
А если подробно, то вот что получается:
Бряк 1 — подготавливаем делимое. Как уже говорилось, оно у нас задается неявно — обязательно через AX. А параметр у нас — через DX процедуре передается. Вот и перемещаем.
Бряк 2 — это, собственно, делитель.
Бряк 3 — очищаем CX. Он у нас будет в качестве счетчика. О нем мы еще поговорим.
Бряк 4 — очищаем DX. Если не очистим, то мы не 1234h какое-нить на 10 делить будем, а 12341234h. Первое 1234 нам надо? Вот и я говорю — очищаем!
Бряк 5 — делим! Частное — в AX, остаток — в DX.
Бряк 6 — заносим остаток (DX) в стек ;).
Бряк 7 — CX=CX+1. Это мы считаем сколько раз «щемили остаток», который «щемится», по кругу (прыжок на метку non_zero), пока AX не равно 0 (бряк 8). То есть делим, делим AX, пока он не окажется, что делить, собственно, нечего.
Так-с. Деление закончено, число раз, которое мы поделили AX до его полного обнуления, хранится в CX.
Дальше все просто. Нам нужно такое же количество раз (CX) извлечь значение (DX) из стека. И это будет «HEX», переведенный в DEC. (Оно же: число в двоично коде, разобранное на последовательность десятичных цифр).
Помните, как у нас организуется цикл? Через loop и CX?
Если бы в качестве счетчика мы использовали какой-нибудь другой регистр, то пришлось бы извращаться со всякими метками и прыжками. а так все просто, все продуманно :). Цикл, в теле которого ИЗВЛЕЧЬ ЦИФЕРКУ (бряк 9) и НАПЕЧАТАТЬ ЦИФЕРКУ (бряк 10). Столько же раз, сколько мы и делили наше исходное шестнадцатеричное число.

Для тех, кто не понял: бряк — это брекпоинт. Для тех, кто еще не знает, что такое брекпоинт — ищите объяснение в ‘DZebug. Руководство юZверя’

Двое из десяти «подопытных» чайников (есть такие) возмутились:
В DX же только четыре циферки влазят!
Ага! Аж два раза четыре!

Как видите, туда еще и две буковки «влазят» ;)
А то и все четыре, если кавычки считать.

2.5. Hello, world! или Изврат-2

#1. Мы уже писали программу «Hello, World!» с использованием 13-й функции 10 прерывания. Посмотрите на ее исходник.
Сегодня мы слабаем еще одно «Hello, World!», но уже несолько другим способом. Какой из этих способов более дZенский — решайте сами ;).
Для начала мы создадим блок данных после всех-всех-всех процедур но между директивами начала и конца сегмента.
Блок данных будет выглядеть следующим образом:

Вы должны спросить «А почему мы хотим напечатать Hello, World-2, а в конце строки у нас 2$? $ — это что? World за баксы продавать, штоль?? Да ну вас.
Эту строчку мы будем выводить на монитор особым дZенским способом — посимвольно. То есть: возьмем первый символ из блока данных, выведем, потом второй и т. д. аналогично пока не встретим символ ‘$’.

Опять-таки, это если в двух словах. Но ведь наверняка вам этого покажется мало ;).

«Щемить» символы мы будем двумя способами. (Тут я хотел было написать «неправильным» и «правильным», но потом передумал и решил обозвать их «первым» и «вторым»).
В алгоритм первого способа вы и сами без труда въедете (я только «рабочую часть» приведу, пуши с попами сами проставляйте):

#2. А вот второй способ немножко навороченнее :). Чтобы в нем разобраться, мы сначала познакомимся со следующей группой команд: LODSB, LODSW, LODSD
Их назначение — это загрузка элемента из последовательности (строки, цепочки) в регистр-аккумулятор al/ax/eax.
Для тех, кто не понял — наша строчка «Hello, World-2$» как раз и является «последовательностью/строкой/цепочкой» из элементов размером в байт.
Адрес цепочки передается через ds:esi/si, сами «элементы» (фиксированной ширины) возвращаются в al (байт, команда LODSB), ax (слово, команда LODSW) или eax (двойное слово, команда LODSD). В общем, последние буковки команд как раз и указывают на размерность элемента: [B]yte, [W]ord, [D]ouble word. Т. е. размер мы определяем неявно.
После выполнения одной из этих команд значение регистра si изменяется на величину, равную длине элемента, но. хм.

Пришло время еще одну большую тайну познать, братья. В справочнике Юрова написано, «знак этой величины зависит от состояния флага df:
df=0 — значение положительное, то есть просмотр от начала цепочки к ее концу;
df=1 — значение отрицательное, то есть просмотр от конца цепочки к ее началу.»
Обидно, да? Флаги-то мы с вами еще не расколупали. Чего-ж дальше-то делать, а?

Как что? «Пропивать» стандартную процедуру и колупать ее, колупать, колупать, ногами ее, ногами, и по морде, по морде, по морде.

Итак, что делает команда lodsb, вы уже поняли. А вот с df=0/df=1 пока что непонятки.
Будем разбираться.

Нам нужно, чтобы «просмотр цепочки» осуществлялся командой lodsb слева направа, для этого нужно установить значение df=0. Делаем мы это при помощи команды cld (бряк 2).
Если нам нужно, чтобы «просмотр цепочки» осуществлялся справа налево, мы используем команду std. (Можете попробовать. Ерунда получится.)

А теперь вспомним «золотое правило». Все регистры, которые мы изменяли ВНУТРИ процедуры, «на выходе» должны восстанавливать свои ПРЕДЫДУЩИЕ значения (кроме тех регистров, через которые мы возвращаем РЕЗУЛЬТАТ).
Так вот: то же самое касается и флагов, которые мы изменяем.
Для регистров мы использовали команды PUSH и POP. Для регистра флагов (изменять у которого мы можем только БИТЫ) используются команды pushf (записать в стек значения флагов, бряк 1) и popf (извлечь из стека, бряк 10).

ПРИМЕЧАНИЕ: Это несколько вольное положение (хотя, вобщем-то, верное). Видимо, здесь следует хотя бы добавить, что сохранять/восстанавливать флаги нужно при изменении специальных флагов (if, df). (С) Хемуль

Теперь колупаем дальше. (С) Serrgio

Бряк 3. Мне удобнее передавать данные «в процедуру» через регистр DX, о чем и написано в заголовке. А lodsb (бряк 4) хотит, чтоб адрес ему в SI подавали. Удовлетворим его желание :)
Бряк 4. После выполнения этой команды ASCII-код первого символа «цепочки» «Hello, World-2$» помещается в AL, а значение регистра SI увеличивается на 1 и указывает теперь на второй элемент цепочки (символ ‘e’).
Бряк 7. Удовлетворяем «пожелания» процедуры write_char. Из AL переносим в DL и печатаем (бряк 9), write_char’ом.

Тэкс. Мы пропустили бряки 5 и 6-й.
Смотрите: на бряке 9 мы «безусловно» зацикливаем «извлечение» и печать элементов цепочки. Безусловно — это значит до потери пульса. Чтоб этого не произошло, каждый из элементов цепочки мы сравниваем с символом-конца-цепочки (в нашем случае это ‘$’, но можно использовать и любой другой). Если текущий символ равен символу-конца-цепочки, то выпрыгиваем (бряк 6) из этого безусловного цикла, восстанавливаем статус-кво (бряк 10) и все на этом.

Напечаталось то, что надо?
Если true — читайте дальше.
Если false — расколупывайте и медитируйте до полного просветления.

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