Dos fn 2ch дать время dos


Содержание

Ассемблер

Прерывание 21h: функции DOS для работы с буфером клавиатуры

Различные служебные функции DOS для работы с буфером клавиатуры (функции 01h, 06h, 07h, 08h, 0Ah, 0Bh и 0Ch) классифицируются прежде всего по трем критериям: ожидают ли они ввода или же, когда символ не получен, сообщают, что ввода нет; выдают ли они на экран дисплея эхо (введенный символ); и реагирует ли функция на ввод стандартного символа прерывания во время ее исполнения. (Напомним, что нажатие комбинации клавиш Ctrl-Break или Ctrl-C рассматривается как прерывание ограниченным числом стандартных функций DOS. Однако, начиная с версии 2.00, в DOS введена команда BREAK ON, которая дает указание DOS реагировать на ввод символа прерывания при всех обстоятельствах.)

Все функции ввода с клавиатуры получают введенный символ из буфера клавиатуры, размещенного в памяти компьютера, а не непосредственно из порта 60h интерфейса клавиатуры (из порта 60h скан-коды считываются прерыванием 09h, переводятся в коды символов и помещаются в буфер клавиатуры).

Функция 1 прерывания 21h: ввод символа с эхопечатью

Функция 01h ждет появления символа в буфере клавиатуры со стандартного устройства ввода и после приема символа помещает его в регистр AL. Другие функции, относящиеся к вводу символов с клавиатуры: 06h, 07h и 08h.

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

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

Обычно функция 01h применяется для проверки принадлежности символа, соответствующего нажатой клавише, коду ASCII. Для этого производится проверка регистра AL. Если AL не равно 00h, то это символ кода ASCII. Если же AL=00h, то вы имеете дело с символом, не относящимся к коду ASCII; в этом случае следует повторить обращение к данной функции для получения псевдокода, соответствующего специальному действию клавиши. Как и в случае применения других средств DOS, предназначенных для ввода символов с клавиатуры, при использовании данной функции развернутый код символов набора ASCII оказывается недоступным, даже если соответствующие средства обслуживания клавиатуры системы ROM BIOS позволяют осуществить доступ к нему.

Функция 6 прерывания 21h: непосредственный ввод

и вывод с консоли

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

При реализации данной функции регистр AL используется для ввода, а регистр DL — для вывода. Если при вызове функции 06h в регистре DL находится значение FFh (в десятичной нотации 255), то при нажатии какой-либо клавиши эта функция поместит соответствующий ASCII-код в регистр AL и сбросит нулевой флаг; при отсутствии нажатия клавиши она установит нулевой флаг.

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

Функция 06h не ожидает ввода символа с клавиатуры и не осуществляет его эхопечати на экране. Кроме того, функция 06h не воспринимает сочетание клавиш Ctrl-C как прерывание программы (при использовании данного сочетания она помещает в регистр AL значение 03h, т.е. соответствующий данному значению ASCII-код).

Функция 7 прерывания 21h: непосредственный ввод

с консоли без эхопечати

Функция 07h ожидает ввода символа со стандартного устройства ввода и после ввода символа помещает его в регистр AL. Она не осуществляет эхопечати символа на экране и не воспринимает сочетание клавиш Ctrl-C как прерывание программы.

Функция 07h действует точно так же, как функция 01h: нажатие клавиши, относящейся к коду ASCII, приводит к немедленному занесению в регистр AL соответствующего байта; нажатие клавиши, не относящейся к коду ASCII, приводит к формированию двух байтов, которые могут быть получены двумя последовательными обращениями к функции 07h.

Функция 8 прерывания 21h:

ввод с консоли без эхопечати

Функция 08h ожидает ввода символа, не осуществляя эхопечати и прерывает программу при нажатии Ctrl-C.

Эта функция идентична функции 01h, за исключением того, что она не выводит введенный символ на экран дисплея (или стандартное устройство вывода).

Для более полного понимания особенностей данной функции обратитесь к описанию функции 01h. Сравните данную функцию с функциями 01h, 06h и 07h. Если вы хотите использовать функцию 08h, но не желаете ждать ввода символа, изучите функцию 0Bh, которая сообщает о готовности ввода. Изучите также функцию 0Ch, которая является модификацией данной функции.

Dos fn 2ch: дать время dos

, Fn+ё, — там изображена кнопка play/pause] — функциональная клавиша мультимедийного софта. Запускает и приостанавливает воспроизведение медиаплеера (если поддерживается ОС и если корректно настроено) Работает и в Windows 7 и в Ubuntu 16.04 (доп. драйверов не требует)
Fn+F1 — включение/отключение тачпада. Работает и в Windows 7 и в Ubuntu 16.04 (доп. драйверов не требует)
Fn+F2 — включение/отключение основного экрана ноутбука Работает и в Windows 7 и в Ubuntu 16.04 (доп. драйверов не требует)
Fn+F3 — выключить звук в ОС Работает и в Windows 7 и в Ubuntu 16.04 (доп. драйверов не требует)
Fn+F4 — регулировка подсветки клавиатуры (6 уровней яркости клавиш + полное отключение подсветки, каждое нажатие комбинации Fn+F4 выполняет переключение яркости на следующий режим). Работает нативно, в т.ч. под DOS.
Fn+F5 — уменьшить громкость в ОС Работает и в Windows 7 и в Ubuntu 16.04 (доп. драйверов не требует)
Fn+F6 — увеличить громкость в ОС Работает и в Windows 7 и в Ubuntu 16.04 (доп. драйверов не требует)
Fn+F7 — переключить вывод с основного экрана ноутбука на HDMI (возможны затыки — мною не проверялось, т.к. не на чём пока проверить)
Fn+F8 — уменьшение яркости основного экрана ноутбука Работает и в Windows 7 и в Ubuntu 16.04 (требуется только установка драйверов от производителя, в случае с Linux — см. ниже по шапке темы в разделе про поддерживаемые ОС)
Fn+F9 — увеличение яркости основного экрана ноутбука Работает и в Windows 7 и в Ubuntu 16.04 (требуется только установка драйверов от производителя, в случае с Linux — см. ниже по шапке темы в разделе про поддерживаемые ОС)
Fn+F10 — включение/выключение (аппаратное) встроенной веб-камеры Работает и в Windows 7 и в Ubuntu 16.04 (доп. драйверов не требует). В Windows7 камера пропадает в диспетчере устройств, в Ubuntu — перестает обнаруживаться в системе, будто выдернули из USB-порта
Fn+F11 — режим «полет» Нет эффекта от нажатия в Windows 7 и в Ubuntu 16.04 (требуется «допиливание», установка софта от производителя)
Fn+F12 — режим гибернации (ноутбук уходит в спящий режим). Работает и в Windows 7 и в Ubuntu 16.04 (доп. драйверов не требует)
Fn+Ins = ScrollLock (аналогичная клавиша есть на полноразмерной клавиатуре полноразмерного ПК) Работает и в Windows 7 и в Ubuntu 16.04 (доп. драйверов не требует)
Fn+PgUp= Pause (аналогичная клавиша есть на полноразмерной клавиатуре полноразмерного ПК). Архаизм. В некоторых играх — постановка на паузу игрового процесса. Работает нативно. Pause+[windows_logo]=диалог свойств о системе в Windows, к примеру. Работает и в Windows 7 и в Ubuntu 16.04 (доп. драйверов не требует)
Fn+PgDn = Break (аналогичная клавиша есть на полноразмерной клавиатуре полноразмерного ПК). Архаизм. Полезна для консольных приложений — посылает прерывание текущему процессу. Реагировать или нет — зависит уже от процесса. Работает и в Windows 7 и в Ubuntu 16.04 (доп. драйверов не требует)
По поводу хоткеев в Windows 7. Порылся на просторах интернета, и нарыл софтину стороннего производителя (305,7 МБ!), которая привела к работоспособности всех комбинаций с Fn и даже к их корректной индикации.

Dos fn 2ch: дать время dos

Связь с администрацией сайта:

Среди толпы я одинок

  • Вы здесь:
  • Home >
  • Блог >
  • Документация и курсы >
  • Самоучитель по ассемблеру >
  • Глава 18 — практика: работа с файлами, перехват и восстановление прерываний

Глава 18 — практика: работа с файлами, перехват и восстановление прерываний

  • Written by Administrator
  • Tagged under АссемблерAssemblerСамоучитель по ассемблеру
  • Print

Замечание! Это пожалуй самая большая глава! информация представленная в ней в принципе довольно важна! К сожалению при работе в NT/Windows 2000/XP вам не удастся опробовать пример! Тут нужен чистый DOS, или хотя бы Win9x! Я например воспользуюсь эмулятором!

Работа с файлами через описатели

Если программы, написанные на языках высокого уровня могут открыть файл без выполнения подготовительных действий (они выполняются автоматически), то ассемблерные программы должны создать специальные области данных, которые используются при операциях ввода/вывода. Используется два метода доступа к файлам: метод управляющего блока файла (FCB) и метод дескриптора файла. С помощью метода FCB можно получить доступ только к файлам, находящимся в текущем каталоге. Метод дескриптора файла позволяет получить доступ к любому файлу, независимо от того, какой каталог является текущим.
Начиная с DOS версии 2.0, в набор функций прерывания 21h включе-ны UNIX-подобные файловые функции. Идея их состоит в том, что, когда программа открывает файл, DOS возвращает 16-битовое значение «описателя файла» (дескриптора файла) (handle). После этого, когда программа читает, позиционирует, пишет или закрывает файл, она ссылаетесь на него через описатель. Одно из самых больших удобств – то, что можно обращаться к некоторым устройствам так, как будто это дисковые файлы, через зарезервированные описатели DOS:

Ниже приведен перечень наиболее часто используемых функций пре-рывания 21h для работы с файлами через описатели.
Функция 3cH
Создать файл.
Вход. AH=3ch
DS:DX=адрес строки ASCIIZ с именем файла
CX=атрибут файла
Выход. AX=код ошибки, если CF установлен и описатель файла,
если ошибки нет.
Описание. Файл создается в указанном (или умалчиваемом) оглав-лении и открывается в режиме доступа «чтение/запись». Если файл уже существует, то при открытии файл усекается до нулевой длины. Если атрибут файла – «только чтение», открытие отвергается (атрибут можно изменить функцией 43H).
Функция 5bH
Создать новый файл (не должен существовать).
Вход. AH=5bh
DS:DX=адрес строки ASCIIZ с именем файла
CX=атрибут файла
Выход. AX=код ошибки, если CF установлен и описатель файла,
если ошибки нет
Описание. Этот вызов идентичен функции 3ch, с тем исключением, что он вернет ошибку, если файл с заданным именем уже существует.
Функция 5aH
Создать уникальный файл.
Вход. AH=5ah
DS:DX=адрес строки ASCIIZ с путем (заканчивается \)
CX=атрибут файла
Выход. AX=код ошибки, если CF установлен и описатель файла,
если ошибки нет
DS:DX (не изменяется) становится полным
ASCIIZ-именем нового файла.
Описание. Открывает (создает) файл с уникальным именем в оглав-лении, указанном строкой ASCIIZ, на которую указывает DS:DX. Описа-ние пути должно быть готово к присоединению в его конец имени файла. Необходимо обеспечить минимум 12 байт в конце строки. После возврата строка DS:DX будет дополнена именем файла. DOS создает имя файла из шестнадцатеричных цифр, получаемых из текущих даты и времени. Ес-ли имя файла уже существует, DOS продолжает создавать новые имена, пока не получит уникальное имя.
Функция 3dH
Открыть файл.
Вход. AH=3dh
DS:DX=адрес строки ASCIIZ с именем файла
AL=режим открытия
Выход. AX=код ошибки, если CF установлен и описатель файла,
если ошибки нет
Описание. В момент открытия файл должен существовать. Файл открывается в выбранном режиме доступа (AL = 0 – для чтения; AL = 1 – для записи; AL = 2 – для чтения и записи) и указатель «чтения/записи» ус-танавливается в 0.
Функция 3eH
Закрыть файл.
Вход. AH=3eh
BX=описатель файла
Выход. AX= код ошибки, если CF установлен
Описание. BX содержит описатель файла (handle), возвращенный при открытии. Файл, представленный этим описателем, закрывается, его буфер сбрасываются, а оглавление обновляется корректными размером, временем и датой.
Функция 41H
Удалить файл.
Вход. AH=41h
DS:DX=адрес строки ASCIIZ с именем файла
Выход. AX=код ошибки, если CF установлен
Описание. Имя файла не может содержать обобщенные символы («?» и «*»). Файл удаляется из заданного оглавления заданного диска. Если файл имеет атрибут только чтение, то перед удалением необходимо изме-нить этот атрибут через функцию 43H.
Функция 42H
Установить указатель чтения/записи (можно также узнать размер файла).
Вход. AH=42h
BX=описатель файла
CX:DX=смещение указателя: (CX * 65536) + DX
AL=0 переместить к началу файла + CX:DX
AL=1 переместить к текущей позиции + CX:DX
AL=2 переместить к концу файла — CX:DX
Выход. AX=код ошибки, если CF установлен
DX:AX=новая позиция указателя файла (если нет
ошибки)
Описание. Перемещает логический указатель чтения/записи к нужному адресу, с которого начнется очередная операция чтения или за-писи. Вызов с AL=2, CX=0, DX=0 возвращает длину файла в DX:AX. DX здесь старшее значащее слово: действительная длина (DX * 65536) + AX.
Функция 3fH
Читать из файла/устройства.
Вход. AH=3fh
BX=описатель файла
DS:DX=адрес буфера для чтения данных
CX=число считываемых байт
Выход. AX=код ошибки, если CF установлен
AX=число действительно прочитанных байт
Описание. CX байт данных считываются из файла или устройства с описателем, указанным в BX. Данные читаются с текущей позиции указателя чтения/записи файла и помещаются в буфер вызывающей програм-мы, адресуемый через DS:DX.
Всегда необходимо сравнивать возвращаемое значение AX (число прочитанных байт) с CX (запрошенное число байт):
1) если AX=CX, (и CF сброшен) – чтение было корректным без ошибок;
2) если AX=0 – достигнут конец файла (EOF);
3) если AX
Функция 40H
Писать в файл/устройство.
Вход. AH=40h
BX=описатель файла
DS:DX=адрес буфера, содержащего данные
CX=число записываемых байт
Выход. AX=код ошибки, если CF установлен
AX=число действительно записанных байт
Описание. CX байт данных записывается в файл или на устройство с описателем, заданным в BX. Данные берутся из буфера, адресуемого через DS:DX и записываются, начиная с текущей позиции указателя чтения/записи файла. Необходимо всегда сравнивать возвращаемое значение AX (число записанных байт) с CX (запрошенное число байт для записи): если AX = CX, запись была успешной; если AX
Некоторые функции в качестве параметра используют атрибут файла. Атрибут — это один байт битовых флагов, связанный с каждым файлом и находящийся в элементе оглавления для файла. В атрибуте определены следующие биты:
x x A D V S H R
R- только чтение (нельзя обновлять или удалять);
H- скрытый;
S- системный;
V- метка тома;
D- элемент подоглавления;
A- архивный;
x- не используются.
ASCIIZ строка, содержащая имя файла, имеет вид:

«‘d:\путь\имя_файла’,0»

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

;Создание файла
MOV AH,3CH
MOV CX,0
LEA DX,BUF ;DS:DX – адрес ASCIIZ строки с именем
INT 21H
JC NO_CREATE ;Проверка флага переноса
. . . ;Работа с файлом
NO_CREATE:
. . .
BUF DB ‘d:\Users\1.txt’,0

Работа с файлами через DTA

Как было сказано ранее, используются два метода доступа к файлу: метод управляющего блока файла (FCB) и метод дескриптора файла. В любом случае программа при работе с файлами должна указывать место в памяти, куда будут помещаться принимаемые данные или откуда будут извлекаться выводимые. Обычно временный буфер устанавливается раз-мером в одну запись и бывает удобно описать его как строковую переменную в сегменте данных.
Буфер, используемый методом FCB доступа к файлам, называется областью обмена с диском или DTA. На этот буфер указывает условный указатель, который хранится операционной системой и который может быть изменен программой. В документации этот указатель на DTA часто сам называют DTA. Указатель на DTA устанавливается специальной функцией DOS и после того как он установлен все функции чтения/записи автоматически обращаются к нему. Это означает, что сами функции не должны содержать адрес временного буфера.
Для установки указателя на DTA используется функцию 1AH прерывания 21H (DS:DX должны указывать на первый байт DTA). Функция 2FH прерывания 21H сообщает текущую установку указателя DTA (при возврате ES:BX содержат сегмент и смещение DTA).
Префикс программного сегмента PSP обеспечивает каждую программу 128-байтным встроенным DTA, начиная со смещения 80H и до 9FH. Программа может использовать его при нехватке памяти. Первоначально указатель на DTA указывает именно на этот буфер, поэтому если программа будет использовать его, то нет нужды устанавливать указатель. Этот буфер по умолчанию особенно удобно использовать с COM файлами, где DS указывает на начало префикса программного сегмента. Для файлов EXE может потребоваться небольшой добавочный код, чтобы использовать DTA по умолчанию.

Примечание: после извлечения года к нему необходимо прибавить 1980.
Существует ряд функций для работы с файлами, используя DTA. Наиболее употребимые из них приведены ниже.
Функция 1ah
Установить адрес DTA.
Вход. AH=1aH
DS:DX=адрес для DTA
Выход. Нет
Описание. Устанавливает адрес DTA.
Функция 2fh
Дать текущий DTA.
Вход. AH=2fH
Выход. ES:BX=адрес для DTA
Описание. Возвращает адрес начала области ввода-вывода (DTA). Поскольку DTA глобальна для всех процессов, в рекурсивной процедуре (например, при проходе по дереву оглавления) может потребоваться со-хранить адрес DTA, а впоследствии восстановить его посредством функ-ции 1aH.
Функция 4eh
Найти 1-й совпадающий файл.
Вход. AH=4eH
DS:DX=адрес строки ASCIIZ с именем файла
CX=атрибут файла для сравнения
Выход. AX=код ошибки, если CF установлен
DTA=заполнена данными (если не было ошибки)
Описание. DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они подразумевают-ся по умолчанию. Обобщенные символы * и ? допускаются в имени файла и расширении. DOS находит имя первого файла в оглавлении, которое совпадает с заданным именем и атрибутом, и помещает найденное имя и другую информацию в DTA.
Функция 4fh
Найти следующий совпадающий файл.
Вход. AH=4fH
DS:DX= адрес данных, возвращенных предыдущей 4eH.
Выход. AX=код ошибки, если CF установлен
DTA=заполнена данными (если не было ошибки)
Описание. DS:DX указывает на 2bH-байтовый буфер с информаци-ей, возвращенной функцией 4eH (либо DTA, либо буфер, скопированный из DTA).Необходимо использовать эту функцию после вызова 4eH. Сле-дующее имя файла, совпадающее по обобщенному имени и атрибуту фай-ла, копируется в буфер по адресу DS:DX вместе с другой информацией (см. функцию 4eH о структуре файловой информации в буфере, заполняе-мом DOS).
Ниже приведен фрагмент программы, иллюстрирующий организацию поиска файлов в текущем каталоге.

;Установить адрес DTA
MOV AH,01AH
LEA DX,FDTA
INT 21H
. . .
;Наити первый совпадающий файл
MOV AH,4EH
LEA DX,MASKA
MOV CX,10H
INT 21H
JC EXIT
NEXT:
. . .
;Найти следующий совпадающий файл
MOV AH,4FH
MOV CX,10H
LEA DX,MASKA
INT 21H
JNC NEXT
EXIT:
. . .
;========== DTA =========
FDTA DB 15H DUP (?)
FATTR DB ?
FTIME DW ?
FDATA DW ?
FSIZE DD ?
FNAME DB 0DH DUP (‘$’)
;========================
MASKA DB ‘*.*’,0

Структура PSP

Префикс программного сегмента PSP (Program Segment Prefics) – специальная область оперативной памяти размером 256 (100h) байт. PSP может использоваться в программе для определения имен файлов и пара-метров из командной строки, введенной при запуске программы на выпол-нение, объема доступной памяти, переменных окружения системы и так далее. После загрузки программы в память сегментные регистры DS и ES указывают на начало PSP этой программы.

Окружение DOS

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

имя_1=значение_1«0»
имя_2=значение_2«0»
. . .
имя_N=значение_N«0»
«0»
«xxxx»
EXEC_string_1«0»
. . .
EXEC_string_NN«0»
«0»

Здесь «0» — это символ ASCII NUL (00H), а «xxxx» — 16-битовое дво-ичное значение (количество дополнительных строк).
Окружение не превышает 32K байт и начинается на границе парагра-фа. Смещение 2cH в PSP текущей программы содержит номер параграфа окружения. Используя окружение, можно найти нужное имя’ серией срав-нений строк ASCIIZ, пока не достигнута пустая строка (нулевой длины), что указывает конец окружения.
В последних версиях DOS, за концом официального окружения по-мещается дополнительная строка, которая содержит диск и путь, с которых была загружена программа. Вслед за последней строкой ASCIIZ окруже-ния находится нулевой байт, указывающий конец официального окруже-ния. Следующие два байта содержат 16-битовый двоичный счетчик допол-нительных строк (обычно 0001H). Вслед за значением счетчика находится строка ASCIIZ, содержащая путь и имя файла. Это в точности та строка, которая использовалась функцией DOS 4bH (EXEC) для загрузки и запуска программы.

Работа с прерываниями

Иногда необходимо выполнить одну из набора специальных проце-дур, если в системе или в программе возникают определенные условия, например, нажата клавиша на клавиатуре. Действие, стимулирующее вы-полнение одной из таких процедур, называется прерыванием. Существует два общих класса прерываний: внутренние и внешние. Первые иницииру-ются состоянием ЦП или командой, а вторые — сигналом, подаваемым от других компонентов системы.
Переход к процедуре прерывания осуществляется из любой програм-мы, а после выполнения процедуры прерывания обязательно происходит возврат в прерванную программу. Перед обращением к процедуре преры-вания должно быть сохранено состояние всех регистров и флагов, исполь-зуемых процедурой прерывания, а после окончания прерывания эти реги-стры должны быть восстановлены.
Последовательность прерывания состоит в следующем:
1) текущее значение регистра Flags включается в стек;
2) текущее значение регистра CS включается в стек;
3) текущее значение регистра IP включается в стек;
4) сбрасываются флаги IF и TF.
Новое содержимое IP и CS определяет начальный адрес выполняемой процедуры прерывания (обслуживание прерывания). Возврат в прерван-ную программу осуществляется командой, которая извлекает из стека со-держимое для IP, CS и регистра флагов (обычно это команда IRET).
Адреса подпрограмм обслуживания прерываний (вектора прерыва-ний) хранятся в таблице векторов прерываний. Таблица векторов прерыва-ний располагается по адресу 0000:0000 и представляет собой массив из 256 элементов, каждый элемент которого занимает 4 байта и представ-ляет собой начальный адрес процедуры обработки прерывания.
Иногда в программе возникает необходимость переопределения (пе-рехвата) прерываний (например, выполнение дополнительных действий при нажатии определенной клавиши клавиатуры). Процесс перехвата пре-рываний состоит в следующем:
1) подготавливается FAR-процедура – новый обработчик прерыва-ний (должна заканчиваться командой IRET);
2) сохраняется старый вектор прерывания (функция 35h прерывания 21h)
3) адрес нового обработчика заносится в таблицу векторов прерыва-ний (функция 25h прерывания 21h);
4) в конце программы происходит восстановление первоначального обработчика прерываний.
Функция 35h
Вход. AH=35H
AL=номер прерывания (00H до 0ffH)
Выход. ES:BX=адрес обработчика прерывания
Описание. Возвращает значение вектора прерывания для INT (AL),
то есть загружает в BX 0000:[AL*4], а в ES –
0000:[(AL*4)+2].
Функция 25h
Вход. AH=25H
AL=номер прерывания (00H до 0ffH)
DS:DX=вектор прерывания (адрес подпрограммы)
Выход. Нет
Описание. Устанавливает значение элемента таблицы векторов прерываний для прерывания с номером AL равным DS:DX. Это равно-сильно записи 4-байтового адреса в 0000:(AL*4), но, в отличие от прямой записи, в момент записи прерывания будут заблокированы.

Разбор практической программы

Задание: Создать текстовый файл «Dir.Txt», содержащий перечень файлов в текущем каталоге. Написать программу переопределения прерывания 05h (клавиша Print Screen).
Примечание:
1) файл «Dir.txt» можно создавать через описатели;
2) получение пути по которому была запущена программа (первая строка в файле «Dir.Txt») можно осуществить, используя окружение DOS. Для этого, во-первых, необходимо получить адрес PSP (функция 062H прерывания 21H), во-вторых, найти в нем адрес окружения DOS. В-третьих, получив из окружения DOS строку, содержащую путь и имя за-пущенного файла, выделить из нее путь к текущему каталогу;
3) на следующем этапе производится поиск первого совпадающего с маской «*.*» файла и его имя записывается в файл «Dir.Txt». Перед на-чалом поиска необходимо правильно установить атрибут файла в CX для сравнения. Далее производится поиск следующего совпадающего с маской файла, используя функцию 04FH прерывания 21H. Если такой файл най-ден, то его имя записывается в «Dir.Txt», иначе осуществляется выход из программы;
4) перед загрузкой нового вектора прерывания необходимо сохранить старый вектор (функция 35h прерывания 21h);
5) новый обработчик прерывания должен быть FAR-процедурой;
6) для проверки, новая процедура обработки прерывания 05h должна выводить в динамик сигнал (прерывание 21H). В основной программе не-обходимо организовать большой цикл, например, выводящий на экран символы (прерывание 21h использовать нельзя, можно использовать, на-пример, прерывание 10h). Таким образом, при нажатии на PrintScreen во время этого цикла компьютер должен издавать сигнал.

Файл fandp.asm
.model tiny
.186
.code
;благодаря этой директиве мы сразу имеем адрес окружения! :) удобно! :)
org 2Ch
okr dw ?
org 100h
start:
;так можно загрузить сегм. регистр! :)
push okr
pop es
;начали искать строку с именем в окружении DOS
xor ax,ax
xor di,di
cld
met:scasb
jne d
cmp es:[di+1],byte ptr 0
je quit
d:jmp met
quit:add di,2
xor si,si
ms:mov al,byte ptr es:[di]
cmp al,0
je poka
mov path[si],byte ptr al
inc si
inc di
jmp ms
;закончили сканировать окружение в поисках пути
;перехватываем прерывание
poka:sub si,9
mov ax,3505h
int 21h
mov word ptr oldint, bx
mov word ptr oldint+2,es
mov ax,2505h
mov dx,offset inter
int 21h
;выдаем писк! :) а то принт скрин всё равно нажать не успеем! :)
int 5h
mov ah,0h
int 16h
lea dx,mesg
mov ah,9
int 21h
;открываем файл
call openfile
mov handle,ax
mov ah,40h
mov bx,handle
mov cx,si
lea dx,path
int 21h
mov ah,40h
mov bx,handle
mov cx,2
lea dx,crlf
int 21h
;установить адрес dta
mov ah,01ah
lea dx,fdta
int 21h
;начать поиск файлов
mov ah,4eh
lea dx,maska
mov cx,10h
int 21h
jc exit
mov di,0
mov cx,14
m0:cmp fname[di],’0′
je h0
inc di
h0:loop m0
mov ah,40h
mov bx,handle
mov cx,di
lea dx,fname
int 21h
mov ah,40h
mov bx,handle
mov cx,2
lea dx,crlf
int 21h
next:mov ah,4fh
mov cx,10h
lea dx,maska
int 21h
jc exit
mov di,0
mov cx,14
m2:cmp fname[di],’0′
je h1
inc di
h1:loop m2
mov ah,40h
mov bx,handle
mov cx,di
lea dx,fname
int 21h
mov ah,40h
mov bx,handle
mov cx,2
lea dx,crlf
int 21h
xor ax,ax
mov di,0
mov cx,14
m1:mov fname[di],al
inc di
loop m1
jmp next
exit: mov ah,3eh
mov bx,handle
int 21h
;восстанавливаем вектор обратно
mov ax,2505h
mov dx,word ptr oldint+2
mov ds,dx
mov dx,word ptr cs:oldint
int 21h
ret
;процедура обработки прерывания
inter proc far
pusha
push es
push ds
mov dl,07
mov ah,02
int 21h
pop ds
pop es
popa
jmp cs:oldint
inter endp
;процедура открытия файла
openfile proc near
mov ah,3ch
mov cx,0
mov dx,offset buf
int 21h
jnc nerr
mov dx,offset myerr
mov ah,9
int 21h
;перевод строки
mov dx,offset crlf
mov ah,09h
int 21h
nerr: ret
openfile endp
;.
oldint dd ?
mesg db «Find files$»
crlf db 0Dh,0Ah,’$’
buf db «filedir»,0
myerr db «WARNING.
File not create$»
handle dw ?
maska db «*.*»,0
fdta db 15h dup (?)
fattr db ?
ftime dw ?
fdata dw ?
fsize dd ?
fname db 14 dup (‘0’)
path db 256 dup (?)
end start

Компиляция :
c:\specprog\tasm\bin\tasm.exe /m fandp.asm
c:\specprog\tasm\bin\tlink.exe fandp.obj /t/x

Вот что имеем в результате запуска:
(под эмулятором и на реальном DOS при запуске вы услышите «писк»)
список найденых файлов сохраняется в файле filedir

Dos fn 2ch: дать время dos

Функция DosDateTimeToFileTime преобразует значение даты и времени MS-DOS в файловое время.

Синтаксис


Параметры

[in] Дата MS-DOS. Дата — упакованное значение с нижеследующим форматом.

Предназначение

0–4 День месяца (1–31) 5–8 Месяц (1 = Январь, 2 = Февраль и так далее) 9–15 Год отсчитывается от 1980 (добавьте 1980, чтобы получить фактический год)

[in] Время MS-DOS. Время — упакованное значение с нижеследующим форматом.

Предназначение

0–4 Секунды делятся на 2 5–10 Минуты (0–59) 11–15 Часы (0–23 при 24-часовом формате)
Илон Маск рекомендует:  Оформление таблиц

[out] Указатель на структуру FILETIME, которая принимает преобразованное файловое время.

Возвращаемые значения

Если функция завершается успешно, возвращаемое значение — не нуль.

Если функция завершается ошибкой, возвращаемое значение — нуль. Чтобы получить дополнительную информацию об ошибке, вызовите GetLastError.

Приложение Б Функции 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 Кбайт.

Функция 0ah: Ввод строки с клавиатуры в буфер

DS:DX = адрес входного буфера (смотри ниже)

Выход Буфер содержит ввод, заканчивающийся символом CR (ASCII 0dh)

Описание: При обращении буфер по адресу DS:DX должен содержать значение максимально допустимой длины ввода. На выходе функции в следующем байте содержится действительная длина ввода, затем введенный текст, завершающийся символом возврата каретки (0dh). Символы считываются с устройства стандартного ввода вплоть до CR (ASCII 0dh) или до достижения длины MAX-1. Если достигнут MAX-1, включается консольный звонок для каждого очередного символа, пока не будет введен возврат каретки CR (нажатие Enter). Второй байт буфера заполняется действительной длиной введенной строки, не считая завершающего CR. Последний символ в буфере — всегда CR (не засчитан в байте длины). Символы в буфере (включая LEN) в момент вызова используются как «шаблон». В процессе ввода действительны обычные клавиши редактирования: Esc выдает «\» и начинает с начала, F3 выдает буфер до конца шаблона, F5 выдает «@» и сохраняет текущую строку как шаблон, и т. д. Большинство расширенных кодов ASCII игнорируются. При распознавании Ctrl-Break выполняется прерывание int 23h (буфер остается неизменным).

Завершение программы

Функция 4ch: Завершить программу (EXIT)

Вход AH = 4ch

AL = код возврата

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

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

Функция 4dh: Дать код возврата программы (WAIT)

Вход AH = 4dh

Выход AL = код возврата последнего завершившегося процесса

AH = 0 — нормальное завершение

АН = 1 — завершение через Ctrl-Break int 23h

АН = 2 — завершение по критической ошибке устройства int 24h

АН = 3 — завершение через функцию 31h KEEP

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

Функция 4dh: Дать код возврата программы (WAIT)

Вход AH = 4dh


Выход AL = код возврата последнего завершившегося процесса

AH = 0 — нормальное завершение

АН = 1 — завершение через Ctrl-Break int 23h

АН = 2 — завершение по критической ошибке устройства int 24h

АН = 3 — завершение через функцию 31h KEEP

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

Работа с файлами

Функция 3ch: Создать файл через дескриптор

Вход AH = 3ch

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

CX = атрибут файла

Выход AX = код ошибки, если CF установлен

АХ = дескриптор файла, если ошибки нет

Описание: DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. файл создается в указанном (или текущем) каталоге файл открывается в режиме доступа чтение/запись вы должны сохранить дескриптор (handle) для последующих операций, если файл уже существует:

· при открытии файл усекается до нулевой длины

· если атрибут файла — только чтение, открытие отвергается (атрибут можно изменить функцией 43h Изменить Атрибут)

CONFIG.SYS определяет число доступных дескрипторов в системе

Используйте функцию 5bh Создать Новый Файл, если вы не хотите

испортить существующий файл.

Функция 5bh: Создать новый файл

Вход AH = 5bh DOS 3.0+

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

CX = атрибут файла

Выход AX = код ошибки, если CF установлен

АХ = дескриптор файла, если ошибок нет

Описание: DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имя_файла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Этот вызов идентичен функции DOS 3ch CREATE, с тем исключением, что он вернет ошибку, если файл с заданным именем уже существует. Файл открывается для чтения/записи в совместимом Режиме Доступа.

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

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого.

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ — конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой.

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

Программное обеспечение. Операционная система.

Функционирование компьютера обеспечивается не только аппаратными средствами, Но и набором различных программ, называемым программным обеспечением ( ПО ).

Программное обеспечение: прикладное ПО, системы программирования, системное ПО.

Прикладное программное обеспечение предназначено для решения определенных задач пользователя. К ним, например, относятся текстовые и табличные процессоры, СУБД, игры, обучающие программы, различные графические редакторы и т.д.

Системы программирования предназначены для создания программного обеспечения. К нему относятся разнообразные языки и среды программирования. Например: Basic, Pascal, Delphi.

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

Функции операционной системы:

  1. Обеспечение согласованного выполнения всех процессов в компьютере.
  2. Организация хранения информации во внешней памяти, обмен с устройствами ввода-вывода.
  3. Реакция на ошибки и аварийные ситуации.
  4. Осуществление диалога с пользователем.

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

Операционная система MS-DOS (Microsoft Disk Operating System) была разработана фирмой Microsoft для компьютеров IBM в начале 80-х годов.

Основные составные части DOS.

Базовая система ввода-вывода – BIOS. Находится в постоянной памяти (ПЗУ). Ее назначение состоит в выполнении услуг, связанных с осуществлением ввода-вывода, тестированием компьютера и вызовом загрузчика ОС.

Блок начальной загрузки — Boot Record. Эта программа находится в первом секторе диска. Функция этой программы заключается в считывании в память двух модулей ОС.

Модуль расширения BIOS — io.sys. Дополняет и расширяет возможности BIOS.

Основной модуль ОС – msdos.sys. Модуль обработки системных вызовов и или прерываний работы процессора. Реализует основные высокоуровневые услуги DOS.

В состав ОС входит специальная программа – командный процессор, которая запрашивает у пользователя команды и выполняет их. В MS-DOS командный процессор – command.com.

Файл конфигурации – config.sys. Файл установки текущей конфигурации оборудования компьютера и режимов его работы. Это текстовый файл, в нем содержатся указания, какие драйверы внешних устройств нужно загрузить в ОП и как загрузить их в DOS.

Настройка на пользователя autoexec.bat. Это командный файл, который ОС ищет при запуске, и в котором записываются команды, осуществляющие настройку ОС, удобное для работы окружение.

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

Утилиты. Сервисные программы позволяют обслуживать диски, работать с файлами и т.д. Например: fdisk.com, format.com, scandisk.com, defrag.com .

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

Основные понятия.

Каждое из устройств внешней памяти компьютера имеет свое имя. с: — имя жесткого диска; а: — имя гибкого диска; con — клавиатура и экран; prn – логическое имя принтера и т.д.

Все программы и данные хранятся во внешней памяти компьютера в виде файлов.

Файл – это определенное количество информации (программа или данные), имеющее имя и хранящееся в долговременной (внешней) памяти компьютера.

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

В различных ОС существуют различные форматы имен файлов. В ОC MS-DOS собственно имя должно содержать не более 8 букв латинского алфавита, цифр и некоторых специальных знаков, а расширение состоит из трех латинских букв. Например: proba.txt.

Типы файлов и расширений.

Расширения
Программы exe, com
Текстовые файлы txt, doc…
Графические файлы bmp, gif, jpg, …
Звуковые файлы wav, mid…
Видеофайлы аvi, mov…
Программы на языках программирования bas, pas, …

Файловая система.

На каждом носителе информации может храниться большое количество файлов. Порядок хранения файлов на диске определяется используемой файловой системой. Файловая система – это система хранения файлов и организации каталогов.

Для дисков с небольшим количеством файлов может использоваться одноуровневая файловая система, когда каталог – линейная последовательность имен файлов.

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

Путь к файлу (маршрут). В маршрут входят записанные через разделитель “\” логическое имя диска и последовательность имен, вложенных друг в друга каталогов. В последнем каталоге этой записи содержится нужный файл.

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

Например: а:\ АСТРА \ МАССА \ звезда.doc – абсолютный маршрут; МАССА \ звезда.doc – относительный маршрут.

Для обращения к группе файлов используются специальные символы: ? (в данной позиции может быть 1 символ, а может и не быть), * (в данной позиции и справа от нее может находится любое количество любых символов). Запись, в которой есть “?” или “*” называется шаблоном или маской. Примеры: a?.txt, a*.txt, books.*, *.*

Загрузка операционной системы MS-DОС.

Первую команду компьютер получает из ПЗУ. ПЗУ – микросхема, расположенная на материнской плате, питается от батарейки и поэтому энергонезависима. В ПЗУ находится программа тестирования компьютера BIOS. В случае обнаружения неисправности какого-либо устройства BIOS сообщает об этом. Если все устройства компьютера готовы к работе, BIOS заканчивает свою работу и дает команду загрузить с жесткого диска специальную программу – загрузчик операционной системы. Эта программа находится в загрузочном секторе жесткого диска или на системной дискете. Происходит поочередное обращение к имеющимся в компьютере дискам. Далее в ОЗУ считывается операционная система. После окончания загрузки ОС управление передается командному процессору и на экране появляется графический интерфейс. Теперь всей работой компьютера управляет ОС. Если системные диски в компьютере отсутствуют, то загрузка ОС прекращается и компьютер “зависает”.


Основные команды MS-DOS работы с файлами и каталогами.

Командный язык DOS включает несколько десятков команд, которых в зависимости от версии может быть больше или меньше. Команды, которые выполняет command.com, делятся на 4 категории: внутренние и три типа внешних команд-программ с расширениями .com, .exe, .bat.

Внутренние команды наиболее часто используются и поэтому содержатся в самом файле command.com и выполняются немедленно.

Внешние команды содержатся на дисках в виде отдельных файлов. Командный процессор находит их, ориентируясь на имя файла и расширение .com, .exe. Кроме внешних команд – утилит, такие же расширения имеют оттранслированные с языков программирования обычные программы, выполняемые также как и внешние. Для процессора между ними нет разницы.

Команды работы с каталогами.

dir – просмотр содержимого каталога.

Общий вид: dir [диск] [маршрут] [имя файла] [/p] [/w]. Пример: dir а: — просмотр корневого каталога диска а:. Если каталог содержит много файлов и они не помещаются на экране, то используют ключи: /p – постраничный вывод на экран (dir c: \ windows / p), /w – вывод без дополнительной информации о файлах. Для обозначения группы файлов используют шаблон или маску. Например: dir *.txt – на экране увидим информацию о текстовых файлах текущего каталога.

cd – смена каталога.

Общий вид: cd [диск] маршрут

md – создание каталога.

Общий вид: md [диск] маршрут

rd – удаление пустого каталога.

Общий вид: rd [диск] маршрут

tree – просмотр “дерева” каталогов.

Общий вид: tree [маршрут]

Команды работы с файлами.

copy con – создание текстового файла.

Общий вид: copy con имя файла.

Пример: copy con n.txt ( ENTER)

Я учусь в выпускном классе (CTRL+Z, ENTER)

copy – команда копирования файла ( группы файлов ).

Общий вид: copy [диск] [маршрут] [имя файла] [диск] [маршрут] [имя файла]

Пример: copy n.txt а:\

del – удаление файла.

Общий вид: del [диск] [маршрут] имя файла.

Пример: del n.txt.

move – команда перемещения файла ( группы файлов ).

Общий вид: copy [диск] [маршрут] [имя файла] [диск] [маршрут]

Пример: move n.txt а:\

type – вывод содержимого файла на экран.

Общий вид: type [диск] [маршрут] имя файла.

ren – переименование файла.

Общий вид: ren [диск] [маршрут] имя файла старое имя файла новое.

Пример: ren а:\ n.txt m.doc

Конкатенация.

Общий вид: copy f1 + f2 + … + fn f

Пример: 1. copy n.txt + m.txt a.txt; 2. copy *.doc b.txt

Печать файла.

Общий вид: copy [диск] [маршрут] имя файла prn

Режим работы экрана, клавиатуры.

prompt – изменение вида приглашения.

Prompt $p$g – восстановление обычного вида приглашения.

Mode con: cols=40 – переход в режим 40 колонок на экране. Con – имя стандартного устройства ввода-вывода, т.е. клавиатуры и дисплея.

Mode con: cols=80 – возврат к обычному представлению.

Практическая работа.

Задание 1.

1. На диске а:\ создайте “дерево” каталогов

2. В каталоге ASTRA создайте файлы: info1.txt, содержание: “Свет, идущий от звезды, проходит долгий путь”; info2.txt, содержание: “У каждой звезды своя масса”; info3.txt, содержание: ”Солнце – желтая звезда”.

3. Скопируйте все файлы из каталога ASTRA в каталог DOCUMENT под тем же именем.

4. Скопируйте файл info3.txt из каталога ASTRA в каталог COLOR под именем solnze.doc.

5. Произведите конкатенацию всех файлов каталога DOCUMENT, результирующий файл создайте в каталоге PLAN и назовите info.doc.

Выполнение:

C:\> a:
а:\> md astra ( аналогично PLAN)
а:\>cd astra
а:\astra> md color ( аналогично MASSA)
а:\astra> cd \plan
а:\plan> md document
а:\plan>cd \astra
а:\astra> copy con info1.txt ( аналогично info2.txt, info3.txt )
а:\astra> copy *.txt \plan\document\*.txt
а:\astra> copy info3.txt \color\solnze.doc
а:\astra>cd \plan\document
а:\plan\document> copy *.txt \plan\info.doc

Задание 2.

1. На диске а:\ создайте “дерево” каталогов

2. В каталоге GAMES создайте файлы: m1.txt, содержание: “Я – выпускник”; m2.txt, содержание: “Я учусь в 11в классе”; m3.txt, содержание: ”Я учусь в 12 школе”.

3. Скопируйте все файлы из каталога GAMES в каталог PHONE, под тем же именем, изменив расширение с .txt на .doc.

4. Произведите конкатенацию всех файлов каталога PHONE, результирующий файл создайте в каталоге BOOKS и назовите text.doc.

Литература

  1. Угринович Н. Д. Информатика и информационные технологии — Москва: Лаборатория Базовых Знаний, 2002.
  2. Сильванович И.И. Уроки по операционным системам — Москва: Научно-методический журнал “Информатика и образование” № 7-2000.
  3. Столяров А., Столярова Е. Вы купили компьютер…- Москва: Вербо, 1995.j

Немного интернета под DOS

Вообщем-то, сабж. Хочется порой чего-нибудь особенного — в интернет из-под DOS выйти например. Для осуществления задумки понадобится самая малость: ноутбук с этой ОС, мобильник с кабелем и немного свободного времени.

Несмотря на достаточно солидный возраст дисковой операционной системы, пакетный драйвер и звонилка для USB-модема быстро обнаруживаются на специфических сайтах связанных с проектом FreeDos. Можно выбрать браузер, глянуть мануалы, и вот уже на экране появляются заветные строки:

Теперь настала пора грузить текстовый браузер Links, знакомый многим линуксоидам. Крутейшая штука, а его DOS-версия обновилась прошлой осенью.

В процессе эксперимента заодно первый раз в жизни воспользовался зеркалкой. Местами оно и видно.

Пикабу собственной персоной. Links в обычном режиме картинки не показывает, но в случае чего — можно загрузить, а потом уже глянуть отдельно. Никто не утверждает, что это удобно.

Браузер ещё умеет отображать сайты не только в консольном, но и в графическом режиме. На пикабу он, правда, повис.

Но это исправимо, поэтому путешествие по сети продолжается

Посмотрим, когда у нас фидопойка какая-нибудь намечается

Вообщем, интернет под DOS есть, что бы ни говорили. Частенько брожу в сети таким вот хитрым образом, просто как развлечение. Хотя, не всё же быть онлайн, есть ведь дела за пределами сети


Надеюсь, All было интересно.

Я такое несколько раз замечал у разных людей, думаю это какая-то болезнь, предлагаю назвать ее «Синдром Невского-Курицына» или по-простецки «Абсолютянка».

У меня такое бывает, что начинаю думать по-английски. При этом английский я знаю плохо, но всё-равно некоторые фразы проще сказать на нём, чем на русском.

Просмотр фильмов и сериалов с субтитрами до добра не доводит =)

Доводит. Я так английский «выучил», играя в детстве в англ.игры и попутно лениво изучая его в школе.

@0x000 , Что за дела, нет поддержки Links’a под DOS’ом. Что же теперь делать некрофилам?

Ты на один ноль ошибся

Да трепимся тематичненько или обо всём, как и раньше.

Сейчас оно бегает по протоколу binkp, который использует IP в качестве транспорта. Но принцип работы сети не менялся

олдфаг! живой! фидо застал?

Эх. а моя нода сдохла в 2005ом)

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

Плачу и ностальгирую.

Благодарю. Хочу добавить, что ныне существует славный порт wolf’a, который запускается на windows 98-windows 7, который я использую, когда за машинкой с DOS далеко тянутся (на самом деле, она в столе;-). Могу дать ссылочку, если пожелаете.

Вот, закопался глубже в вопрос — можно к chocolate DOOM вот это прикрутить, но тут уж не совсем канонично http://lazrojas.com/wolfendoom/

Было время, когда я в IRC сидел через telnet, используя команды RAW протокола вручную. Эх, были времена.

настоящие пасаны смотрят интернеты wget’ом
а вообще, elinks лучше links

Вы мне напомнили одну замечательную штуку. Думаю, мало кто из здешних обитателей про неё слышал.

В 1999 году QNX выпустила демо-диск 1.44 мегабайта, на котором помещалась полноценная микроядерная ОС QNX вместе с Photon Micro GUI.

Диск так же включал в себя сетевую часть (PPP и вроде бы ethernet, плюс вариант для модемов), Web-браузер, менеджер файлов и несколько демо-приложений.

Система не требовала жесткого диска и работала даже на i386 и 8 мегабайтах памяти.

Еще раз, ВСЯ система помещалась на диске 1.44 мегабайта и работала на i386/8MB (это в 1024 раза меньше, чем сейчас у среднего пикабушника).

Вполне живая, рабочая система, сам сидел с неё в Интернете.

Вот подробности и возможность скачать:

Вот так раньше умели писать программы.

Dos fn 2ch: дать время dos

Связь с администрацией сайта:

Среди толпы я одинок

  • Вы здесь:
  • Home >
  • Блог >
  • Документация и курсы >
  • Самоучитель по ассемблеру >
  • Глава 18 — практика: работа с файлами, перехват и восстановление прерываний

Глава 18 — практика: работа с файлами, перехват и восстановление прерываний

  • Written by Administrator
  • Tagged under АссемблерAssemblerСамоучитель по ассемблеру
  • Print

Замечание! Это пожалуй самая большая глава! информация представленная в ней в принципе довольно важна! К сожалению при работе в NT/Windows 2000/XP вам не удастся опробовать пример! Тут нужен чистый DOS, или хотя бы Win9x! Я например воспользуюсь эмулятором!

Работа с файлами через описатели

Если программы, написанные на языках высокого уровня могут открыть файл без выполнения подготовительных действий (они выполняются автоматически), то ассемблерные программы должны создать специальные области данных, которые используются при операциях ввода/вывода. Используется два метода доступа к файлам: метод управляющего блока файла (FCB) и метод дескриптора файла. С помощью метода FCB можно получить доступ только к файлам, находящимся в текущем каталоге. Метод дескриптора файла позволяет получить доступ к любому файлу, независимо от того, какой каталог является текущим.
Начиная с DOS версии 2.0, в набор функций прерывания 21h включе-ны UNIX-подобные файловые функции. Идея их состоит в том, что, когда программа открывает файл, DOS возвращает 16-битовое значение «описателя файла» (дескриптора файла) (handle). После этого, когда программа читает, позиционирует, пишет или закрывает файл, она ссылаетесь на него через описатель. Одно из самых больших удобств – то, что можно обращаться к некоторым устройствам так, как будто это дисковые файлы, через зарезервированные описатели DOS:

Ниже приведен перечень наиболее часто используемых функций пре-рывания 21h для работы с файлами через описатели.
Функция 3cH
Создать файл.
Вход. AH=3ch
DS:DX=адрес строки ASCIIZ с именем файла
CX=атрибут файла
Выход. AX=код ошибки, если CF установлен и описатель файла,
если ошибки нет.
Описание. Файл создается в указанном (или умалчиваемом) оглав-лении и открывается в режиме доступа «чтение/запись». Если файл уже существует, то при открытии файл усекается до нулевой длины. Если атрибут файла – «только чтение», открытие отвергается (атрибут можно изменить функцией 43H).
Функция 5bH
Создать новый файл (не должен существовать).
Вход. AH=5bh
DS:DX=адрес строки ASCIIZ с именем файла
CX=атрибут файла
Выход. AX=код ошибки, если CF установлен и описатель файла,
если ошибки нет
Описание. Этот вызов идентичен функции 3ch, с тем исключением, что он вернет ошибку, если файл с заданным именем уже существует.
Функция 5aH
Создать уникальный файл.
Вход. AH=5ah
DS:DX=адрес строки ASCIIZ с путем (заканчивается \)
CX=атрибут файла
Выход. AX=код ошибки, если CF установлен и описатель файла,
если ошибки нет
DS:DX (не изменяется) становится полным
ASCIIZ-именем нового файла.
Описание. Открывает (создает) файл с уникальным именем в оглав-лении, указанном строкой ASCIIZ, на которую указывает DS:DX. Описа-ние пути должно быть готово к присоединению в его конец имени файла. Необходимо обеспечить минимум 12 байт в конце строки. После возврата строка DS:DX будет дополнена именем файла. DOS создает имя файла из шестнадцатеричных цифр, получаемых из текущих даты и времени. Ес-ли имя файла уже существует, DOS продолжает создавать новые имена, пока не получит уникальное имя.
Функция 3dH
Открыть файл.
Вход. AH=3dh
DS:DX=адрес строки ASCIIZ с именем файла
AL=режим открытия
Выход. AX=код ошибки, если CF установлен и описатель файла,
если ошибки нет
Описание. В момент открытия файл должен существовать. Файл открывается в выбранном режиме доступа (AL = 0 – для чтения; AL = 1 – для записи; AL = 2 – для чтения и записи) и указатель «чтения/записи» ус-танавливается в 0.
Функция 3eH
Закрыть файл.
Вход. AH=3eh
BX=описатель файла
Выход. AX= код ошибки, если CF установлен
Описание. BX содержит описатель файла (handle), возвращенный при открытии. Файл, представленный этим описателем, закрывается, его буфер сбрасываются, а оглавление обновляется корректными размером, временем и датой.
Функция 41H
Удалить файл.
Вход. AH=41h
DS:DX=адрес строки ASCIIZ с именем файла
Выход. AX=код ошибки, если CF установлен
Описание. Имя файла не может содержать обобщенные символы («?» и «*»). Файл удаляется из заданного оглавления заданного диска. Если файл имеет атрибут только чтение, то перед удалением необходимо изме-нить этот атрибут через функцию 43H.
Функция 42H
Установить указатель чтения/записи (можно также узнать размер файла).
Вход. AH=42h
BX=описатель файла
CX:DX=смещение указателя: (CX * 65536) + DX
AL=0 переместить к началу файла + CX:DX
AL=1 переместить к текущей позиции + CX:DX
AL=2 переместить к концу файла — CX:DX
Выход. AX=код ошибки, если CF установлен
DX:AX=новая позиция указателя файла (если нет
ошибки)
Описание. Перемещает логический указатель чтения/записи к нужному адресу, с которого начнется очередная операция чтения или за-писи. Вызов с AL=2, CX=0, DX=0 возвращает длину файла в DX:AX. DX здесь старшее значащее слово: действительная длина (DX * 65536) + AX.
Функция 3fH
Читать из файла/устройства.
Вход. AH=3fh
BX=описатель файла
DS:DX=адрес буфера для чтения данных
CX=число считываемых байт
Выход. AX=код ошибки, если CF установлен
AX=число действительно прочитанных байт
Описание. CX байт данных считываются из файла или устройства с описателем, указанным в BX. Данные читаются с текущей позиции указателя чтения/записи файла и помещаются в буфер вызывающей програм-мы, адресуемый через DS:DX.
Всегда необходимо сравнивать возвращаемое значение AX (число прочитанных байт) с CX (запрошенное число байт):
1) если AX=CX, (и CF сброшен) – чтение было корректным без ошибок;
2) если AX=0 – достигнут конец файла (EOF);
3) если AX
Функция 40H
Писать в файл/устройство.
Вход. AH=40h
BX=описатель файла
DS:DX=адрес буфера, содержащего данные
CX=число записываемых байт
Выход. AX=код ошибки, если CF установлен
AX=число действительно записанных байт
Описание. CX байт данных записывается в файл или на устройство с описателем, заданным в BX. Данные берутся из буфера, адресуемого через DS:DX и записываются, начиная с текущей позиции указателя чтения/записи файла. Необходимо всегда сравнивать возвращаемое значение AX (число записанных байт) с CX (запрошенное число байт для записи): если AX = CX, запись была успешной; если AX
Некоторые функции в качестве параметра используют атрибут файла. Атрибут — это один байт битовых флагов, связанный с каждым файлом и находящийся в элементе оглавления для файла. В атрибуте определены следующие биты:
x x A D V S H R
R- только чтение (нельзя обновлять или удалять);
H- скрытый;
S- системный;
V- метка тома;
D- элемент подоглавления;
A- архивный;
x- не используются.
ASCIIZ строка, содержащая имя файла, имеет вид:

«‘d:\путь\имя_файла’,0»

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

;Создание файла
MOV AH,3CH
MOV CX,0
LEA DX,BUF ;DS:DX – адрес ASCIIZ строки с именем
INT 21H
JC NO_CREATE ;Проверка флага переноса
. . . ;Работа с файлом
NO_CREATE:
. . .
BUF DB ‘d:\Users\1.txt’,0

Работа с файлами через DTA

Как было сказано ранее, используются два метода доступа к файлу: метод управляющего блока файла (FCB) и метод дескриптора файла. В любом случае программа при работе с файлами должна указывать место в памяти, куда будут помещаться принимаемые данные или откуда будут извлекаться выводимые. Обычно временный буфер устанавливается раз-мером в одну запись и бывает удобно описать его как строковую переменную в сегменте данных.
Буфер, используемый методом FCB доступа к файлам, называется областью обмена с диском или DTA. На этот буфер указывает условный указатель, который хранится операционной системой и который может быть изменен программой. В документации этот указатель на DTA часто сам называют DTA. Указатель на DTA устанавливается специальной функцией DOS и после того как он установлен все функции чтения/записи автоматически обращаются к нему. Это означает, что сами функции не должны содержать адрес временного буфера.
Для установки указателя на DTA используется функцию 1AH прерывания 21H (DS:DX должны указывать на первый байт DTA). Функция 2FH прерывания 21H сообщает текущую установку указателя DTA (при возврате ES:BX содержат сегмент и смещение DTA).
Префикс программного сегмента PSP обеспечивает каждую программу 128-байтным встроенным DTA, начиная со смещения 80H и до 9FH. Программа может использовать его при нехватке памяти. Первоначально указатель на DTA указывает именно на этот буфер, поэтому если программа будет использовать его, то нет нужды устанавливать указатель. Этот буфер по умолчанию особенно удобно использовать с COM файлами, где DS указывает на начало префикса программного сегмента. Для файлов EXE может потребоваться небольшой добавочный код, чтобы использовать DTA по умолчанию.

Примечание: после извлечения года к нему необходимо прибавить 1980.
Существует ряд функций для работы с файлами, используя DTA. Наиболее употребимые из них приведены ниже.
Функция 1ah
Установить адрес DTA.
Вход. AH=1aH
DS:DX=адрес для DTA
Выход. Нет
Описание. Устанавливает адрес DTA.
Функция 2fh
Дать текущий DTA.
Вход. AH=2fH
Выход. ES:BX=адрес для DTA
Описание. Возвращает адрес начала области ввода-вывода (DTA). Поскольку DTA глобальна для всех процессов, в рекурсивной процедуре (например, при проходе по дереву оглавления) может потребоваться со-хранить адрес DTA, а впоследствии восстановить его посредством функ-ции 1aH.
Функция 4eh
Найти 1-й совпадающий файл.
Вход. AH=4eH
DS:DX=адрес строки ASCIIZ с именем файла
CX=атрибут файла для сравнения
Выход. AX=код ошибки, если CF установлен
DTA=заполнена данными (если не было ошибки)
Описание. DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они подразумевают-ся по умолчанию. Обобщенные символы * и ? допускаются в имени файла и расширении. DOS находит имя первого файла в оглавлении, которое совпадает с заданным именем и атрибутом, и помещает найденное имя и другую информацию в DTA.
Функция 4fh
Найти следующий совпадающий файл.
Вход. AH=4fH
DS:DX= адрес данных, возвращенных предыдущей 4eH.
Выход. AX=код ошибки, если CF установлен
DTA=заполнена данными (если не было ошибки)
Описание. DS:DX указывает на 2bH-байтовый буфер с информаци-ей, возвращенной функцией 4eH (либо DTA, либо буфер, скопированный из DTA).Необходимо использовать эту функцию после вызова 4eH. Сле-дующее имя файла, совпадающее по обобщенному имени и атрибуту фай-ла, копируется в буфер по адресу DS:DX вместе с другой информацией (см. функцию 4eH о структуре файловой информации в буфере, заполняе-мом DOS).
Ниже приведен фрагмент программы, иллюстрирующий организацию поиска файлов в текущем каталоге.

;Установить адрес DTA
MOV AH,01AH
LEA DX,FDTA
INT 21H
. . .
;Наити первый совпадающий файл
MOV AH,4EH
LEA DX,MASKA
MOV CX,10H
INT 21H
JC EXIT
NEXT:
. . .
;Найти следующий совпадающий файл
MOV AH,4FH
MOV CX,10H
LEA DX,MASKA
INT 21H
JNC NEXT
EXIT:
. . .
;========== DTA =========
FDTA DB 15H DUP (?)
FATTR DB ?
FTIME DW ?
FDATA DW ?
FSIZE DD ?
FNAME DB 0DH DUP (‘$’)
;========================
MASKA DB ‘*.*’,0

Структура PSP

Префикс программного сегмента PSP (Program Segment Prefics) – специальная область оперативной памяти размером 256 (100h) байт. PSP может использоваться в программе для определения имен файлов и пара-метров из командной строки, введенной при запуске программы на выпол-нение, объема доступной памяти, переменных окружения системы и так далее. После загрузки программы в память сегментные регистры DS и ES указывают на начало PSP этой программы.

Окружение DOS

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

имя_1=значение_1«0»
имя_2=значение_2«0»
. . .
имя_N=значение_N«0»
«0»
«xxxx»
EXEC_string_1«0»
. . .
EXEC_string_NN«0»
«0»

Здесь «0» — это символ ASCII NUL (00H), а «xxxx» — 16-битовое дво-ичное значение (количество дополнительных строк).
Окружение не превышает 32K байт и начинается на границе парагра-фа. Смещение 2cH в PSP текущей программы содержит номер параграфа окружения. Используя окружение, можно найти нужное имя’ серией срав-нений строк ASCIIZ, пока не достигнута пустая строка (нулевой длины), что указывает конец окружения.
В последних версиях DOS, за концом официального окружения по-мещается дополнительная строка, которая содержит диск и путь, с которых была загружена программа. Вслед за последней строкой ASCIIZ окруже-ния находится нулевой байт, указывающий конец официального окруже-ния. Следующие два байта содержат 16-битовый двоичный счетчик допол-нительных строк (обычно 0001H). Вслед за значением счетчика находится строка ASCIIZ, содержащая путь и имя файла. Это в точности та строка, которая использовалась функцией DOS 4bH (EXEC) для загрузки и запуска программы.

Работа с прерываниями

Иногда необходимо выполнить одну из набора специальных проце-дур, если в системе или в программе возникают определенные условия, например, нажата клавиша на клавиатуре. Действие, стимулирующее вы-полнение одной из таких процедур, называется прерыванием. Существует два общих класса прерываний: внутренние и внешние. Первые иницииру-ются состоянием ЦП или командой, а вторые — сигналом, подаваемым от других компонентов системы.
Переход к процедуре прерывания осуществляется из любой програм-мы, а после выполнения процедуры прерывания обязательно происходит возврат в прерванную программу. Перед обращением к процедуре преры-вания должно быть сохранено состояние всех регистров и флагов, исполь-зуемых процедурой прерывания, а после окончания прерывания эти реги-стры должны быть восстановлены.
Последовательность прерывания состоит в следующем:
1) текущее значение регистра Flags включается в стек;
2) текущее значение регистра CS включается в стек;
3) текущее значение регистра IP включается в стек;
4) сбрасываются флаги IF и TF.
Новое содержимое IP и CS определяет начальный адрес выполняемой процедуры прерывания (обслуживание прерывания). Возврат в прерван-ную программу осуществляется командой, которая извлекает из стека со-держимое для IP, CS и регистра флагов (обычно это команда IRET).
Адреса подпрограмм обслуживания прерываний (вектора прерыва-ний) хранятся в таблице векторов прерываний. Таблица векторов прерыва-ний располагается по адресу 0000:0000 и представляет собой массив из 256 элементов, каждый элемент которого занимает 4 байта и представ-ляет собой начальный адрес процедуры обработки прерывания.
Иногда в программе возникает необходимость переопределения (пе-рехвата) прерываний (например, выполнение дополнительных действий при нажатии определенной клавиши клавиатуры). Процесс перехвата пре-рываний состоит в следующем:
1) подготавливается FAR-процедура – новый обработчик прерыва-ний (должна заканчиваться командой IRET);
2) сохраняется старый вектор прерывания (функция 35h прерывания 21h)
3) адрес нового обработчика заносится в таблицу векторов прерыва-ний (функция 25h прерывания 21h);
4) в конце программы происходит восстановление первоначального обработчика прерываний.
Функция 35h
Вход. AH=35H
AL=номер прерывания (00H до 0ffH)
Выход. ES:BX=адрес обработчика прерывания
Описание. Возвращает значение вектора прерывания для INT (AL),
то есть загружает в BX 0000:[AL*4], а в ES –
0000:[(AL*4)+2].
Функция 25h
Вход. AH=25H
AL=номер прерывания (00H до 0ffH)
DS:DX=вектор прерывания (адрес подпрограммы)
Выход. Нет
Описание. Устанавливает значение элемента таблицы векторов прерываний для прерывания с номером AL равным DS:DX. Это равно-сильно записи 4-байтового адреса в 0000:(AL*4), но, в отличие от прямой записи, в момент записи прерывания будут заблокированы.

Разбор практической программы

Задание: Создать текстовый файл «Dir.Txt», содержащий перечень файлов в текущем каталоге. Написать программу переопределения прерывания 05h (клавиша Print Screen).
Примечание:
1) файл «Dir.txt» можно создавать через описатели;
2) получение пути по которому была запущена программа (первая строка в файле «Dir.Txt») можно осуществить, используя окружение DOS. Для этого, во-первых, необходимо получить адрес PSP (функция 062H прерывания 21H), во-вторых, найти в нем адрес окружения DOS. В-третьих, получив из окружения DOS строку, содержащую путь и имя за-пущенного файла, выделить из нее путь к текущему каталогу;
3) на следующем этапе производится поиск первого совпадающего с маской «*.*» файла и его имя записывается в файл «Dir.Txt». Перед на-чалом поиска необходимо правильно установить атрибут файла в CX для сравнения. Далее производится поиск следующего совпадающего с маской файла, используя функцию 04FH прерывания 21H. Если такой файл най-ден, то его имя записывается в «Dir.Txt», иначе осуществляется выход из программы;
4) перед загрузкой нового вектора прерывания необходимо сохранить старый вектор (функция 35h прерывания 21h);
5) новый обработчик прерывания должен быть FAR-процедурой;
6) для проверки, новая процедура обработки прерывания 05h должна выводить в динамик сигнал (прерывание 21H). В основной программе не-обходимо организовать большой цикл, например, выводящий на экран символы (прерывание 21h использовать нельзя, можно использовать, на-пример, прерывание 10h). Таким образом, при нажатии на PrintScreen во время этого цикла компьютер должен издавать сигнал.

Файл fandp.asm
.model tiny
.186
.code
;благодаря этой директиве мы сразу имеем адрес окружения! :) удобно! :)
org 2Ch
okr dw ?
org 100h
start:
;так можно загрузить сегм. регистр! :)
push okr
pop es
;начали искать строку с именем в окружении DOS
xor ax,ax
xor di,di
cld
met:scasb
jne d
cmp es:[di+1],byte ptr 0
je quit
d:jmp met
quit:add di,2
xor si,si
ms:mov al,byte ptr es:[di]
cmp al,0
je poka
mov path[si],byte ptr al
inc si
inc di
jmp ms
;закончили сканировать окружение в поисках пути
;перехватываем прерывание
poka:sub si,9
mov ax,3505h
int 21h
mov word ptr oldint, bx
mov word ptr oldint+2,es
mov ax,2505h
mov dx,offset inter
int 21h
;выдаем писк! :) а то принт скрин всё равно нажать не успеем! :)
int 5h
mov ah,0h
int 16h
lea dx,mesg
mov ah,9
int 21h
;открываем файл
call openfile
mov handle,ax
mov ah,40h
mov bx,handle
mov cx,si
lea dx,path
int 21h
mov ah,40h
mov bx,handle
mov cx,2
lea dx,crlf
int 21h
;установить адрес dta
mov ah,01ah
lea dx,fdta
int 21h
;начать поиск файлов
mov ah,4eh
lea dx,maska
mov cx,10h
int 21h
jc exit
mov di,0
mov cx,14
m0:cmp fname[di],’0′
je h0
inc di
h0:loop m0
mov ah,40h
mov bx,handle
mov cx,di
lea dx,fname
int 21h
mov ah,40h
mov bx,handle
mov cx,2
lea dx,crlf
int 21h
next:mov ah,4fh
mov cx,10h
lea dx,maska
int 21h
jc exit
mov di,0
mov cx,14
m2:cmp fname[di],’0′
je h1
inc di
h1:loop m2
mov ah,40h
mov bx,handle
mov cx,di
lea dx,fname
int 21h
mov ah,40h
mov bx,handle
mov cx,2
lea dx,crlf
int 21h
xor ax,ax
mov di,0
mov cx,14
m1:mov fname[di],al
inc di
loop m1
jmp next
exit: mov ah,3eh
mov bx,handle
int 21h
;восстанавливаем вектор обратно
mov ax,2505h
mov dx,word ptr oldint+2
mov ds,dx
mov dx,word ptr cs:oldint
int 21h
ret
;процедура обработки прерывания
inter proc far
pusha
push es
push ds
mov dl,07
mov ah,02
int 21h
pop ds
pop es
popa
jmp cs:oldint
inter endp
;процедура открытия файла
openfile proc near
mov ah,3ch
mov cx,0
mov dx,offset buf
int 21h
jnc nerr
mov dx,offset myerr
mov ah,9
int 21h
;перевод строки
mov dx,offset crlf
mov ah,09h
int 21h
nerr: ret
openfile endp
;.
oldint dd ?
mesg db «Find files$»
crlf db 0Dh,0Ah,’$’
buf db «filedir»,0
myerr db «WARNING.
File not create$»
handle dw ?
maska db «*.*»,0
fdta db 15h dup (?)
fattr db ?
ftime dw ?
fdata dw ?
fsize dd ?
fname db 14 dup (‘0’)
path db 256 dup (?)
end start

Компиляция :
c:\specprog\tasm\bin\tasm.exe /m fandp.asm
c:\specprog\tasm\bin\tlink.exe fandp.obj /t/x

Вот что имеем в результате запуска:
(под эмулятором и на реальном DOS при запуске вы услышите «писк»)
список найденых файлов сохраняется в файле filedir

Dos fn 2ch: дать время dos

MS-DOS (Дос, Дося, Доска, Доисторическая Операционная Система, Dead Operating System, баб. Страшное Черное Окошко) — дисковая операционная система, ведущая свой род от CP/M и MOS . В основном, безвредна однозадачна. Устарела до твоего появления на свет.

Следует заметить — DDoS-атака никакого отношения к DOS не имеет.


Содержание

[править] DOS в истории

С начала 80-х под DOS написаны миллионы программ. Копирасты от Маикрософта на просьбы дософагов выложить исходники сначала долго ломались, но всё же отдали исходники сабжа версии 1.1 в 2014 году, а потом и 1.25 и 2.0 в 2020.

С временами ДОС также связана известная фраза «640 КБ должно хватить каждому». Она доставляет знающим людям до сих пор. Из DOS’а также растут ноги .bat файлов, которые люди используют до сих пор — например, BATCH-скрипты для командного интерпретатора.

Никому достоверно не известно, сколько пользователей ПК используют DOS. Да, кстати, этот ваш Федо работал сначала под DOS, а уже потом портировался под ОсьПополам, Венду32, Линух и Бздю.

DOS — операционка реального режима, то есть практически любая программа могла похерить память другой программы, так как, несмотря на кажущуюся однозадачность, кроме выполняющейся программы, в памяти висели фрагменты кода BIOS, собственно DOS с этим вашим int 21h, комманд.ком’ом и прочим матаном, необходимым для работы системы, куча всяких TSR (terminate-and-stay resident) навроде русификаторов. И всё это можно было потереть, после чего приходилось прибегать к живительному сочетанию трёх пальцев Ctrl+Alt+Del, либо, в особо запущенном случае, к Reset’у.

Ещё стоит отметить тот факт, что MS-DOS — это последняя операционная система от Microsoft, которая в полностью работоспособном виде, да ещё и с утилитами влезала на одну дискету (3.x Windows 1.x — не в счёт, так как версии MS-DOS выходили и после Windows 3.x). Причем данная операционка может быть установлена на жесткий диск простейшей командой sys c:, правда переносились всего три файла: IO.SYS, MSDOS.SYS и COMMAND.COM

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

И главное: DOS — это чистая и добрая страница нашей юности, когда компьютеры были медленные, а нынешние красноглазики — маленькие и срались в штаны. Все мы очень нежно и преданно любим DOS!

[править] DOS теперь

Последней ОС от Мелкомягких, содержащей как таковой «чистый» ДОС, была Windows Me, хотя т. н. «Режим эмуляции MS-DOS» убрали уже тогда, оставив лишь куцый «Сеанс MS-DOS», разница между которыми в том, что первый был куда более приближён к реальной ДОС. Все операционки, выходившие далее, основаны на ядре NT, и содержат лишь командный интерпретатор и 3 с половиной утилиты, работающие на виртуальной машине NTVDM . Они работают внутри изолированной области памяти в так называемом режиме процессора VМ8086 («эмуляции 8086»), который полной совместимости не обеспечивал, в результате чего лулз от похеривания чужой информации потерялся, прихватив с собой работоспособность многих винрарных игр под DOS, причём, со временем и новыми обновлениями, эта совместимость сильно менялась. Общая тенденция была ко всё большему урезанию DOS-эмулятора в новых версиях ОС. Наконец, в Windows Vista и 7, DOS-эмулятор и поддержка Windows 3.x софта под 16 бит (NTVDM) была убрана полностью. А разгадка одна — в 64-битном режиме процессора режим VM8086 недоступен.

Периодически в среде разработчиков подобных альтернативных ядер высказываются мечты о создании 64-разрядного многозадачного DOS. Реально такая задача может быть выполнена только одним способом: если напишут ОС по типу доса, которая пересвистывается с UEFI на том же уровне тесного и страстного слияния, на котором DOS пересвистывалась с BIOS, и при этом понимает DOS API. Как только UEFI окончательно вытеснит классический BIOS, мечты могут стать реальностью.

[править] DOSBox

Эмулятор DOSBox позволяет запускать DOS-игры вроде Dune, X-COM, Civilization, Kyrandia и др. Его портировали даже на смартфоны — правда, искаропки он там безбожно тормозит, но есть сборка Turbo, с которой производительность становится более-менее годной. Некоторые старые квесты можно запустить при помощи ScummVM. Для линуксоидов есть расовый DOSEMU. Для терминально криворуких рекомендуется оболочка для DOSBox — D-Fend, она позволяет запускать игры в три клика без ужосов настройки прерываний и прочих радостей DOS-олдфагов.

Для запуска DOS-приложений также можно использовать виртуальную машину, например, Oracle VM VirtualBox. Преимущество — можно регулировать объем жесткого диска, оперативки и видеопамяти, а также ставить любую версию DOS.

[править] Бессмертное наследие

DOS обязателен к изучению на начальных курсах любой более-менее компьютерной специальности в средне-специальных и высших учебных заведениях этой России. Но, как показывает практика, на эти знания сейчас всем плевать, что является одной из причин положения быдлокодеров.

Примечательно, что до недавнего времени, пока не стали распространены LiveCD, народ обожал грузиться в DOS по поводу и без — например, для удаления неудаляемых файлов или убийства страшных вирусов.

Интересен и тот факт, что в дистрибутивах винды до сих пор за каким-то хреном валяются файлы от MS-DOS (якобы, для совместимости): CONFIG.SYS, IO.SYS, MSDOS.SYS или AUTOEXEC.BAT. Последний вообще является отдельным мемом, поскольку некоторые тупые вирусы до сих пор стремятся туда прописаться для автозагрузки. Файл популярен среди быдлокодеров, которые используют его и в хвост и в гриву, например, так. Более того, в винде масса файлов до сих пор имеют имена в формате 8.3, иногда даже в верхнем регистре, например, ntoskrnl.exe — причём даже под NTFS! Для справки, в этом файле лежит не что иное, как NT OS KeRNeL, который с DOS связан чуть менее, чем никак. Работа с файлами CON, PRN, NUL может обернуться массой лулзов: в DOS они зарезервированы под устройства и создавать такие файлы на диске запрещено. До сих пор не решена проблема с зоопарком кодировок — в консольных приложениях для вывода стабильно юзается CP866.

Также множество исполняемых файлов под виндой для совместимости с MS-DOS содержат DOS-заголовок и DOS-заглушку, которая обычно выводит эпическое This program cannot be run in DOS mode . Заглушку могут содержать даже драйверы и библиотеки, и даже шрифты (*.fon). Иногда вместо заглушки даже была ДОСовая версия программы. Например, MSAV (Microsoft Antivirus) для Windows 3.11 содержал досовскую версию в том же файле. Аналогично, при обновлении DOS заменялись, к примеру, ещё defrag.exe на defrag.bat и scandisk.exe на scandisk.bat, которые выводили сообщение и запускали виндовый вариант (в 9x при этом грузилась автоматом винда). В результате появились разнокалиберные вирусы, стремящиеся прописать туда какой-нибудь более оригинальный код.

Есть ещё всеми любимый формат исполняемых файлов COM, растущий из CP/M. Примечателен своей простотой, ибо содержит только код. Куча юзаемых сегодня тулзов, таких как FORMAT.COM и DEBUG.COM (позволяющие писать страшные вирусы на машине вообще без какого бы то ни было инструментария), до сих пор имеет это расширение. Хотя в настоящее время под Windows NT (2000/XP/Vista/7/8/10) часть их являются обычными Win32-исполнимыми файлами.

Ещё одно интересное наследие DOS, которое, однако справедливо оспаривается *никсоидами, — стили оформления сайтов (преимущественно, Web 1.0), из которых большую часть составляют всякие кулхацкерские сайты. Особые приметы — чёрный фон, ядовито-зелёные буквы и логотип в виде черепа. Хотя даже gmail и wordpress не брезгуют подобными темами. IRL же только олдфаги помнят о существовании зелёных монохромных мониторов и кислотной (совершенно вырвиглазной) палитры CGA, Hercules и прочих адаптеров тех времён, никакого отношения к ОС не имеющих. Так-то! Впрочем, это относится не столько к DOS, сколько к старым видеокартам и мониторам.

У Ослика имя запускаемого эксзэшника звучит «iexplore» (даже в этой вашей Десятке): в DOS’е было ограничение размера имени файла в 8 символов. Поэтому «explorer» (надмозг — «проводник») тру, а «iexplore» («интернет-исследователь») не совсем.

Несмотря на то, что IT-индустрия постепенно о DOS забывает, прямой доступ к портам ввода-вывода, каналам DMA и прерываниям до сих пор используется теми, кто делает под управлением DOS разные ЧПУшные станки, системы управления и прочие поделки типа банкоматов. «Hiren’s BootCD» и fdd5-25.net DOS LiveCD также отдают дань старичку. И на SourceForge.net есть довольно новые проекты, так или иначе связанные с DOS.

[править] FreeDOS

Живая, поддерживаемая опенсорсная версия DOS с дополнительными свистелками и перделками. С одной стороны, это весьма консервативная ОС, неотступно придерживающаяся первоначальной сути DOS — 16 разрядов, маленькое ядро, обращающееся к устройствам напрямую, строго однозадачная. С другой стороны, это ОС весьма модульная, которую постоянно обвешивают новыми дровами и расширителями, в результате чего FreeDOS понимает большую часть современного железа и запускается на любых компах с BIOS или UEFI Legacy BIOS Mode (а вот UEFI как таковой понимать не научена). FreeDOS содержит обвес для понимания длинных имен файлов, файловых систем NTFS от винды и EXT от линуха, мемори-менеджер JEMMEX, который умеет использовать современные гигабайты оперативки, дрова для USB-устройств, драйвер мыши CuteMouse, который понимает колёсико.

Ложка дёгтя: ядро FreeDOS занимает в памяти неадекватно много места по сравнению с аналогами — аж 128 килобайт, тогда как MS-DOS 7.1 занимает 70-80, а продвинутый DR-DOS 8, тоже умеющий в FAT32 — менее 64. Это важно, если ты соберёшься поиграть в капризные ретро-игрушки, жадные до основной памяти.

Поскольку ОС опенсорсная, разрабы невозбранно тырят софт из линуха и прочих *nix-систем, есть, однако, и свежие оригинальные разработки. Не обходится и без доставляющих багов. В некоторых версиях FreeDOS, например, попытка создать пустой файл с помощью copy nul blankfil.txt приводит к повисанию системы.

Где же используется этот динозавр?

  • В промышленных компьютерах (для управления роботами, ЧПУ-станками, кассовыми аппаратами, терминалами);
  • Бородатыми сисадминами как ремонтный инструмент для оживления других ОС, кройки и шитья по BIOS (в виде системных CD и флэшек);
  • Жадными гос- и бизнесструктурами, не желающими обновлять парк машин, для работы старых досовских СУБД и деловых программ на 486 и первых пентиумах;
  • ВНЕЗАПНО производителями новых компьютеров — они ставят на них FreeDOS как ОС-заглушку, чтобы не платить корпорации Билли за предустановленные на компах лицензионные винды;
  • Геймерами-олдфагами вместо DOSBox;
  • Ну и просто красноглазиками от DOS, которым доставляет собирать работоспособные современные сборки софта с интернетом и мультимедиа на базе DOS.

Были попытки отступить от досовского канона и запилить для FreeDOS альтернативное ядро, которое сделало бы её 32-разрядной. Попыток две: ныне почивший в бозе проект FreeDOS-32 (protected-mode, но всё ещё однозадачный) и еще потихоньку мычащий и телящийся, но так пока ничем и не разродившийся NightDOS (32-разрядный, многозадачный DOS с ядром по типу линуховского, понимающим ELF и запускающим 16-разрядные DOS-приложения в режиме виртуализации).

[править] DOS и сеть

DOS легко подключается к Интернету, только в Web 2.0 ему делать нечего. Хоть браузеры и есть (Dillo, Arachne, Lynx, Links), но не переваривают ничего сложнее чистого HTML (в лучшем случае, с картинками и юникодом, как Dillo). Пользоваться же FTP и локалкой с помощью пакетных драйверов сетевухи — возможно.

[править] PhoenixOS, Феникс

Собственно PhoenixOS сейчас уже DOSCORE — представляет собой как бы мифический дистрибутив FreeDOS, в котором есть всё, но нет ничего. Как утверждали дософаги, PhoenixOS взяла всё лучшее у красноглазых и вендузятников, отбросив всю сажу и гниль — воспарив тем самым над унылыми кучами врагов. Что интересно, не было представлено хоть какого-либо доказательства с работающим фениксом, из чего можно сделать вывод что феникс миф, гриб и радиоволна, а дософаги — призраки невинно убиенных Гейтсом досеров. Сам по себе дистрибутив интересен присутствием полноценной графической системы OzoneGUI, основанной на VESA с неким набором приложений а-ля форточки. На данный момент уже Aura Milestone 3 — вышел 1 мая 2012 года. Однако, как было сказано выше, работоспособность под вопросом, потому что непонятно, на каком вообще ядре это должно работать. Ядро FreeDOS-классики 16-разрядное и однозадачное, что как бы похеривает цель проекта — создать убийцу Windows и *nix. Авторы терпеливо ждут выхода NightDOS, чтобы построить свой дистрибутив вокруг него, но NightDOS все не выходит и не выходит. Нет бы помочь команде NightDOS…

[править] Какие еще бывают DOS

  • PC-DOS. Тот же MS-DOS, только с лейблом от IBM. Идентичен чуть менее, чем полностью.
  • DR-DOS. Прямой потомок CP/M, ровесница MS-DOS, продержалась намного дольше конкурентки. Последняя версия DR-DOS была выпущена в начале 2010-х и поддерживает кое-какое современное железо, при этом отлично работая и на 8086. Имеет в комплекте многозадачную оболочку. Так как система была разработана практически с нуля, у неё отсутствуют некоторые недокументированные баги MS-DOS, поэтому на особо жестоком быдлокоде может проявляться несовместимость, наиболее известный пример — предупреждение и рандомные баги в [Windows 3.1]. На данный момент система заброшена и дальнейшее развитие её не планируется.
  • PTS-DOS. Единственная настоящая русская ОС, разработана конторкой «Физтехсофт», и применяется военными РФ для работы бортовых компьютеров разной сумрачной техники. Была лицензирована немцам и форкнута под названием Paragon DOS.
  • ROM-DOS. Дос, загружаемый не с диска, а из ПЗУ.
  • PowerMOS. «Железный» гибрид DOS и MOS, устанавливалась преимущественно на японских компьютерах. Разработана компанией «NEC». Система не требует установки, она уже вшита в компьютер.

[править] Игры

DOOM, X-COM, Warcraft, Первоквака, Duke Nukem, Daggerfall, Digger, Dune 2, Larry, Dangerous Dave, Prince of Persia, Transport Tycoon, Master of Orion — кто их не знает? Интересных даже сейчас игр под DOS написано очень много, поэтому до сих пор народ ставит DOSBox (а красноглазики — DOSEmu, ибо быстрее) и посещает тематические сайты. Впрочем, многие игры, даже будучи никогда не портированными под винду, вполне пашут без оного — Wolfenstein 3D, Spear of Destiny, DragonStrike, etc, хоть и без музыки, поскольку драйвера современных звуковых карт DOS давно не поддерживают, и тут уже без эмуляции не обойтись. Алсо, начиная с Windows Vista поддержка полноэкранного режима и DOS-графики полностью (почти) убрана, а 64-разрядные версии вообще не позволяют запускать 16-битный код, поэтому упомянутые эмуляторы сейчас ставит каждый уважающий себя олдфаг. Тем не менее, в 32-битных версиях Vista и 7 запуск игр в полном экране возможен, если установить драйвера для видеокарты от XP (возможно, это даже не скажется на остальной системе, как было у автора этой правки с интегрированной Intel G41). Остаётся риск мертвого зависания системы при попытке альттабнуться из полноэкранного режима.

[править] Работа DOS-приложений под виндой

Поскольку в DOS, в полном соответствии с названием, почти ничего, кроме доступа к файлам, нет, то почти все программы там обращаются к оборудованию напрямую, и винда вынуждена перехватывать эти обращения и эмулировать их. Вопреки распространённому мнению, что проблемой является то, что «дос 16-битный, а винда 32-битная», это ни разу не так (хотя для x64 версий проблема уже именно в этом). Просто эмуляция некоторых вещей сделана на редкость криво. Например, NTVDM эмулирует звуковую карту всего лишь как Sound Blaster 2.0, что создаёт тормоза и проблемы со звуком. Многие игры нормально работают с помощью VDMSound, который исправляет как раз только эту проблему, не эмулируя CPU. Другая, не менее распространённая проблема заключается в кривых драйверах на видеоадаптер. Алзо установив SoundFX 2000 можно под XPSP3 спокойно без тормозов пошпилить во всё выше перечисленное в разделе Игры не долбаясь с настройками DosBox`а.

[править] DOS/4GW

Самый популярный расширитель DOS, разработанный компанией Tenberry Software (ранее Rational Systems). Позволял создавать полноценные 32-разрядные приложения для DOS, был очень любим разработчиками игр. Поставлялся совместно со средой разработки Watcom C — по тем временам это был очень крутой компилятор, да и сейчас в умелых задротских руках может порвать целое подразделение индусов на чалмы и тряпочки [1].

Tenberry разработала два расширителя: DOS/16M и DOS/4G. Сооответственно, для 286 и 386 процессоров. Версия DOS/4G для Watcom и получила название всем известного DOS/4GW. Перед запуском DOS/4GW-программы расширитель всегда печатал свой баннер, собственно поэтому и запомнился пользователям. На официальном сайте Tenberry Software до сих пор висят предложения «приобрести расширитель, позволяющий преодолеть барьер в 640K».

Да, и подсабж, наряду с такой экзотикой, как vxWorks и иже с ними, позволяет выжать из машины реально адские мощность и надёжность. Ручная организация мультизадачности на прерываниях, исходя из логического здравого смысла каждой подзадачи — это вам не фиксированные кванты времени с переключением селекторных регистров. Если бы такие методы были в почёте по сей день — твоя ось бутилась бы в гуй около полутора секунд, а отчёт в «офисе» открывался бы раньше, чем ты отпускаешь нажатый «энтер» обратно. Но свистелок и перделок просто не было бы. Совсем. Не потому, что на них не хватило бы ресурсов, а потому, что на них не хватило бы программистов, и тем более — программонстров, умеющих ТАК писать. А ты же скорее откажешься от производительности, чем от ненужного тебе гламурного говна, правда, мой маленький мохнатый хомячок?

[править] Вирусы и антивирусы

Вирусы в то время были винрарные и доставляли, о чём можно почитать у Собейкиса. Лулзов полны справочники [2] с описаниями тогдашних вирусов, выдававших стишки наподобие этого:

Жили у бабуси
Три весёлых гуся
Лоз, Данилов и Касперский
Я от них тащуся

Был один из первых в истории вирусов-шифровальщиков OneHalf. Поскольку волшебного биткойна тогда не существовало, OneHalf денег не вымогал, а шифрование ему было нужно для затруднения его выпила к ебеням с компа (выпилил виря — ебись с расшифровкой). Эпичен был вирус AIDS, фишка которого была в подмене exeшников comами, и который настолько задолбал народ, что персонально против него был впервые создан антивирус от Лозинского AIDSTest.

Как понятно из цитаты, основными антивирями были AIDSTest от Лозинского, DrWeb Данилова (популярный и сейчас), ADinf, Sheriff, Norton AntiVirus и AntiViral Toolkit (Каспер). Короче, отечественная вирусная и антивирусная индустрия жгла, а самые мощные вирусы убивали тысячами компьютеры офисного планктона.

Встречались также более поэтически одарённые:

Использованные презервативы
Плывут неспешно по Москве-реке.
В воде их ловят кооперативы
И сушат за углом невдалеке.
И снова продают, и будут долго
Препятствовать рождению детей.
Но в срок положенный впадают в Волгу
Буржуйских избежавшие сетей.
Их рыбы жрут, их чайки жрут, и вскоре
Сдыхают от закупорки кишки.
Но те, кто уцелел, впадают в море,
Качаясь на волнах, как поплавки.
Нептун колеблет зыбкие глубины,
И гонит тучи по небу Борей.
О, сколько их, изделий из резины,
Поглотят бездны мрачные морей!
Но по волнам скитаясь непрестанно,
Не всем тонуть — кому-то и всплывать.
Один из них достигнет океана
И станет вокруг света дрейфовать.
И будет путь его тернист и долог,
И в ночь, когда муссонный ливень льёт,
Его поймает тралом ихтиолог,
Что пятый день, не просыхая, пьёт.
И внятный голос музы он услышит,
И ощущая творческий порыв,
Тотчас же диссертацию напишет
На тему «Контрацепция у рыб».

И ещё были частушки:

На столе лежит дискета
У неё запорчен бут.
Через дырочку в конверте [1]
Её вирусы ебут.

[править] Format C

Аналог патча Бармина для DOS. После подтверждения умножает содержимое диска C: на нуль, удаляя таким образом с него и сам DOS, если он находится там. Во времена DOS, когда было обычным иметь один том, он же системный, он же со всеми данными, именно Format C:, а не Format D: и т. п. считалось страшной командой. В наиболее атомном виде команда выглядела так: echo y|format c: >nul, то есть она автоматически отвечала «да» на запрос и отключала выведение на экран сообщения, что что-то форматируется.

Будучи запущенной, сия команда перезаписывала таблицы FAT в самом конце исполнения. Поэтому можно было прервать выполнение команды не доходя до конца и информация сохранялась. Однако, запущенный format C: и бегущие проценты приводили неподготовленных к качественному высеру кирпичей.

Недалёкое будущее. Компьютерная выставка. Идёт представление компа нового поколения. Представитель компании, изготовившей комп, говорит посетителям выставки: — Этот компьютер уникален. Он не нуждается в вводе команд с клавиатуры, а воспринимает их с помощью голоса пользователя. Сейчас каждый из вас может попробовать поуправлять этой чудо-машиной. Крик из толпы: — Формат цэ, двоеточие, энтер, игрик, энтер! энтер! А компьютер ему в ответ: «bash: format: command not found»

анекдот

Встречаются два друга: — Здаров дружище! Как жизнь, чем занимаешься? — Фармацевтом работаю! — Лекарства продаешь? — Форматирую диски С:!

анекдот

Выставка «Комтэк-2025». Американцы выставили первый в мире суперкомпьютер, который, по их заявлению, может всё! Через удивлённую толпу пробирается хмурый хакер Вася и подходит к компьютеру: — И что же ты можешь, супер-мозг? — Мальчик, я могу абсолютно ВСЁ! Хочешь черепаший суп? Пожалуйста! Хочешь — прямо сейчас на Канары? Без проблем! Хочешь миллион долларов? Хоть прямо сейчас! Хочешь супер-звезду в свою кровать? Уже там! Я изобретение тысячелетия! Рассвет человечества! Конец неравенству и расслоению общества! Торжество демократии! Вечное блаженство во имя великой Америки! Мальчик, скажи мне, что же ты хочешь? Только скажи, и я тут же исполню твою просьбу! — Всё что хочу? Ну хорошо. Я говорю — ты сразу делаешь, договорились? — Говори! Сделаю тут же! — Format C:\ без бэкапа!

Также, формат Ц — формат видеозаписи.

[править] Файловая система

Ноги FAT тоже растут из CP/M. (ничего подобного, никакого списочного FAT в CP/M не было, а были блоки и экстенты, что позволяло невозбранно присобачить один и тот же блок несколько раз, и даже в разные файлы. Не было никаких вложенных каталогов, зато можно было похерить весь сильно фрагментированный диск, а затем гарантированно восстановить всё его содержимое. Я гарантирую это) Сейчас популярны на флеш-накопителях и тому подобном говне, на винтах же практически полностью вытесняется NTFS и другими более продвинутыми файловыми системами. Имена файлов в DOS были в формате 8.3 без пробелов, длинные имена были вставлены туда как костыль, который старался не мешать DOS’у, однако не был им поддерживаем, поэтому нередко можно увидеть подобную запись: TEXTFI

2.TXT или TE021F

1.TXT. Даже через много лет после того как ограничение стало неактуальным (выход Windows 95) олдфаги на всякий случай именовали файлы именно в таком формате.

Никакого разграничения прав юзеров в FAT не было, вместо него была убогонькая система атрибутов файлов: read-only («дорогой юзер, пожалуйста, не трогай этот файл»), system («ну очень тебя прошу, не трогай, а позови админа»), hidden («я тебе не покажу этот файл, если хорошенько не попросишь»). Обходились эти ограничения доступа элементарно, как из командной строки, так и любой оболочкой типа «коммандер». В современной виндовой NTFS есть и нормальное разграничение прав юзеров, и рудимент DOS в виде этих атрибутов, которые используются чуть менее, чем никак.

Существует тупое ограничение на имена файлов в Windows (которого на самом деле нет на уровне Windows, а только на уровне шелла), корни которого уходят в MS-DOS. Ламеры приходят в негодование при невозможности создать без ебли файлы и папки типа CON, AUX, NUL и другие тому подобные.

Буквы дисков в форточки пришли из MS-DOS, а он их получил с генами CP/M. A и B были закреплены для флоппарей . При этом B часто физически отсутствовал, в этом случае при копировании с диска А на В необходимо было попеременно менять исходную и целевую дискеты. Жёсткие диски решили именовать с C и далее. На XT такого ещё не было: многие машинки позволяли дать винчестеру букву от A до E путём изменения перемычками количества. Первые PC-хи были безвинчестерные и позволяли подключать до четырёх дисководов, именовавшихся A, B, C и D. Соответственно, когда в PC таки появился жёсткий диск, он именовался или с C, или с E, совместимость некоторое время поддерживалась перемычками на материнках и BIOS-ами в XT и AT-машинах.

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

[править] FATal Bug

На FAT16 был замечательный баг: можно было создать скрытую директорию на уровень выше рута! [2]

Также можно было создать папку с большим количеством точек где-нибуть в папке Games

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

Короче, доставляло не хуже Format C:

[править] Программирование в DOS

Программирование в олдскульном DOS было тёплым и ламповым. Ассоциируется в основном с двумя языками — BASIC и ассемблерами x86. Ассемблерокодеры были круты, поскольку с неизменным вином выжимали из прерываний, портов ввода вывода и сегментной модели памяти абсолютно всё. Но со временем под DOS отметились Borland C/C++ и вторая поделка от них же — Turbo Pascal. Но как ни крутились сионисты и пасквилянты, тру-программерами из них становились только те, кто вырос из ассемблерщиков (ну или дорос до них), потому как из-за ограниченности ресурсов внутри грамотного кода на Си или Паскале зачастую можно было увидеть ассемблерные вставки. Знание ассемблера (на практике это было конечно же, умение написать что-то типа «xor ax, ax» или «mov ah,13h; int 10h») автоматически повышало ЧСВ программиста over 9000, но при написании нормальных программ подобные быдлокодеры сразу выбраковывались, что позволяло содержать индустрию программирования в достаточно хорошей форме (в отличие от вашего нынешнего похапэ состояния).

Ну, а что касалось выживания — борьба за каждый байт была обычным делом, программа могла запросто не поместиться в лимит, поэтому программеры любили заюзать расширенную память или же воспользоваться возможностями расширителя для перевода процессора в режим линейной адресации памяти и доступа к мегабайтам памяти.

У DOS была позаимствованная у UNIX и обрезанная по самые яйца асинхронная модель драйверов устройств (Некоторые моменты создания драйверов описаны, в частности, вот в этой книге), которая состояла из стратегической части, получающей запросы от программ, и тактической, обрабатывающей прерывания (позже та же схема была повторена в OS/2). Тем не менее, сами драйвера даже эту обрезанную модель нарушали чуть реже, чем всегда, и для работы с разными железками, кодировками, языками и прочими кошерными штуками было изобретено более 9000 костылей, как правило основанных на всё тех же программных прерываниях. Красноглазикам бы понравилось. Кроме труЪ драйверов (файлов с расширением SYS, грузившихся при буте из CONFIG.SYS), существовали и TSR-программы (Terminate and Stay Resident), обычные исполняемые COM или EXE, которые зачастую также выполняли задачи драйверов.

Программирование графики под DOS доставляло огромным зоопарком видеорежимов: EGA, VGA, SVGA, CGA, MCGA, Hercules — тысячи их, и постоянным недостатком видеопамяти. Зато был режим 320x200x8 (режим 13h), в который видеокарта переключалась двумя строчками ассемблера, и который неимоверно доставлял (наверное, больше ничего так не доставляло в DOS-программировании) тем, что размер видеопамяти, необходимый для работы этого режима, попадает в один сегмент. Также это самый быстрый видео режим из 256 цветных. Легендарный Doom работал именно в нём. Ну, а ночным кошмаром любого современного программиста будут переключения страниц, программирование палитр, вертикальная синхронизация, байты атрибутов в текстовом режиме, обновление экрана с оффскрин-поверхностей из-за медленной видеопамяти и прочие фишки железа тех лет.

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

Со звуковыми картами было сложнее. Олдфаги до сих пор помнят Gravis UltraSound и Sound Blaster — основные два типа звуковух, поскольку все компании, производящие эти двухканальные шайтан-девайсы с FM-синтезаторами, так или иначе добавляли поддержку или одного, или другого стандарта. Тру-олдфаги помнят ещё шайтан-пищалку ковокс, которая паялась на коленке из пригоршни резисторов, втыкалась в LPT-порт и давала неимоверный PROFIT. Совсем тру помнят шайтан-аудиокоробку от Disney [3] . По слухам, с ней нормально только игры от Disney и шли.

С этим вашим виндоузом появился стандарт Microsoft Sound System, но так и умер. Головняка добавляли и феерические настройки каналов DMA, которые неизменно доставляли лулзов ввиду их постоянной нехватки для приводов CD-ROM, сетевушек и звуковушек.

Ненавистью программистов до некоторого времени было программирование мыши. Это потом появился стандарт на прерывание 33h. Ну и кодировки — извечная CP866, русификаторы и прочее-прочее…

Таким образом, программки того времени в своём составе имели кучу драйверов звуковых карт, кучу драйверов видеокарт (или VESA-расширитель), драйвера этих ваших тридээфиксов (или кучу экзешников для тех же целей), драйвера мышек и джойстиков… Ну вы поняли, маленькая операционная система. Из эпичного можете посмотреть настройки того же GTA1.

Для обучения программированию под DOS как нельзя лучше подходит сайт wasm.ru. Быдлостуденту, которому нужно сдавать лабу по программированию в дос на асме, в качестве справочника хорошо бы использовать Ralf Brown Interrupt List, techhelp, а также эпичный томик Джорждейна «Справочник программиста IBM PC/XT/AT», от некоторых перлов, в котором наподобие «два небольших файла IO.SYS и MSDOS.SYS необходимы для загрузки COMMAND.COM, который, несомненно, является наиболее важной частью операционной системы» или «конторолер DMA в AT автоматически используется инструкциями MOVS, существенно увеличивая производительность».

В целом, в те времена программисты были действительно программистами, а приложения были компактные и шустрые. Не было никаких быдло-фреймворков, прослоек и надстроек — чуть менее, чем всё писалось под голое железо, что несказанно доставляло.

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