Dos fn 27h читать произвольный блок файла


Содержание

Как считывать с файла данные блоками?

07.02.2015, 22:45

Как считывать файлы блоками
В программе вводиться путь к файлу. Нужно считать его блоками по n байт. Как это сделать? Как.

Как считывать данные из файла?
как считывать и записывать данные из файла по строкам в переменную?

Как считывать из файла данные по 64 бита
надо из созданого мной myfile.txt считывать информацию по блокам в 64 бита(в дальнейшем разбить их.

Как считывать данные из строки?
делаю программу работающую с ip-адресами. ввожу в консоли адрес через точку. нужно перезаписать.

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

DOS Fn 4cH: завершить программу — EXIT

Выход

Вход

DOS Fn 4bH: выполнить или загрузить программу — EXEC

Выход

Вход

DOS Fn 4aH: Сжать или расширить блок памяти

Выход

Вход

  • AH = 49H
  • ES = сегментный адрес (параграф) освобождаемого блока памяти
  • AX = код ошибки если CF установлен

Описание:

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

  • AH = 4aH
  • ES = сегмент распределенного блока памяти
  • BX = желаемый размер блока в 16-байтовых параграфах
  • AX = код ошибки если CF установлен
  • BX = наибольший доступный блок (если расширение неудачно)

Описание:

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

Замечание:

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

  • AH = 4bH
  • DS:DX = адрес строки ASCIIZ с именем файла, содержащего программу
  • ES:BX = адрес EPB (EXEC Parameter Block — блока параметров EXEC)
  • AL = 0 = загрузить и выполнить
  • AL = 3 = загрузить программный оверлей
  • AX = код ошибки если CF установлен

Описание:

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

DS:DX указывает на строку ASCIIZ в форме: «d:путьимяфайла»,0. если диск или путь опущены, они подразумеваются по умолчанию.

ES:BX указывает на блок памяти, подготовленный как EPB, формат которого зависит от запрошенной подфункции в AL.

AL=0 EXEC: так как родительская программа первоначально получает всю доступную память в свое распоряжение, вы должны освободить часть памяти через функцию 4aH до вызова EXEC (AL=0). обычная последовательность:

1. Вызовите функцию 4aH с ES=сегменту PSP и BX=минимальному объему памяти, требуемой вашей программе (в параграфах).

2. Подготовьте строку ASCIIZ с именем вызываемого программного файла и установите DS:DX на первый символ этой строки.

3. Подготовьте блок параметров EXEC со всеми необходимыми полями.

4. Сохраните текущие значения SS, SP, DS, ES и DTA в переменных, адресуемых через регистр CS (CS — это единственная точка для ссылок после того, как EXEC вернет управление от ребенка).

5. Выдайте вызов EXEC с AL=0.

6. Восстановите локальные значения SS и SP.

7. Проверьте флаг CF, чтобы узнать, не было ли ошибки при EXEC.

8. Восстановите DS, ES и локальную DTA, если необходимо.

9. Проверьте код выхода через функцию 4dH WAIT (если надо).

Все открытые файлы дублируются, так что ребенок может обрабатывать данные как через описатели файлов, так и через стандартный в/в. режимы доступа описателей дублируются, но любые активные блокировки файлов не будут относиться к ребенку. См. функцию 5cH. после возврата из ребенка, векторы INT 22H Terminate, INT 23H Ctrl-Break и INT 24H Critical Error восстанавливаются в их предыдущие значения.

AL=3 LOAD: Эта подфункция используется для загрузки «оверлея».

DS:DX указывает на ASCIIZ имя файла, а ES:BX указывает на «LOAD»-версию блока параметров EXEC. Главное значение этой подфункции в том, что она считывает заголовок EXE и выполняет необходимые перемещения сегментов, как это требуется для программ .EXE.

Dos fn 27h: читать произвольный блок файла

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

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

  • Вы здесь:
  • 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

kursovik (Семантический анализ структуры EXE файла и дисассемблер (с примерами и исходниками), вирусология), страница 7

Описание файла

Документ из архива «Семантический анализ структуры EXE файла и дисассемблер (с примерами и исходниками), вирусология», который расположен в категории «рефераты». Всё это находится в предмете «информатика, программирование» из раздела «Студенческие работы», которые можно найти в файловом архиве Студент. Не смотря на прямую связь этого архива с Студент, его также можно найти и в других разделах. Архив можно найти в разделе «рефераты, доклады и презентации», в предмете «информатика, программирование» в общих файлах.

Онлайн просмотр документа «kursovik»

Текст 7 страницы из документа «kursovik»

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

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

*Я рассматриваю — вирусы написанные в основном на ассемблере, имеющие не большой размер.

Вирусы, замещающие программный код (Overwrite)

Такие вирусы уже давно устарели и в наши дни они редко распространены.

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

Эти вирусы получили свое название из-за алгоритма размножения: К каждому инфицированному файлу создается файл-спутник. Рассмотрим более подробно два типа вирусов этой группы:

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

Вирусы второго типа действуют более тонко. Имя инфицируемого
ЕХЕ-файла остается прежним, а расширение заменяется каким-либо
другим, отличным от исполняемого (СОМ, ЕХЕ и ВАТ), Например,
файл может получить расширение DAT (файл данных) или OVL (программный оверлей). Затем на место ЕХЕ-файла копируется вирусный
код. При запуске такой инфицированной программы управление полу-
чает вирусный код, находящийся в ЕХЕ-файле. Инфицировав еще один
или несколько ЕХЕ-файлов таким же образом, вирус возвращает оригинальному файлу исполняемое расширение (но не ЁХЕ, а СОМ, поскольку ЕХЕ-файл с таким именем занят вирусом), после чего исполняет его. Когда работа инфицированной программы закончена, ее
запускаемому файлу возвращается расширение неисполняемого. Лечение файлов, зараженных вирусом этого типа, может быть затруднено,
если вирус-спутник шифрует часть или все тело инфицируемого файла,
а перед исполнением его расшифровывает.

Вирусы, внедряющиеся в программу (Parasitic)

Вирусы этого вида самые незаметные: их код записывается в инфицируемую программу, что существенно затрудняет лечение зараженных файлов. Рассмотрим методы внедрения ЕХЕ-вирусов в ЕХЕ-файл.

Способы заражения ЕХЕ-файлов

Самый распространенный способ заражения ЕХЕ-файлов такой: в конец файла дописывается тело вируса, а заголовок корректируется (с сохранением оригинального) так, чтобы при запуске инфицированного файла
управление получал вирус. Похоже на заражение СОМ-файлов, но вместо задания в коде перехода в начало вируса корректируется собственно
адрес точки запуска программы. После окончания работы вирус берет из
сохраненного заголовка оригинальный адрес запуска программы, прибавляет к его сегментной компоненте значение регистра DS или ES (полученное при старте вируса) и передает управление на полученный адрес.

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

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

Рассмотрим алгоритм распространения Вируса.

1. Открыть файл, из которого вирус получил управление.

2. Считать в буфер код вируса.

4. Искать по маске подходящий для заражения файл.

5. Если файлов больше не найдено, перейти к пункту 11.

6. Открыть найденный файл.

7. Проверить, не заражен ли найденный файл этим вирусом.

8. Если файл заражен, перейти к пункту 10.

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

10. Закрыть файл (по желанию можно заразить от одного до всех фай-
лов в каталоге или на диске).

11. Выдать на экран какое-либо сообщение об ошибке, например
«Abnormal program termination» или «Not enough memory», — как бы, пусть
пользователь не слишком удивляется тому, что программа не запустилась.

12. Завершить программу.

В большинстве случаев для написания вируса широко используются функции DOS-а. Их достаточно много всех не будем рассматривать, приведу пример только одного из них.

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

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

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

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

DOS, функция OOh
Завершить программу

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

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

DOS, функция 03h

Считать символа со стандартного вспомогательного устройства

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

DOS, функция 3Ah
Удалить оглавление

DOS, функция 41h
Удалить файл

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

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

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

DOS, функция 4Ch
Завершить программу

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

DOS, функция 5Ah
Создать уникальный временный файл

DOS, функция 68h
Завершить файл.

Список наиболее часто используемых функций DOS.(ассемблер пример)

[AK] Вот список функций, которые важно помнить при разработке вирусов:

Установить адрес DTA.

Получить адрес DTA.

es:bx = текущий адрес

Create — Создать файл.

cx = атрибуты файла (таб 1)

ds:dx = путь и имя файла в формате asciz

ax = дескриптор файла

ax = код ошибки (3,4,5) (таб 2)

Open — Открыть существующий файл

al = режим доступа (таб 2)

ax = дескриптор файла

ax = код ошибки (1,2,3,4,5,0C)

Close — Закрыть файл

ax = код ошибки (6)

Read — Чтение из файла

ds:dx = буфер для чтения

ax = число прочитанных байт

Это значение может быть меньше CX.

Например потому, что превысили длину файла.

ax = код ошибки (5,6)

Write — Записать в файл

ds:dx = данные для записи

ax = число записанных байт

ax = код ошибки (5,6)

Unlink — Удалить файл

ax = код ошибки (2,3,5)

LSeek — Установить указатель в файле

al = точка отсчета указателя:

0 — от начала файла

1 — от текущего положения

cx:dx = смещение (cx=старшие 16 бит, dx=младшие)

dx:ax = новое положение указателя относительно начала

Текст книги «Создаем вирус и антивирус»

Автор книги: Игорь Гульев

Программирование

Текущая страница: 12 (всего у книги 15 страниц) [доступный отрывок для чтения: 4 страниц]

Для многих пользователей Интернет SPAM (бесконечные рекламные предложения и мусор, рассылаемый по почте) стал настоящим бедствием. Основные рекомендации для защиты от SPAM следующие:


– пишите письма в конференции Usenet исключительно с ненужных (бесплатных) адресов, потому что именно письма в конференции Usenet являются основной «засветкой» для спамеров. А если будет много SPAM, то такой адрес можно, что называется, выбросить и за пару минут сделать другой подобный;

– установите какую-либо программу-фильтр для e-mail. Существует великое множество таких программ, доступных на бесплатных серверах, например, на http://www.shareware.com и http://www.download.com.

На FTP-сервер под чужим IP-адресом

Путешествуя по Интернет, пользователи часто не задумываются о том, что оставляют следы своих посещений каждый раз, когда заходят на какой-либо FTP-сайт. Стандартные log-файлы позволяют любопытным владельцам сайтов узнать многое, и, прежде всего, IP-адрес, что равнозначно, например, тому, что определен номер телефона. Существует несколько способов защитить privacy от подобных посягательств.

Анонимно путешествовать по сети можно с помощью proxy-сервера. Proxy сервер работает, по сути, как Анонимайзер, то есть документ с сайта «забирает» он, а не компьютер пользователя. Большинство proxy серверов ограничивают доступ на основании IP-адреса, с которого приходит обращение. Иными словами, если провайдером пользователя является Demos, то proxy сервер Glasnet его к себе попросту не пустит. Но, к счастью, в сети всегда можно найти «добрый» proxy, владельцы которого либо открыто заявляют о его доступности для всех желающих, либо, по той или иной причине, не ограничивают доступ только своим доменом, о чем широкой публике не известно, например:

Для настройки FTP-клиентов proxy-сервер надо установить в passive режим. Проделав эту нехитрую операцию, можно путешествовать по сети, как болгарский или американский пользователь, но… тут есть один очень важный момент. Далеко не все proxy серверы являются полностью анонимными. Некоторые из них позволяют администратору сайта, который пользователь посещаете с использованием proxy, при желании определить IP-адрес, с которого происходит обращение к proxy, то есть реальный IP-адрес пользователя. Поэтому выбранный proxy-сервер нужно проверить на предмет его полной или неполной анонимности. Сделать это можно на сервере http://www.tamos.com/bin/proxy.cgi

Если в ответ получено сообщение «Proxy server is detected!», выбранный proxy имеет «дыру», будет предоставлена информация о реальном IP-адресе пользователя, как, впрочем, и об IP-адресе proxy сервера, с которого пришел запрос. Если же сообщение гласит «Proxy server is not detected» – все в порядке, анонимность обеспечена. Рекомендуется периодически (не реже, чем раз в месяц) проверять proxy, с которыми ведется работа, на предмет анонимности. В заключение еще несколько соображений касательно использования proxy серверов. Работа через далеко расположенный proxy снижает скорость передачи данных и увеличивает время ожидания. Кроме того, если все читатели будут использовать приведенные выше адреса proxy, то очень скоро удовольствие кончится, и доступ к ним будет закрыт (если уже не закрыт). Найти подходящий proxy несложно, например, приведенные адреса найдены всего за пять минут. В поисковой машине (например AltaVista) указываются ключевые слова, что-нибудь вроде proxy+server+configuration+ Netscape. В результате появится список страниц, где провайдеры рассказывают своим пользователям, как настроить браузеры для работы с их proxy. Если пробовать все подряд, на пятый или седьмой раз удача улыбнется, и proxy-сервер согласится работать.

Приложения

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

Приложение А
Форматы заголовков EXE-файлов
Формат заголовка обычного EXE-файла

В начале EXE-файла расположена форматированная часть заголовка EXE-файла (Таблица А-1).

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

Таблица А-1. Формат заголовка обычного EXE-файла
Формат заголовка NE-executable EXE-файла

В состав старого заголовка входят:

– обычный EXE-заголовок (Таблица A-2);

– указатель на новый заголовок (если в ЕХЕ-заголовке в начале таблицы перемещаемых элементов – по смещению18h – стоит 40h или больше, то слово, расположенное по смещению 3С^ содержит смещение начала нового заголовка);

Таблица A-2. Формат обычного EXE-заголовка в NE-executable EXE-файле

В состав нового заголовка входят:

– инфоблок (Таблица A-3);

– таблица сегментов (Таблица A-4);

– таблица ресурсов (Таблица A-5);

Таблица A-3. Формат NE-заголовка
Таблица A-4. Формат таблицы сегментов
Таблица A-5. Формат таблицы ресурсов

– таблица резидентных имен;

– таблица ссылок на модули;

– таблица импортируемых имен;

– таблица входов (Таблицы A-6 и A-7);

– таблица нерезидентных имен.

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

Сразу за заголовком находится таблица сегментов. В ней содержится описание каждого сегмента исполняемого файла.

Таблица ресурсов. Ресурсами являются все основные объекты интерфейса – диалоговые окна, меню, курсоры, растровые изображения, значки и так далее.

Формат таблицы ресурсов (смещения относительно начала входа каждого ресурса). Значения в диапазоне смещений 02-12h повторяются в таблице до тех пор, пока величина по смещению 02h не станет равной нулю. Значения в диапазоне от 0Ah до 12h повторяются столько раз, сколько указано по адресу 04h.

Таблица A-6. Таблица входов перемещаемого сегмента
Таблица A-7. Таблица входов фиксированного сегмента

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

Данные в таблице находятся в виде:

– длина строки (равна нулю, если в таблице нет дополнительных строк);

– строка резидентного имени (первая строка – имя модуля);

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

Таблица ссылок на модули. В ней содержится список смещений имен модулей, хранящихся в таблице импортируемых имен. Каждый вход в таблице есть двубайтное последовательное число.

Таблица импортируемых имен. В ней записаны имена модулей, импортируемых в исполняемый файл. Каждый вход состоит из двух частей – байта длины строки и собственно строки.

Таблица входов. В ней содержатся группы точек входа в исполняемый файл.

Эти группы создаются редактором связей и последовательно пронумерованы (начиная с 1). Каждая группа начинается с двухбайтного заголовка, который содержит число входов в группе (00h – конец таблицы) и дополнительную информацию о сегменте (FFh – перемещаемый, FEh – вход относится к константе, определенной внутри модуля, иначе вход является индексом сегмента). Для перемещаемых сегментов каждый вход состоит из шести байт, а для фиксированных – из трех.

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

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

– тип адресации (только сегмент, только смещение, или и то, и другое);

– тип перемещения (внутренняя ссылка, импортируемый порядковый номер, импортируемое имя);

– номер сегмента или порядковый ID (для внутренних ссылок);

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

– индекс таблицы ссылок или смещение таблицы имен (для импортируемых имен).

Формат заголовка PE-executable EXE-файла

В состав старого заголовка входят:

– обычный EXE-заголовок (Таблица A-8);

– указатель на PE-заголовок (если в ЕХЕ-заголовке в начале таблицы перемещаемых элементов – по смещению 18h – стоит 40h или больше, то слово, расположенное по смещению 3С^ содержит смещение начала PE-заголовка);

В состав нового заголовка входят:

– PE-заголовок (Таблица A-9);

– таблица объектов (Таблица A-10);

– таблицы ресурсов, импортируемых и экспортируемых имен, настройки адресов.

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

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

СХ — число считываемых записей

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

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

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

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

СХ — действительное число считанных записей

Читает несколько записей из файла, начиная с файлового адреса, ука-

занного полем «Номер записи при непосредственном доступе к файлу»

в FCB. Помещает данные в память, начиная с адреса DTA. Соответству-

ющие поля FCB корректируются, чтобы указывать на следующую за-

«Assembler IBM PC 7. Лабораторная работа № 2. Системные функции dos ввода-вывода информации. Обработка строковых переменных»

7.1. ЦЕЛЕВЫЕ УСТАНОВКИ

· Освоение стандартных способов ввода-вывода DOS.

· Разработка программ по обработке символьной информации с использованием строковых команд.

7.2. МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ

7.2.1. ВЫЗОВЫ ФУНКЦИЙ MS-DOS ДЛЯ ВВОДА-ВЫВОДА СИМВОЛЬНОЙ ИНФОРМАЦИИ

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

Прерывания, в основном, можно разделить на два основных типа: аппаратные (hardware) и программные (software interrupt). Аппаратные прерывания вызываются сигналами от периферийных устройств, требующими обслуживания процессором, а программные, через посредство команды Int, вызывающей какую-либо сервисую функцию (процедуру) DOS или BIOS. Перечень функций, выполняемых операционной системой DOS, подробно изложен в п. 3.

Упрощенная схема обработки прерывания изображена на рис. 2.1. Процессор выполняет команду прерывания, используя таблицу векторов, где содержатся все адресные указатели обработчиков (аппаратных и программных) прерываний. Действия процессора при переходе на выполнение подпрограммы-обработчика (инициируемое командой Int n) и последующем возврате обратно (при встрече команды Iret) в точку выхода из основной программы показаны на рис. 2.1 цифрами в кружках. Одно и то же прерывание может выполнять несколько различных функций, код которых помещается в регистрah, а дополнительные параметры заносятся в другие регистры РОН. Возвращаемая обработчиком информация содержится в регистре al или ax, если флаг cf=0. Флаг cf устанавливается в 1, если произошла какая-либо ошибка, код которой заносится в регистр ax (так называемый код возврата ошибки). Возможные коды ошибок приводятся в руководствах по DOS [4, 10, 12].

Рис. 2.1. Упрощенная схема обработки программного прерывания Int n

Функции информационного обмена MS DOS в своём развитии изменялись от специализированных программ обмена для каждого типа устройства на основе блока управления файлами FCB (File ControlBlock) до унификации обмена на основе файловой системы через дескрипторы. Дескриптор или логический номер файла идентифицирует файл или устройство, с которым должна работать прикладная программа. Это упрощает программирование операций ввода/вывода, т.к. позволяет осуществлять обмен информации независимо от природы файла (устройства). Существует пять стандартных дескрипторов файлов, которые предоставляются прикладной программе:

· – стандартный ввод с консоли (обычно клавиатура);

· 1 – стандартный вывод на консоль (обычно экран дисплея);

· 2 – устройство вывода ошибок (всегда дисплей);

· 3 – внешнее устройство обмена AUX (асинхронный адаптер COM1);

· 4 – стандартный принтер (первый параллельный порт LPT1).

Стандартный ввод (как и стандартный вывод) можно перенаправить средствами DOS на любое устройство или в файл, а стандартная ошибка всегда связана с экраном (обычно дескриптор 2 используют для вывода диагностических сообщений). Перенаправление ввода или вывода программы осуществляет командный процессор Command.com. Если, допустим, в программе prog предусмотрен ввод данных через дескриптор стандартного ввода ²0², а вывод данных через дескриптор вывода ²1², то при обычном запуске программы командой prog.exe программа будет требовать входные данные с клавиатуры и выводить результаты своей работы на экран. Если, однако, при запуске программы использовать символ перенаправления

то система сама создаст файл file.txt, и весь вывод программы будет записан в этот файл. Ввод по-прежнему будет осуществляться с клавиатуры. Запуск программы командой

заставит программу выполняться в режиме ввода информации из файла file.dat и вывода в файл file.txt. Ни экран, ни клавиатура использоваться не будут. Сама программа ничего не знает об этих перенаправлениях – она во всех случаях обращается к стандартному устройству ввода данных и к стандартному устройству вывода данных. Просто DOS как бы подставляет ей на входе и выходе другие устройства.

7.2.2. ВВОД С КЛАВИАТУРЫ СИМВОЛЬНОЙ ИНФОРМАЦИИ

7.2.2.1. Буфер ввода данных с клавиатуры

Нажатие любой клавиши клавиатуры вызывает сигнал аппаратного прерывания (прерывания с типом 09h), заставляющий процессор прервать исполняемую программу и перейти на подпрограмму обработки прерывания от клавиатуры. Обработчик прерывания формирует двухбайтовый код с последующей засылкой его в кольцевой буфер ввода данных с клавиатуры, располагающийся по адресу 0040h:001Eh в системной области оперативной памяти. Для алфавитно-цифровых клавиш старший байт этого кода представляет scan-код клавиши (условный номер клавиши на клавиатуре), а младший – ASCII-код клавиши, т.е. 8-битовый код закреплённого за этой клавишей символа.

Заполнение буфера клавиатуры, рассчитанного на 15 слов или ударов по клавишам, происходит по мере нажатия клавиш и не связано с выполнением текущей программы. Если программе требуется ввести с клавиатуры определённый символ (или строку), она с помощью соответствующей системной функции DOS обращается к буферу ввода и, при наличии в нём данных, передаёт первый из поступивших в этот буфер символов в программу. Дело в том, что запись и считывание кодовых слов в буфер клавиатуры соответствует принципу FIFO (first in – first out, первым вошёл – первым вышел), поэтому считывание символа из буфера освобождает место для ввода последующих. Если к моменту вызова функции DOS буфер ввода оказывается пуст, DOS будет непрерывно опрашивать его состояние, ожидая появления в буфере очередного кода, а исполнение программы приостанавливается до нажатия клавиши.

7.2.2.2. Системные функции DOS ввода данных с клавиатуры

DOS предоставляет несколько способов ввода данных с клавиатуры [4, 5, 7, 11, 12, 13, 14]:

¨ использование группы функций Int 21h (01h, 06h, 07h, 08h, 0Ah¸0Ch), обеспечивающих посимвольный ввод с клавиатуры в разных режимах;

¨ обращение к клавиатуре, как к файлу, с помощью функции 3Fh.

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

Сравнительная характеристика функций DOS ввода с клавиатуры

Номер функции DOS

01h

06h

07h

08h

0Ah

0Bh

Ch

Реакция на Ctrl+C

Ожидание нажатия клавиши

Ввод расширенных кодов ASCII

Ввод кодов с помощью Alt/цифра

Эхо-символы. Отображение вводимого символа на экране.

Реакция на Ctrl+C. Аварийное завершение программы (ASCII-код 03h). Вызывается обработчик прерывания Int 23h, завершающий текущую программу с выходом в DOS.

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

Ввод расширенных кодов ASCII. Все функции DOS, считывающие данные с клавиатуры, передают в программу только ASCII-код (младший байт кодового слова клавиши), оставляя scan-код (старший байт) без внимания. Правда, это относится только к алфавитно-цифровым клавишам, т. е. клавишам, за которыми закреплены отображаемые на экране символы (94 символа со значениями ASCII-кода от 32 до 126). Особенности считывания информационных кодов с других, так называемых функциональных и управляющих клавиш, будут рассмотрены дальше в разделе ²Расширенные коды ASCII².

Очистка буфера. Процесс считывания кодов с буфера ввода может дать непредсказуемый эффект, если перед вызовом функции DOS этот буфер не был пуст. Программа, не желающая вводить набранные досрочно коды, должна очистить клавиатурный буфер с помощью специальной функции Ch прерывания 21h (при al = 0).

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

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

Вводит символ из стандартного устройства ввода и отображает его на устройстве стандартного вывода. Ввод каждого символа сопровождается перемещением курсора вправо на следующую позицию. При отсутствии символа ждёт ввода. При наборе строки обрабатываются управляющие клавиши: BS (шаг назад без удаления символа, AL = 08h), TAB (табуляция, AL = 09h), ENTER (переход на начало текущей строки, AL = 13h). Допустимо перенаправление ввода. Если ввод не перенаправлен, выполняет обработку . Для чтения расширенного кода ASCII требует повторного выполнения функции.

¨ Функция 06h. Ввод одиночных символов из стандартного устройства ввода и вывод одиночных символов на стандартное устройство вывода.

Режим работы определяется содержанием регистра DL в момент вызова функции: DL = FF – режим ввода, DL = <FFh – 00h > – режим вывода соответствующего этому коду символа. В режиме вывода коды ASCII: 07h – звонок, Dh – возврат каретки, Ah – перевод строки, рассматриваются как управляющие и выполняются соответствующие им действия.

Если вводимый символ в устройстве ввода присутствует, то он помещается в AL (без эха) с установкой флага ZF = 0, иначе ZF = 1. Отличительным качеством функции 06h является то обстоятельство, что она, просматривая устройство ввода, не останавливает программы (является асинхронной), если не обнаруживает в нём символа, а просто устанавливает флаг ZF = 1. Допускает перенаправление ввода-вывода. Для чтения расширенного кода ASCII требуется повторное выполнение функции.

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

ZF = 1 – устройство ввода пустое.

Вывод: DL = FE¸00. Код в регистре DL является одновременно и кодом выводимого символа.

¨ Функция 07h. Нефильтрованный ввод символа без эха.

Вводит символ из стандартного устройства ввода без его отображения на экране. При отсутствии символа ждёт его ввода. Допустимо перенаправление ввода. Не выполняет отработку . Для чтения расширенного кода ASCII требует повторное выполнение функции. Функция, как правило, используется для ввода пароля с целью защиты программы от несанкционированного запуска

¨ Функция 08h. Ввод символа без эха.

Вводит символ из стандартного устройства ввода. При отсутствии символа ждёт его ввода. Допустимо перенаправление ввода. Для чтения расширенного кода ASCII требует повторное выполнение функции. Если ввод не перенаправлен, чувствительна к (иначе надо предварительно включить режим Break). Как и функция 07h, используется для ввода пароля. Пример использования данной функции будет рассмотрен в одной из программ этой работы.

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

Вывод: AL = код символа.

¨ Функция Ah. Буферизованный ввод с клавиатуры.

Вводит строку байт из устройства стандартного ввода в буфер пользователя по адресу DS:DX, с отображением на устройстве стандартного вывода. Допустимо перенаправление ввода. Если ввод не перенаправлен, выполняет отработку (иначе надо предварительно включить режим Break). Функция допускает редактирование данных при их вводе клавишами: Backspace (отмена последнего символа), Exc (отмена всего набранного текста), F5 (запоминает текущую строку как подсказку), F3 (восстанавливает подсказку для ввода). Ввод символов строки заканчивается нажатием клавиши , код которой (0Dh) вводится в качестве последнего символа в отведённый буфер.

Структура буфера (резервируется в сегменте данных): байт 0 – назначаемая пользователем максимальная длина строки (1-254) с учётом символа CR (код Dh), байт 1 – число реально введённых символов без учёта символа CR, байт 2 и далее – строка. В следующем примере приведена процедура In_string ввода строки в буфер, емкостью 50 символов. Она возвращает адрес первого символа строки в регистре DX, а число символов в регистре CX.

Buf DB 50. 50 DUP(?) ;Буфер пользователя

lea dx,[Buf] ;Адрес буфера пользователя

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

int 21h ;Вызов DOS

mov cl,[Buf+1] ;Поместить счётчик символов в cx

add dx,2 ;Сделать dx указателем строки

¨ Функция 0Bh. Проверка состояния ввода.

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

Возврат: Если символа нет, то AL = 0, если символ ждет, то AL = FFH.

¨ Функция 0Ch. Вызов служебной функции DOS для ввода данных с предварительной очисткой буфера клавиатуры. Допускает переопределение ввода.

Вызов: AH = 0Ch, Int 21h,

AL = номер функции ввода: 01, 07, 08, 0Ah (если AL = 0, то только очистка), DS:DX = адрес буфера, если AL = 0Ah.

Выход: AL = байт входных данных (если при вызове Al = 0Ah, данные помещаются в буфер).

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

Универсальная функция ввода данных в буфер с указателем DS:DX из источника, определённого дескриптором в регистре BX. Допускает переопределение ввода. В регистре CX указывается число байтов, которое необходимо ввести. Пример использования.

In_Area DB 20 DUP(?)

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

mov bx,00h ;Дескриптор ввода (клавиатуры)

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

lea dx,[In_Area] ;Адрес буфера ввода

int 21h ;Вызов функции DOS

sub cx,2 ;Фактически введено

Команда Int 21h ожидает окончания ввода символов, которое фиксируется нажатием клавиши Enter. После ввода текста и нажатия клавиши Enter в буфер In_Aria автоматически вводятся два управляющих символа: CR (код 0Dh) и LF (код 0Ah). Вследствие данной особенности максимальное число символов и размер буфера ввода должны содержать место для двух дополнительных символов. При успешном завершении операции флаг CF = 0, а в регистре AX устанавливается число байтов, введённых с клавиатуры (плюс два дополнительных символа). Если CF = 1, то в регистре AX содержится возвратный код ошибки. Это либо 5 (отказ в доступе), либо 6 (неверный дескриптор).

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

7.2.3. ФУНКЦИИ DOS ВЫВОДА ДАННЫХ НА ЭКРАН

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

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

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

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

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

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

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

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

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

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

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

int 21h ;Вызов DOS

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

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

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

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

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

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

int 21h ;Вызов DOS

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

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

Out_Area DB 20 DUP(?)

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

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

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

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

int 21h ;Вызов DOS

7.2.4. РАСШИРЕННЫЕ КОДЫ ASCII И УПРАВЛЕНИЕ ПРОГРАММОЙ С КЛАВИАТУРЫ

Как уже отмечалось в п 7.2.2, рассмотренный процесс считывания ASCII-кодов клавиш клавиатуры с помощью системных функций DOS относится к алфавитно-цифровым клавишам, за которыми закреплены ASCII-таблицей отображаемые символы (буквы, цифры, знаки препинания и др.). Кроме них, на клавиатуре персонального компьютера имеется ряд клавиш, которым не назначены какие-либо отображаемые символы. Это, например, функциональные клавиши . , клавиши управления курсором , , . , , , специальные клавиши , , а также использующие на практике различные сочетания клавиш с , и . В этом случае, в качестве scan-кода клавиши или какой-либо комбинации из них выступает также старший байт кодового слова, но уже при нулевом младшем байте (нулевом коде ASCII). Например, при нажатии клавиши в кольцевой буфер ввода клавиатуры поступает код 3B00h, а клавиши – 4700h.

Двухбайтовые коды клавиш, содержащие на месте кода ASCII – ноль, называются расширенными кодами ASCII. Эти коды (и соответствующие им клавиши) широко используются для управления программами. Для доказательства этого утверждения достаточно указать на популярную оболочку DOS – Norton Commander. Широкое использование в компьютерах интерактивных средств требовало расширение возможностей ввода с клавиатуры управляющей информации, которую программа должна отличать от вводимого текста. Поэтому расширенные коды ASCII генерируются и всеми алфавитно-цифровыми клавишами, если они нажимаются совместно с клавишей . В табл. 2.2 приведены значения расширенных ASCII-кодов для одиночных клавиш.

Расширенные коды для функциональных клавиш

Клавиша

Код (hex)

Клавиша

Код (hex)

Клавиша

Код (hex)

Клавиша

Код (hex)

Правая часть клавиатуры.


«Num Lock-выкл»

В составе комбинации Alt+

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

Обратим здесь внимание на важный момент! Расширенный код ASCII можно считать, если программа будет настроена на проверку нулевого значения младшего байта для каждого нажатия клавиши. Пример использования функциональных клавиш для управления программой показан в листинге 2.1.

Листинг 2.1. Фрагмент программы, демонстрирующий выполнение альтернативных действий на основе анализа расширенных кодов ASCII

mes1 DB 13,10,’Сообщение $’

mes2 DB 13,10,’Сообщение $’

mes3 DB 13,10,’Сообщение $’

;Ожидаем нажатия клавиши

again: mov ah,08h ;Функция ввода одиночного символа без эха

int 21h ;Первый вызов DOS

cmp al,0 ;Расширенный ASCII код?

mov ah,08h ;Да, введём старший байт

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

cmp al,3B ;Нажата F1?

cmp al,54h ;Нажата ?

cmp al,1Eh ;Нажата ?

jmp again ;Нажато незапланированное

F1: ;Вывод сообщения mes1

Shift_F1: ;Вывод сообщения mes2

Alt_A: ;Вывод сообщения mes3

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

7.2.5. СТРОКОВЫЕ КОМАНДЫ. ОБЩАЯ ХАРАКТЕРИСТИКА

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

Строковые команды, несмотря на синонимичное название со строковыми переменными, предназначены для обработки не только ASCII-строк, но и вообще блоков байтов, одинарных или двойных слов, каждое из которых хранится в памяти в двоичном коде.

Строковые команды представлены в табл. 3.1 и по своему назначению делятся на две группы:

— команды для поиска и сравнения данных (Scas, Cmps).

Любая строковая команда может оперировать как байтами, так и словами, что отражается в мнемокоде команды (например: movsb, movsw, movsd). Все строковые команды, в отличие от других команд процессора ix86, используют для выполнения своих функций одни и те же регистры:

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

Название команды и её мнемокод

Действие

Тип исполь-зуемого префикса

Влияние на флаги

Lods src – Загрузка Acc из строки

src=byte ds:si Lodsb

src=word ds:si Lodsw

src=dword ds:si Lodsd

_

Stos dst – Сохранение Acc в строке

dst=byte es:di Stosb

dst=word es:di Stosw

dst=dword es:di Stosd

Movs dst,src Пересылка элемента строки

dst=byte es:di, src=byte ds:si Movsb

dst=word es:di, src=word ds:si Movsw

dst=dword es:di, src=dword ds:si Movsd

Scas dst – Поиск элемента в строке

dst=byte es:di Scasb

dst=word es:di Scasw

dst=dword es:di Scasd

Все флаги операции сравнения

Cmps dst, src Сравнение элементов строк

src=byte ds:si, dst=byte es:di Cmpsb

src=word ds:si, dst=word es:di Cmpsw

src=dword ds:si, dst=dword es:di Cmpsd

srcdst .

Все флаги операции сравнения

При этом индексные регистры si(esi) и di(edi) определяют смещения элементов строк в сегментах данных, определяемых регистрами ds и es соответственно. Установите es = ds, если это не противоречит другим условиям реализации программы, что позволит вам не беспокоиться о корректной адресации сегментов памяти. Необходимо помнить, что в строковых инструкциях приёмник – строка es:di(edi) не допускает переопределение, а источник – строка ds:si(esi), допускает переопределение на es:si(esi).

Каждая из строковых команд выполняет операцию только над парой элементов двух строк (или над одним для команд Lods, Stos, Scas) и автоматически настраивается на обработку соседних элементов, обеспечивая продвижение по строке в нужном направлении, а именно:

Здесь величина d определяется согласно правилу:

Тип операнда Флаг направления

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

rep (repeat) – повторять, пока cx ¹ 0;

Префиксы используют регистр CX как счётчик числа циклов (беззнаковое число), которое должно быть записано в CX до начала выполнения строковой команды. Счётчик CX декрементируется на 1 после выполнения строковой команды, но проверяется перед её выполнением. Если CX = 0, то строковая команда не выполняется ни разу. Префиксы repe и repne дополнительно выставляют флаг нуля ZF после выполнения строковой операции.

В листинге 2.2. рассматривается использование строковой команды сравнения cmpsb на примере программы с паролем. Идея простейшей защиты программы от несанкционированного запуска заключается в том, что где-то в программе записывается ключевое слово-пароль, и программа, начав работать, требует ввода этого слова с клавиатуры. Если пользователь ввёл пароль правильно, программа продолжит свою работу, иначе попросит ввести его заново или завершится. Ввод пароля обычно осуществляется функцией DOS, не отображающей вводимые символы на экране (обычно 07h или 08h) и заканчивается нажатием клавиши .

Листинг 2.2. Фрагмент программы с паролем.

password DB ‘camel’ ;Пароль

string DB 80 DUP(?)

promt DB 13,10,’Введите пароль: $’

OK DB 13,10,’Работаем!$’

start: mov ax,@data

begin: mov ah,09h ;Вывод запроса на ввод пароля

mov dx,offset promt ;Адрес запроса

mov bx,0 ;Инициализация индексирования ввода

pass: mov ah,08h ;Функция ввода символа в AL без эха

je compare ;Да, на сравнение

mov [string+bx],al ;Нет, сохраним символ

mov dl,’*’ ;Запишем на экран *

jmp pass ;Повторять

;Сравнение введённого пароля с действительным (сравнение строк)

compare: push ds ;Установить ES на сегмент данных

mov si,offset string ;DS:SI- начало string

mov di,jffset password ;ES:DI- начало password

cld ;DF=0- просмотр вперёд

mov cx,pass_len ;Установить счётчик сравнения

repe cmpsb ;Сравнивать, пока (или повторять

;пока символы двух строк совпадают, но не более CX раз)

jne err ;Строки не равны

Вывод сообщения ОК, подтверждающего правильность пароля

mov dx,offset OK

exit: mov ax,4C00h ;Ввод функции 4С для завершения программы

err: jmp begin ;Повторить ввод пароля

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

7.3. ЗАДАНИЯ К РАБОТЕ. ПОДГОТОВКА И ВЫПОЛНЕНИЕ

¨ Задания к работе

1) Ввести строку из произвольных ASCII-символов и произвести её сортировку под управлением функциональных клавиш: – по возрастанию; – по убыванию; – завершение программы. Работу программы отобразить на экране.

2) Ввести строку из произвольного числа символов и произвести в ней поиск подстроки SYMBOL. Если подстрока найдена, то её необходимо удалить. Вновь полученную строку вывести на экран. Если подстрока не найдена, вывести сообщение NOT_FOUND. Программу защитить паролем.

3) Ввести строку из произвольного числа символов. Выполнить преобразование символьной строки в её цифровой аналог на основе ASCII-кодов, после чего произвести поиск максимального кода. Работу программы отобразить на экране и защитить паролем.

4) Ввести строку из произвольных ASCII-символов и произвести её сортировку к виду, включающему четыре части разделённые пробелами: цифры, буквы прописные, буквы строчные, все другие символы. Работу программы отобразить на экране и защитить паролем.

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

6) Ввести строку из произвольных ASCII-символов и выполнить с ней преобразования, задаваемые нажатием функциональных клавиш: изменение порядка следования символов исходной строки на обратный, – замена строчной буквы на прописную и обратно, завершение программы.

7) Ввести строку из произвольного числа символов и произвести в ней поиск подстроки COMPUTER. Если такой подстроки нет, то данную подстроку ввести в начало исходной строки и вывести на экран. В противном случае дать сообщение There is. Программу защитить паролем.

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

9) Ввести строку из произвольного числа символов. Выполнить преобразование символьной строки в её цифровой аналог на основе ASCII-кодов, после чего произвести поиск минимального кода. Работу программы отобразить на экране и защитить паролем.

10) Ввод с клавиатуры на экран произвольного текста с одновременной записью в буфер. Реализовать элементы редактирования: стирание последних символов клавишей Backspace, контроль над прописной буквой первого слова нового предложения (ввести признак начала предложения). При ошибке строчная буква заменяется прописной. Переход на новую строку осуществляется клавишей . Управление: – вывод копии отредактированного текста из буфера, – выход из программы.

11) Ввод с клавиатуры на экран произвольного текста с одновременной записью в буфер. Программа демонстрирует переход на новую строку одним из двух способов:

– нажатие клавиши , если последнее введённое слово пересекло границу в 40 символов. В этом случае на новую строку автоматически переносится всё последнее слово. После перехода на новую строку вывод текста может быть продолжен в обычном порядке. Выход из программы с помощью клавиши .

12) Ввести строку из произвольного числа символов и произвести в ней поиск подстроки AUTOMATON. Если такой подстроки нет, то в начало исходной строки поместить символ @, а в её конец дописать подстроку и вывести на экран. В противном случае дать сообщение There is. Программу защитить паролем.

13) Программа проверки работоспособности ОЗУ для заданной области памяти данных с использованием шахматного теста. Тест предусматривает запись в ячейки с чётными адресами числа 0AAh, а в нечётные – 55h. В результате последующего считывания осуществляется проверка записанной информации. При обнаружении сбоя запоминается адрес данной ячейки (для проверки выполнения последнего требования использовать прогон программы в отладчике TD).

14) Программа проверки работоспособности ОЗУ для заданной области памяти с использованием сканирующего теста. Тест предусматривает запись байта 00h с последующим считыванием и проверкой, затем те же действия выполняются с числом 0FFh. По результатам теста формируется массив из адресов ячеек, в которых обнаружен сбой (для проверки выполнения последнего требования использовать прогон программы в отладчике TD). Программу оформить как com-файл.

15) Разработать программу, преобразующую все символы введённой строки (в строке представлены произвольные алфавитно-цифровые символы) из нижнего регистра клавиатуры в верхний.

¨ Подготовка и выполнение:

a) ознакомиться с методическими рекомендациями к лабораторной работе и соответствующими тематическими разделами в рекомендуемой литературе;

б) разработать и отладить программу в соответствии с индивидуальным заданием;

в) программа, по возможности, должна обеспечивать удобный экранный интерфейс с пользователем при её демонстрации;

г) отчёт о выплненной работе представляет собой:

– индивидуальное задание на разработку программы;

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

7.4. КОНТРОЛЬНЫЕ ВОПРОСЫ

1. Что такое дескриптор? Сколько дескрипторов определено в DOS и как ими пользоваться?

2. Какие функции DOS можно использовать для ввода символов с клавиатуры в регистр AL процессора?

3. Назовите функции DOS, осуществляющие ввод строки символов с клавиатуры в память данных.

4. Какие функции DOS осуществляют операцию вывода на экран:

– одиночных символов из регистра DL процессора;

– строки символов из памяти данных?

5. Напишите процедуру перевода курсора на новую строку с помощью функции 02h DOS.

6. Что такое скан-код клавиши и чем он отличается от расширенного кода ASCII? Как нужно организовать вызовы соответствующей функции DOS для получения расширенного ASCII-кода?

7. Каким сегментным регистрам должен адресоваться сегмент данных, в котором располагается:

8. Какие строковые команды влияют на флаги, а какие нет?

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

10. В какой фазе исполнения команды происходит проверка счётчика на равенство нулю при выполнении:

– строковой команды с префиксом повторения;

– команды управления циклом Loop ?

Что происходит с исполнением этих команд, если счётчик СХ инициализирован нулём?

Dos fn 27h: читать произвольный блок файла

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

DOS, функция OOh
Завершить программу

AH=OOh
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
Записать в стандартное устройство вывода

AH=02h
DL — символ, выводимый в стандартный вывод

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

Считать символа со стандартного вспомогательного

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

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

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

2400 бод, без проверки на четность, 1 стоп-бит, 8-битные слова. Коман-
да DOS MODE используется для установки иных характеристик.

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

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

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

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

АН-ОЗЬ
DL — символ, записываемый на стандартный принтер

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

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

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

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

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

AL — считанный символ
ZF=1, если осуществлялся ввод символа и символа в консоли нет

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

AL=FFh, если символ доступен со стандартного ввода
AL=OOh, если нет доступного символа

Проверяет состояние стандартного ввода. При распознавании Ctrl-Break

выполняется INT 23h.

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

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

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

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

AL=01h — ввод с клавиатуры
AL=06h — ввод с консоли
AL=°07h — нефильтрующий без эха

AL=08h — ввод без эха
AL=OAh — буферизованный ввод

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

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

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

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

DL — номер диска (0 — А, 1 — В и так далее), который становится теку-
щим

AL — общее число дисководов в системе

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

AL имеет то же значение, что и LASTDRIVE, указанное в файле

CONFIG.SYS, и по умолчанию равно 5.

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

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

AL=OOh, если функция выполнена успешно (FCB заполнен)
AL=FFh, если файл не найден или доступ к файлу не разрешен


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

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

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

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

Поделитесь ссылкой пожалуйста:
Смещ. Размер Описание
-07h байт Расширенный FCB, если FFh
-06h 5 байт Зарезервировано
-Olh байт Атрибут файла, если расширенный FCB
+00h байт Номер диска (0 — текущий, 1 — А. )
+01h 8 байт Имя файла
+09h 3 байта Расширение файла
+OCh слово Номер текущего блока
+OEh слово Размер логической записи
+10h двойное слово Размер файла
+14h слово Дата последней записи
+16h слово Время последней записи
+18h 8 байт Зарезервировано
+20h байт Запись с текущего блока
+21h двойное слово Номер записи при непосредственном доступе к файлу

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

AL=FFh, если файл не найден там, где он находился при открытии

с помощью функции OFh

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

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

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

AL°OOh, если подходящее имя найдено

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

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

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

байт FFh, 7 байт нулей, номер диска и элемент оглавления. ,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

AL — номер текущего диска (0 — А, 1 — В, и так далее)

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

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

AH=lAh
DS:DX — адрес DTA

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

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

DS:BX — адрес байта FAT ID, отражающего тип диска (Таблица Б-3)
DX — всего кластеров (единиц распределения) на диске
AL — секторов на кластер
СХ — байт на сектор

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

ID Описание
FFh Floppy, 2 стороны, 8 секторов на дорожку (320Кбайт)
FEh Floppy, 1 сторона, 8 секторов на дорожку (160Кбайт)
FDh Floppy, 2 стороны, 9 секторов на дорожку (360Кбайт)
FCh Floppy, 1 сторона, 9 секторов на дорожку (180Кбайт)
F9h Floppy, 2 стороны, 15 секторов на дорожку (1,2Мбайт)
F8h Жесткий диск
FOh Другой

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

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

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

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

АН-1Ch
DL — номер диска (0 — текущий, 1 — А и так далее)

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

DX — всего кластеров (единиц распределения)
AL — секторов на кластер
СХ — байт на сектор

Аналогична функции IBh с той разницей, что регистр DL указывает

диск, для которого нужно получить информацию.

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

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

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

Данная функция читает из файла с текущей позиции как с указанной

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

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

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

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

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

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

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

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

АН^ЗЬ
DS:DX — адрес неоткрытого FCB (Таблица Б-2)

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

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

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

AH°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

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

Если перехватывается INT 21h, нужно позаботиться о помещении в стек

корректного CS:IP. Еще лучше использовать функцию 4Ch.

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

Смещ. Размер Описание
+00h 2 байта Инструкция INT 20h
+02h слово Сегмент первого байта памяти, выделенной программе
+04h байт Неиспользуемый заполнитель
+05h байт СР/М системный вызов
+06h слово Первый сегмент для СОМ-файла
+08h 2 байта Запоминаются FARJMP 05h
+OAh двойное слово Хранит INT 22h (адрес завершения)
+OEh двойное слово Хранит INT 23h (адрес обработчика Ctrl-Break)
+12h двойное слово Хранит INT 24h (адрес обработчика критической
ошибки)
+16h слово Сегмент родительского PSP
+18h 20 байт Рабочая таблица файлов. Один байт на файл (FFh —
закрыт)
+2Ch слово Сегмент среды окружения для процесса
+2Eh двойное слово SS:SP на входе при последнем вызове
прерывания INT 21 h
+32h слово Количество входов в рабочей таблице файлов
(по умолчанию 20)
+34h двойное слово Указатель на рабочую таблицу файлов
(по умолчанию PSP:0018h)
+38h двойное слово Указатель на предыдущий PSP
+3Ch 4 байта Зарезервировано
+40h 2 байта Версия при возврате на INT 2 lh (AH=30h)
+42h 26 байт Зарезервировано (используется MS Windows и
версиями DOS выше 6.00)
+5Ch 16 байт Первый FCB по умолчанию ‘
+6Ch 16 байт Второй FCB по умолчанию
+7Ch 4 байта Не используются
-i-ent, 1 Ой Й-.Д.Т.

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

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

СХ — число считываемых записей

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

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

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

DS:DX — адрес открытого FCB (Таблица Б-2)
СХ — число записываемых блоков (если СХ равен нулю, то размер фай-
ла усекается до указанного в поле FCB «Номер записи при непосред-
стванном доступе к файлу»)

AL=OOh, если запись успешна «1!
AL=01h, при переполнении диска

AL=02h, если при записи произошел выход за границу сегмента
СХ — действительное число сделанных записей ‘

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

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

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

ES:DI — адрес буфера для результирующего неоткрытого FCB

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

AL=OOh, если результирующий FCB не содержит обобщенных символов
AL=01h, если результирующий FCB содержит обобщенные символы
AL°FFh, если неверно обозначение диска в имени файла
DS:SI — изменен — указывает на символ сразу вслед за именем файла
ES:DI — не изменен — указывает на неоткрытый FCB

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

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

Бит Описание
Пропустить разделители
1 Использовать присутствующий номер диска, если диск не указан,
вместо того, чтобы устанавливать это поле в ноль ;
2 Использовать в FCB имя присутствующего файла, если базовое имя
не указано, вместо того, чтобы заполнять это поле стандартным •
заполнителем ,
3 Использовать в FCB расширение присутствующего файла, если
расширение не указано, вместо того, чтобы заполнять это поле
стандартным заполнителем
4 Зарезервировано

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

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

СХ — год (от 1980 до 2099)
DH — месяц (1 до 12)
DL — день (1 до 31)

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

DOS 2.x не гарантирует возврата в AL значения дня.
DOS 1.0+ возвращает правильный день недели.
Версии до 2.1 имеют проблемы с переходом через дату.

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

СХ — год (от 1980 до 2099)
DH — месяц (от 1 до 12)
DL — день (от 1 до 31)

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

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

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

СН — часы (от 0 до 23)
CL — минуты (от 0 до 59)
DH — секунды (от 0 до 59)
DL — сотые доли секунды (от 0 до 99)

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

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

DL имеет точность примерно 0.04 сек.

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

СН — часы (от 0 до 23)

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

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

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

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

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

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

AL=OOh — отключить верификацию

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

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

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

ES:BX — адрес начала текущей DTA

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

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

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

DOS, функция ЗОИ
Получить номер версии DOS

AL — старший номер версии
АН — младший номер версии

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

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

Если в AL возвращается OOh, можно предполагать, что работает DOS

более ранней версии, чем DOS 2.0.

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

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

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

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

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

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

(Официально не документирована)

AH=32h
DL — номер диска (0 — текущий, 1 — А и так далее)

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

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

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

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

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

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

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

Таблица Б-6. Формат блока информации о диске.

Смещ. Размер Описание
+00h байт Номер диска (0 — текущий, 1 — А и так далее)
+01h байт Количество блоков в драйвере диска
+02h слово Количество байт в секторе
+04h байт Наибольший номер сектора в кластере
+05h байт Счетчик сдвига для конвертации кластера в сектор
+06h слово Количество зарезервированных секторов в начале диска
+08h байт Количество FAT
+09h слово Количество входов в root-директорию
+OBh слово Номер первого сектора, содержащего данные
+ODh слово Максимальный номер кластера
+OFh байт Количество секторов в FAT
+10h слово Номер первого сектора директории
+12h двойное слово Адрес заголовка драйвера устройства
+16h байт ID (отражает тип диска)
+17h байт OOh, если диск доступен и FFh, если нет
+18h двойное слово Указатель на следующий блок информации о диске
Для версий DOS 2.XX
+lCh слово Кластер, содержащий старт текущей директории.
OOOOh — root, FFFFh — не известно
+lEh 64 байта Путь текущей директории для диска в формате ASCIZ
Для версий DOS 3.XX
+lCh слово Кластер, с которого начинается поиск свободного места
при записи некоторого количества секторов на диск
+lEh слово Количество свободных секторов на диске.
FFFFh — не известно

Таблица Б-6. Формат блока информации о диске. <Окончание)

Смещ. Размер Описание
Для версий DOS 4.XX — 6.ХХ
+OFh слово Количество секторов в FAT
+llh слово Номер первого сектора директории
+13h двойное слово Адрес заголовка драйвера устройства
+17h байт ID (отражает тип диска)
+18h байт OOh, если диск доступен, и FFh, если нет
+19h двойное слово Указатель на следующий блок информации о диске
+lDh слово Кластер, с которого начинается поиск свободного кластера
при записи некоторого количества секторов на диск
+lFh слово Количество свободных секторов на диске.
FFFFh — не известно

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

AL=OOh — опросить текущий статус контроля Ctrl-Break
AL=01h — установить статус контроля Ctrl-Break
DL — требуемый статус (0 — выключен, 1 — включен)

DL — текущий статус (0 — выключен, 1 — включен)

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

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

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

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

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

DOS, функция 34h
Получить адрес флага активности DOS

(Официально не документирована)

ES:BX — адрес флага активности DOS

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

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

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

DOS, функция 35h
Получить вектор прерывания

AH-35h
AL — номер прерывания (OOh до FFh)

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

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

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

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

DOS, функция 36h
Получить свободную память диска

АН-ЗбЬ
DL — номер диска (0 — текущий, 1 — А и так далее)

AX=FFFFh, если AL содержал неверный номер диска
Если функция выполнена успешно:

AX — число секторов на кластер
ВХ — число доступных кластеров
СХ — байт на сектор
DX — всего кластеров на диске

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

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

DOS, функция 37h
Установить/опросить символ-переключатель

(Официально не документирована)

AL=OOh — опросить текущий переключатель
AL=01h — установить символ-переключатель
DL — символ-переключатель


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

DL — текущий символ-переключатель DOS (если при вызове AL=OOh)
AL=FFh, если использована неподдерживаемая подфункция

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

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

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

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

AH-SSh
Получить информацию:

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

DS:DX — адрес локального буфера для чтения блока данных страны

(Таблица Б-7)
Установить информацию:

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

AL=FFh — установить данные для кода страны > 255

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

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

ВХ — код страны
CF=1, если при выполнении функции возникли ошибки

Если DX=FFFFh, то текущий код страны устанавливается равным AL
(если AL=FFh, то код страны устанавливается равным ВХ). Обычно код
страны устанавливается в файле CONFIG.SYS. Если DX

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

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

АН-ЗЭЬ
DS:DX — адрес строки ASCIZ с именем оглавления

Таблица 6-7. Формат блока данных страны.

Смещ. Размер Описание
+00h слово Формат даты:
OOh — USA (месяц дата год)
Olh — Европа (дата месяц год)
02h — Япония (год месяц дата)
+02h 5 байт Текущая строка символов в формате ASCIZ
+07h 2 байта Разделитель тысяч в формате ASCIZ
+09h 2 байта Разделитель целой и дробной части в формате ASCIZ
+OBh 2 байта Разделитель даты в формате ASCIZ
+ODh 2 байта Разделитель времени в формате ASCIZ
+OFh байт Текущий формат:
Бит 2 — текущий символ заменяется десятичной точкой
Бит 1 — количество пробелов между значением и текущим
символом
Бит 0=0 — текущий символ предшествует значению
Бит 0-=1 — текущий символ следует за значением
+10h байт Количество символов в дробной части числа
+llh байт Формат времени:
Бит 0

0 — 12-часовые часы

Бит 0=1 — 24-часовые часы
+12h двойное слово Адрес карты (CALL FAR при AL=кoд символа больше 80h)
+16h 2 байта Список разделителей в формате ASCIZ
+18h 10 байт Зарезервировано

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

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

Если диск и/или корневой путь не указаны, то новое оглавление созда-
ется в текущей директории. Поддиректория создается и связывается

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

Код Страна
OOlh Соединенные Штаты Америки
003h Латинская Америка
007h Россия
OlFh Нидерланды
020h Бельгия
021h Франция
022h Испания
027h Италия
02Ch Великобритания
031h Германия

с существующим деревом. Если флаг CF установлен при возврате,
то АХ содержит код ошибки, и оглавление не создается.

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

DOS, функция 3Ah
Удалить оглавление

АН-ЗАЬ
DS:DX — адрес строки ASCIZ с именем оглавления

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

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

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

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

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

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

АН-ЗВЬ
DS:DX — адрес строки ASCIZ с именем оглавления

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

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

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

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

DOS, функция 3Ch
Создать файл через описатель

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

СХ — атрибут файла (атрибуты приведены в описании функции

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

АХ — описатель файла
CF=1, если при выполнении функции возникли ошибки

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

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

DOS, функция 3Dh
Открыть описатель файла

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

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

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

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

AX — описатель файла
CF=1, если при выполнении функции возникли ошибки

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

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

DOS, функция 3Eh
Закрыть описатель файла

АН-ЗЕЬ
ВХ — описатель файла

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

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

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

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

DOS, функция 3Fh
Читать файл через описатель

ВХ — описатель файла

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

СХ — число считываемых байт

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

AX — число действительно прочитанных байт
CF=1, если при выполнении функции возникли ошибки

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

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

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

ВХ — описатель файла

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

СХ — число записываемых байт

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

AX — число действительно записанных байт
CF°1, если при выполнении функции возникли ошибки

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

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

DOS, функция 41h
Удалить файл

AH^lh
DS:DX — адрес строки ASCIZ с именем файла

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

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

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

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

DOS, функция 42h
Переместить указатель файла

ВХ — описатель файла ^
CX:DX на сколько передвинуть указатель: (CX*65536)+DX
AL=OOh переместить относительно начала файла +CX:DX
AL=01h переместить относительно текущей позиции +CX:DX
AL=02h переместить относительно конца файла +CX:DX

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

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

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

Очередная операция чтения или записи начнется с этого адреса.

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

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

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

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

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

AL=OOh — извлечь текущий атрибут файла

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

СХ — новый атрибут файла (для подфункции 01Ь)(Таблица Б-9)

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

СХ — текущий атрибут файла (для подфункции ООЬ)(Таблица Б-9)

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

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

Бит Атрибут
Только чтение
1 Скрытый
2 Системный
3 Метка тома (может находиться только в корневом каталоге)
4 Директория
5 Архивный

Атрибут файла читается или устанавливается, согласно коду в AL.

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

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

можно было ожидать).

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

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

AH=44h
AL — код подфункции:

AL=OOh — получить информацию об устройстве
AL=01h — установить информацию об устройстве
AL=02h — читать с символьного устройства
AL=03h — писать на символьное устройство
AL=04h — читать с блочного устройства
AL=05h — писать на блочное устройство
AL=06h — дать статус ввода
AL=07h — дать статус вывода
AL=08h — запрос съемного носителя
AL=09h — запрос удаленного устройства
AL=OAh — запрос удаленного описателя
AL=OBh — счет повторов разделения
AL=OCh — кодовые страницы 3.3

AL-ODh — общий IOCTL

AL=OEh — получить логическое устройство

AL=OFh — установить логическое устройство

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

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

AH-45h
ВХ — существующий описатель файла

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

AX — новый описатель файла, дублирующий оригинал
CF=1, если при выполнении функции возникли ошибки

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

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

DOS, функция 46h
Переназначить описатель

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

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

CF=0, если функция выполнена успешно
CF=1, если при выполнении функции возникли ошибки
AX — код ошибки

Заставляет описатель файла (handle) ссылаться на другой файл или ус-
тройство. Если описатель в СХ (источник) открыт, он закрывается,

а затем становится дубликатом описателя в ВХ (назначения). Иными
словами, описатели в СХ и ВХ будут ссылаться на один и тот же физи-
ческий файл или устройство.

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

DOS, функция 47h
Получить текущее оглавление DOS

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

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

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

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

В буфер по адресу DS:SI помещается в форме ASCIZ путь текущего ог-
лавления для диска, указанного в DL. Путь возвращается в формате:

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

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

DOS, функция 48h
Выделить память

AH^Sh
ВХ — запрошенное количество памяти в 16-байтных параграфах

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

АХ — сегментный адрес распределенного блока
CF»!, если при выполнении функции возникли ошибки

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

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

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

DOS, функция 49h
Освободить блок памяти

AH=49h
ES — сегментный адрес освобождаемого блока памяти

CF=0, если функция выполнена успешно
CF=1, если при выполнении функции возникли ошибки
АХ — код ошибки

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

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

DOS, функция 4Ah
Изменить размер блока памяти

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

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

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

CF=1, если при выполнении функции возникли ошибки
AX — код ошибки
ВХ — размер максимального доступного блока памяти (в параграфах)

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

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

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

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

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

ES:BX — адрес ЕРВ (блока параметров ЕХЕС)

AL=°OOh — загрузить и выполнить

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

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

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

ВХ, DX не сохранены
СЕ=1, если при выполнении функции возникли ошибки

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

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

DOS, функция 4Ch
Завершить программу

AH=4Ch
AL — код выхода

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

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

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

DOS, функция 4Dh
Получить код выхода программы

АН — код выхода последнего завершившегося процесса

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

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

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

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

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

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

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

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

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

DTA заполнена данными (Таблица Б-10)
CF=1, если при выполнении функции возникли ошибки

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

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

DOS, функция 4Fh
Найти следующий совпадающий файл

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

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

DTA заполнена данными
CF°1, если при выполнении функции возникли ошибки

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

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

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

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

(Официально не документирована)

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

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

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

Таблица Б-]]. Формат векторной таблицы связи.

Смещ. Размер Описание
-18h слово Содержимое СХ при вызове INT 21h при AX=5E01h
-16h слово Счетчик для кэшируемых FCB
-14h слово Счетчик для открытых FCB
-12h двойное слово Адрес обработчика OEM-функций (FFFFh:FFFFh,
если обработчик не установлен)
-OEh слово Смещение в кодовом сегменте DOS кода
возврата из прерывания INT 21h
-ОСЬ слово Счетчик повторов
-OAh слово Задержка повтора
-08h двойное слово Указатель на буфер текущего диска
-04h слово Сегмент данных DOS
-02h слово Сегмент первого МСВ
+00h двойное слово Указатель на первый блок параметров диска
+04h двойное слово Указатель на первую системную файловую таблицу
+08h двойное слово Указатель на заголовок активного драйвера часов
+OCh двойное слово Указатель на заголовок активного драйвера консоли

DOS, функция 54h
Получить переключатель верификации DOS

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


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

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

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

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

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

CF^O, если функция выполнена успешно
CF^l, если при выполнении функции возникли ошибки
AX — код ошибки

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

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

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

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

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

ВХ — описатель файла (handle)

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

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

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

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

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

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

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

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

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

AH°59h
BX-OOOOh (номер версии: ООООЬ для DOS 3.0, 3.1 и 3.2)

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

Биты Описание
15-11 Часы
10-5 Минуты
4-0 Секунды/2
Биты Описание
15-9 Год-1980
8-5 Месяц
4-0 Дата

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

ВН — класс ошибки

BL — предлагаемое действие

СН — сфера (где произошла ошибка)

Эту функцию можно использовать, чтобы уточнить, что предпринять
после сбоя функции DOS по ошибке (только DOS 3.0+). Ее можно вы-
зывать: в обработчике критических ошибок INT 24h, после любой фун-
кции INT 21h, возвратившей флаг переноса после вызова FCB-функ-
ции, возвратившей AL=FFh.

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

DOS, функция 5Ah
Создать уникальный временный файл

DS:DX — адрес строки ASCIZ с диском и путем (заканчивается симво-
лом «\») \
СХ — атрибут файла

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

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

DS:DX — (не изменяется) полное ASCIZ-имя нового файла
CF=1, если при выполнении функции возникли ошибки

Открывает (создает) файл с уникальным именем в каталоге, заданном
строкой ASCIZ, на которую указывает DS:DX. COMMAND.COM вызы-
вает эту функцию, когда создает временные «канальные» файлы, ис-
пользуемые при переназначении ввода-вывода. Описание пути должно
быть готово к добавлению в его конец имени файла. Необходимо обес-
печить минимум 12 байт в конце строки. Сама строка должна быть за-
полнена в одной из форм: «d:\nyrb\»,0 (указан диск и путь), «d>,0 (те-
кущее оглавление диска) или «d:\»,0 (корневое оглавление диска).

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

DOS, функция 5Bh
Создать новый файл

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

СХ — атрибут файла

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

AX — описатель файла
CF=1, если при выполнении функции возникли ошибки

Файл открывается для чтения/записи в совместимом режиме доступа.
Если диск и/или путь не указаны, принимаются значения по умолча-
нию. Этот вызов идентичен функции DOS 3Ch с тем исключением, что
он вернет ошибку, если файл с заданным именем уже существует.

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

DOS, функция 5Ch
Блокировать/разблокировать доступ к файлу

AL=OOh — заблокировать область файла

AL=01h — разблокировать ранее заблокированную область

ВХ — описатель файла

CX-.DX — смещение ((CX*65536)+DX) от начала файла

SLDI — длина блокируемой области ((SI*65536)+DI) байт

CF=0, если функция выполнена успешно
CF=1, если при выполнении функции возникли ошибки
AX — код ошибки

Блокирует или освобождает доступ к участку файла, указанного в ВХ.

Область файла с логическим смещением CX:DX и длиной SLDI

блокируется (захватывается) или разблокируется (освобождается). Сме-
щение и длина обязательно должны быть указаны. Разделение файлов
должно быть активизировано (командой SHARE), иначе функция вернет
код ошибки «Неверный номер функции».

Версии: DOS 3.00 и выше (при обязательной загрузке SHARE).

DOS, функция 62h
Получить адрес PSP

ВХ — сегментный адрес PSP выполняющейся программы

Эта функция возвращает в ВХ адрес PSP текущей программы. Исполь-
зуется, для получения адреса параметров командной строки, адреса ок-
ружения DOS и другой полезной информации, содержащейся в PSP.

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

DOS, функция 65h
Получить расширенную информацию страны

AH=65h DOS 3.3
AL — подфункция:

AL=01h — дать расширенную информацию страны DOS 3.3
AL=02h — дать таблицу преобразования строчных букв в прописные
AL=04h — то же для символов, допустимых в именах файлов
AL=06h — дать сопоставляющую последовательность
DX — код страны

ВХ — кодовая страница (FFFFh — консоль)
СХ — размер буфера возврата (должен быть минимум 5 байт)
ES:DI — адрес буфера возврата

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

ES:DI — адрес возвращенной информации
CF=1, если при выполнении функции возникли ошибки:

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

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

DOS, функция 66h
Получить/установить глобальную кодовую страницу

AL=01h — запросить текущую глобальную кодовую страницу

AL=02h — установить активную кодовую страницу

ВХ — (при AL=02h) кодовая страница (Таблица Б-14)

DX — (при AL=02h) системная кодовая страница (устанавливаемая при

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

ВХ — (если при вызове AL=01h) текущая активная кодовая страница
DX — (если при вызове AL=01h) системная кодовая страница (уста-
навливаемая при загрузке)

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

Эта функция выбирает новую кодовую страницу или получает значение
текущей активной кодовой страницы (страниц). Программа DOS
NLSFUNC должна быть загружена до этого вызова. Функция использу-
ется в сочетании с 65h или 38h.

Устанавливая новую активную кодовую страницу, DOS читает данные

из файла COUNTRY.SYS.

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

Таблица Б-14. Значения кодовых страниц.

Кодовая
страница
Страна (язык)
437 Соединенные Штаты Америки
850 Многоязыковая
857 Турция
860 Португалия
861 Исландия
863 Канада (французский)
865 Норвегия
866 Россия

DOS, функция 67h
Установить число описателей файлов

AH=67h
ВХ — максимальное число описателей (до FFFFh)

CF=0, если функция выполнена успешно
CF=1, если при выполнении функции возникли ошибки
AX — код ошибки

Эта функция устанавливает максимальное число описателей файлов,
которые могут быть открыты одновременно. Если значение ВХ меньше
20, то принимается 20. Если значение ВХ меньше текущего максимума
(нужно сократить число описателей), и в данный момент открыто более
чем ВХ файлов, то изменение будет иметь место, когда число открытых
файлов не будет превышать устанавливаемый максимум. Если ВХ боль-
ше текущего максимума (нужно увеличить число описателей), то DOS
должна иметь доступную память, чтобы распределить ее под новые опи-
сатели. Функция 4Ah позволяет освободить память, чтобы она стала
доступной DOS.

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

DOS, функция 68h
Завершить файл

AH=68h
ВХ — описатель завершаемого файла

CF=0, если функция выполнена успешно
CF=1, если при выполнении функции возникли ошибки
AX — код ошибки

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

Версии: DOS 3.3 и выше. В версиях DOS от 2.0 до 3.2 можно использо-
вать функцию DOS 45h, чтобы создать и затем закрыть дубликат.

Исследование файловых систем. FAT. Глава 1.

Начинаю готовить новый цикл статей, посвященных исследованию файловых систем.

И начну я с наиболее простой (для разогрева) файловой системы FAT12/16.

Вначале немного истории. Файловая система FAT (расшифровывается никак не иначе, как File Allocation Table) разработана Биллом Гейтсом (основатель Microsoft corp.) и Марком МакДональдом в 1977 году и изначально использовалась в ОС 86-DOS. Для сохранения переносимости программ из операционной системы CP/M в 86-DOS, в ней сохранились ранее принятые ограничения на длину имени файла и используемые символы. Позднее, ОС 86-DOS была куплена Microsoft и стала прообразом для ОС MS-DOS 1.0, увидевшей свет в августе 1981 года.

Файловая система FAT была предназначена для работы с гибкими дисками размером менее 1 Mb, в начале даже не поддерживала жесткие диски. В настоящее время файловая система FAT поддерживает разделы и файлы размером до 2 Gb.

Используемое программное обеспечение.

Для просмотра 16-ричного дампа диска и анализа всех параметров здесь и далее буду использовать утилиту WinHEX, мощный редактор. Обо всех функциях буду рассказывать по мере повествования. Так как этот софт я сам пока ещё не знаю, но планирую узнать. Итак, главное окно программы:

Структуру файловой системы FAT можно условно представить в виде таблицы.

Структура файловой системы FAT:

Нулевой сектор, называемый также загрузочным (Boot), содержит таблицу с параметрами диска и начальный загрузчик ОС. Первые 3 байта сектора содержат команду перехода JMP на начало загрузчика: либо байт 0E9h и 1 байт короткого смещения, после которых следует команда NOP (код 90h), либо байт 0EBh и два байта длинного смещения, которое используется, если загрузчик расположен в зарезервированной области.

Что из себя представляет загрузчик?

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

Далее расположено поле из 8 байт, содержащее текстовый идентификатор версии ОС.

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

Важно: байты читаются в обратном порядке!

Это мы уже увидели. Теперь немного расскажу, как нужно ориентироваться в WinHEX и вообще в 16-ричном дампе.

Смешение – это сдвиг от начала исследуемой области. После каждого 16-ричного числа ставится символ h (hex) что означает, что число 16-ричное. Вот краткий хелп, как ориентироваться в дампе:

Байт – это пара смежных символов 16-ричного алфавита. Слово – 2 байта, иначе говоря WORD. Двойное слово – 4 байта (DWORD). Поиск байта по смещению – это сложение смещения по строке и по столбцу. Например, ищем байт по смещению A5h. Для этого ищем по вертикали 000000A0, а по горизонтали откладываем 5. На пересечении будет находиться байт 46h [1]. Точно так же для примера я нашёл байт по смещению 2Dh [2]. Нужно привыкать к такому поиску, потому что будем часто перемещаться на произвольное смещение.

Смещение Длина Назначение
0Bh 2 BytesPerSector – количество байт в секторе, обычно равно 512 (200h)
0Dh 1 SectorPerCluster – количество секторов в кластере
0Eh 2 ReservedSectors – количество зарезервированных секторов
10h 1 NumberOfFATs – количество FAT таблиц
11h 2 RootEntries – максимальное число 32-байтных элементов корневого каталога
13h 2 TotalSectors – общее число секторов на томе. 0000h означает, что диск большого объема (> 32 Mb, поэтому число задается DWORD по смещению 20h, параметр BigTotSects
15h 1 MediaDescriptor – дескриптор носителя (то же,что и в первом байте FAT таблицы)
16h 2 SectorPerFat – число секторов в одной таблице FAT
18h 2 SectorPerTrack – число секторов на треке
1Ah 2 Heads – число головок
1Ch 4 HiddenSectors – число скрытых секторов
20h 4 BigTotalSectors – число секторов (для раздела >32 Mb)
24h 1 PhysicalDiskNumber – физический номер устройства, номер присваивается в процессе форматирования (80h – первый десткий диск в системе)
25h 1 CurrentHead – зарезервировано
26h 1 Signature – сигнатура расширенного загрузчика (29h)
27h 4 VolumeSerialNumber – серийный номер тома (устанавливается при форматировании)
2Bh 11 VolumeLabel – метка тома (строка символов)
36h 8 SystemID – символьный код идентификатора файловой системы, например FAT16.
3Eh 448 Область кода загрузчика
1FEh 2 BootSignature – сигнатура 55AAh – конец загрузочного сектора

1. Количество байт в секторе

Итак, смещение 0Bh, длина – два байта.Мы видим там значения 00h 02h. Напоминаю, что у нас тут обратный порядок байт, то есть читаем с конца. 02h 00h = 0200h. Переводя в десятичное – 512. Кстати, в опциях рекомендую включить View -> Show -> Data Interperter. А в опциях Options -> Data Interpreter включить 8 bit (unsigned), 16 bit (unsigned), 32 bit (unsigned), Assembler opcodes, Digit Grouping. Тогда в плавающем окошке будет отображаться как у меня. Ставим курсор на первое число, и, поскольку у нас 2 байта – смотрим значение в поле 16 bit (для длины 1 байт смотрим 8 bit, для длины 4, dword, смотрим 32 бит, очень удобно.

Итак, переводим 0200h в десятичное число. 0200h = 512.

И действительно, на флешке у нас размер сектора 512 байт.

2. Количество секторов в кластере

Находим смещение 0Dh, так как длина поля 1 байт, смотрим значение 8 bit в Data Interpreter. Оно равно 64. Верно, 0Dh = 64 (dec).

Отсюда можно легко вычислить количество байт в кластере. Первое число умножаем на второе.

Количество байт в кластере = 512 * 64 = 32 768.

3. Число зарезервированных секторов

Согласно таблице, открываем смещение 0Eh и читаем 2 байта.

Значение равно 0002h, что в переводе на десятичные равно так же 2. Значит два сектора зарезервированы под загрузчик. Размер сектора – 512 байт, следовательно зарезервировано 2 * 512 = 1024 байта.

4. Количество копий FAT.

Я пометил это на предыдущем скриншоте, легко увидеть, что судя по значению байта по смещению 10h, используется 2 копии FAT.

5. Максимальное число 32-байтных элементов корневого каталога

Считываем два байта по смещению 11h и видим, сколько может уместиться 32-байтных элементов в корневом каталоге. И количество их равно 512. Что это значит – разберём немного позже.

6. Общее число секторов на томе.

Следующие два байта по смещению 13h – общее количество секторов. Для дисков, объем которых превышает 32 Mb, эти два байта заполнены нулями, и реальное количество секторов указывается по смещению 20h в четырёх байтах. Об этом скажу чуть ниже.

7. Дескриптор носителя

Этот дескриптор содержится в первом байте FAT-таблицы. В байте по смещению 15h мы видим значение F8. Забегая вперёд я хочу привести скрин FAT-таблицы, чтобы не быть голословным.

Некоторые параметры я пропущу, ввиду их очевидности. Итак, идём дальше.

8. Общее число секторов.

Для разделов > 32 Mb у нас находится по смещению 20h и занимает 4 байта.

Там мы видим последовательность байт: 80 B0 3B 00. Читаем их в обратном порядке 00 3B B0 80, переводим это число в десятичный вид: 3911808. Это число показывает, сколько секторов у нас на разделе. Умножаем на размер сектора в байт (см. пункт 1) и получаем 3911808 * 512 = 2 002 845 696 байт. В общем флешка на 2 Gb.

В калькуляторе преобразовывать числа из систем счисления не сложно. Запускаем калькулятор, Вид->Инженерный. Переключаем режим на Hex (16-ричные числа), вводим наше число 3BB080.

Затем переключаем режим на Dec (десятичные) и видим уже преобразованное число в десятичные.

Конец загрузчика.

Сигнатура конца бутового раздела – последовательность байт 55AAh – увидите её внизу. Показывает, что загрузочный сектор закончился. Эта сигнатура присутствует во всех файловых системах, поэтому можно легко идентифицировать конец загрузочного сектора.

Программирование в среде однозадачной операционной системы

МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

«ПЕНЗЕНСКАЯ ГОСУДАРСТВЕННАЯ ТЕХНОЛОГИЧЕСКАЯ АКАДЕМИЯ

Е.В. Грачева

Системное программное обеспечение

Персональных ЭВМ

доктор технических наук, пофессор

зав.кафедрой «Вычислительные машины и системы»

доктор технических наук, пофессор

кафедры «Информационно-вычислительные системы»

Пензенского государственного университета

Грачева Е.В.

Системное программное обеспечение персональных ЭВМ:

Учебнле пособие /Е.В. Грачева – Пенза

Учебное пособие подготовлено на кафедре «Вычислительные машины и системы»

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

Программирование в операционной среде

Операционной средой называется набор функций ОС, сервисов и правила обращения к ним. Поскольку каждая операционная система имеет свой набор функций и правил обращения к ним, программирование в операционной среде каждой ОС должно рассматриваться отдельно [1].

Программирование в среде однозадачной операционной системы

Программы для MS DOS могут быть одного из двух форматов: COM или EXE.

Программы типа COM не могут быть размером более 64 Кб и состоят только из одного сегмента – сегмента кода.

Размер программы типа EXE может превышать 64 кб.

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

Главным входом большинства функций DOS служит прерывание, вызываемое с помощью команды INT 21h. Параметры функциям DOS передаются через регистры микропроцессора: AX (AH и AL), BX, CX, DX; регистровые пары DS:DX и ES:BX используются в основном при передаче адреса ячейки памяти. Через эти же регистры возвращаются результат работы функции DOS, кроме того могут быть установлены флаги в регистре флагов.

Как и любая операционная система, DOS загружает и выполняет программы. При загрузке программы в начале отводимого для нее блока памяти (для СОМ-программ это вся свободная на данный момент память) создается структура данных PSP (префикс программного сегмента) размером 256 байт (100h). Затем DOS создает копию текущего окружения для загружаемой программы, помещает полный путь и имя программы в конец окружения, заполняет поля PSP следующим образом:

+00h: слово – CDh 20h – команда INT 20h. Если СОМ-программа завершается командой RETN, управление передается на эту команду.

+02h: слово – сегментный адрес первого байта после области памяти, выделенной для программы

+04h: байт – не используется DOS

+05h: 5 байт – 9Ah F0h FEh 1Dh F0h – команда CALL FAR на абсолютный адрес 000C0h, записанная так, чтобы второй и третий байты составляли слово, равное размеру первого сегмента для СОМ-файлов (в этом примере FEF0h). Введено для совместимости с командой СР/М CALL 5.

+0Ah: 4 байта – адрес обработчика INT 22h (выход из программы)

+0Eh: 4 байта – адрес обработчика INT 23h (обработчик нажатия Ctrl-Break).

+12h: 4 байта – адрес обработчика INT 24h (обработчик критических ошибок)

+16h: слово – сегментный адрес PSP процесса, из которого был запущен текущий.

+18h: 20 байт – JFT – список открытых идентификаторов, один байт на идентификатор, FFh – конец списка.

+2Ch: слово – сегментный адрес копии окружения для процесса.

+2Eh: 2 слова – SS:SP процесса при последнем вызове INT 21h.

+32h: слово – число элементов JFT (по умолчанию 20).

+34h: 4 байта – дальний адрес JFT (по умолчанию PSP:0018).

+38h: 4 байта – дальний адрес предыдущего PSP.

+3Ch: байт – флаг, указывающий, что консоль находится в состоянии ввода 2-байтного символа.

+3Dh: байт – флаг, устанавливаемый функцией В711h прерывания 2Fh (при следующем вызове INT 21h для работы с файлом имя файла будет замечено на полное).

+3Eh: слово – не используется в DOS.

+40h: слово – версия DOS, которую вернет функция DOS 30h (DOS 5.0+).

+42h: 12 байт – не используется в DOS.

+50h: 2 байта – CDh 21h – команда INT 21h.

+54h: 7 байт – область для расширения первого FCB (FCB, FileControlBlok — это метод работы с файлами, являющийся рудиментом от ранних версий DOS’а. При его использовании можно работать только с файлами в текущем каталоге, причем даже нет возможности сменить каталог (точнее, даже понятия «каталог» в момент создания этих функций вообще не было). Современные программы эти функции не используют. MS-DOS обеспечивает две технологии обслуживания файлов. Первая была разработана при создании версий 1.Х. Эта технология основана на использовании структур данных, называемых блоками управления файлом (FCB). В то время подавляющее большинство компьютеров работало под управлением операционной системы CPM. Блоки FCB обеспечивали совместимость файлов MS-DOS с файлами этой системы. При разработке MS-DOS версий 2.Х, когда была предложена иерархическая структура организации файлов, была разработана вторая технология их обслуживания. Она основана на использовании ссылок на управляющую запись файла и не требует организации FCB. После того, как эта технология была опробована на операционной системе UNIX, она получила широкое распространение.).

+5Ch: 16 байт – первый FCB, заполняемый из первого аргумента командной строки.

+6Ch: 16 байт – второй FCB, заполняемый из второго аргумента командной строки.

+7Ch: 4 байта – не используется в DOS.

+80h: 128 байт – командная строка и область DTA по умолчанию.

Затем DOS записывает программу в память, начиная с адреса PSP:0100h.

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

При запуске СОМ-программы регистры устанавливаются следующим образом:

AL = FFh, если первый параметр командной строки содержит неправильное имя диска (например, z:/something), иначе – 00h.

АН = FFh, если второй параметр содержит неправильное имя диска, иначе 00h.

CS = DS = ES = SS = сегментный адрес PSP.

SP = адрес последнего слова в сегменте (обычно FFFEh; меньше, если не хватает памяти).

При запуске ЕХЕ-программы регистры SS:SP устанавливаются в соответствии с сегментом стека, определенным в программе, затем в любом случае в стек помещается слово 0000h и выполняется переход на начало программы (PSP:0100h для СОМ, собственная точка входа для ЕХЕ).

Все эти действия выполняет одна функция DOS – DOS 4Bh – загрузить и выполнить программу. В качестве параметров этой функции передаются:

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

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

DS:DX – адрес ASCIZ-строки с полным именем программы
ES:BX – адрес блока параметров ЕРВ:

+00h: слово – сегментный адрес окружения, которое будет скопировано для нового процесса (или 0, если используется текущее окружение)
+02h: 4 байта – адрес командной строки для нового процесса
+06h: 4 байта – адрес первого FCB для нового процесса
+0Ah: 4 байта – адрес второго FCB для нового процесса
+0Eh: 4 байта – здесь будет записан SS:SP нового процесса после его завершения (только для AL = 01)
+12h: 4 байта – здесь будет записан CS:IP (точка входа) нового процесса после его завершения (только для AL = 01)

AL = 03h – загрузить как оверлей;
DS:DX – адрес ASCIZ-строки с полным именем программы
ES:BX – адрес блока параметров:

+00h: слово – сегментный адрес для загрузки оверлея
+02h: слово – число, которое будет использовано в командах, использующих непосредственные сегментные адреса, – обычно то же самое число, что и в предыдущем поле. 0 для СОМ-файлов

AL = 05h – подготовиться к выполнению (используется в ОС MS DOS начиная с версии 5.0 и выше)
DS:DX – адрес следующей структуры:

+00h: слово – 00h
+02h: слово:

бит 0 – программа – ЕХЕ
бит 1 – программа – оверлей

+04h: 4 байта – адрес ASCIZ-строки с именем новой программы
+08h: слово – сегментный адрес PSP новой программы
+0Ah: 4 байта – точка входа новой программы
+0Eh: 4 байта – размер программы, включая PSP

CF = 0, если операция выполнена, ВХ и DX модифицируются,
CF = 1, если произошла ошибка, АХ = код ошибки (2 – файл не найден, 5 – доступ к файлу запрещен, 8 – не хватает памяти, 0Ah – неправильное окружение, 0Bh – неправильный формат).

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

В таблице 1 приведены функции прерывания INT 21h.

Таблица 1 -Функции прерывания INT21h

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

Лучшие изречения: Студент — человек, постоянно откладывающий неизбежность. 10529 — | 7318 — или читать все.

Илон Маск рекомендует:  Asp справочник по объектам iis admin
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL
Номер функции Название Входные данные Выходные данные Описание
Функции ввода/вывода данных
01H Ввод с клавиатуры AH = 01H AL = символ, полученный из стандартного ввода Считывает (ожидает) символ со стандартного входного устройства. Отображает этот символ на стандартное выходное устройство (эхо). При распознавании Ctrl-Break выполняется INT 23H. Замечание: Ввод расширенных клавиш ASCII (F1-F12, pgup, курсор и т.п.) требует двух обращений к этой функции. Первый вызов возвращает AL=0. Второй вызов возвращает в AL расширенный код ASCII.
02H Вывод на дисплей AH = 02H DL = символ, выводимый на стандартный вывод Посылает символ из DL на стандартный вывод. Обрабатывает символ Backspace (ASCII 8), перемещая курсор влево на одну позицию и оставляя его в новой позиции. При обнаружении Ctrl-Break выполняется INT 23H.
03H Вспомогательный ввод AH = 03H AL = символ, полученный со стандартного вспомогательного устр-ва Считывает (ожидает) символ со стандартного вспомогательного устройства, COM1 или AUX и возвращает этот символ в AL. Замечание: Ввод не буферизуется и должен опрашиваться (не управляется прерываниями). При запуске DOS порт AUX (COM1) инициализируется так: 2400 бод, без проверки на четность, 1 стоп-бит, 8-битовые слова. Команда DOS MODE используется для установки иных характеристик.
04H Вспомогательный вывод AH = 04H DL = символ, записываемый на стандартное вспомогательное устр-во Посылает символ в DL на стандартное вспомогательное устройство, COM1 или AUX.
05H Вывод на принтер AH = 05H DL = символ, записываемый на стандартный принтер Посылает символ в DL на стандартное устройство принтера, обычно LPT1. Замечание: Команда DOS «MODE» может перенаправить этот вывод в последовательный порт.
06H Консольн. ввод-вывод AH = 06H DL = символ (от 0 до 0feh), посылаемый на стандартный вывод DL = 0ffh запрос ввода со стандартного ввода ZF = Сброшен (NZ), если символ готов при запросе ввода При DL = 0ffh выполняет ввод с консоли «без ожидания», возвращая взведенный флаг нуля (ZF), если на консоли нет готового символа. Если символ готов, сбрасывает флаг ZF (NZ) и возвращает считанный символ в AL. Если DL не равен 0ffh, то DL направляется на стандартный вывод. Замечание: Не проверяет Ctrl-Break. Вызывайте дважды для расширенного ASCII.
07H Нефильтрующий консольный ввод без эха AH = 07H AL = символ, полученный через стандартный ввод Считывает (ожидает) символ со стандартного входного устройства и возвращает этот символ в AL. Не фильтрует: Не проверяет на Ctrl-Break, backspace и т.п. Замечания Вызывайте дважды для ввода расширенного символа ASCII. Используйте функцию 0bh для проверки статуса (если не хотите ожидать нажатия клавиши).
08H Консольный ввод без эха AH = 08H AL = символ, полученный через стандартный ввод Считывает (ожидает) символ со стандартного входного устройства и возвращает этот символ в AL. При обнаружении Ctrl-Break выполняется прерывание INT 23H. Замечание: Вызывайте дважды для ввода расширенного символа ASCII.
09H Выдать строку на дисплей AH = 09H DS:DX = адрес строки, заканчивающейся символом ‘$’ (ASCII 24H) Строка, исключая завершающий ее символ ‘$’, посылается на стандартный вывод. Символы Backspace обрабатываются как в функции 02H Display Char. Обычно, чтобы перейти на новую строку, включают в текст пару CR/LF (ASCII 0dh и ASCII 0ah). Строки, содержащие ‘$’, можно выдать через 40H Write Handle (BX=0).
0ah Ввод строки в буфер AH = 0ah DS:DX = адрес входного буфера (смотри ниже) Буфер содержит ввод, заканчивающийся символом CR (ASCII 0dh) При входе буфер по адресу DS:DX должен быть оформлен так:
Max * * * *

Где max – максимальная допустимая длина ввода (от 1 до 254)

При выходе буфер заполнен следующим образом:

Max Len T E X T 0dh

Где len– действительная длина данных без завершающего CR (здесь — 04H). Символы считываются со стандартного ввода вплоть до CR (ASCII 0dh) или до достижения длины MAX-1. Если достигнут MAX-1, включается консольный звонок для каждого очередного символа, пока не будет введен возврат каретки CR (нажатие Enter).

Второй байт буфера заполняется действительной длиной введенной строки, не считая завершающего CR. Последний символ в буфере — всегда CR (который не засчитан в байте длины). Символы в буфере (включая LEN) в момент вызова используются как «шаблон». В процессе ввода действительны обычные клавиши редактирования: Esc выдает «\» и начинает с начала, F3 выдает буфер до конца шаблона, F5 выдает «@» и сохраняет текущую строку как шаблон, и т.д. Большинство расширенных кодов ASCII игнорируются. При распознавании Ctrl-Break выполняется прерывание INT 23H (буфер остается неизменным).

0bh Проверить статус ввода AH = 0bh AL = 0ffh, если символ доступен со стандартного ввода Проверяет состояние стандартного ввода. При распознавании Ctrl-Break выполняется INT 23H. Замечание: используйте перед функциями 01H 07H и 08H, чтобы избежать ожидания нажатия клавиши. Эта функция дает простой неразрушающий способ проверки Ctrl-Break в процессе длинных вычислений или другой обработки, обычно не требующей ввода. Это позволяет вам снимать счет по нажатию Ctrl-Break.
0ch Ввод с очисткой AH = 0ch AL = номер функции ввода DOS (01H, 06H, 07H, 08H или 0ah) Очищает буфер опережающего ввода стандартного ввода, а затем вызывает функцию ввода, указанную в AL. Это заставляет систему ожидать ввод очередного символа. Следующие значения допустимы в AL: 01H ввод с клавиатуры 06H ввод с консоли 07H Нефильтрующий без эха 08H ввод без эха 0ah буферизованный ввод
Операции с файлами
3ch Создать файл через описатель (дескриптор) AH = 3ch DS:DX = адрес строки ASCIIZ с именем файла CX = атрибут файла AX = код ошибки если CF установлен и описатель файла если ошибки нет DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Файл создается в указанном (или умалчиваемом) оглавлении Файл открывается в режиме доступа чтение/запись Вы должны сохранить описатель (дескриптор, handle) для последующих операций. Если файл уже существует: При открытии файл усекается до нулевой длины Если атрибут файла — только чтение, открытие отвергается (атрибут можно изменить функцией 43H изменить атрибут) CONFIG.SYS специфицирует число доступных описателей в системе Используйте функцию 5bh создать Новый файл, если вы не хотите перекрывать (усекать) существующий файл.
3dh Открыть описатель файла AH = 3dh DS:DX = адрес строки ASCIIZ с именем файла AL = режим открытия AX = код ошибки если CF установлен и описатель файла если нет ошибки. DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Файл должен существовать. См. Функцию 3ch (создать файл). Файл открывается в выбранном режиме доступа / режиме открытия для совместимости с DOS 2.x и избежания сетевых режимов, задавайте: AL = 0 чтобы открыть для чтения AL = 1 чтобы открыть для записи AL = 2 чтобы открыть для чтения и записи Указатель чтения/записи устанавливается в 0. См. 42H (LSEEK) Вы должны сохранить описатель (handle) для последующих операций Разделение файлов должно быть активизировано (команда DOS SHARE), если запрашивается открытие в одном из режимов разделения. CONFIG.SYS специфицирует число доступных описателей файлов.
3eh Закрыть описатель файла AH = 3eh BX = описатель файла AX = код ошибки если CF установлен BX содержит описатель файла (handle), возвращенный при открытии. Файл, представленный этим описателем, закрывается, его буфера сбрасываются, и оглавление обновляется корректными размером, временем и датой. Из-за нехватки описателей файлов (максимум 20, по умолчанию 8), вам может понадобиться закрыть часть умалчиваемых описателей, как, например, описатель 3 (стандартный AUX).
3fh Читать файл через описатель AH = 3fh BX = описатель файла DS:DX = адрес буфера для чтения данных CX = число считываемых байт AX = код ошибки если CF установлен или число действительно прочитанных байт CX байт данных считываются из файла или устройства с описателем, указанным в BX. Данные читаются с текущей позиции указателя чтения/записи файла и помещаются в буфер вызывающей программы, адресуемый через DS:DX. Используйте функцию 42H LSEEK, чтобы установить указатель файла, если необходимо (OPEN сбрасывает указатель в 0). Модифицирует указатель чтения/записи файла, подготавливая его к последующим операциям чтения или записи. Вы должны всегда сравнивать возвращаемое значение AX (число прочитанных байт) с CX (запрошенное число байт): Если AX = CX, (и CF сброшен) — чтение было корректным без ошибок Если AX = 0, достигнут конец файла (EOF) Если AX При чтении с устройства — входная строка имеет длину AX байт При чтении из файла — в процессе чтения достигнут EOF Замечания: Эта функция превосходит сложные и неудобные FCB-функции. Она эффективно сочетает произвольный и последовательный доступ, позволяя пользователю выполнять свое собственное блокирование. Удобно использовать эту функцию для чтения стандартных описателей, таких как описатели стандартного в/в, взамен многочисленных буферизующих и посимвольных FCB-функций ввода. Когда вы читаете с устройства, AX возвращает длину считанной строки с учетом завершающего возврата каретки CR (ASCII 0dh).
40H Писать в файл через описатель AH = 40H BX = описатель файла DS:DX = адрес буфера, содержащего записываемые данные CX = число записываемых байт AX = код ошибки если CF установлен AL = число реально считанных байт (лучший тест для ошибок) CX байт данных записывается в файл или на устройство с описателем, заданным в BX. Данные берутся из буфера, адресуемого через DS:DX. Данные записываются, начиная с текущей позиции указателя чтения/записи файла. Используйте функцию 42H LSEEK, чтобы установить указатель файла, если необходимо (OPEN сбрасывает указатель в 0). Обновляет указатель чтения/записи файла, чтобы подготовиться к последующим операциям последовательного чтения или записи. Вы должны всегда сравнивать возвращаемое значение AX (число записанных байт) с CX (запрошенное число байт для записи). Если AX = CX, запись была успешной Если AX Замечание: Эта функция превосходит сложные и неудобные FCB-функции. Она эффективно сочетает произвольный и последовательный доступ, позволяя пользователю осуществлять собственное блокирование. Удобно использовать эту функцию для вывода на умалчиваемые устройства, такие как стандартный вывод, взамен использования различных функций вывода текста.
42H Установить указатель файла – LSEEK 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.
Операции с файловой системой
0dh Сброс диска AH = 0dh Сбрасывает (пишет на диск) все файловые буфера. Если размер файла изменился, такой файл должен быть предварительно закрыт (при помощи функций 10H или 3eh).
0eh Установить текущий диск DOS AH = 0eh DL = номер диска (0=A, 1=B и т.д.), который становится текущим AL = общее число дисководов в системе Диск, указанный в DL, становится текущим (умалчиваемым) в DOS. Проверка: используйте функцию 19H «дать текущий» для проверки. В регистре AL возвращается число дисководов всех типов, включая твердые диски и «логические» диски (как B: в 1-floppy системе).
19H Дать текущий диск DOS AH = 19H AL = номер текущего умалчиваемого диска (0=A, 1=B, и т.д.) Возвращает номер дисковода текущего умалчиваемого диска DOS.
1bh Дать информацию FAT (текущий диск) AH = 1bh DS:BX = адрес байта FAT > Возвращает информацию о размере и типе умалчиваемого диска. Размер диска в байтах = (DX*AL*CX). Ищите свободную память функциями 36h Disk Free или 32h Disk Info. Версии: DOS 1.x держит FAT в памяти и возвращает DS:BX => FAT. DOS 2.0+ может держать в памяти лишь порцию всей FAT. Предупреждение: Эта функция изменяет содержимое регистра DS.
1ch Дать информацию FAT (любой диск) AH = 1ch DL = номер диска (0=текущий, 1=A, и т.д.) DS:BX = адрес байта FAT > Аналогична функции 1bh Get FAT Cur, с той разницей, что регистр DL указывает диск, для которого вы хотите получить информацию. Версии: Недоступна для DOS 1.x.
32H Дать информацию DOS о диске AH = 32H DL = номер диска (0=текущий, 1=A, и т.д.) AL = 0 если DL задавал корректный диск FF = 0ffh если диск задан неверно DS:BX = адрес блока информации диска для запрошенного устройства Возвращает блок информации, представляющей интерес для приложений и утилит, выполняющих доступ к диску, поддерживаемый драйверами устройств, на уровне секторов. Некоторые дисководы (особенно незагружаемые) функционируют исключительно через свои драйверы устройств. Такие диски могут содержать неверную информацию в корневой записи и таблице разделов, что делает очень трудным определение, например, размера корневого оглавления, числа таблиц FAT, и т.п. Блок информации диска содержит все данные такого рода в хорошо форматированной структуре. Это может быть единственным способом определить адрес драйвера устройства. Предупреждение: Изменяет сегментный регистр DS. Эта недокументированная функция может измениться в будущих версиях.
36H Дать свободную память диска AH = 36H DL = номер диска (0=текущий, 1=A, и т.д.) AX = 0ffffh, если AL содержал неверный номер диска или число секторов на кластер, если нет ошибок. BX = доступных кластеров. CX = байт на сектор. DX = всего кластеров на диске. Возвращает данные для подсчета общей и доступной дисковой памяти. Если в AX возвращено 0ffffh, значит, вы задали неверный диск. Иначе, свободная память в байтах = (AX*BX*CX) всего памяти в байтах = (AX*CX*DX)
39H Создать новое оглавление — MKDIR AH = 39H DS:DX = адрес строки ASCIIZ с именем оглавления AX = код ошибки если CF установлен DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяоглавл»,0 если диск и/или корневой путь опущены, то принимаются по умолчанию. Подоглавление создается и связывается с существующим деревом. Если флаг CF установлен при возврате, то AX содержит код ошибки, и оглавление не создается.
3ah Удалить оглавление – RMDIR AH = 3ah DS:DX = адрес строки ASCIIZ с именем оглавления AX = код ошибки если CF установлен DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяоглавл»,0. Если диск и/или корневой путь опущены, то принимаются по умолчанию. Подоглавление удаляется из структуры оглавления. Если флаг CF установлен при возврате, то AX содержит код ошибки, и оглавление не удаляется. Замечание: Оглавление не должно содержать файлов и подоглавлений и не должно быть связано возможными ограничениями DOS (например, не должно быть задействовано в активных командах JOIN или SUBST).
3bh Установить умалчиваемое оглавление DOS – CHDIR AH = 3bh DS:DX = адрес строки ASCIIZ с именем оглавления AX = код ошибки если CF установлен DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяоглавл»,0. Если диск и/или корневой путь опущены, то принимаются по умолчанию. Указанное подоглавление для указанного диска становится текущим (умалчиваемым) оглавлением DOS для этого (или текущего) диска. Если флаг CF установлен при возврате, то AX содержит код ошибки, и текущее оглавление для выбранного диска не изменяется.
41H Удалить файл AH = 41H DS:DX = адрес строки ASCIIZ с именем файла AX = код ошибки если CF установлен DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Имя файла не может содержать обобщенные символы (‘?’ и ‘*’). Файл удаляется из заданного оглавления заданного диска. Если файл имеет атрибут только чтение, то перед удалением необходимо изменить этот атрибут через функцию 43H CHMOD.
43H Установить/опросить атрибут файла – CHMOD AH = 43H DS:DX = адрес строки ASCIIZ с именем файла AL — код подфункции: = 0 — извлечь текущий атрибут файла AL = 1 — установить атрибут файла CX = новый атрибут файла (для подфункции 01H) AX = код ошибки если CF установлен CX = текущий атрибут файла (для подфункции 00H) DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Атрибут файла извлекается или устанавливается, согласно коду в AL. Замечание: Чтобы спрятать оглавление, используйте CX=02H (а не 12H, как вы, возможно, ожидали, см. описание файловой системы FAT, аттрибуты файлов).
45H Дублировать описатель файла – DUP AH = 45H BX = существующий описатель файла AX = новый описатель файла, дублирующий оригинал или код ошибки если CF установлен. Создает дополнительный описатель файла, ссылающийся на тот же поток в/в, что и существующий описатель. Любое продвижение указателя чтения/записи для одного описателя действует на его дубликат — включая любые операции чтения, записи или перемещения указателя посредством функции 42H LSEEK. Новый описатель наследует ограничения режима открытия оригинала. Эта функция используется с одной главной целью: вы можете закрыть описатель, заставляя DOS записать файловые буфера. Такой способ DUP/CLOSE — быстрее, чем закрытие и повторное открытие файла. Оставить комментарий – для сохранения файла без его закрытия – CTRL+S
46H Переназначить описатель – FORCDUP AH = 46H BX = целевой описатель файла (должен уже существовать) CX = исходный описатель файла (должен уже существовать) AX = код ошибки если CF установлен Заставляет описатель файла (handle) ссылаться на другой файл или устройство. Описатель в CX (источник) закрывается, если он открыт, а затем становится дубликатом описателя в BX (назначения). Иными словами, описатели в CX и BX будут ссылаться на один и тот же физический файл или устройство. Используется для переназначения стандартного в/в. Пример: Откроем файл «C:\STDOUT.TXT» через функцию 3dh Open File и получим описатель (например, 05). Установим BX=05, CX=01 и вызовем эту функцию. (замечание: описатель 01 — это предопределенный описатель «стандартного выходного устройства»). Теперь можно вызвать функцию 3eh Close File и закрыть handle 05. Можно обращаться к файлу STDOUT.TXT через описатель 01. Стало быть, дисковый файл «C:\STDOUT.TXT» будет отныне получать весь вывод, создаваемый всеми процессами (текущим и порожденными) через любую функцию символьного в/в DOS, так же как и любой вывод в описатель файла 01 через функцию DOS 40H. Когда вы выходите в COMMAND.COM, предопределенные описатели устанавливаются на обычные устройства (например, описатель 01 устанавливается на «CON»).
47H Дать умалчиваемое оглавление DOS AH = 47H DS:SI = адрес локального буфера для результирующего пути (64 байта) DL = номер диска (0=текущий, 1=A, и т.д.) AX = код ошибка если CF установлен В пользовательский буфер по адресу DS:SI помещается в форме ASCIIZ путь текущего умалчиваемого оглавления для диска, указанного в DL. Путь возвращается в формате: «путь\оглавление»,0. Не подставляется впереди буква диска, а сзади не подставляется символ «\». Например, если текущим является корневое оглавление, эта функция вернет вам пустую строку (DS:[SI] = 0).
4eh Найти 1-й совпадающий файл AH = 4fh DS:DX = адрес строки ASCIIZ с именем файла (допускаются ? И *) CX = атрибут файла для сравнения AX = код ошибки если CF установлен DTA = заполнена данными (если не было ошибки) DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они подразумеваются по умолчанию. Обобщенные символы и ? Допускаются в имени файла и расширении. DOS находит имя первого файла в оглавлении, которое совпадает с заданным именем и атрибутом, и помещает найденное имя и другую информацию в DTA, как показано ниже: Замечания: Атрибут файла обычно используется во «включающем» поиске. Если вас интересуют как файлы, так и оглавления, установите бит атрибута 4 (т.е. Attr | 10H). См. Атрибут файла для полной информации. Типичная последовательность, используемая для поиска всех подходящих файлов: Используйте вызов 1ah, чтобы установить DTA на локальный буфер (или используйте умалчиваемую DTA в PSP по смещению 80H) Уст. CX=атрибут, DS:DX => ASCIIZ диск, путь, обобщенное имя Вызовите функцию 4eh (Найти 1-й) Если флаг CF указывает ошибку, вы закончили (нет совпадений) Уст. DS:DX => DTA (или на данные, которые вы скопировали из DTA после вызова функции 4eh) Повторять Обработать имя файла и данные по адресу DS:DX Вызвать функцию 4fh (Найти следующий) Пока CF=1 не покажет, что совпадений больше нет
4fh Найти следующий совпадающий файл AH = 4fh DS:DX = адрес данных, возвращенных предыдущей 4eh Найти 1-й файл AX = код ошибки если CF установлен DTA = заполнена данными DS:DX указывает на 2bh-байтовый буфер с информацией, возвращенной функцией 4eh Найти 1-й (либо DTA, либо буфер, скопированный из DTA). Используйте эту функцию после вызова 4eh. Следующее имя файла, совпадающее по обобщенному имени и атрибуту файла, копируется в буфер по адресу DS:DX вместе с другой информацией (см. Функцию 4eh о структуре файловой информации в буфере, заполняемом DOS).
56H Переименовать/переместить файл AH = 56H DS:DX = адрес старого ASCIIZ имени (путь/имя существующего файла) ES:DI = адрес нового ASCIIZ имени (новые путь/имя) AX = код ошибки если CF установлен DS:DX и ES:DI указывают на строки ASCIIZ: «d:\путь\имяфайла»,0. Старое имя DS:DX должно отвечать существующему файлу и не может содержать обобщенных символов. Диск и путь необязательны (если опущены, они принимаются по умолчанию). Новое имя ES:DI должно описывать НЕ существующий файл. Если указан диск, он должен быть тем же, что и в старом имени. Если диск или путь опущены, принимаются текущие умолчания. Если старое и новое имя содержат разные пути (явно или принятые по умолчанию), то элемент оглавления для файла ПЕРЕМЕЩАЕТСЯ в оглавление, указанное в новом имени. Замечание: Если ID диска в старом имени отличается от текущего диска DOS, не забывайте указывать такой же ID диска в новом имени.
57H Установить/опросить дату/время файла AH = 57H AL = 0 чтобы получить дату/время файла = 1 чтобы установить дату/время файла BX = описатель файла (handle) CX = (если AL=1) новая отметка времени в формате время/дата файла DX = (если AL=1) новая отметка даты в формате время/дата файла AX = код ошибки если CF установлен CX = отметка времени файла в формате время/дата файла DX = отметка даты файла в формате время/дата файла BX должен содержать описатель открытого файла (см. 3ch или 3dh ). Укажите подфункцию, 0 или 1, в регистре AL. DX и CX задаются в формате памяти; например, младшие 8 бит даты находятся в DH.
5ah Создать уникальный временный файл AH = 5ah DOS 3.0+ DS:DX = адрес строки ASCIIZ с диском и путем (заканчивается \) CX = атрибут файла AX = код ошибки если CF установлен и описатель файла (если нет ошибки) DS:DX = (не изменяется) становится полным ASCIIZ-именем нового файла Открывает (создает) файл с уникальным именем в оглавлении, указанном строкой ASCIIZ, на которую указывает DS:DX. COMMAND.COM использует эту функцию, когда создает временные «канальные» файлы, используемые при переназначении ввода-вывода. Описание пути должно быть готово к присоединению в его конец имени файла. Вы должны обеспечить минимум 12 байт в конце строки. Сама строка должна быть заполнена в одной из форм: «d:\путь\»,0 (указаны диск и путь) ИЛИ «d:»,0 (умалчиваемое оглавление диска) ИЛИ «d:\»,0 (корневое оглавление диска) ИЛИ «»,0 (умалчиваемые диск и оглавление) После возврата строка DS:DX будет дополнена именем файла. Замечания: DOS создает имя файла из шестнадцатеричных цифр, получаемых из текущих даты и времени. Если имя файла уже существует, DOS продолжает создавать новые имена, пока не получит уникальное имя. Создаваемые таким способом файлы — по существу НЕ ВРЕМЕННЫЕ, и их следует удалять посредством функции DOS 41H , когда они не нужны. Версии: Доступна, начиная с DOS 3.0
5bh Создать новый файл AH = 5bh DOS 3.0+ DS:DX = адрес строки ASCIIZ с именем файла CX = атрибут файла AX = код ошибки если CF установлен и описатель файла если ошибок нет DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Этот вызов идентичен функции DOS 3ch CREATE, с тем исключением, что он вернет ошибку, если файл с заданным именем уже существует. Файл открывается для чтения/записи в совместимом режиме доступа
5ch Блокировать/разблокировать доступ к файлу AH = 5ch DOS 3.0+ AL = подфункция: 0 = заблокировать область файла = 1 = разблокировать ранее захваченную область BX = описатель файла (handle) CX:DX = смещение ((CX 65536) + DX) от начала файла SI:DI = длина блокируемой области ((SI 65536) + DI) байт AX = код ошибки если CF установлен Блокирует или освобождает доступ к участку файла, идентифицируемого описателем в BX. Область файла, начинающаяся по логическому смещению CX:DX и имеющая длину SI:DI, блокируется (захватывается) или разблокируется (освобождается). Смещение и длина обязательны. Разделение файлов ДОЛЖНО быть активизировано (командой SHARE), иначе функция вернет код ошибки «неверный номер функции.» Блокировка действует на операции чтения, записи и открытия со стороны порожденного или конкурирующего процесса. При попытке такого доступа (и режиме доступа , определенном при OPEN как «режим разделения», который запрещает такой доступ), DOS отвергает операцию через вызов INT 24H (обработчик критических ошибок) после трех попыток. DOS при этом выдает сообщение «Abort, Retry, Ignore». Рекомендуемое действие — НЕ пытаться читать файл и ожидать кода ошибки. Вместо этого попытайтесь заблокировать область и действуйте в соответствии с кодом возврата. Это позволяет избежать довольно неустойчивого состояния DOS, связанного с выполнением INT 24H. Блокировка за концом файла не является ошибкой. Вы можете захватить весь файл, задав CX=0, DX=0, SI=0ffffh, DI=0ffffh и AL=0. При освобождении, смещение и длина участка должны точно совпадать со смещением и длиной захваченного участка. Замечания: Дублирование описателя через 45H или 46H дублирует и блокировки. Даже если во время OPEN выбран режим доступа Inherit, механизм блокировки не даст никаких привилегий доступа порожденным процессам, созданным функцией 4bh EXEC (они трактуются как отдельные). Важно, чтобы все блокировки файла были сняты до завершения программы. Если вы используете блокировку, особо отслеживайте вызовы INT 23H (выход Ctrl-Break) и INT 24H (выход по критической ошибке), чтобы снять блокировки до действительного завершения программы. Рекомендуется освобождать блокировки как можно скорее. Всегда блокируйте, обрабатывайте файл и освобождайте блокировку одной операцией. Версии: Доступна, начиная с DOS 3.0
Операции с системой прерываний
25H Установить вектор прерывания AH = 25H AL = номер прерывания DS:DX = вектор прерывания: адрес программы обработки прерывания Устанавливает значение элемента таблицы векторов прерываний для прерывания с номером AL равным DS:DX. Это равносильно записи 4-байтового адреса в 0000:(AL*4), но, в отличие от прямой записи, DOS здесь знает, что вы делаете, и гарантирует, что в момент записи прерывания будут заблокированы. Предупреждение: Не забудьте восстановить DS (если необходимо) после этого вызова.
26H Построить PSP AH = 26H DX = адрес сегмента (параграфа) для нового PSP CS = сегмент PSP, используемого как шаблон для нового PSP Устанавливает PSP для порождаемого процесса по адресу DX:0000. Текущий PSP (100H байт, начиная с CS:0), копируется в DX:0 Поле memtop соответственно корректируется Векторы Terminate, Ctrl-Break и Critical Error копируются в PSP из векторов прерываний INT 22H, INT 23H и INT 24H после этого вы можете загрузить программу с диска и передать ей управление посредством FAR JMP. Замечание: Если вы перехватываете INT 21H, позаботьтесь о помещении в стек корректного CS:IP. Еще лучше использовать функцию 4ch (EXEC).
2ah Дать системную дату AH = 2ah AL = день недели (0=Вск, 1=Пнд. 6=Суб) DOS 3.0+ CX = год (1980 до 2099) DH = месяц (1 до 12) DL = день (1 до 31) Возвращает текущую дату, как она известна системе. Версии: DOS 2.x не гарантирует возврата в AL значения дня; все версии 1.0+ возвращают правильный день недели. Версии до 2.1 имеют проблемы с переходом даты.
2bh Установить системную дату AH = 2bh CX = год (1980 до 2099) DH = месяц (1 до 12) DL = день (1 до 31) AL = 0 если дата корректна Устанавливает системную дату DOS.
2ch Дать время DOS AH = 2ch CH = часы (0 до 23) CL = минуты (0 до 59) DH = секунды (0 до 59) DL = сотые доли секунды (0 до 99) Возвращает текущее время, как оно известно системе. Замечание: Поскольку системные часы имеют частоту 18.2 тиков в секунду (интервал 55мс), DL имеет точность 0.04 сек.
2dh Установить время DOS AH = 2dh CH = часы (0 до 23) CL = минуты (0 до 59) DH = секунды (0 до 59) DL = сотые доли секунды (0 до 99) AL = 0 если время корректно Устанавливает системное время DOS.
2eh Установить/сбросить переключатель верификации AH = 2eh AL = 0 отключить верификацию = 1 включить верификацию Устанавливает, должна ли DOS верифицировать (считывать обратно) каждый сектор, записываемый на диск. Это замедляет операции записи на диск, но гарантирует максимальную надежность записи. Функция 56H Get Verify возвращает текущий статус верификации DOS.
2fh Дать адрес текущей DTA AH = 2fh ES:BX = адрес начала текущей DTA Возвращает адрес начала области ввода-вывода (DTA). Поскольку DTA глобальна для всех процессов, в рекурсивной процедуре (например, при проходе по дереву оглавления) может потребоваться сохранить адрес DTA, а впоследствии восстановить его посредством функции 1ah «Уст. DTA». Замечание: Эта функция изменяет сегментный регистр ES.
30H Дать номер версии DOS AH = 30H AL = старший номер версии AH = младший номер версии BX,CX = 0000H DOS 3.0+ Возвращает в AX значение текущего номера версии DOS. Например, для DOS 3.2, в AL возвращается 3, в AH — 2. Замечание: Если в AL возвращается 0, можно предполагать, что работает DOS более ранней версии, чем DOS 2.0. Версии: DOS 2.x не гарантирует очистки регистров CX и BX.
31H Завершиться и остаться резидентным – KEEP AH = 31H AL = код выхода DX = объем памяти, оставляемой резидентной, в параграфах Выходит в родительский процесс, сохраняя код выхода в AL. Код выхода можно получить через функцию 4dh Wait. DOS устанавливает начальное распределение памяти, как специфицировано в DX, и возвращает управление родительскому процессу, оставляя указанную память резидентной (число байт = DX 16). Эта функция перекрывает функцию INT 27H, которая не возвращает код выхода и неспособна установить резидентную программу, большую 64K.
33H Установить/опросить статус Ctrl-Break AH = 33H AL = 0 чтобы опросить текущий статус контроля Ctrl-Break AL = 1 чтобы установить статус контроля Ctrl-Break DL = требуемый статус (0=OFF, 1=ON) (только при AL=1) DL = текущий статус (0=OFF, 1=ON) Если AL=0, в DL возвращается текущий статус контроля Ctrl-Break. Если AL=1, в DL возвращается новый текущий статус. Когда статус ON, DOS проверяет на Ctrl-Break с консоли для большинства функций (исключая 06H и 07H). При обнаружении, выполняется INT 23H (если оно не перехватывается, то это снимает процесс). Когда статус OFF, DOS проверяет на Ctrl-Break лишь при операциях стандартного в/в, стандартной печати и стандартных операциях AUX.
35H Дать вектор прерывания AH = 35H AL = номер прерывания (00H до 0ffh) ES:BX = адрес обработчика прерывания Возвращает значение вектора прерывания для INT (AL); то есть, загружает в BX 0000:[AL*4], а в ES — 0000:[(AL*4)+2]. Предупреждение: Эта функция изменяет сегментный регистр ES.
44H Управление устройством в/в – IOCTL AH = 43H AL = код подфункции: AL = 0ch — (зарезервировано) Прочие = (в зависимости от подфункции) AX = код ошибки если CF установлен или иное значение (в зависимости от подфункции) IOCTL предоставляет метод взаимодействия с устройствами и получения информации о файлах. Входные параметры и выходные значения варьируются в зависимости от кода подфункции в регистре AL. Версии: Подфункции 0-7 . DOS 2.1+ Подфункции 8,0bh . DOS 3.0+ Подфункции 9,0ah . DOS 3.1+ Подфункции 0dh,0eh,0fh . DOS 3.2+ ———————————— Подфункция 00H: Запросить флаги информации об устройстве Вход: BX= описатель файла (устройство или дисковый файл) Выход: DX= IOCTL Инф об устр ———————————— Подфункция 01H: установить флаги информации об устройстве Вход: BX = описатель файла (устройство или дисковый файл) DX = IOCTL Инф об устр (DH должен быть нулевым) Выход: DX= IOCTL Инф об устр ———————————— Подфункция 02-03: читать (AL=02H) или писать (AL=03H) строку IOCTL на СИМВОЛЬНОЕ устр Вход: DS:DX = адрес буфера (чтение) или данных (запись) CX= число передаваемых байт BX= описатель файла (только устройство — не файл!) Выход: AX= код ошибки если CF установлен ———————————— Подфункция 04-05: читать (AL=04H) или писать (AL=05H) строку IOCTL на БЛОЧНОЕ устр Вход: DS:DX = адрес буфера (чтение) или данных (запись) CX = число передаваемых байт BL = : Вход: CL = код действия 40H = установить параметры устройства 60H = дать параметры устройства 41H = писать дорожку логического устройства 61H = читать дорожку логического устройства 42H = форматировать дорожку с верификацией 62H = Верифицировать дорожку логического устройства DS:DX=> адрес пакета данных IOCTL Выход: AX= код ошибки если CF установлен DS:DX=> пакет данных может содержать информацию возврата. ———————————— Подфункция 0eh: Выяснить, назначил ли драйвер устройства несколько логических устройств одному физическому устройству. [DOS 3.2+] Вход: BL= . Эта функция позволяет вам сообщать DOS, что диск с указанным >
48H Распределить память (дать размер памяти) AH = 48H BX = запрошенное количество памяти в 16-байтовых параграфах AX = код ошибки если CF установлен BX = размер доступной памяти в параграфах (если памяти не хватает) AX = сегментный адрес распределенного блока (если нет ошибок) Распределяет блок памяти длиной BX параграфов, возвращая сегментный адрес этого блока в AX (блок начинается с AX:0000). Если распределение неудачно, устанавливается CF, в AX возвращается код ошибки, а BX содержит максимальный размер доступной для распределения памяти (в параграфах). Чтобы определить наибольший доступный кусок, общепринято устанавливать BX=0ffffh перед вызовом. Распределение завершится с ошибкой, возвратив размер максимального блока памяти в BX. Замечание: Когда процесс получает управление через функцию 4bh EXEC, вся доступная память уже распределена ему.
49H Освободить распределенный блок памяти AH = 49H ES = сегментный адрес (параграф) освобождаемого блока памяти AX = код ошибки если CF установлен Освобождает блок памяти, начинающийся с адреса ES:0000. Этот блок становится доступным для других запросов системы. Вообще говоря, вы должны освобождать лишь те блоки памяти, которые вы получили через функцию 48H распределить память. Родитель отвечает за освобождение памяти порожденных процессов. Тем не менее, ничто не препятствует вам освобождать память чужих процессов.
4ah Сжать или расширить блок памяти AH = 4ah ES = сегмент распределенного блока памяти BX = желаемый размер блока в 16-байтовых параграфах AX = код ошибки если CF установлен BX = наибольший доступный блок (если расширение неудачно) Изменяет размер существующего блока памяти. Когда программа получает управление, функция 4bh EXEC уже распределила блок памяти, начиная с PSP, который содержит всю доступную память. Чтобы освободить память для запуска порождаемых процессов, блок памяти, начинающийся с PSP, необходимо сначала сжать. Замечание: Функция 31H (KEEP) и INT 27H (TSR) сжимают блок по адресу PSP.
4bh Выполнить или загрузить программу – EXEC AH = 4bh DS:DX = адрес строки ASCIIZ с именем файла, содержащего программу ES:BX = адрес EPB (EXEC Parameter Block — блока параметров EXEC) AL = 0 = загрузить и выполнить AL = 3 = загрузить программный оверлей AX = код ошибки если CF установлен Предоставляет средства одной программе (родителю) вызвать другую программу (ребенка), которая по завершению возвратит управление родителю. DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имяфайла»,0. Если диск или путь опущены, они подразумеваются по умолчанию. ES:BX указывает на блок памяти, подготовленный как EPB, формат которого зависит от запрошенной подфункции в AL. AL=0 EXEC: так как родительская программа первоначально получает всю доступную память в свое распоряжение, вы должны освободить часть памяти через функцию 4ah до вызова EXEC (AL=0). Обычная последовательность: 1. Вызовите функцию 4ah с ES=сегменту PSP и BX=минимальному объему памяти, требуемой вашей программе (в параграфах). 2. Подготовьте строку ASCIIZ с именем вызываемого программного файла и установите DS:DX на первый символ этой строки. 3. Подготовьте блок параметров EXEC со всеми необходимыми полями. 4. Сохраните текущие значения SS, SP, DS, ES и DTA в переменных, адресуемых через регистр CS (CS — это единственная точка для ссылок после того, как EXEC вернет управление от ребенка). 5. Выдайте вызов EXEC с AL=0. 6. Восстановите локальные значения SS и SP. 7. Проверьте флаг CF, чтобы узнать, не было ли ошибки при EXEC. 8. Восстановите DS, ES и локальную DTA, если необходимо. 9. Проверьте код выхода через функцию 4dh WAIT (если надо). Все открытые файлы дублируются, так что ребенок может обрабатывать данные как через описатели файлов, так и через стандартный в/в. Режимы доступа описателей дублируются, но любые активные блокировки файлов не будут относиться к ребенку. См. Функцию 5ch. После возврата из ребенка, векторы INT 22H Terminate, INT 23H Ctrl-Break и INT 24H Critical Error восстанавливаются в их предыдущие значения. AL=3 LOAD: Эта подфункция используется для загрузки «оверлея». DS:DX указывает на ASCIIZ имя файла, а ES:BX указывает на «LOAD»-версию блока параметров EXEC. Главное значение этой подфункции в том, что она считывает заголовок EXE и выполняет необходимые перемещения сегментов, как это требуется для программ .EXE. Замечания: Эта функция использует программу-загрузчик из COMMAND.COM, который транзитен в DOS 2.x (и, возможно, уже перекрыт программой). В этом случае возникнет ошибка, если DOS не найдет файл COMMAND.COM. Вы должны обеспечить корректную строку COMSPEC= в окружении перед вызовом этой функции. Вместо разбора собственных FCB (как требуется для EPB), вы можете найти удобным загрузить и выполнить вторичную копию файла COMMAND.COM, используя опцию /C. Например, чтобы выполнить программу FORMAT.COM, установите DS:DX на адрес строки ASCIIZ: «\command.com»,0 и установите EPB+2 на сегмент и смещение следующей строки команд: 0eh,»/c format a:/s/4″,0dh такой вторичный интерпретатор команд использует очень мало памяти (около 4K). Вы можете поискать в окружении DOS строку COMSPEC=, чтобы установить точное местоположение файла COMMAND.COM.
4ch Завершить программу – EXIT AH = 4ch AL = код выхода Возвращает управление от порожденного процесса его родителю, устанавливая код выхода, который можно опросить функцией 4dh WAIT. Управление передается по адресу завершения в PSP завершающейся программы. Векторы Ctrl-Break и Critical Error восстанавливаются к старым адресам, сохраненным в родительском PSP. Замечание: Значение ERRORLEVEL (используемое в пакетных файлах DOS) можно использовать для проверки кода выхода самой последней программы.
4dh Дать код выхода программы – WAIT AH = 4dh AL = код выхода последнего завершившегося процесса AH = 0 — нормальное завершение AH = 1 — завершение через Ctrl-Break AH = 2 — завершение по критической ошибке устройства AH = 3 — завершение через функцию 31H KEEP Возвращает код выхода последнего из завершившихся процессов. Эта функция возвращает правильную информацию только однажды для каждого завершившегося процесса.
54H Дать переключатель верификации DOS AH = 54H AL = 0 если верификация выключена (OFF) AL = 1 если верификация включена (ON) Возвращает текущий статус верификации записи DOS. Если в AL возвращается 1, то DOS считывает обратно каждый сектор, записываемый на диск, чтобы проверить правильность записи. Функция DOS 2eh позволяет установить/изменить режим верификации.
59H Дать расширенную информацию об ошибке AH = 59H DOS 3.0+ BX = 0000H (номер версии: 0000H для DOS 3.0, 3.1 и 3.2) AX = расширенный код ошибки (0, если не было ошибки) BH = класс ошибки BL = предлагаемое действие CH = сфера (где произошла ошибка) Используйте эту функцию, чтобы уточнить, что предпринять после сбоя функции DOS по ошибке (только DOS 3.0+ ). Вызывайте ее: В обработчике критических ошибок INT 24H После любой функции INT 21H , возвратившей Carry-флаг После вызова FCB-функции, возвратившей AL=0ffh Версии: Эта функция отсутствует в версиях до DOS 3.00. В DOS 2.x, когда флаг CF указывает на ошибку, используйте логику вашей программы, чтобы отреагировать на ошибку. В DOS 3.0+, когда функция возвращает CF=1, рекомендуем вам игнорировать код ошибки, возвращенный в AX, вызвать эту функцию и выполнить действие, предложенное в BL.
5eh Разные сетевые функции AH = 5eh DOS 3.1+ AL = подф.: 0=дать имя машины (узла) в сети AL = 2=установить стартовую строку сетевого принтера AL = 3=извлечь стартовую строку сетевого принтера Прочие = (зависят от подфункции) AX = код ошибки если CF установлен Прочие = (зависят от подфункции) Эти функции доступны при установленной IBM PC Network Program. Версии: Доступны, начиная с DOS 3.1 ———————————— Подф. 00H: Извлекает имя машины (узла), как оно известно в сети. Вход: DS:DX=> буфер пользователя для ASCIIZ сетевого имени Выход: DS:DX=> буфер, содержащий сетевое имя CH= 0=имя не определено; иначе=имя определено CL= номер имени NETBIOS (если CH ненулевой) AX= код ошибки если CF установлен Замечание: Сетевое имя — 15-симв. (дополненная пробелами) строка ASCIIZ ———————————— Подф. 02H: Задает настроечную строку, посылаемую на принтер каждый раз, когда эта машина выдает результаты на сетевой принтер. Вход: DS:SI=> буфер, содержащий настроечную строку (до 64 байт) CX= длина настроечной строки BX= индекс в списке назначений, отвечающий принтеру Выход: AX= код ошибки если CF установлен ———————————— Подф. 03H: Извлекает настроечную строку принтера, заданную ранее посредством DOS Fn 5eh подф. 02H. Вход: DS:DI=> 64-байтовый буфер пользователя для результата bx= индекс принтера в списке назначений Выход: ES:DI=> буфер, заполненный настроечной строкой CX= длина настроечной строки AX= код ошибки если CF установлен Замечание: Поскольку индекс в списке назначений может измениться в любой момент, используйте функцию 5fh подф. 02H, чтобы получить индекс непосредственно перед вызовом этой функции.
5fh Переназначение устройств в сети AH = 5fh DOS 3.1+ AL = подф.: 2=получить элемент списка переназначений устройств = 3=переназначить сетевое устройство = 4=отменить переназначение сетевого устройства Прочие = (зависят от подфункции) AX = код ошибки если CF установлен Эти функции доступны при установленной IBM PC Network Program. Версии: Доступны, начиная с DOS 3.1 ———————————— Подф. 02H: Извлекает элемент из списка переназначений сетевых устройств. Вход: DS:DI=> 128-байтовое ASCIIZ локальное имя устр. («LPT1»,0) ES:DI=> 128-байтовый буфер с ASCIIZ сетевым именем BX= индекс в списке назначений Выход: DS:DI=> ASCIIZ локальное имя устройства (напр., «LPT1»,0) ES:DI=> ASCIIZ сетевое имя BL= тип устр: 3=принтер; 04=файл ‘устройство’ BH= статус устр: бит 0=1 -неверное устр.; 0=верное CX= сохраненный параметр (при NETBIOS, всегда 0) AX= код ошибки если CF установлен DX,BP = (изменены) Замечание: обычно эту функцию вызывают с BX=0, затем повторяют вызовы, увеличивая значение BX, пока DOS не вернет ошибку 12H (больше нет файлов). ———————————— Подф. 03H: этот вызов определяет имена оглавлений для сети и перенаправляет доступ на сетевые принтеры. Замеч: доступ к принтеру переназначается на уровне ROM-BIOS INT 17H. Вход: DS:SI = ASCIIZ имя исходного устройства ES:DI = ASCIIZ назначение (сетевой путь с паролем) BL= тип устр: 03=принтер; 04=файл ‘устройство’ CX= параметр для вызывающего (задавайте 0 для NETBIOS) Выход: AX= код ошибки если CF установлен Замеч: если BL=03, то источник задает ASCIIZ-имя принтера (например, «LPT1»,0). Назначение кодируется в форме: [\\computername\],0,[password],0. Если пароль начинается с 00, считается, что пароля нет. Если BL=04, то источник задает ASCIIZ-имя диска (например, «F:»,0), а назначение — ASCIIZ-имя пути. После вызова этой функции, локальные обращения к этому диску переназначаются на выбранные имя компьютера и путь. ———————————— Подф. 04H: Отменить сетевое переназначение для указанного устройства. Вход: DS:SI=> ASCIIZ-имя устройства или ,0), то переназначение этого диска прекращается, и ID диска восстанавливает свое предыдущее значение.