Dos fn 33h установитьопросить статус ctrl break


Содержание

BREAK — включить или отключить обработку CTRL+C в DOS.

&nbsp &nbsp Команда BREAK является встроенной командой интерпретатора команд CMD.EXE и включена для совместимости с системами семейства DOS. Она не оказывает никакого влияния на работу Windows. При включении расширенной обработки команд в операционной ОС Windows, команда BREAK вызывает состояние точки останова в процессе отладки программы с помощью отладчика.

Параметры командной строки:

ON — комбинация клавиш CTRL+C позволяет принудительно завершить выполнение командного файла.

OFF — комбинация клавиш CTRL+C игнорируется. Для принудительного завершения командного файла можно использовать комбинацию клавиш CTRL+Break .

Подробное исследование работы клавиатуры ПК и обслуживающих ее прерываний , страница 13

Для примера, дайте команду DOS DIR, а затем, во время вывода каталога на экран, нажмите Ctrl-NumLock на 83-клавишной клавиатуре или Pause на 101-клавишной для остановки вывода (желательно, чтобы каталог был большим). Теперь нажмите любую клавишу сдвига. Состояние изменится, однако DOS не возобновит вывод списка каталога.

Комбинация клавиш Ctrl-S тоже останавливает вывод каталога, однако это реализовано не программой INT 09H. Ctrl-S обрабатывается и вводится в буфер клавиатуры точно так же, как и любой другой символ, a DOS уже интерпретирует ее как команду паузы.

Ctrl-Alt-Del

Комбинация Ctrl-Alt-Del имеет специальное назначение. При ее обнаружении в ячейку RESET_FLAG, находящуюся в области данных BIOS, заносится значение 1234H и выполняется переход на процедуру инициализации, которая выполняется обычно при включении компьютера. Программа инициализации проверяет RESET_FLAG и пропускает самопроверку в том случае, если его значение равно 1234H. Таким образом осуществляется «теплая» перезагрузка.

Если вы обратитесь к байту KD_FLAG, то заметите, что в нем зарезервированы биты для индикации состояния клавиш Ctrl и Alt, но не Del. Бита состояния клавиши Del нет также и в KD_FLAG1. Это означает, что INT 09H не имеет возможности хранения состояния клавиши Del. Поэтому для перезагрузки необходимо сначала нажать клавиши Ctrl и Alt а затем Del. Порядок нажатия клавиш Ctrl и Alt не имеет значения, важно только нажать Del в последнюю очередь.

Ctrl-Break

При обнаружении этой комбинации INT 09H выполняет несколько действий. Сначала очищается буфер клавиатуры путем установки указателя начала буфера равным указателю конца. Затем INT 09H устанавливает в 1 старший бит байта BIOS_BREAK с адресом 40:71Н в области данных BIOS. Любая программа может проверить значение этого бита для определения состояния Ctrl-Break. Затем INT 09H вызывает прерывание INT 1BH. Обычно INT 1BH указывает на обработчик DOS. но любая программа может перехватить этот вектор и тем самым самостоятельно обрабатывать Ctrl-Break. Если прерывание INT 1BH вызывает обработчик DOS, то последний устанавливает внутренний флаг Ctrl-Break DOS. При этом любая программа, использующая функции ввода/вывода DOS при взведенном флаге Ctrl-Break (Ctrl-Break DOS а не INT 09H), будет прервана. DOS отобразит на экране значок «^С» и выведет приглашение командной строки. Последнее, что делает INT 09H с Ctrl-Break — это помещает нулевой символ и скан-код в буфер клавиатуры.

Ввод Ctrl-C тоже интерпретируется как Ctrl-Break. Выполнение этой команды, так же как и выполнение Ctrl-S, не является функцией INT 09H. Ctrl-C обрабатывается INT 09H в той же последовательности, как и любой другой символ, а уже DOS сама интерпретирует ее как команду прерывания.

При нажатии комбинации Shift-PrtScrn на 83-клавишной клавиатуре или специальной клавиши PrintScreen на 101-клавишной, INT 09H просто вызывает INT 05H для посылки лампа экрана на принтер. INT 09H непосредственно печатью не занимается.

Алфавитно-цифровые клавиши

Если INT 09H не обнаруживает специальных скан-кодов, то она полагает, что принятый скан-код принадлежит алфавитно-цифровому символу ASCII. Для алфавитно-цифровых символов INT 09H проверяет состояние CapsLock. Затем INT 09H заносит в буфер как сам ASCII-символ, так и скан-код нажатой клавиши. Это дает возможность прикладной программе либо прочитать ASCII-символ, либо определить нажатую клавишу. Однако, прежде чем что-либо занести в буфер программа INT 09H должна проверить, есть ли в нём место. Если места недостаточно, то INT 09H сообщает об этом сигналом динамика и завершает свое выполнение без занесения символа в буфер.

  • АлтГТУ 419
  • АлтГУ 113
  • АмПГУ 296
  • АГТУ 266
  • БИТТУ 794
  • БГТУ «Военмех» 1191
  • БГМУ 172
  • БГТУ 602
  • БГУ 153
  • БГУИР 391
  • БелГУТ 4908
  • БГЭУ 962
  • БНТУ 1070
  • БТЭУ ПК 689
  • БрГУ 179
  • ВНТУ 119
  • ВГУЭС 426
  • ВлГУ 645
  • ВМедА 611
  • ВолгГТУ 235
  • ВНУ им. Даля 166
  • ВЗФЭИ 245
  • ВятГСХА 101
  • ВятГГУ 139
  • ВятГУ 559
  • ГГДСК 171
  • ГомГМК 501
  • ГГМУ 1967
  • ГГТУ им. Сухого 4467
  • ГГУ им. Скорины 1590
  • ГМА им. Макарова 300
  • ДГПУ 159
  • ДальГАУ 279
  • ДВГГУ 134
  • ДВГМУ 409
  • ДВГТУ 936
  • ДВГУПС 305
  • ДВФУ 949
  • ДонГТУ 497
  • ДИТМ МНТУ 109
  • ИвГМА 488

  • ИГХТУ 130
  • ИжГТУ 143
  • КемГППК 171
  • КемГУ 507
  • КГМТУ 269
  • КировАТ 147
  • КГКСЭП 407
  • КГТА им. Дегтярева 174
  • КнАГТУ 2909
  • КрасГАУ 370
  • КрасГМУ 630
  • КГПУ им. Астафьева 133
  • КГТУ (СФУ) 567
  • КГТЭИ (СФУ) 112
  • КПК №2 177
  • КубГТУ 139
  • КубГУ 107
  • КузГПА 182
  • КузГТУ 789
  • МГТУ им. Носова 367
  • МГЭУ им. Сахарова 232
  • МГЭК 249
  • МГПУ 165
  • МАИ 144
  • МАДИ 151
  • МГИУ 1179
  • МГОУ 121
  • МГСУ 330
  • МГУ 273
  • МГУКИ 101
  • МГУПИ 225
  • МГУПС (МИИТ) 636
  • МГУТУ 122
  • МТУСИ 179
  • ХАИ 656
  • ТПУ 454
  • НИУ МЭИ 641
  • НМСУ «Горный» 1701
  • ХПИ 1534
  • НТУУ «КПИ» 212
  • НУК им. Макарова 542
  • НВ 777
  • НГАВТ 362
  • НГАУ 411
  • НГАСУ 817
  • НГМУ 665
  • НГПУ 214
  • НГТУ 4610
  • НГУ 1992
  • НГУЭУ 499
  • НИИ 201
  • ОмГТУ 301
  • ОмГУПС 230
  • СПбПК №4 115
  • ПГУПС 2489
  • ПГПУ им. Короленко 296
  • ПНТУ им. Кондратюка 119
  • РАНХиГС 186
  • РОАТ МИИТ 608
  • РТА 243

  • РГГМУ 118
  • РГПУ им. Герцена 124
  • РГППУ 142
  • РГСУ 162
  • «МАТИ» — РГТУ 121
  • РГУНиГ 260
  • РЭУ им. Плеханова 122
  • РГАТУ им. Соловьёва 219
  • РязГМУ 125
  • РГРТУ 666
  • СамГТУ 130
  • СПбГАСУ 318
  • ИНЖЭКОН 328
  • СПбГИПСР 136
  • СПбГЛТУ им. Кирова 227
  • СПбГМТУ 143
  • СПбГПМУ 147
  • СПбГПУ 1598
  • СПбГТИ (ТУ) 292
  • СПбГТУРП 235
  • СПбГУ 582
  • ГУАП 524
  • СПбГУНиПТ 291
  • СПбГУПТД 438
  • СПбГУСЭ 226
  • СПбГУТ 193
  • СПГУТД 151
  • СПбГУЭФ 145
  • СПбГЭТУ «ЛЭТИ» 380
  • ПИМаш 247
  • НИУ ИТМО 531
  • СГТУ им. Гагарина 114
  • СахГУ 278
  • СЗТУ 484
  • СибАГС 249
  • СибГАУ 462
  • СибГИУ 1655
  • СибГТУ 946
  • СГУПС 1513
  • СибГУТИ 2083
  • СибУПК 377
  • СФУ 2423
  • СНАУ 567
  • СумГУ 768
  • ТРТУ 149
  • ТОГУ 551
  • ТГЭУ 325
  • ТГУ (Томск) 276
  • ТГПУ 181
  • ТулГУ 553
  • УкрГАЖТ 234
  • УлГТУ 536
  • УИПКПРО 123
  • УрГПУ 195
  • УГТУ-УПИ 758
  • УГНТУ 570
  • УГТУ 134
  • ХГАЭП 138
  • ХГАФК 110

  • ХНАГХ 407
  • ХНУВД 512
  • ХНУ им. Каразина 305
  • ХНУРЭ 324
  • ХНЭУ 495
  • ЦПУ 157
  • ЧитГУ 220
  • ЮУрГУ 306

Полный список ВУЗов

Чтобы распечатать файл, скачайте его (в формате Word).

Системное программное обеспечение: Учебное пособие

Для того, чтобы оценить ресурс, необходимо авторизоваться.

Настоящее учебное пособие предназначено для подготовки студентов различных вычислительных специальностей, изучающих работу в среде MS-DOS. Для специальности 2201 эта работа может использоваться в курсах «Системное программное обеспечение», «Проектирование микропроцессорных систем», «Организация ввода-вывода». В пособии описано семейство микропроцессоров х86 с точки зрения программиста, рассмотрены регистры процессора, способы адресации и формирования исполнительного адреса. Даны основы программирования на ассемблере, приведены примеры программ, использующих ресурсы MS-DOS. Рассмотрены способы написания резидентных программ и драйверов. Рассмотрены соответствующие примеры.

Fn 00H: завершить программу

Вход

  • AH = 00H
  • CS = сегмент PSP завершающегося процесса

Выход

Описание:

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

Замечание:

Проще и более аккуратно — использовать функцию DOS Fn 4cH Exit.

Fn 01H: ввод с клавиатуры

Вход

Выход

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

Описание:

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

Замечание:

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

Fn 09H: Выдать строку на дисплей

Вход

  • AH = 09H
  • DS:DX = адрес строки, заканчивающейся символом ‘$’ (ASCII 24H)

Выход

Описание:

строка, исключая завершающий ее символ ‘$’, посылается на стандартный вывод. символы Backspace обрабатываются как в функции 02H Display Char. обычно, чтобы перейти на новую строку, включают в текст пару CR/LF (ASCII 13H и ASCII 0aH). строки, содержащие ‘$’, можно выдать через 40H Write Handle (BX=0).

Fn 06H: Консольный ввод-вывод

Вход

  • AH = 06H
  • DL = символ (от 0 до 0feH), посылаемый на стандартный вывод
  • = 0ffH запрос ввода со стандартного ввода

Выход

  • ZF = Сброшен (NZ), если символ готов ҐҐЈҐ при запросе ввода

Описание:

при DL = 0ffH выполняет ввод с консоли «без ожидания», возвращая взведенный флаг нуля (ZF), если на консоли нет готового символа. если символ готов, сбрасывает флаг ZF (NZ) и возвращает считанный символ в AL. если DL не равен 0ffH, то DL направляется на стандартный вывод.

Замечание:

Не проверяет Ctrl-Break. вызывайте дважды для расширенного ASCII.

Fn 0aH: ввод строки в буфер

Вход

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

Выход

  • нет = буфер содержит ввод, заканчивающийся символом CR (ASCII 0dH)

Описание:

при входе буфер по адресу DS:DX должен быть оформлен так:

¦max¦ ? ¦ ? ? ? ? ? MAX — максимально допустимая


при выходе буфер заполнен данными следующим образом:

¦max¦len¦ T E X T 0dH LEN — действительная длина данных

символы считываются со стандартного ввода вплоть до CR (ASCII 0dH) или до достижения длины MAX-1. если достигнут MAX-1, включается консольный звонок для каждого очередного символа, пока не будет введен возврат каретки CR (нажатие Enter).

Второй байт буфера заполняется действительной длиной введенной строки, не считая завершающего CR. последний символ в буфере — всегда CR (который не засчитан в байте длины). символы в буфере (включая LEN) в момент вызова используются как «шаблон». В процессе ввода действительны обычные клавиши редакти рования: Esc выдает «\» и начинает с начала, F3 выдает буфер до конца шаблона, F5 выдает «@» и сохраняет текущую строку как шаблон, и т.д. большинство расширенных кодов ASCII игнорируются. при распознавании Ctrl-Break выполняется прерывание INT 23H (буфер остается неизменным).

Fn 25H: установить вектор прерывания

Вход

  • AH = 25H
  • AL = номер прерывания
  • DS:DX = вектор прерывания: адрес программы обработки прерывания

Выход

Описание:

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

Предупреждение:

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

Fn 35H: дать вектор прерывания

Вход

  • AH = 35H
  • AL = номер прерывания (00H до 0ffH)

Выход

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

Описание:

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

Предупреждение:

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

Fn 27H: читать произвольный блок файла

Вход

  • AH = 27H
  • DS:DX = адрес открытого FCB
  • CX = число считываемых записей

Выход

  • AL = 0 если чтение успешно и DTA заполнена данными
  • AL = 1 если достигнут конец файла (EOF) и данные не считаны
  • AL = 2 если DTA + FCB (RecSize * CX) выходит за границу сегмента
  • AL = 3 если EOF и считана усеченная порция (дополнена нулями)
  • CX = действительное число считанных записей

Описание:

Читает несколько записей из файла, начиная с файлового адреса, специфицированного полем RandomRec в FCB. Помещает данные в память, начиная с адреса DTA. число считанных байт = FCB RecSize*CX. Поля RandomRec, CurBlk и CurRec корректируются, чтобы указывать на следующую запись (первую запись за прочитанными).

Fn 31H: завершиться и остаться резидентным — KEEP

Вход

  • AH = 31H
  • AL = код выхода
  • DX = объем памяти, оставляемой резидентной, в параграфах

Выход

Описание:

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

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

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

  • 3.1. Получение справочной информации
  • 3.2. Создание, удаление и переименование каталогов
  • 3.3. Поиск в каталогах
  • 3.4. Работа с файлами
  • 3.5. Чтение/запись файлов
  • 3.6. Позиционирование
  • 3.7. Изменение атрибутов, времени и даты файлов
  • 3.8. Буферизация ввода/вывода
  • 3.9. Другие функции для работы с файлами
  • 3.10. Таблица открытых файлов

Теперь, после того, как мы познакомились с логической структурой диска в MS-DOS, можно приступить к изучению одной из самых развитых подсистем операционной системы — файловой системы.

Сервис файловой системы доступен программе через прерывание MS-DOS INT 21h. Многочисленные функции этого прерывания, относящиеся к файловой системе, можно разбить на группы:

  • получение справочной информации;
  • работа с каталогами;
  • работа с файлами.

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

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

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


Заметим, что существует два класса функций для работы с файлами. Первый класс использует управляющие блоки файлов FCB. Эти функции исплоьзовались в MS-DOS версий 1.х и имеют в настоящее время чисто исторический интерес. Вам они скорее всего никогда не будут нужны, за исключением одного случая — если вам надо составить программу, способную работать под управлением MS-DOS версии 1.0 или 1.1. В этой книге мы не будем упоминать функции, предназначенные для работы с файлами через FCB. При необходимости вы сможете найти информацию об этих функциях в руководстве по операционной системе MS-DOS.

Второй класс использует файловые индексы (handle). Этот класс функций впервые появился в MS-DOS версии 2.0. Эти функции аналогичны используемым в операционной системе UNIX.

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

Первые пять файловых индексов зарезервированы операционной системой:

Стандартное устройство ввода (клавиатура)
1 Стандартное устройство вывода (экран)
2 Стандартное устройство для вывода сообщений об ошибках (экран)
3 Стандартное устройство последовательного ввода/вывода, обычно это асинхронный адаптер COM1.
4 Стандартное печатающее устройство (обычно первый принтерный порт LPT1)

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

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

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

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

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

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

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

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

Для установки текущего диска можно использовать функцию 0Eh, которая имеет следующий формат вызова:

На входе: AH = 0Eh
DL = Номер дисковода (0 — А:, 1 — В:, и т.д.)
На выходе: AL = Общее количество дисководов в системе. Эта величина соответствует параметру LASTDRIVE файла CONFIG.SYS.

Для того чтобы узнать номер текущего дисковода, программа может воспользоваться функцией 19h:

На входе: AH = 19h
На выходе: AL = Номер текущего дисковода (0 — А:, 1 — В:, и т.д.).

Функция 3Bh предназначена для установки текущего каталога:

На входе: AH = 3Bh
DL = Номер дисковода (0 — текущий, 1 — А:, 2 — В:, и т.д.)
DS:DX = Адрес буфера, содержащего путь каталога, который должен стать текущим.
На выходе: AX = Код ошибки, если CY установлен в 1.

Буфер пути может иметь максимальный размер 64 байта. Он должен содержать путь в формате ASCIIZ, т.е. строку, закрытую двоичным нулем, например: «path\dirname»,0. Строка не должна содержать литеры, обозначающие диск. Если текущим должен стать корневой каталог, строка должна состоять только из одного двоичного нуля.

Для того чтобы узнать текущий каталог, вы можете воспользоваться функцией 47h:

На входе: AH = 47h
DL = Номер дисковода ( — текущий, 1 — А:, 2 — В:, и т.д.)
DS:SI = Адрес буфера для записи пути текущего каталога.
На выходе: AX = Код ошибки, если флаг переноса CF установлен в 1.

Буфер должен иметь размер не менее 64 байтов, текущий каталог возвращается в формате ASCIIZ без литеры, обозначающей диск. Если текущим является корневой каталог, регистровая пара DS:SI будет указывать на нулевую строку (состоящую из одного двоичного нуля).

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

Информация о таблице размещения файлов FAT для текущего диска может быть получена с помощью функции 1Bh прерывания INT 21h, имеющего следующий формат:

На входе: AH = 1Bh
На выходе: DS:BX = Адрес первого байта FAT. Это байт ID идентификации среды носителя данных, соответствует байту media в блоке параметров BIOS.
DX = Общее количество кластеров на диске.
AL = Количество секторов в одном кластере.
CX = Количество байтов в одном секторе.

Дополнительно эта функция возвращает информацию об общем количестве кластеров на диске, размере кластера в секторах и размере сектора в байтах. Для версий MS-DOS, более ранних, чем 2.0, регистровая пара DS:BX указывала на FAT, считанный в память. Более поздние версии операционной системы могут содержать по этому адресу только часть таблицы размещения файлов.

Для получения аналогичной информации не о текущем, а о любом диске, используйте функцию 1Ch. Эта функция полностью аналогична предыдущей, за исключением того, что в регистре DL должен быть указан код дисковода: — текущий, 1 — А:, 2 — В: и т.д. Эта функция доступна в MS-DOS версии 2.0 и в более поздних версиях.

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

На входе: AH = 36h
DL = Номер дисковода ( — текущий, 1 — А:, 2 — В:, и т.д.)
На выходе: AX = Количество секторов в кластере; 0FFFFh, если был задан неправильный номер дисковода;
BX = Количество свободных кластеров на диске.
CX = Количество байтов в одном секторе.
DX = Общее количество кластеров на диске.

Эта функция возвращает в регистре AX число 0FFFFh, если вы неправильно указали номер дисковода.

При обсуждении векторной таблицы связи мы рассказывали о блоках управления устройствами DDCB. Поле dev_cb векторной таблицы связи содержит FAR-адрес цепочки этих блоков.

Приведем еще раз формат блока DDCB. Напомним, что он изменяется в зависимости от версии DOS. Для версий 2.х и 3.х блок DDCB имеет следующий формат:

(0) 1 drv_num номер устройства ( соответствует устройству А:, 1 — В: и т.д.)
(+1) 1 drv_numd дополнительный номер устройства внутри драйвера
(+2) 2 sec_size размер сектора в байтах
(+4) 1 clu_size число, на единицу меньшее количества секторов в кластере
(+5) 1 clu_base если содержимое этого поля не равно нулю, то для получения общего числа секторов в кластере надо возвести 2 в степень clu_base и получившееся число прибавить к clu_size
(+6) 2 boot_siz количество зарезервированных секторов (boot-сектора, начало корневого каталога)
(+8) 1 fat_num количество копий FAT
(+9) 2 max_dir максимальное число дескрипторов файлов в корневом каталоге (т.е. максимальное число файлов, которое может содержать корневой каталог на этом устройстве)
(+11) 2 data_sec номер первого сектора данных на диске (номер сектора, соответствующего кластеру номер 2)
(+13) 2 hi_clust максимальное количество кластеров (равно увеличенному на 1 количеству кластеров данных)
(+15) 1 fat_size количество секторов, занимаемых одной копией FAT
(+16) 2 root_sec номер первого сектора корневого каталога
(+18) 4 drv_addr FAR-адрес заголовка драйвера, обслуживающего данное устройство
(+22) 1 media байт описания среды носителя данных
(+23) 1 acc_flag флаг доступа, означает, что к устройству был доступ
(+24) 4 next адрес следующего блока DDCB, для последнего блока в поле смещения находится число FFFF
————— только для DOS 2.x —————
(+28) 2 dir_clu номер начального кластера текущего каталога (0 для корневого каталога)
(+30) 64 dir_path строка в формате ASCIIZ, содержащая путь к текущему каталогу
————— DOS 3.х —————————-
(+28) 2 reserv1 зарезервировано, обычно равно 0
(+30) 2 built число FFFF в этом поле означает, что блок DDCB был построен

Формат блока DDCB для DOS версии 4.х:

(0) 1 drv_num номер устройства ( соответствует устройству А:, 1 — В: и т.д.)
(+1) 1 drv_numd дополнительный номер устройства внутри драйвера
(+2) 2 sec_size размер сектора в байтах
(+4) 1 clu_size число, на единицу меньшее количества секторов в кластере
(+5) 1 clu_base если содержимое этого поля не равно нулю, то для получения общего числа секторов в кластере надо возвести 2 в степень clu_base и получившееся число прибавить к clu_size
(+6) 2 boot_siz количество зарезервированных секторов (boot-сектора, начало корневого каталога)
(+8) 1 fat_num количество копий FAT
(+9) 2 max_dir максимальное число дескрипторов файлов в корневом каталоге (т.е. максимальное число файлов, которое может содержать корневой каталог на этом устройстве)
(+11) 2 data_sec номер первого сектора данных на диске (номер сектора, соответствующего кластеру номер 2)
(+13) 2 hi_clust максимальное количество кластеров (равно увеличенному на 1 количеству кластеров данных)
(+15) 1 fat_size количество секторов, занимаемых одной копией FAT
(+16) 1 reserv1 зарезервироано
(+17) 2 root_sec номер первого сектора корневого каталога
(+19) 4 drv_addr FAR-адрес заголовка драйвера, обслуживающего данное устройство
(+23) 1 media байт описания среды носителя данных
(+24) 1 acc_flag флаг доступа, означает, что к устройству был доступ
(+25) 4 next адрес следующего блока DDCB, для последнего блока в поле смещения находится число FFFF
(+29) 2 reserv2 зарезервироано
(+31) 2 built число FFFF в этом поле означает, что блок DDCB был построен
Илон Маск рекомендует:  Asp компонент content linking

Файл sysp.h содержит определение типа DDCB для MS-DOS версии 4.х:

При описании векторной таблицы связи мы приводили примеры использования блоков DDCB. Для получения адреса блока DDCB конкретного дисковода можно воспользоваться недокументированной функцией 32h. Она имеет следующий формат вызова:

На входе: AH = 32h
DL = Номер дисковода ( — текущий, 1 — А:, 2 — В:, и т.д.)
На выходе: AL = 0, если был задан правильный номер дисковода;
0FFh, если был задан неправильный номер дисковода;
DS:BX = Адрес блока DDCB

Для получения адреса блока DDCB текущего диска можно воспользоваться недокументированной функцией 1Fh, которая имеет формат, аналогичный функции 32h, за исключением того, что не надо задавать номер дисковода в регистре DL.

Какая еще полезная информация может быть получена при использовании функций MS-DOS?

С помощью функции 33h программа может проверить или установить флаг Ctrl-Break и узнать номер диска, с которого выполнялась загрузка операционной системы:

На входе: AH = 33h
AL = Код подфункции:
— Проверить текущее состояние флага Ctrl-Break;
1 — Установить флаг Ctrl-Break;
5 — Определить номер диска, который был использован для загрузки операционной системы.
DL = Значение устанавливаемого флага Ctrl-Break для подфункции 1 (0 — OFF, 1 — ON).
На выходе: DL = Текущее состояние флага Ctrl-Break для подфункции 0;
Номер диска, использованного для загрузки операционной системы для подфункции 5 (1 — А:, 2 — В:, и т.д.).

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

Состояние флага Ctrl-Break влияет на возможность прервать выполнение программы нажатием комбинации клавиш Ctrl-Break или Ctrl-C. Если флаг находится в состоянии OFF, DOS проверяет эту комбинацию клавиш только при вызове функций стандартного ввода/вывода на консоль, принтер и последовательный порт. Если флаг установлен в состояние ON, комбинация клавиш проверяется и при вызове других функций MS-DOS. Если операционная система зафиксировала нажатие указанной комбинации клавиш, она выполняет прерывание INT 23h, которое завершает работу текущей программы.

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

Функция 54h позволяет программе узнать текущее состояние флага проверки записывающейся на диск информации. В регистре AL эта функция возвращает текущее состояние флага. Если содержимое регистра равно 1, операционная система после записи сектора считывает его для проверки. Разумеется, такая проверка снижает скорость работы программы. Если после вызова функции регистр AL содержит 0, проверка записи не выполняется.

Для установки флага проверки записи можно использовать функцию 2Eh. Перед вызовом функции в регистр AL необходимо занести новое значение флага проверки: — проверка не нужна; 1 — должна выполняться проверка записанной информации.

Стандартные библиотеки трансляторов Microsoft QC 2.5 и C 6.0 содержат несколько функций, облегчающих получение справочной информации о состоянии дисковой подсистемы.

Функция _dos_getdiskfree() использует функцию 36h для получения информации о диске. Файл dos.h содержит описание этой функции:

Параметр drive задает номер используемого дисковода: — текущий, 1 — А:, и т.д.

Информация возвращается в структуре diskfree_t, которая определена в файле dos.h:

В этой структуре:

unsigned total_clusters общее количество кластеров на диске;
unsigned avail_clusters количество свободных кластеров;
unsigned sectors_per_cluster количество секторов, занимаемых кластером;
unsigned bytes_per_sector размер сектора в байтах.

Для получения номера текущего диска и для установки номера текущего диска можно использовать, соответственно, функции _dos_getdrive() и _dos_setdrive().

Функция _dos_getdrive() имеет формат:

Эта функция пользуется функцией 19h для получения номера текущего диска, который записывается по адресу, задаваемому параметром. Значение 1 соответствует диску А:, 2 — В:, и т.д.

Функция _dos_setdrive() предназначена для установки текущего диска и может быть использована для определения общего числа дисков в системе:

Параметр drive опеределяет текущий диск (1 — А:, и_т.д.), по адресу, задаваемому вторым параметром, функция записывает общее количество логических дисков, установленных в системе. Функция _dos_setdrive() использует функцию 0Eh прерывания INT 21h.


Для иллюстрации способов использования функций _dos_getdrive(), _dos_setdrive(), _dos_getdiskfree() мы составили следующую программу:

3.2. Создание, удаление и переименование каталогов

После форматирования логический диск содержит корневой каталог. Если диск форматируется как системный, в этом каталоге могут находится дескрипторы файлов операционной системы IO.SYS, MSDOS.SYS, COMMAND.COM.

Операционная система предоставляет программам пользователя удобный сервис для создания, уничтожения и переименования каталогов. Используя сведения, приведенные в этой книге, вы сможете изменять структуру каталогов сами, не прибегая к услугам MS-DOS. Однако это следует делать только тогда, когда операции с каталогами по каким-то причинам нежелательно выполнять с использованием функций операционной системы.

Для создания каталога используйте функцию 39h прерывания INT 21h:

На входе: AH = 39h
DS:DX = Адрес строки в формате ASCIIZ, содержащей имя создаваемого каталога.
На выходе: AL = Код ошибки, если был установлен в 1 флаг переноса CF.

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

Размер строки с именем каталога не должен превышать по длине 64 байта.

Удалить существующий каталог можно с помощью функции 3Ah. Формат вызова этой функции аналогичен предыдущему:

На входе: AH = 3Ah
DS:DX =Адрес строки в формате ASCIIZ, содержащей имя удаляемого каталога.
На выходе: AL = Код ошибки, если был установлен в 1 флаг переноса CF.

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

Для изменения имени каталогов и файлов предназначена функция 56h:

На входе: AH = 56h
DS:DX = Адрес строки в формате ASCIIZ, содержащей старое имя каталога или файла.
ES:DI = Адрес строки в формате ASCIIZ, содержащей новое имя каталога или файла.
На выходе: AL = Код ошибки, если был установлен в 1 флаг переноса CF.

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

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

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

Стандартные библиотеки трансляторов Microsoft QC 2.5 и C 6.0 содержат несколько функций, предназначенных для работы с каталогами.

Функция getcwd() предназначена для определения текущего каталога. Прототип этой функции описан в файле direct.h:

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

Если в качестве первого параметра указать NULL, функция динамически закажет буфер длиной n байтов из области кучи. Эту память впоследствии необходимо будет освободить при помощи функции free(). Функция getcwd() возвращает указатель на буфер, содержащий текущий каталог.

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

Для создания и удаления каталогов, изменения текущего каталога имеются функции mkdir(), rmdir(), chdir().

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

Приведем небольшой пример, использующий перечисленные выше функциии:

Для переименования каталогов (и файлов) предназначена функция rename():

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

Функция может возвращать один из кодов ошибки:

ENOENT Нет такого файла или каталога
EACCES Нет прав доступа
EXDEV Другой диск

Код ошибки EXDEV возвращается в том случае, когда программа указывает разные диски для старого и нового имен файлов или каталогов.

Важное замечание: если вы задаете полный путь, в строке пути повторяйте символ ‘\’ два раза. Это нужно для того, чтобы избежать конфликта с форматом представления констант в языке С. Например:

3.3. Поиск в каталогах

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

Пара функций 4Eh и 4Fh предназначены для сканирования каталогов.

Эти функции используются вместе следующим образом:

  • Вызывается функция 4Eh для поиска в каталоге файла, соответствующего образцу. В образце можно использовать символы ? и *, которые означают, соответственно, один любой символ и любое количество любых символов. Информация о найденном файле располагается в специальной области, назначенной каждой работающей программе — области DTA.
  • Вызывается в цикле функция 4Fh для поиска остальных файлов, удовлетворяющих образцу, заданному при вызове функции 4Eh. Условие завершения цикла — отсутствие в каталоге указанных файлов.

Приведем формат вызова функций 4Eh и 4Fh.

На входе: AH = 4Eh
CX = Атрибуты файла, которые будут использованы при поиске. Будут найдены файлы, имеющие заданный в этом регистре атрибут.
DS:DX = Адрес строки в формате ASCIIZ, содержащей путь каталогаили файла.
На выходе: AL = Код ошибки, если был установлен в 1 флаг переноса CF.
На входе: AH = 4Fh
На выходе: AL = Код ошибки, если был установлен в 1 флаг переноса CF.

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

Для работы с областью DTA MS-DOS имеет две функции. Это функция 2Fh, позволяющая получить адрес области DTA (она возвращает этот адрес в регистрах ES:BX), и функция 1Ah, предназначенная для установки своей области DTA (адрес новой области DTA должен быть указан в регистрах DS:DX).

Напомним, что по умолчанию область DTA занимает 128 байтов в префиксе сегмента программы PSP со смещением 80h.

В случае успешного поиска функции 4Eh и 4Fh помещают в DTA информацию о найденных файлах в следующем формате:

(0) 20 Зарезервировано.
(+21) 1 Атрибуты найденного файла
(+22) 2 Поле времени последнего обновления фалйла
(+24) 2 Поле даты последнего обновления фалйла
(+26) 4 Длина файла
(+30) 13 Имя файла и расширение в формате ASCIIZ

Номер начального класетра, распределенного файлу или каталогу, невозможно получить с помощью функций 4Eh и 4Fh.

Стандартные библиотеки трансляторов Microsoft QC 2.5 и C 6.0 содержат две функции, предназначенные для сканирования каталогов — _dos_findfirst() и _dos_findnext().

Приведем прототипы этих функций, описанные в файле dos.h:

В этих функциях параметр pattern определяет образец для поиска файлов, параметр attr — атрибуты файла — используется в качестве дополнительного критерия поиска. Параметр found представляет собой указатель на структуру, в которую будет записываться информация о найденных файлах. Эта структура определена в файле dos.h:

Приведем текст программы просмотра содержимого каталога. Программа принимает из командной строки параметр — образец для показа файлов. Если вы укажете параметр *.*, будет выведена информация обо всех файлах. Можно задавать полный путь: c:\*.*.

При запуске программы с параметром *.com на экран будет выведена информация:

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

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

Для создания файла предназначена функция 3Ch прерывания INT 21h. С помощью этой функции может быть создан файл как в текущем, так и в любом другом каталоге. Если файл с указанным именем уже существует, он обрезается до нулевой длины. Будьте осторожны при использовании этой функции — она может уничтожить нужный вам файл.

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

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

На входе: AH = 3Ch
CX = Атрибуты создаваемого файла:
00h — обычный файл;
01h — только читаемый файл;
02h — скрытый файл;
04h — системный файл.
DS:DX = Адрес строки, содержащей путь создаваемого файла
На выходе: AX = Код ошибки, если был установлен в 1 флаг переноса CF;
Файловый индекс, если флаг переноса сброшен в 0.

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

  • отсутствует какой-либо элемент в пути для создаваемого файла, например, диск или каталог;
  • была сделана попытка создать файл в корневом каталоге, но корневой каталог переполнен;
  • в указаннном каталоге уже есть файл с таким именем, и этот файл имеет атрибут «Только читаемый»;
  • пользователь, который работает в сети, не имеет прав доступа для выполнения указанной операции.

Операционная система игнорирует попытки создания с помощью этой функции каталогов или метки диска.

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

Формат вызова функции:


На входе: AH = 5Bh
CX = Атрибуты создаваемого файла:
00h — обычный файл;
01h — только читаемый файл;
02h — скрытый файл;
04h — системный файл.
DS:DX = Адрес строки, содержащей путь создаваемого файла
На выходе: AX = Код ошибки, если был установлен в 1 флаг переноса CF;
Файловый индекс, если флаг переноса сброшен в .

Если вам требуется временный файл, вы можете создать его с помощью функции 5Ah:

На входе: AH = 5Ah
CX = Атрибуты создаваемого файла:
00h — обычный файл;
01h — только читаемый файл;
02h — скрытый файл;
04h — системный файл.
DS:DX = Адрес буфера, в который функция запишет путь созданного временного файла. Размер этого буфера должен быть по крайней мере 13 байтов.
На выходе: AX = Код ошибки, если был установлен в 1 флаг переноса CF;
Файловый индекс, если флаг переноса сброшен в .

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

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

На входе: AH = 3Dh
AL = Требуемый режим доступа:

Бит 7: флаг наследования

0 — файловый индекс наследуется порожденным процессом
1 — файловый индекс не наследуется порожденным процессом

Биты 4. 6: режим разделения

000 — режим совместимости
001 — запрещение всех видов доступа
010 — запрещение записи
011 — запрещение чтения
100 — разрешение всех видов доступа

Бит 3:0 — зарезервировано

Биты 0. 2: вид доступа

000 — чтение
001 — запись
010 — чтение/запись

DS:DX = Адрес строки, содержащей путь открываемого файла
На выходе: AX = Код ошибки, если флаг переноса CF был установлен в 1;
Файловый индекс, если флаг переноса сброшен в .

С помощью функции 3Dh можно открыть любой файл (но не каталог). Если требуется вид доступа «запись», открываемый файл не должен иметь атрибут «Только читаемый».

Для использования битов 4. 7 (управляющих доступом к файлу другими программами в сети) должна быть запущена программа SHARE.EXE.

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

Операционная система MS-DOS версии 4.0 имеет в своем составе функцию 6Ch, обладающую расширенными возможностями по созданию и открытию файлов:

На входе: AH = 6Ch
AL = 00h
BX = байт флагов расширенного режима открытия файла
CX = атрибуты создаваемого файла, используется только при создании файлов
DX = выполняемая функция, если файл существует или не существует:

Биты 0-3 регистра DX задают действие, если файл существует:

0000h — если файл существует, вернуть признак ошибки
0001h — если файл существует, открыть его
0002h — если файл существует, заместить и открыть его

Биты 4-7 регистра DX задают действие, если файл не существует:

0000h — если файл не существует, вернуть признак ошибки
0001h — если файл не существует, создать и открыть его

DS:SI = Адрес строки, содержащей путь открываемого файла
На выходе: AX = Код ошибки, если флаг переноса CF был установлен в 1;
Файловый индекс, если флаг переноса сброшен в .
CX = Код выполненных действий:
0 — файл был открыт
1 — файл был создан и открыт
2 — файл был замещен и открыт

Регистр BX на входе задает флаги расширенного режима открытия файла в следующем формате:

Биты Назначение
0. 2 Режим доступа при чтении/записи
3 Зарезервировано, должно быть равно 0
4. 6 Режим разделения
7 Флаг наследования
8. 12 Зарезервировано, должно быть равно 0
13 — Режим обычного использования обработчика критических ошибок INT 24h
1 — Блокировка обработчика критических ошибок INT 24h. Для того, чтобы узнать причину ошибки, программа должна использовать функцию 59h прерывания INT 21h MS-DOS.
14 Управление буферизацией:
— Использование стандартной для MS-DOS буферизации.
1 — Отмена буферизации. Использование этого режима замедлит работу с диском, однако вероятность потери информации при аварии в питающей сети уменьшится.

Описанная выше функция является как бы комбинацией функций 3Dh и 3Ch (открытие и создание файла). Она удобна, но при ее использовании программа должна убедиться в том, что версия используемой операционной системы не ниже, чем 4.0.

Удалить файл можно при помощи функции 41h прерывания INT 21h:

На входе: AH = 41h
DS:DX = Адрес строки в формате ASCIIZ, содержащей имя удаляемого файла.
На выходе: AL = Код ошибки, если был установлен в 1 флаг переноса CF.

С помощью этой функции нельзя удалить файл, имеющий атрибут «Только читаемый».

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

Стандартные библиотеки трансляторов Microsoft QC 2.5 и C 6.0 содержат функции для работы с файлами. Эти функции можно разделить на две группы — функции ввода/вывода низкого уровня и функции ввода/вывода потоком. Вторая группа функций использует буферизацию и будет рассмотрена в разделе, посвященном буферизованному вводу/выводу.

Функции ввода/вывода низкого уровня отображаются на описанные выше функции прерывания INT 21h (и функции этого же прерывания, предназначенные для чтения/записи, позиционирования и т.д.).

Для создания файла можно использовать функцию creat():

Эта функция и ее параметры описаны в файлах io.h, sys\types.h, sys\stat.h, errno.h.

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

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

S_IWRITE для создаваемого файла разрешена операция записи;
S_IREAD для создаваемого файла разрешена операция чтения;
S_IREAD | S_IWRITE для создаваемого файла разрешены операции чтения и записи.

В операционных системах MS-DOS и OS/2 невозможно создать файл, в который можно было бы писать, но из которого было бы нельзя читать информацию. Поэтому задание второго параметра как S_IWRITE приведет к созданию такого файла, для которого разрешены как операция записи, так и операция чтения.

После создания файла функция creat() открывает новый файл и возвращает файловый индекс (handle) или код ошибки.

Мощная функция open() предназначена как для открытия существующих файлов, так и для создания новых:

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

Параметр oflag может являться результатом битовой операции ИЛИ над следующими константами, определенными в файле fcntl.h:

O_APPEN при записи в файл информация будет добавляться в конец файла;
O_BINARY файл открывается для работы в двоичном режиме (игнорируются управляющие символы, такие как конец строки);
O_CREAT создается новый файл и открывается для записи; эта константа игнорируется, если указанный в первом параметре файл уже существует;
O_EXCL используется вместе с O_CREAT; если указанный в первом параметре файл существует, функция возвратит признак ошибки;
O_RDONLY файл открывается только для чтения, попытка записи в файл приведет к тому, что функция записи вернет признак ошибки;
O_RDWR файл открывается как для чтения, так и для записи;
O_TEXT файл открывается в текстовом режиме;
O_TRUNC существующий файл открывается и обрезается до нулевой длины (если для этого файла разрешена операция записи);
O_WRONLY файл открывается только для записи (в операционных системах MS-DOS и OS/2 для файла, открытого с признаком O_WRONLY разрешено выполнение операции чтения).

Для того, чтобы закрыть файл, открытый функциями creat() или open(), нужно использовать функцию close():

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

Код ошибки для этой и других функций cтандартных библиотек трансляторов Microsoft QC 2.5 и C 6.0 записывается в глобальную переменную errno.

3.5. Чтение/запись файлов

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

На входе: AH = 40h
BX = файловый индекс открытого файла
CX = количество записываемых байтов
DS:DX = Адрес буфера, содержащего записываемые данные
На выходе: AX = Код ошибки, если был установлен в 1 флаг переноса CF;
Количество действительно записанных байтов, если флаг переноса CF сброшен в .

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

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

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

Следует учитывать, что количество действительно записанных байтов может не совпадать с заданным в регистре CX при вызове функции 40h. Такая ситуация возможна, например, при записи в файл, открытый в текстовом режиме, байта Ctrl-Z (1Ah). Этот байт означает конец текстового файла. Другая возможная причина — отсутствие свободного места на диске.

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

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

Функция 40h может выполнять запись не только в файл, но и в устройство посимвольной обработки, предварительно открытое функцией 3Dh. Об этом мы говорили в разделах книги, посвященных драйверам.

Для чтения данных из файла (или устройства посимвольной обработки) предназначена функция 3Fh прерывания INT 21h:

На входе: AH = 3Fh
BX = файловый индекс открытого файла
CX = количество читаемых байтов
DS:DX = Адрес буфера для данных
На выходе: AX = Код ошибки, если был установлен в 1 флаг переноса CF;
Количество действительно прочитанных байтов, если флаг переноса CF сброшен в .

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

Если ваша программа составлена на языке программирования С, для записи и чтения данных она может воспользоваться функциями write() и read():


Эти функции работают аналогично функциям 40h и 3Fh прерывания INT 21h. Параметр handle определяет файл, для которого необходимо выполнить операцию записи или чтения. Параметр buffer — указатель на буфер, который содержит данные для записи или в который необходимо поместить прочитанные данные. Количество записываемых/читаемых байтов определяется третьим параметром — count.

После выполнения операции функция возвращает количество действительно записанных или прочитанных данных или -1 при ошибке. Будьте внимательны, если вы записываете или читаете больше 32К байтов — вы можете получить признак ошибки, хотя передача данных выполнилась правильно. Большие массивы данных можно записывать по частям.

В качестве примера мы приведем программу копирования файлов, которая пользуется описанными выше функциями ввода/вывода:

В приведенной программе для определения конца исходного файла использована функция eof():

Для файла с файловым индексом handle эта функция возвращает одно из трех значений:

1 достигнут конец файла;
конец файла не достигнут;
-1 ошибка, например, неправильно указан handle.

Программа, которая читает файл с помощью функции 3Fh прерывания INT 21h, может определить момент достижения конца файла, анализируя код ошибки в регистре AX.

3.6. Позиционирование

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

Установить файловый указатель в нужную вам позицию можно с помощью функции 42h прерывания INT 21h MS-DOS:

На входе: AH = 42h
AL = метод кодирования:
00h абсолютное смещение от начала файла
01h смещение от текущей позиции
02h смещение от конца файла
BX = файловый индекс открытого файла
CX = старший байт смещения
DX = младший байт смещения
На выходе: AX = Код ошибки, если был установлен в 1 флаг переноса CF;
Младший байт текущей позиции, если флаг переноса CF сброшен в 0.
DX = Старший байт текущей позиции

Функция позволяет указывать новое значение указателя либо как абсолютное смещение от начала файла, либо как смещение от текущей позиции, либо как смещение от конца файла. В последних двух случаях используется смещение со знаком. Для указания смещения или абсолютной позиции программа должна задать в регистрах CX, DX 32-битовое значение.

Если использовать метод кодирования 02h и задать нулевое смещение, функция установит указатель на конец файла. Это обстоятельство может быть использовано для определения размера файла в байтах.

Что произойдет, если при использовании методов кодирования 01h или 02h попытаться установить указатель позиции до начала файла?

Функция 42h при этом не возвратит признак ошибки, однако если будет сделана попытка прочитать или записать данные, то соответствующая функция чтения/записи завершится с ошибкой.

Стандартные библиотеки трансляторов Microsoft QC 2.5 и C 6.0 содержат функции, предназначенные для управления содержимым файлового указателя позиции и получения текущего значения этого указателя. Это функции lseek(), tell(), filelength().

Функция lseek() работает аналогично только что описанной функции 42h. Приведем ее прототип:

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

SEEK_SET Абсолютное смещение от начала файла
SEEK_CUR Смещение относительно текущей позиции
SEEK_END Смещение относительно конца файла

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

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

Функция возвращает размер файла в байтах. Файл задается параметром handle. В случае ошибки функция возвращает значение -1L.

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

Эта функция возвращает текущую позицию для файла, определенного параметром handle, или -1L, в случае ошибки.

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

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

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

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

Для работы с полем атрибутов файла предназначена функция 43h прерывания INT 21h:

На входе: AH = 43h
AL = выполняемая операция:
00h чтение атрибутов файла
01h установка новых атрибутов файла
CX = новые атрибуты файла, если AL = 01h:
Биты:
5 — бит архивации
4 — каталог
3 — метка диска
2 — системный файл
1 — скрытый файл
0 — только читаемый файл
DS:DX = путь файла в формате ASCIIZ
На выходе: AX = Код ошибки, если был установлен в 1 флаг переноса CF
CX = Если не было ошибки, этот регистр содержит атрибуты файла

При изменении атрибутов файла допустимо указывать комбинации битов в регистре CX.

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

Для работы с полями времени и даты последней модификации файла предназначена функция 57h прерывания INT 21h:

На входе: AH = 57h
AL = выполняемая операция:
00h чтение даты и времени
01h установка даты и времени
BX = файловый индекс открытого файла
CX = время
DX = дата
На выходе: AX = Код ошибки, если был установлен в 1 флаг переноса CF
CX = Если не было ошибки, этот регистр содержит время последнего изменения файла
DX = Если не было ошибки, этот регистр содержит дату последнего изменения файла

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

Формат поля времени:

Стандартные библиотеки трансляторов Microsoft QC 2.5 и C 6.0 содержат функции для чтения и изменения атрибутов файлов и времени/даты их последней модификации.

Для определения атрибутов файла можно использовать функцию _dos_getfileattr():

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

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

Для изменения атрибутов файла можно использовать функцию _dos_setfileattr():

Параметр attrib может принимать следующие значения:

_A_ARCH установка бита архивации
_A_HIDDEN файл скрытый
_A_NORMAL обычный файл
_A_RDONLY только читаемый файл
_A_SUBDIR каталог
_A_SYSTEM системный файл
_A_VOLID метка диска

Для определения времени последней модификации файла можно использовать функцию _dos_getftime():

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

Если вам надо изменить время или дату последней модификации файла, используйте функцию _dos_setftime():

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

Приведем программу, изменяющую при запуске значение бита файла атрибутов «Только читаемый» для файла, имя которого передается программе в качестве параметра:

Программа сначала считывает байт атрибутов, затем инвертирует соответствующий бит и устанавливает новое значение байта атрибутов.

3.8. Буферизация ввода/вывода

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

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

Операционная система MS-DOS имеет несколько буферов. Их количество зависит от оператора BUFFERS, находящегося в файле CONFIG.SYS. Этот оператор позволяет определить от 2 до 99 буферов. Если файл CONFIG.SYS не содержит оператора BUFFERS, по умолчанию используются два буфера.

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

Обычно для машин класса AT с диском размером 20-40 мегабайтов рекомендуется использовать 32 буфера, однако для каждого конкретного случая может потребоваться подбор этого параметра для оптимизации производительности системы.

Если ваша программа интенсивно использует обращение к каталогам файловой системы, вы можете использовать утилиту MS-DOS FASTOPEN, которая запоминает в оперативной памяти расположение на диске файлов и каталогов, уменьшая интенсивность обращения к диску. Например, при использовании следующей команды в оперативной памяти будет храниться информация о расположении максимально о 100 файлах и каталогах:

В операционной системе MS-DOS версии 4.0 вы можете указать для утилиты FASTOPEN опцию /X. Эта опция вызывает размещение информации о файлах и каталогах в дополнительной (expanded) памяти. Для этой версии операционной системы вызов утилиты FASTOPEN лучше всего выполнять через оператор INSTALL файла CONFIG.SYS:

В приведенной выше строке используются следующие обозначения:

d: обозначение диска;
n количество файлов или каталогов, для которых необходимо запомнить расположение, может иметь значение от 1 до 999, по умолчанию используется 34;
m количество буферов для фрагментированных файлов, может иметь значение от 1 до 999, по умолчанию используется 34;
/X задает расположение буферов в дополнительной памяти.

Еще один способ организовать буферизацию ввода/вывода для жестких дисков — использовать драйвер SMARTDRV.SYS. Этот драйвер позволяет создать для диска кэш-память в расширенной или дополнительной памяти. Например, следующая строка в файле CONFIG.SYS определяет дисковый кэш размером 530 килобайтов, размещенный в расширенной памяти:


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

Если вы используете кэш-память для диска, не следует задавать оператор BUFFERS в файле CONFIG.SYS или пользоваться утилитой FASTOPEN, так как это приведет к многократной буферизации и вызовет излишние пересылки данных в оперативной памяти.

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

При закрытии файла все буфера, связанные с ним, сбрасываются на диск. Если вам надо сбросить буфера, не закрывая файл, это можно сделать с помощью функции 68h прерывания INT 21h:

На входе: AH = 68h
BX = файловый индекс открытого файла
На выходе: AX = Код ошибки, если был установлен в 1 флаг переноса CF;
, если операция выполнена успешно.

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

Обратите также внимание на функцию расширенного открытия файлов 6Ch, входящую в состав MS-DOS версии 4.0. Эта функция позволяет при открытии файла отменить буферизацию.

Стандартные библиотеки трансляторов Microsoft QC 2.5 и C 6.0 содержат многочисленные функции, использующие собственный механизм буферизации при работе с файлами. Их часто называют функциями потокового ввода/вывода. Такую буферизацию не следует путать с буферизацией, выполняемой операционной системой. Имена всех этих функций начинаются на f — fopen(), fclose(), fprintf() и т.д.

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

При использовании функций потокового ввода/вывода файлы открываются функцией fopen(), закрываются функцией fclose(). Эти функции не только открывают и закрывают файлы (получают и освобождают их файловый индекс), но и, соответственно, создают и уничтожают структуру типа FILE, описанную в файле stdio.h и связанную с данным файлом:

Для организации потокового ввода/вывода вначале необходимо при помощи функции fopen() открыть файл. Функция fopen() имеет следующий прототип:

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

«r» файл открывается для чтения;
«w» файл открывается для записи;
«a» файл открывается для записи, данные будут добавляться в конец файла.

К буквам r, w, a справа могут добавляться буквы t и b.

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

Строка режима открытия файла может дополнительно содержать символ ‘+’. Этот символ означает, что для файла разрешены операции чтения и записи одновременно.

Для закрытия файлов, открытых для ввода/вывода потоком, должна использоваться функция fclose():

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

Если вы открыли файл с помощью низкоуровневой функции open(), вы можете создать поток для этого файла, используя функцию fdopen():

В качестве первого параметра используется файловый индекс, полученный от функции open(), второй параметр аналогичен парметру mode для функции fopen().

Для того чтобы закрыть поток, созданный функцией fdopen(), необходимо использовать функцию fclose(), а не close().

Для открытого потока вы можете узнать файловый индекс с помощью функции fileno():

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

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

stdin стандартное устройство ввода;
stdout стандартное устройство вывода;
stderr стандартное устройство для вывода сообщений об ошибках;
stdaux стандартное последовательное устройство ввода/вывода;
stdprn стандартное печатающее устройство.

Для работы со стандартными устройствами ввода/вывода в библиотеках трансляторов для языка программирования Си имеется соответствующий набор функций, которые должны быть вам хорошо известны — printf(), scanf(), putchar() и т.д.. Мы не будем их описывать для экономии места.

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

Для записи данных в поток предназначена функция fwrite():

Эта функция записывает в файл stream блоки информации, каждый из которых имеет длину size байтов. Количество блоков — count. Данные для записи расположены по адресу buffer.

Если файл открыт в текстовом режиме, каждый символ возврата каретки CR заменяется на два символа — возврата каретки CR и перевода строки LF.

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

Чтение данных потоком можно выполнить с помощью функции fread():

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

Если при использовании функции fread() вы задали значения параметров size или count, равные нулю, функция fread() не изменяет содержимое буфера buffer.

Для позиционирования внутри файла, открытого потоком с помощью функции fopen(), предназначена функция fseek():

В этой функции параметр offset задает новое содержимое указателя текущей позиции в файле stream, а параметр origin — определяет способ задания новой позиции. Этот оператор может иметь значения, аналогичные используемым в функции lseek():

SEEK_SET Абсолютное смещение от начала файла
SEEK_CUR Смещение относительно текущей позиции
SEEK_END Смещение относительно конца файла

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

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

При использовании функции fseek() для позиционирования внутри файлов, открытых в текстовом режиме, необходимо учитывать особенность обработки текстовых файлов — автоматическую замену символа возврата каретки CR на пару символов: возврат каретки CR и перевод строки LF. Для текстовых файлов функция fseek() будет правильно работать только в следующих двух случаях:

  • поиск со смещением offset, равным нулю, при любом значении параметра origin;
  • поиск выполняется относительно начала файла, причем в качестве смещения offset используется значение, полученное специальной функцией ftell().

Функция ftell() возвращает текущее значение указателя позиции для файла, или -1 при ошибке:

Пара функций ftell() — fseek() позволит вам правильно организовать позиционирование для файлов, открытых в текстовом режиме.

Есть еще одна возможность организовать позиционирование внутри файлов, открытых потоком — использовать пару функций fgetpos() — fsetpos():

Эти две функции используют для запоминания и установки позиции переменную с типом fpos_t, определенным в файле stdio.h. Функция fgetpos() записывает в эту переменную текущую позицию в потоке stream. Содержимое переменной затем может быть использовано для установки позиции в потоке с помощью функции fsetpos().

Обе эти функции возвращают нулевое значение в случае успешного завершения работы, или ненулевое — при ошибке.

Среди функций потокового ввода/вывода можно выделить группу функций форматного ввода/вывода. Это такие функции, как fputc(), fgetc(), fputs(), fgets(), fprintf(), fscanf().

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

Для записи в поток отдельных байтов используется функция fputc():

Байт c записывается в файл stream начиная с текущей позиции. После записи текущая позиция увеличивается на единицу. Функция возвращает записываемый байт или значение EOF, которое служит признаком ошибки.

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

Эта функция возвращает считанный из файла и преобразованный к типу int байт из потока stream. После чтения байта текущая позиция в файле увеличивается на единицу.

При достижении конца файла или в случае ошибок функция fgetc() возвращает значение EOF. Однако для проверки на ошибку или конец файла лучше пользоваться специальными функциями ferror() и feof(). Если вы открыли файл в двоичном режиме, единственный способ определить момент достижения конца файла — использовать функцию feof(), так как значение константы EOF может находиться в любом месте двоичного файла.

Для работы со строками предназначены функции fputs() и fgets().

Функция fputs() предназначена для вывода строки в файл, открытый потоком:

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

Для ввода строк из текстового файла удобна функция fgets():

Функция читает байты из потока stream и записывает их в буфер string до тех пор, пока не произойдет одно из двух событий — будет прочитан символ новой строки ‘\n’ или количество прочитанных символов не будет равно n-1.

После того, как байты будут прочитаны в буфер, в конец образованной из этих байтов строки функция записывает двоичный ноль. Если был прочитан символ новой строки ‘\n’, он тоже записывается в буфер.

Для анализа достижения конца файла или ошибок необходимо использовать функции feof() и ferror().

Для форматного вывода в файл содержимого переменных удобно использовать функцию fprintf():

Эта функция аналогична хорошо известной вам функции форматного вывода на экран printf(), с которой обычно начинают изучение языка программирования Си. Вспомните такую программу:

Функция fprintf() имеет дополнительно один параметр — stream, который определяет выходной файл.

После завершения работы функция возвращает количество записанных байтов или отрицательную величину, если при записи произошла ошибка.

Для форматного ввода информации из файла можно использовать функцию fscanf(), аналогичную известной вам функции scanf():

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

Функция fscanf() возвращает количество успешно считанных и преобразованных в указанный формат полей. Те поля, которые были считаны, но не преобразовывались, в возвращаемом функцией значении не учитываются.

При достижении конца файла функция возвращает значение EOF. Если функция возвратила нулевое значение, это означает, что преобразование полей не производилось.

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

Функция setbuf() позволяет вам заменить системный буфер на свой собственный:

Параметр buffer должен указывать на подготовленный пользователем массив, имеющий размер BUFSIZ байтов. Константа BUFSIZ описана в файле stdio.h.

Функция setvbuf() позволяет программе не только указать свой буфер, но и задать его размер:

Параметр stream должен указывать на открытый поток, причем для этого потока до вызова функции setvbuf() нельзя выполнять операции чтения/записи.

Параметр buffer должен указыват на подготовленный программой буфер размером size байтов. Этот буфер будет использоваться для работы с потоком stream.

Параметр mode может иметь значения _IOFBF, _IOLBF, _IONBF. Если mode равно _IOFBF или _IOLBF, параметр size указывает размер буфера. Если параметр mode равен _IONBF, буферизация не используется, парметры buffer и size игнорируются.

Параметры _IOFBF и _IOLBF эквивалентны.

Если в качестве адреса буфера buffer задать значение NULL, функция автоматически закажет буфер размером size.

Функция setvbuf() возвращает ноль при успешном завершении и ненулевую величину, если указан неправильный парметр mode или неправильный размер буфера size.

Для чего может понадобиться изменение размера буфера?

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

При закрытии потока функцией fclose() содержимое буфера записывается на диск. Если программе необходимо выполнить запись содержимого буфера на диск без закрытия файла, она может воспользоваться функцией fflush():

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

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

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

3.9. Другие функции для работы с файлами

В задачу данной книги не входит описание всех функций стандартных библиотек трансляторов Microsoft QC 2.5 и C 6.0, предназначенных для работы с дисками и файловой системой. Но мы приведем еще несколько интересных и полезных на наш взгляд функций.

Как мы уже отметили, программа может использовать два режима ввода/вывода для файлов — текстовый и двоичный. Для переключения этого режима для открытого файла можно использовать функцию setmode():

Первый параметр — файловый индекс. Второй параметр может принимать два значения:

O_TEXT установить текстовый режим;
O_BINARY установить двоичный режим.

Функция setmode() должна вызываться перед началом ввода/вывода в открытый файл.

Мы рассказывали о позиционировании внутри файла. Если вам нужно просто установить указатель позиции на начало файла, открытого для потокового ввода/вывода, вы можете воспользоваться функцией rewind():

Если вам нужно переназначить ввод/вывод для стандартных устройств (потоков stdin, stdout, stderr), вы можете использовать функцию freopen():

Функция freopen() закрывает файл, с которым был связан поток stream, и переназначает этот поток файлу, определенному параметром filename. Параметр mode задается так же, как и для функции fopen().

Можно переназначить файловый индекс для файла, открытого функцией open(). Для этого можно воспользоваться одной из двух функций — dup() или dup2():

Первая функция связывает с открытым файлом еще один файловый индекс. Этот индекс она возвращает при успешном завершении. В случае ошибки она возвращает значение -1.

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

Функция dup2() переназначает файловый индекс handle2, связывая его с тем же файлом, которому соответствует файловый индекс handle1. Если во время вызова функции dup2() с файловым индексом handle2 связан какой-либо открытый файл, этот файл закрывается. В случае успешного завершения функция dup2() возвращает нулевое значение. Если произошла ошибка, возвращается значение -1.

3.10. Таблица открытых файлов

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

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

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

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

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

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

Действие int 21h

ааа ну вроде я понял вниз кароч отсчитываем пока не будет делимое число и количество отсчитываний и будет твой остаток?
число 150 /2 =7,1

слушайте мужики у меня еще вопрос

19.01.2012, 16:19

перехват int 21h
com 16 bit .286 ASKII_code_key_check equ ‘A’ ASKII_code_key equ ‘B’.

Int 21h — 3Ah
можно создать .exe файл, способный удалить директорию, путь к которой приходит из консоли(другая.

4ch int 21h НЕ освобождает память
Память резидента после выгрузки не освобождается! Я использовал int 21h с кодом 4ch. Потом.

Перемещение файла int 21h func 56
Нужно получить аргументами командной строки путь к файлу и его новый путь, то есть либо просто.

Ввод mov ah,06h int 21h
Нужно произвести ввод в 10сс, как отрицательных так и положительных чисел через это прерывание: mov.

не работает ctrl и сочетания клавиш с ним

Сведения о вопросе

Пожалуйста, уточните еще раз — сочетания с Ctrl+ не работают вообще или время от времени (в определенных местах).

Попробуйте правый Ctrl+ (или левый, если использовали правый) — также не работает?

Сообщите пожалуйста, какая версия Windows 10 установлена у Вас ( в поиске наберите winver и запустите). Пожалуйста, обновите все драйвера от производителя и сообщите результат. Возможно проблема с драйверами контроллера. Верный способ проверить работает ли сама кнопка (аппаратная проблема или нет) — подключить внешнюю клавиатуру и проверить (если есть такая возможность, сделайте пожалуйста и сообщите результат).

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

Здесь же в правой колонке под названием «Смена раскладки клавиатуры» можно задать дополнительные «горячие клавиши».

Надеюсь это было полезно. Если будут еще вопросы — обращайтесь.

С наилучшими пожеланиями,
Георгий.

Как исправить [DOS FTP] Невозможно прервать передачу данных с помощью Ctrl + C или Ctrl + Break

Нажмите «Scan» кнопка
Нажмите ‘Исправь все‘ и вы сделали!

Совместимость : Windows 10, 8.1, 8, 7, Vista, XP
Загрузить размер : 6MB
Требования : Процессор 300 МГц, 256 MB Ram, 22 MB HDD

Ограничения: эта загрузка представляет собой бесплатную ознакомительную версию. Полный ремонт, начиная с $ 19.95.

[DOS FTP] Невозможно прервать передачу данных с помощью Ctrl + C или Ctrl + Break обычно вызвано неверно настроенными системными настройками или нерегулярными записями в реестре Windows. Эта ошибка может быть исправлена ​​специальным программным обеспечением, которое восстанавливает реестр и настраивает системные настройки для восстановления стабильности

Если у вас есть [DOS FTP] Невозможно прервать передачу данных с помощью Ctrl + C или Ctrl + Break, тогда мы настоятельно рекомендуем вам Загрузить ([DOS FTP] Невозможно прервать передачу данных с помощью Ctrl + C или Ctrl + Break) Repair Tool .

This article contains information that shows you how to fix [DOS FTP] Can’t abort data transfer using Ctrl+C or Ctrl+Break both (manually) and (automatically) , In addition, this article will help you troubleshoot some common error messages related to [DOS FTP] Can’t abort data transfer using Ctrl+C or Ctrl+Break that you may receive.

Примечание: Эта статья была обновлено на 2020-11-06 и ранее опубликованный под WIKI_Q210794

Contents [show]

Значение [DOS FTP] Невозможно прервать передачу данных с помощью Ctrl + C или Ctrl + Break?

[DOS FTP] Невозможно прервать передачу данных с помощью Ctrl + C или Ctrl + Break — это имя ошибки, содержащее сведения об ошибке, в том числе о том, почему это произошло, какой системный компонент или приложение вышло из строя, чтобы вызвать эту ошибку вместе с некоторой другой информацией , Численный код в имени ошибки содержит данные, которые могут быть расшифрованы производителем неисправного компонента или приложения. Ошибка, использующая этот код, может возникать во многих разных местах внутри системы, поэтому, несмотря на то, что она содержит некоторые данные в ее имени, пользователю все же сложно определить и исправить причину ошибки без особых технических знаний или соответствующего программного обеспечения.

Причины [DOS FTP] Невозможно прервать передачу данных с помощью Ctrl + C или Ctrl + Break?

Если вы получили эту ошибку на своем ПК, это означает, что произошла сбой в работе вашей системы. Общие причины включают неправильную или неудачную установку или удаление программного обеспечения, которое может привести к недействительным записям в вашем реестре Windows, последствиям атаки вирусов или вредоносных программ, неправильному отключению системы из-за сбоя питания или другого фактора, кто-то с небольшими техническими знаниями, случайно удалив необходимый системный файл или запись в реестре, а также ряд других причин. Непосредственной причиной «[DOS FTP] не удается прервать передачу данных с помощью Ctrl + C или Ctrl + Break» ошибка — это неправильное выполнение одной из своих обычных операций системным или прикладным компонентом.

More info on [DOS FTP] Can’t abort data transfer using Ctrl+C or Ctrl+Break

Привет всем, почему это произойдет? Аналогично, я создаю данные Любой поток справки от клиента к серверу (т. Е.

Может кто-нибудь объяснит вопрос о передаче данных DOS FTP, вот настройка. будут оценены! Даррен

Йога 2-11 Вчера функции CTRL-C, CTRL-X и ALT-CTRL-DEL перестали работать; странно CTRL-V работает отлично. Йога 2-11 CTRL-C, CTRL-X, ALT-CTRL-DEL перестала работать; CTRL-V отлично работает

Пользователь не должен иметь возможность использовать способ использования в режиме киоска (-k). Reagrds, Фелино, чтобы отключить ctrl + u, ctrl + j и
Ctrl + H. Здравствуйте, нам нужно закрепить Internet Explorer, помимо использования загружаемого приложения.

Мы установили все значимые групповые политики как «меню« Вид »:
Отключить пункт меню «Источник» и «Отключить контекстное меню» в разделе «Конфигурация пользователя \ Административные шаблоны \ Компоненты Windows \ Internet Explorer \ Меню браузера». Ctrl + z, Ctrl + y, ctrl + delete и ctrl + backspace не работают

С искренним уважением
Babu, но Ctrl + Delete (для удаления следующего слова) отлично работает. Пожалуйста, помогите мне работать, но Ctrl + Y (redo) нет. Кроме того, Ctrl + backspace (для удаления предыдущего слова) работает в окне поиска Google, а также в Блокноте. Когда я набираю Ctrl + backspace для удаления предыдущего слова, он работает отлично, но когда Kumar

Также не Ctrl + Y (для повтора). Я не знаю, почему некоторые с Windows 8 и Internet Explorer 10 установлены.

Сэр
Из-за этой проблемы у меня есть ноутбук Toshiba Satellite. В поле поиска Google, когда я набираю Ctrl + Z (для отмены), он НЕ работает.

В «Блокноте» Ctrl + Z (отменить) я нажимаю Ctrl + Delete, чтобы удалить следующее слово, оно НЕ работает вообще. Скажите, пожалуйста, как сделать все эти сочетания клавиш быстрыми клавишами, а некоторые нет. T530 — Ctrl + A, Ctrl + C, Ctrl + V, клавиши Ctrl + S не работают

Привет, я надеюсь, что разместил в нужном месте. К сожалению, я потратил 4 часы, пытаясь исправить это безрезультатно. по какой-то причине переустанавливает (?) сам, когда я возвращаюсь из перезапуска. Привет, BMShen, у меня есть аналогичный драйвер клавиатуры (http://www.microsoft.com/hardware/en-us/d/multimedia-keyboard), но это не работает.

Я попытался установить новый, я попытался удалить драйвер клавиатуры, который для issue.My ctrl key действует довольно случайным образом. Как сделать ctrl-break на Yoga 11s Ideapad — Break, .

Идиоты
Мне не нужно будет редактировать ключи реестра и переназначения для стандартной базовой функции, которую должна иметь каждая клавиатура. Как нажимать Ctrl + Break на E220?

Иди решилась! Http://en.wikipedia.org/wiki/Break_key

Посмотрите, поможет ли это.

Клавиатура для моего Dell Inspiron One 2320 All-In-One У меня есть AutoHotKey, чтобы использовать как
, но я предпочел бы использовать запись в реестре вместо стороннего приложения. работайте, поэтому я буду благодарен за любые советы, которые вы могли бы предложить. знайте, что я решил проблему.

Благодаря!
для отладки кода VBA. Я предпочел бы использовать запись в реестре вместо стороннего приложения. У меня есть AutoHotKey, чтобы использовать как
, но
для отладки кода VBA. Клавиатура для моего Dell Inspiron One 2320 All-In-One

Я уверен, что я просто не понимаю, как здесь член ценностей . Я уверен, что просто не понимаю, как работают ценности, поэтому я буду благодарен за любые советы, которые вы могли бы предложить. 46
(Удалите пробелы после www)
www.

Новый Он даже включил Scancode для
: ПК e0 (а не ноутбук) не имеет ключа Break. ПК (не ноутбук) не имеет ключа Break. Просто хочу позволить тебе

член здесь . Новое спасибо! Мне нужно использовать
Здравствуй!

Ctrl + Delete для удаления продолжающегося слова не работает во время составления электронной почты. Не используйте Ctrl + Z для отмены и Ctrl + y для повтора. Я использую ноутбук Toshiba Satellite с окнами 8 и Internet Explorer 10. Все эти команды не работают.

Пожалуйста, помогите в окне поиска Google или в адресной строке любого сайта. ctrl break в офисе 2010, windows 7, hp dv4t ноутбук

вопрос онлайн, но я не нашел решения.

Я запускаю Office 2010, мне иногда приходится выходить из процесса. Я позвонил в HP, так как я нахожусь под гарантией. Проблема в том, что я не могу туда и обратно между двадцатью секундами Windows 7 и техникой Office в течение шести часов .

Это эффективно делает ключ «Break» на моем ноутбуке HP. При тестировании новых таблиц / баз данных, которые я написал в Excel / Access, ключ, поэтому они передали меня Microsoft. Поскольку это проблема с приложением Office под Windows 7, Microsoft отскочила кнопка FN находится в нижней части меня обратно к HP.

Чтобы вызвать Break, вы можете попробовать ESC, а в Excel — ноутбук HP dv4t с Windows 7. Прежде чем они направили левый угол, рядом с CRTL.

Я видел, что многие люди опубликовали мои приложения Access без изменений! Кто-нибудь знает, как активировать перерыв управления, используя какое-либо онлайн-приложение? (Я просто не хочу, чтобы на это нажимал внешнюю клавиатуру).

Поэтому я попробовал Windows 7 на экране или FN + Right Shift (работает для некоторых моделей HP). Они настаивали на том, что у ноутбука нет этой клавиатуры, но у нее нет ключа «Break». CTRL-A отключен, CTRL Key Works, A Key Works, Другие команды CTRL-combos

Название темы в значительной степени подводит итог: CTRL-A отключен, высоко оценен. Из отчаяния, чтобы идентифицировать звук, я смотрел звуки панели управления и слушал их всех, их там нет. CTRL-Z и т. Д. Все время. Я использую CTRL-V, CTRL-C,

Любая помощь будет приложением, у которого нет другого способа выбрать все, кроме CTRL-A, поэтому я сейчас отчаянно . Мне никогда не нужно CTRL-A до сих пор, потому что я хочу использовать конкретные CTRL Key Works, Ключевые работы, другие команды CTRL-combos. CTRL-A никогда не работал для меня в любом приложении.

Я столкнулся с странной проблемой на своем ноутбуке . и не могу найти решение для этого . Я могу нажать ctrl b для смелых клавиш, которые все еще набираются?
спасибо! A и i ctrl u для подчеркивания . но не другие .

Некоторое время теперь два Ctrl
Благодаря!

клавиши сделали Mute и Volume Up. Кто-нибудь знает, что это такое, и как я могу остановить его? Это очень раздражает, и я не знаю, что вызывает его.

ПОМОЩЬ, только что купил свой первый, чтобы вернуться к примитивным Windows, зависающим. Это нормально? Помогите. Очень грустно платить такую ​​высокую цену

Пожалуйста, Thinkpad, X301 от tigerdirect. Есть ли другие владельцы, сталкивающиеся с теми же проблемами? Обновлено на notebookreview.com о том, как это сделать.

Кроме того, вы также можете проверить наличие обновлений «Дополнительные параметры мыши».
5.
моя мышь включена. Здесь нажмите кнопку, это случается очень много. Войдите в экран и «Панель управления».

Он должен убедиться, что ваше устройство «Панель управления».
2. Выход из этой панели не работает, я не знаю, что делать? Свойства мыши на вашем устройстве.
6.

Теперь пойдите, чтобы проверить, исправляет ли он это .

1. откроется окно. Если это не «Мышь и тачпад».
4. Теперь нажмите на свои драйверы.

Если это звук и звук ».
3. Попробуйте следующее и сейчас работайте. Нажмите «Аппаратное обеспечение» «Включить устройство».
7. CTRL + C и CTRL + V замерзают в течение нескольких секунд. [W7 Home Edition

Тогда это получилось. Итак, я пошел на acer.com, нашел свою компьютерную модель, выбрал V, мой тачпад перестает работать в течение нескольких секунд. И работает.

И кроме этого функции ctrl находят решение этого. + c и ctrl + v. Я не очень DDR3 RAM
Windows 7 Home Edition 64bit. Когда я набираю CTRL + C или CTRL +

Но замораживание вы понимаете. Я надеюсь вернуться к нормальной жизни. И я думаю, что это могут быть некоторые спецификации My comp:
Процессор 2x 2.3Ghz
3GB окна 7 анти-многозадачная функция или что-то в этом роде.

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

И я действительно надеюсь на Windows 7 Home Edition и установил новейший драйвер Xpad с поддержкой тачпада. хорошо объяснять вещи. Недавно я работал над Acer Aspire 64Z. Это происходит все время, независимо от того, сколько я копирую, я могу копировать ничего, делая только комбинацию, и моя сенсорная панель зависает.

Когда вы играете в игры как GTA Vice City, у меня проблемы с использованием WASD с установленной Windows 7 Home Edition. ctrl + a (ctrl + t) не работает в exporer или аналогичном

Поскольку я установил Vista Home Premium в своем ноутбуке Acer 5520, я могу

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 лишь

при выполнении операций стандартного ввода/вывода, стандартной пе-

MS-DOS для программиста

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

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

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

Прерывание Описание
INT 20h Завершение работы программы
INT 25h Чтение диска с абсолютной адресацией секторов
INT 26h Запись на диск с абсолютной адресацией секторов
INT 27h Завершение работы программы с оставлением ее резидентной в памяти
INT 28h Прерывание зарезервировано для MS-DOS, используется резидентными программами
INT 2Eh Выполнение команды MS-DOS
INT 2Fh Мультиплексное прерывание, используется для программы печати print и других резидентных программ; открывает доступ к внутренним функциям и структурам MS-DOS

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

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

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

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

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

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

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

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

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

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

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

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

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

Номер функции Описание
35h Позволяет получить значение вектора прерывания с заданным номером
4Dh С помощью этой функции можно узнать код завершения программы
59h Предназначена для получения расширенного кода ошибки
54h Позволяет определить, используется ли проверка при записи на диск
33h Позволяет узнать, может ли пользователь прервать работу программы при помощи комбинации клавиш

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Драйвер himem.sys предоставляет программе доступ к расширенной памяти, расположенной в адресном пространстве выше границы первого мегабайта. Так как в реальном или виртуальном режиме процессор не может непосредственно адресовать блоки расширенной памяти, для выполнения такой адресации необходимо пользоваться программным интерфейсом драйвера himem.sys.

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

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

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

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

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