Dos fn 5bh создать новый файл


Dos fn 5bh: создать новый файл

Автор: Рустам Гадеев, 15 May 98

Если вы заметили в документе
опечатки или неточности перевода,
просьба сообщить о них!
Перевод на русский язык и оформление:
Валерий Вотинцев

3.2. РАСШИРЕННЫЙ ИНТЕРФЕЙС DOS INT 21H (EXTENDED DOS API)

Перечень поддерживаемых функций:

09h Вывод строки на консоль Write string to console
1Ah Установить адрес DTA (disk transfer area) Set disk transfer area address
1Bh Получить характеристики текущего диска Get allocation information for default drive
1Ch Получить характеристики указанного диска Get allocation information for specific drive
1Fh Получить DPB (drive parameter block) для текущего диска Get drive parameter block for default drive
25h Установить обработчик прерывания (Set interrupt vector) Set interrupt vector
2Fh Получить адрес DTA (disk transfer area) Get disk transfer area address
32h Получить DPB (drive parameter block) для указанного диска Get drive parameter block for specific drive
34h Получить адрес флага InDos Get address of InDos flag
35h Получить адрес обработчика прерывания Get interrupt vector
39h Создать каталог (директорий) Create subdirectory
3Ah Удалить каталог (директорий) Remove subdirectory
3Bh Изменить текущий каталог Change current directory
3Ch Создать новый файл Create new file
3Dh Открыть существующий файл Open existing file
3Fh Чтение из файла Read from file
40h Запись в файл Write to file
41h Удалить файл с диска Delete file
43h Получить/Установить атрибуты файла Get/set file attributes
44h IOCTL IOCTL
47h Получить имя текущего каталога Get current directory
48h Выделить блок памяти DOS Allocate DOS memory block
49h Освободить блок памяти DOS Free DOS memory block
4Ah Изменить размер блока памяти DOS Resize DOS memory block
4Bh Загрузить и выполнить программы Load and execute child program
4Eh Найти первый файл по маске (Find first) Find first matching file
4Fh Найти следующий файл по маске (Find next) Find next matching file
56h Переименовать файл Rename file
5Ah Создать временный файл Create temporary file
5Bh Создать новый файл Create new file

Подробное описание функций WDOSX для расширенного интерфейса DOS INT 21h:

9h — Вывод строки на консоль

1Ah — Установить адрес DTA (disk transfer area)

1Bh — Получить характеристики текущего диска

Asmworld Программирование на ассемблере для начинающих и не только

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

Автор: xrnd | Рубрика: Исходники | 25-12-2010 | Распечатать запись

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

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

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

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

Имя файла должно быть в формате 8.3 — 8 символов имени и 3 символа расширения. Естественно, можно использовать только английский буквы, цифры и некоторые другие символы. Строка с именем файла должна заканчиваться нулевым байтом. Если файл уже существует, то его содержимое будет удалено.

Об ошибке можно узнать, проверяя значение флага CF (1 — ошибка, 0 — нет ошибки). Аналогично для других функций работы с файлами. Если флаг CF равен 0, то в регистре AX будет находиться дескриптор (или описатель) файла. Дескриптор — это просто специальное число, по которому операционная система отличает один открытый файл от другого.

Запись данных в файл

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

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

Закрытие файла

После работы с файлом нужно его закрыть с помощью функции DOS 3Eh.

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

Пример первый

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

use16 ;Генерировать 16-битный код org 100h ;Программа начинается с адреса 100h jmp start ;Перепрыгнуть данные ;——————————————————————————- ; Данные file_name db ‘hello.txt’,0 buffer db ‘asmworld.ru’,13,10,’Hello!’ size db 19 s_error db ‘Error!’,13,10,’$’ s_pak db ‘Press any key. $’ handle rw 1 ;Дескриптор файла ;——————————————————————————- ; Код start: mov ah,3Ch ;Функция DOS 3Ch (создание файла) mov dx,file_name ;Имя файла xor cx,cx ;Нет атрибутов — обычный файл int 21h ;Обращение к функции DOS jnc @F ;Если нет ошибки, то продолжаем call error_msg ;Иначе вывод сообщения об ошибке jmp exit ;Выход из программы @@: mov [handle],ax ;Сохранение дескриптора файла mov bx,ax ;Дескриптор файла mov ah,40h ;Функция DOS 40h (запись в файл) mov dx,buffer ;Адрес буфера с данными movzx cx,[size] ;Размер данных int 21h ;Обращение к функции DOS jnc close_file ;Если нет ошибки, то закрыть файл call error_msg ;Вывод сообщения об ошибке close_file: mov ah,3Eh ;Функция DOS 3Eh (закрытие файла) mov bx,[handle] ;Дескриптор int 21h ;Обращение к функции DOS jnc exit ;Если нет ошибки, то выход из программы call error_msg ;Вывод сообщения об ошибке exit: mov ah,9 mov dx,s_pak int 21h ;Вывод строки ‘Press any key. ‘ mov ah,8 ;\ int 21h ;/ Ввод символа без эха mov ax,4C00h ;\ int 21h ;/ Завершение программы ;——————————————————————————- ; Процедура вывода сообщения об ошибке error_msg: mov ah,9 mov dx,s_error int 21h ;Вывод сообщения об ошибке ret

В результате работы программы создаётся файл, который можно открыть блокнотом:

Открытие существующего файла

Для открытия файла используется функция DOS 3Dh. В отличие от создания файла, эта функция завершится ошибкой, если файл не существует.

Чтение данных из файла

Чтение из файла выполняется функцией DOS 3Fh.

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

Пример второй

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

use16 ;Генерировать 16-битный код org 100h ;Программа начинается с адреса 100h jmp start ;Перепрыгнуть данные ;——————————————————————————- ; Данные file_name db ‘hello.txt’,0 s_error db ‘Error!’,13,10,’$’ s_file db ‘—-[ file «Hello.txt» ]$’ endline db 13,10,’$’ s_pak db ‘Press any key. $’ buffer rb 81 ;80 + 1 байт для символа конца строки ‘$’ handle rw 1 ;Дескриптор файла ;——————————————————————————- ; Код start: mov ah,3Dh ;Функция DOS 3Dh (открытие файла) xor al,al ;Режим открытия — только чтение mov dx,file_name ;Имя файла xor cx,cx ;Нет атрибутов — обычный файл int 21h ;Обращение к функции DOS jnc @F ;Если нет ошибки, то продолжаем call error_msg ;Иначе вывод сообщения об ошибке jmp exit ;Выход из программы @@: mov [handle],ax ;Сохранение дескриптора файла mov bx,ax ;Дескриптор файла mov ah,3Fh ;Функция DOS 3Fh (чтение из файла) mov dx,buffer ;Адрес буфера для данных mov cx,80 ;Максимальное кол-во читаемых байтов int 21h ;Обращение к функции DOS jnc @F ;Если нет ошибки, то продолжаем call error_msg ;Вывод сообщения об ошибке jmp close_file ;Закрыть файл и выйти из программы @@: mov bx,buffer add bx,ax ;В AX количество прочитанных байтов mov byte[bx],’$’ ;Добавление символа ‘$’ mov ah,9 mov dx,s_file int 21h ;Вывод строки с именем файла mov cx,56 call line ;Вывод линии mov ah,9 mov dx,buffer int 21h ;Вывод содержимого файла mov dx,endline int 21h ;Вывод перехода на новую строку mov cx,80 call line ;Вывод линии close_file: mov ah,3Eh ;Функция DOS 3Eh (закрытие файла) mov bx,[handle] ;Дескриптор int 21h ;Обращение к функции DOS jnc exit ;Если нет ошибки, то выход из программы call error_msg ;Вывод сообщения об ошибке exit: mov ah,9 mov dx,s_pak int 21h ;Вывод строки ‘Press any key. ‘ mov ah,8 ;\ int 21h ;/ Ввод символа без эха mov ax,4C00h ;\ int 21h ;/ Завершение программы ;——————————————————————————- ; Процедура вывода сообщения об ошибке error_msg: mov ah,9 mov dx,s_error int 21h ;Вывод сообщения об ошибке ret ;——————————————————————————- ; Вывод линии ; CX — количество символов line: mov ah,2 ;Функция DOS 02h (вывод символа) mov dl,’-‘ ;Символ @@: int 21h ;Обращение к функции DOS loop @B ;Команда цикла ret

Результат работы программы:

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

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

  • 5Bh — создание нового файла без удаления существующего;
  • 5Ah — создание файла с уникальным именем (например, временного файла);
  • 41h — удаление файла;
  • 42h — установка указателя чтения/записи;
  • 56h — переименование файла;
  • 43h — получение или изменение атрибутов файла;
  • 57h — получение или изменение метки времени файла;
  • 39h — создание папки;
  • 3Ah — удаление папки;
  • 3Bh — изменение текущей папки;
  • 47h — получение текущей папки.

Файл: Упорядочить файл по убыванию рейтинга студентов

Помогите пожалуйста написать програму:

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

Буду очень благодарен!

27.01.2013, 17:22

Сделать перевод рейтинга в 5-ти бальную шкалу. Измененный файл вывести на экран
Помогите пожалуйста с заданием, я вообще не понимаю. Создать файл записей: фамилия студента, номер.

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

Файл: Упорядочить список студентов по алфавиту и распечатать его.
Всем привет. Прошу помочь с написание программы. Заранее благодарю. На диске имеется файл данных.

27.01.2013, 18:12 2

AH = 43H
DS: DX = адрес строки ASCIIZ с именем файла
AL = код подфункции: 0 = извлечь текущий атрибут файла
AL = 1 = установить атрибут файла
CX = новый атрибут файла (для подфункции 01H)
Выход

AX = код ошибки если CF установлен
CX = текущий атрибут файла (для подфункции 00H)
Описание:

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

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

OS Fn 3cH: создать файл через описатель

AH = 3cH
DS: DX = адрес строки ASCIIZ с именем файла
CX = атрибут файла
Выход

AX = код ошибки если CF установлен и описатель файла если ошибки нет
Описание:

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

файл создается в указанном (или умалчиваемом) оглавлении
файл открывается в режиме доступа чтение/запись
вы должны созранить описатель (handle) для последующих операций
если файл уже существует:
при открытии файл усекается до нулевой длины
если атрибут файла — только чтение, открытие отвергается (атрибут можно изменить функцией 43H изменить атрибут)
CONFIG.SYS специфицирует число доступных описателей в системе
используйте функцию 5bH создать Новый файл, если вы не хотите перекрывать (усекать) существующий файл.

DOS Fn 3fH: читать файл через описатель

AH = 3fH
BX = описатель файла
DS: DX = адрес буфера для чтения данных
CX = число считываемых байт
Выход

AX = код ошибки если CF установлен или число действительно прочитанных байт
Описание:

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

Используйте функцию 42H LSEEK, чтобы установить указатель файла, если необходимо (OPEN сбрасывает указатель в 0). Модифицирует указатель чтения/записи файла, подготавливая его к последующим операциям чтения или записи.

Вы должны всегда сравнивать возвращаемое значение AX (число прочитанных байт) с CX (запрошенное число байт):

если AX = CX, (и CF сброшен) — чтение было корректным без ошибок
если AX = 0, достигнут конец файла (EOF)
если AX
при чтении с устройства — входная строка имеет длину AX байт
при чтении из файла — в процессе чтения достигнут EOF
Замечания:

Эта функция превосходит сложные и неудобные FCB-функции. Она эффективно сочетает произвольный и последовательный доступ, позволяя пользователю выполнять свое собственное блокирование. Удобно использовать эту функцию для чтения стандартных описателей, таких как описатели стандартного в/в, взамен многочисленных буферизующих и посимвольных FCB-функций ввода. Когда вы читаете с устройства, AX возвращает длину считанной строки с учетом завершающего возврата каретки CR (ASCII 0dH).

DOS Fn 40H: писать в файл через описатель

AH = 40H
BX = описатель файла
DS: DX = адрес буфера, содержащего записываемые данные
CX = число записываемых байт
Выход

AX = код ошибки если CF установлен
AL = число реально считанных байт (лучший тест для ошибок)
Описание:

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

Используйте функцию 42H LSEEK, чтобы установить указатель файла, если необходимо (OPEN сбрасывает указатель в 0). Обновляет указатель чтения/записи файла, чтобы подготовиться к последующим операциям последовательного чтения или записи.

Вы должны всегда сравнивать возвращаемое значение AX (число записанных байт) с CX (запрошенное число байт для записи).

если AX = CX, запись была успешной
если AX
Замечание:

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

Создаем вирус и антивирус (39 стр.)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

BH – класс ошибки

BL – предлагаемое действие

CH – сфера (где произошла ошибка)

Описание. Эту функцию можно использовать, чтобы уточнить, что предпринять после сбоя функции DOS по ошибке (только DOS 3.0+). Ее можно вызывать: в обработчике критических ошибок INT 24h, после любой функции INT 21h, возвратившей флаг переноса после вызова FCB-функции, возвратившей AL=FFh.

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

DS:DX – адрес строки ASCIZ с диском и путем (заканчивается символом «\»)

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

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

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

DS:DX – (не изменяется) полное ASCIZ-имя нового файла

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

Описание. Открывает (создает) файл с уникальным именем в каталоге, заданном строкой ASCIZ, на которую указывает DS:DX. COMMAND.COM вызывает эту функцию, когда создает временные «канальные» файлы, используемые при переназначении ввода-вывода. Описание пути должно быть готово к добавлению в его конец имени файла. Необходимо обеспечить минимум 12 байт в конце строки. Сама строка должна быть заполнена в одной из форм: «^: \путь\»,0 (указан диск и путь), «d:»,0 (текущее оглавление диска) или «d: \»,0 (корневое оглавление диска).

Версии: DOS 3.00 и выше. DOS, функция 5Bh Создать новый файл

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

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

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

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

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

Описание. Файл открывается для чтения/записи в совместимом режиме доступа. Если диск и/или путь не указаны, принимаются значения по умолчанию. Этот вызов идентичен функции DOS 3Ch с тем исключением, что он вернет ошибку, если файл с заданным именем уже существует.

Версии: DOS 3.00 и выше. DOS, функция 5Ch Блокировать/разблокировать доступ к файлу

AL=00h – заблокировать область файла

AL=01h – разблокировать ранее заблокированную область

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

CX:DX – смещение ((CX*65536)+DX) от начала файла

SI:DI – длина блокируемой области ((SI*65536)+DI) байт

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

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

Описание. Блокирует или освобождает доступ к участку файла, указанного в BX. Область файла с логическим смещением CX:DX и длиной SI:DI блокируется (захватывается) или разблокируется (освобождается). Смещение и длина обязательно должны быть указаны. Разделение файлов должно быть активизировано (командой SHARE), иначе функция вернет код ошибки «Неверный номер функции».

Версии: DOS 3.00 и выше (при обязательной загрузке SHARE). DOS, функция 62h Получить адрес PSP

Выход: BX – сегментный адрес PSP выполняющейся программы

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

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

AL=01h – дать расширенную информацию страны DOS 3.3

AL=02h – дать таблицу преобразования строчных букв в прописные

AL=04h – то же для символов, допустимых в именах файлов

AL=06h – дать сопоставляющую последовательность

BX – кодовая страница (FFFFh – консоль)

CX – размер буфера возврата (должен быть минимум 5 байт)

ES:DI – адрес буфера возврата

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

ES:DI – адрес возвращенной информации

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

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

Версии: DOS 3.30 и выше. DOS, функция 66h Получить/установить глобальную кодовую страницу

AL=01h – запросить текущую глобальную кодовую страницу

AL=02h – установить активную кодовую страницу

BX – (при AL=02h) кодовая страница (Таблица Б-14)

DX – (при AL=02h) системная кодовая страница (устанавливаемая при загрузке)

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

Таблица Б-14. Значения кодовых страниц

BX – (если при вызове AL=01h) текущая активная кодовая страница

DX – (если при вызове AL=01h) системная кодовая страница (устанавливаемая при загрузке)

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

Описание. Эта функция выбирает новую кодовую страницу или получает значение текущей активной кодовой страницы (страниц). Программа DOS NLSFUNC должна быть загружена до этого вызова. Функция используется в сочетании с 65h или 38h.

Примечание. Устанавливая новую активную кодовую страницу, DOS читает данные из файла COUNTRY.SYS.

Версии: DOS 3.30 и выше. DOS, функция 67h Установить число описателей файлов

BX – максимальное число описателей (до FFFFh)

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

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

Описание. Эта функция устанавливает максимальное число описателей файлов, которые могут быть открыты одновременно. Если значение BX меньше 20, то принимается 20. Если значение BX меньше текущего максимума (нужно сократить число описателей), и в данный момент открыто более чем BX файлов, то изменение будет иметь место, когда число открытых файлов не будет превышать устанавливаемый максимум. Если BX больше текущего максимума (нужно увеличить число описателей), то DOS должна иметь доступную память, чтобы распределить ее под новые описатели. Функция 4Ah позволяет освободить память, чтобы она стала доступной DOS.

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

BX – описатель завершаемого файла

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

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

Лекция №10. Работа с файлами. Управление файловой системой. Консольный ввод в ассемблере.

Чтение данных из файла

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

BOOL ReadFile(HANDLE hFile, (1)

LPVOID lpBuffer, (2)

DWORD nNumberOfBytesToRead, (3)

LPDWORD lpNumberOfBytesRead, (4)

LPOVERLAPPED lpOverlapped); (5)

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

– hFile – хэндл того файла, из которого будет производиться чтение.

– lpBuffer – указывает на буфер, в который будет производиться чтение данных.

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

– в буфер lpNumberOfBytesRead будет записано число реально прочитанных байтов.

– аргумент lpOverlapped используется только для асинхронного ввода-вывода. При синхронном вводе необходимо этому параметру передать значение NULL.


; Считать данные из файла data.txt в массив структур. (struk4.asm)

.model flat, stdcall

worker struc ;информация о сотруднике

nam db 30 dup (» «) ;фамилия, имя, отчество

position db 30 dup (» «) ;должность

age db 2 dup (» «) ;возраст

standing db 2 dup (» «) ;стаж

salary db 4 dup (» «) ;оклад в гривнах

birthdate db 8 dup (» «) ;дата рождения

worker ends ; 76 байт в строке в файле

mas_sotr worker 10 dup (<>)

filename db ‘data.txt’,0

Ttl db ‘Massiv’,0h

mes1 db ‘Massiv: ‘,0ah,0dh

mov ebx,type worker

; CreateFileA

mov eax,offset filename

; ReadFile

mov ebx,offset mas_sotr

mov esi,(type worker)*edi ; edi — индекс элемента в массиве

lea edi, bufread

Не обещаю, что работает!

Пример программы для практики

; Программа формирует массив структур. В массиве 3 элемента. Массив вводится вручную.

; На экран выводится возраст всех сотрудников

worker struc ;информация о сотруднике

nam db 15 dup (‘ ‘) ;имя

lastnam db 15 dup (‘ ‘) ; фамилия

age db 2 dup (‘ ‘) ;возраст

buf1 db 15 dup (20h)

pole1 db 2 dup (?) ; поле для вывода возраста

N=3 ; размерность массива

mas_sotr worker N dup (<>)

mes1 db ‘Vvedite 3 elementa strukturi: ‘,’$’

mnam db 10,13,’Vvedite imya: ‘, ‘$’

mlastnam db 10,13,’Vvedite familiyou: ‘,’$’

mage db 10,13,’Vvedite vozrast: ‘,’$’

mes db 10,13,’Vozrast=’,10,13,’$’

mov dx,offset mes1 ; mes1 = ‘Vvedite 3 elementa strukturi: ‘,’$’

mov ah,09h ;Функция Dos вывода сообщения на

mov bx, offset mas_sotr

mov ax, type worker

; Цикл cykl2 – цикл формирования массива структур в памяти.

mov dx,offset mnam

mov ah,09h ;Функция Dos вывода сообщения на

mov ah,0ah ; Функция 0ah записывает в буфер buf1, находящийся по адресу в dx

mov cl,byte ptr [si]

mov dx,offset mlastnam

mov ah,09h ;Функция Dos вывода сообщения на

mov cl,byte ptr [si]

mov dx,offset mage

mov ah,09h ;Функция Dos вывода сообщения на

mov cl,byte ptr [si]

; —————————————-Метка label_1: продолжение цикла cykl2, так как он получается

; очень большим, то часть цикла вынесли за его пределы.

mov ax, type worker

mov byte ptr [di],’$’

mov dx,offset mes

; ——————————————В поле pole1 записывается возраст каждого сотрудника из

; массива структур в памяти. Далее содержимое поля pole1 выводится на экран.

mov bx, type worker

lea dx,[si].age ;lea dx,[si+1E]

mov dx,offset pole1

Самостоятельно на практике:

1) Переделать программу под WIN32.

2) Создать массив структур mas_sotr2 worker 7 dup (<>). Инициализировать массив структур в программе. На экран выдать сообщение в окне MessageBoxA. Сообщение должно содержать все данные структуры для самого старшего сотрудника.

Создать и открыть новый файл

Функция DOS 5Bh — Создать и открыть новый файл.

СХ = атрибут файла

DS:DX = адрес ASCIZ-строки с полным именем файла

CF = 0 и АХ = идентификатор файла, открытого для чтения/записи в режиме совместимости, если не произошла ошибка.

CF = 1 и АХ = код ошибки (03h — путь не найден, 04h — слишком много открытых файлов, 05h — доступ запрещен, 50h — файл уже существует).

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

Функция DOS 3Fh — Чтение из файла или устройства

АН = 3Fh

ВХ = идентификатор файла

СХ = число байт

DS:DX = адрес буфера для приема данных

Вывод:

CF = 0 и АХ = число считанных байт, если не произошла ошибка

CF = 1 и АХ = 05h, если доступ запрещен, 06h, если неправильный идентификатор

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

При работе с файлами на ассемблере единичной записью является байт. Все записи имеют номера от 0 до L-1, где L длина файла. При открытии файла указатель устанавливается на запись 0. При чтении или записи указатель автоматически передвигается на n байт (где n — число прочитанных или записанных байт).

Илон Маск рекомендует:  Что такое код asp binarywrite

При чтении файла (функция 3FH) в АХ помещается считанное количество байт. Поэтому следует каждый раз сравнивать АХ и СХ. Если АХ>СХ, то обычно это означает, что в процессе чтения произошел переход через конец файла (устанавливается флаг СF). При записи в файл ситуация аналогична, но в этом случае неравенство содержимого АХ и СХ будет означать, что в процессе записи произошла ошибка.

Переместить указатель чтения/записи

Функция DOS 42h — Переместить указатель чтения/записи

Ввод:

АН = 42h

ВХ = идентификатор

CX:DX = расстояние, на которое надо переместить указатель (со знаком) (4 ГБ)

AL = перемещение от:

Начала файла

Текущей позиции

Конца файла

Вывод:

CF = 0 и CX:DX = новое значение указателя (в байтах от начала файла), если не произошла ошибка

CF = 1 и АХ = 06h, если неправильный идентификатор

Указатель можно установить за реальными пределами файла: если указатель устанавливается в отрицательное число, следующая операция чтения/записи вызовет ошибку; если указатель устанавливается в положительное число, большее длины файла, следующая операция записи увеличит размер файла. Эта функция также часто используется для определения длины файла. Для этого необходимо вызвать ее с параметрами СХ = 0, DX = 0, AL = 2, и в CX:DX будет возвращена длина файла в байтах.

Используя функцию 42Н, можно переместиться к любому байту файла. Ниже дается полное описание этой функции.

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

CX:DX на сколько передвинуть

AL как передвигать

0 начало файла + CX:DX,

1 от текущей позиции файла + CX:DX,

2 от конца файла + СХ:DX

Если флаг переноса установлен, то в АХ помещен код ошибки, в противном случае AX:DX показывает новую позицию в файле.

Переместить указатель чтения/записи в Win32

DWORD SetFilePointer(HANDLE hFile,

LONG IDistanceToMove,

PLONG lpDistanceToMoveHigh,

DWORD dwMoveMethod);

Последнее изменение этой страницы: 2020-09-13; Нарушение авторского права страницы

Dos fn 5bh: создать новый файл

Ассемблер? Это просто! Учимся программировать (FAQ)
______________________________________

Вопросы, которые поступили от подписчиков рассылки
«Ассемблер? Это просто! Учимся программировать»

Дата выхода: 2001-10-11

Как бороться с этой ошибкой:
Assembling file: life.asm
**Fatal** life.asm(1) Line too long
Turbo Assembler Version 4.1

Здравствуйте, tim!
В Асме существует два вида коментариев
точка с запятой-коментарий до конца строки
и
Comment
где -любой символ, коментарий идет до строки, где встретится такой же символ
В первой строке у тебя объявляется такой коментарий($)
и черте где он заканчивается
Может это убрать, и закоментарить стандартными (;)
ЗЫ Я когда-то сам на паскале эту вещь реализовал. Ностальжи:)
А по поводу призов за голосование-экспертам там что-то обещают(показы баннеров, WMR)-можно и выигравшему то же, но есстессно меньше:)

Отправил эксперт: Sensey
Эксперт отправил ответов (всего): 171

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Привет всем! У меня тут пара вопросов:
1. Команда Ret — возврат из процедуры,
а команды RetN и RetF? И вообще какие команды возврата ещЈ сушествуют?
2. В Turbo Pascal надо запустить несколько процедур в фоновом режиме. Я знаю, что надо прехватить прерывание 1Ch. Но как в обработчике прерывания запустить эти процедуры я незнаю.

Команда ret — общий вид еоманды завершения процедуры. Компилятором она преобразуется к виду retn или retf в зависимости от типа процедуры — ближняя или дальняя. Если не оформлять процедуру при помощи кончтрукции proc/endp, то в моделях памяти TINY, SMALL и COMPACT используется по умолчанию retn, а для моделей MEDIUM, LARGE, HUGE, TPASCAL — retf.

Что Вы понимаете под «какие команды возврата еще сушествуют»? Вообще-то, существует только одна команда ret. Ну, плюс еще команда iret для завершения обработчика прерывания. Ну и модификация ret для завершения процедуры с одновременой очисткой стека. В основном для возврата из процедур, предназначенных для использования с паскаль-программами. Ее вид — ret n, где n — число слов, извлекаемых из стека.

А если Вас интересует, как можно извратиться с возвратом из процедуры, то тут поле для деятельности неограничено. Например, я люблю следующий трюк (для сопряжения с Паскалем, с Си не пройдет!):

PascalProc proc far
pop [EndProc_Ofs]
pop [EndProc_Seg]
.
db JMPFAR ; код команды jmp far. В начале определяется константа JMPFAR EQU 0eah

EndProc_Ofs dw ?
EndProc_Seg dw ?

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

2. А какие проблемы с запуском процедур? Они вызываются так же, как и обычные процедуры. Только надо учесть, что при вызове обрабьтчика прерывания указатель регистра данных (ds) установлен неизвестно на что. Так что надо сохранить ds и установить его на сегмент данных программы. А то ничего паскалевого работать не будет! :)

Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 27

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Как бороться с этой ошибкой:
Assembling file: life.asm
**Fatal** life.asm(1) Line too long
Turbo Assembler Version 4.1

Вот уж и не знаю. MASM — оно, может быть, и хорошо, но TASM — лучше! В TASM’е у меня все скомпилировалось нормально, только предупреждения по поводу использования зарезервированных слов в качестве имен переменных.

Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 28

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Уважаемые эксперты
Подскажите
IDE для кодирования на ассемблере
Чтобы команды одним шрифтом
операнды другим
а дерективы третим
И чтобы project manager был, а то NotePad достал уже
И еще чтобы параметры в командной строке после TASM можно было редактировать
Короче IDE под ассемблер

Здравствуйте, ivekm!
Под win32 это безусловно ASMedit а если хотите под дос то это TASMedit
(а зато там все на руском! )

Отправил эксперт: Bart Simpson
Эксперт отправил ответов (всего): 8

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Программа написана на ASM. При компиляции ее TASM’ом размер ее — 143b, а при компидяции MASM’ом — 125b. Какие необходимы параметры для TASM’а, чтобы она компилировалась в 125b?

А программу приложить.

Отправил эксперт: Dron (http://spawnhole.narod.ru/asmos/asmos.html — Операционная система с нуля!)
Эксперт отправил ответов (всего): 168

Экспертная группа: Оптимизация программ

Программа написана на ASM. При компиляции ее TASM’ом размер ее — 143b, а при компидяции MASM’ом — 125b. Какие необходимы параметры для TASM’а, чтобы она компилировалась в 125b?

Здравствуйте, Константин!
Без программы точно невозможно сказать, а решение, лежащее на поверхности-поставить многопроходную компиляцию:
параметр /m9 — компилировать 9 раз,
хотя прог, где надо больше 3 проходов, не встречал.

Отправил эксперт: Sensey
Эксперт отправил ответов (всего): 172

Экспертная группа: Оптимизация программ

Ну и оперативность. ВОт программа:

Поставь для tasm ключик /m2
Это указание что компилировать нужно за два прохода.

Просто ты используешь .386
на 386 условные переходы могут быть двух видов
на +-128 байт (ну примерно :)
или на +-32к или +-2G

первый или двушечный вариант занимает два байта,
второй (в зависимости от типа сегмента) от 4 до 7.

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

В твоей программе 9 условных переходов, следовательно 18 байт потерь.

Отправил эксперт: Dron (http://spawnhole.narod.ru/asmos/asmos.html — Операционная система с нуля!)
Эксперт отправил ответов (всего): 169

Экспертная группа: Оптимизация программ

Уважаемые эксперты
Подскажите
IDE для кодирования на ассемблере
Чтобы команды одним шрифтом
операнды другим
а дерективы третим
И чтобы project manager был, а то NotePad достал уже
И еще чтобы параметры в командной строке после TASM можно было редактировать
Короче IDE под ассемблер

Здравствуйте, ivekm!
Очень хороший IDE — это TASMEDIT . Где его найти, я Вам сказать затрудняюсь, но поищите в www.filesearch.ru (ищите tasmed.zip/rar/arj). Известные глюки в версии 1.85 — не очень корректно запускает из-под себя tasm и tlink, но можно в нем писать, а компилить отдельно. Если надо, у меня есть к нему кряк и пара самописных bat-файлов для компиляции. Пиши.

Отправил эксперт: baldr (http://www.dospage.fromru.com — Сайт об ОС DOS. Всем, кто любит эту ОС!)
Эксперт отправил ответов (всего): 1

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Здравствуйте, Дмитрий!
Я, честно говоря, не совсем понимаю, что это за буфер в 256 байт, но все делается
гораздо проще. В сегменте данных BIOS (сегмент 0040h) по смещению 0017h находится байт состояния клавиатуры 1.
бит 7 =1 INSert активен
бит 6 =1 Caps Lock активен
бит 5 =1 Num Lock активен
бит 4 =1 Scroll Lock активен
бит 3 =1 любая Alt нажата
бит 2 =1 любая Ctrl нажата
бит 1 =1 Left Shift нажата
бит 0 =1 Right Shift нажата
Изменяя его соответствующим образом, можно получить соответствующие сочетания клавиш.

Отправил эксперт: baldr (http://www.dospage.fromru.com — Сайт об ОС DOS. Всем, кто любит эту ОС!)
Эксперт отправил ответов (всего): 2

Экспертная группа: Оптимизация программ

Меня тут препод по программингу нагрузил: придумать самому себе задание и его же реализовать. Я думал-думал, на ум что-то ничего не идет. Может подкинете идейку насчет того, какую прогу написать, чтобы не слишком простая была и не слишком сложная (тесты и м/м энциклопедии не предлагать). У самого уже воображения не хватает.
HELP бедному студенту!

Здравствуйте, Shorty!
Предлагаю написать полиморфный резидентный вирус под Windows :))

(Сам просид — не слишком легкую) :))) Вроде и не слишком сложно.
Как тебе ? :)) Cлабо. :))
Ну а если это слишком легко — то тогда добавь еще и антиэвристические приемы :))) И технологию UEP

Отправил эксперт: Евгений
Эксперт отправил ответов (всего): 21

Экспертная группа: Общие вопросы по программированию на Ассемблере под Win32

Подскажите где взять ASMEdit

Здравствуйте, ivekm!
www.download.com

Отправил эксперт: DiGiT
Эксперт отправил ответов (всего): 26

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Хочу купить riva tnt pro 32mb
Какие у неё характеристики? и вообще как ведет себя в играх, при просмотре фильмов?

Здравствуйте, Владимир!
Не бери этот отстой покупай GeForce хотя бы 2MX. рива хреновая карта. У нее сам движок хуже. И позже если ты хочешь играть в потрясные игры ты поймешь эту разницу. А GeForce хоть и дороже, но она оправдывает свою цену.(лучше конечно GTS,а не 2MX).Выбор за тобой.

Отправил эксперт: DiGiT
Эксперт отправил ответов (всего): 27

Экспертная группа: Модели, виды и типы компьютеров (hard)

Ну и оперативность. ВОт программа:

Здравствуйте, Константин! И?


Отправил эксперт: DiGiT
Эксперт отправил ответов (всего): 28

Экспертная группа: Оптимизация программ

Хочу купить riva tnt pro 32mb
Какие у неё характеристики? и вообще как ведет себя в играх, при просмотре фильмов?

Здравствуйте, Владимир!
Характеристики: 32мб АГП..с поддержкой директ3Д..OPenGL
но нет 3dfx интерфейса. который желателен для промотра фильмоф многих геймов, но есь 3D аксселератры которые эмулируют 3дфх(конечно ето не сравнится с аксселератором ввиде платы)..котрые сделают те 3дфх.

Отправил эксперт: змей
Эксперт отправил ответов (всего): 66

Экспертная группа: Модели, виды и типы компьютеров (hard)

Подскажите где взять ASMEdit

Здравствуйте, ivekm!
www.avtlab.ru

Отправил эксперт: Broken Sword (http://www.revolution.co.uk — скрытая реклама. )
Эксперт отправил ответов (всего): 183

Экспертная группа: Работа с MASM/TASM

Подскажите, pls как асмом создать папку, в которой создать файл и записать в него каку-нибудь строку.

Только сильно не пинайте за ламерские вопросы, я читал как это делается, но не вЪехал.
Насколько я понял директория создаётся функцией 39h, при этом в DX — offset переменной, содержащей путь.

А файл создать — это вроде 3сh, но нужно указать атрибуты, а какие они бывают. и неясно чего ложить в dx.

А чтобы открыть файл нужно какой-то код открытия и указатель — увы не знаю что это такое.

Пожалуйста поподробнее, если можно
Заранее благодарен.

Здравствуйте уважаемый, см. приложение.
1. Создаем директорию (как вы правильно заметили — 39h функция 21h прерывания), в dx ложим адрес переменной (dir), содержащей путь, в котором последняя директория пока еще не существует (C:\TESTDIR — так вот этот TESTDIR пока еще не существует (до int 21h)). Причем, заметьте, что эта самая dir заканчивается НУЛЕМ. (это чтобы знать где конец пути).

2. Создаем файл в еще тепленькой директории. Для этого сущ. 3Ch функция прерывания 21h. В dx аналогично п.1 ложим адрес переменной file, которая содержит полный путь и имя файла, который мы собираемся замутить. (тоже заканчивается 0. ) насчет атрибутов — они в CX:
если бит 0 регистра CX = 1, то создаваемый файл будет иметь атрибут «только для чтения».
если бит 1 регистра CX = 1, то создаваемый файл будет иметь атрибут «скрытый»
вообщем, 2 бит — системный файл, 3 — метка тома (игнорируется), 4 — директория (должен быть 0), 5 — архивный бит (1, если файл не сохранялся), 6-не используется, 7-для Novel NetWare

3. Можно даже не открывать, а сразу писать в него чето. ah=40h, в bx — идентификатор файла, в который собираемся писать (вот для чего команда mov bx,ax), cx-число байтов, к-рые собираемся писать, dx- адрес буфера с данными (здесь уже никаких 0 в конце не нада, все определяется cx)

Есть кой-какая хрень — это определение имени создаваемого файла за создаваемой директорией, получается 2 раза одно и тоже — это нехорошо. Я подумаю, че можно присочинить, пока так.

Отправил эксперт: Broken Sword (http://www.revolution.co.uk — скрытая реклама. )
Эксперт отправил ответов (всего): 184

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Подскажите, pls как асмом создать папку, в которой создать файл и записать в него каку-нибудь строку.

Только сильно не пинайте за ламерские вопросы, я читал как это делается, но не вЪехал.
Насколько я понял директория создаётся функцией 39h, при этом в DX — offset переменной, содержащей путь.

А файл создать — это вроде 3сh, но нужно указать атрибуты, а какие они бывают. и неясно чего ложить в dx.

А чтобы открыть файл нужно какой-то код открытия и указатель — увы не знаю что это такое.

Пожалуйста поподробнее, если можно
Заранее благодарен.

Ну, вот пример создания, записи и закрытия файла. Вроде с комментариями :)

Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 29

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Существует ли в Ассемблере понятие массива? Если да, то как можно создать массив, удалить его, управлять им и т. д.? Какие команды/прерывания для этого предназначены (можно просто перечислить)? Относится ли команда LEA к массивам? Что она вообще такое?
Спасибо

Что Вы имеете в виду под понятием массива? Если Вы хотите описание типа lalala array [1..100] — то нет.

Но с массивом тем не менее можно работать. См. кусок кода

А по поводу lea, то это команда загрузки адреса в регистр. Может использоваться где угодно и в качестве операнда может быть использовано любое допустимое выражение. В простейшем случае используется выражение
lea reg, stroka
которое компилятор преобразует в
mov reg, OFFSET stroka

lea — это полноправная команда процессора и выполняется. Выражение OFFSET stroka вычисляется в момент компиляции и является константой.

Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 30

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Существует ли в Ассемблере понятие массива? Если да, то как можно создать массив, удалить его, управлять им и т. д.? Какие команды/прерывания для этого предназначены (можно просто перечислить)? Относится ли команда LEA к массивам? Что она вообще такое?
Спасибо

Здравствуйте, Warewolf!
Массив описывается так
MyArr db 100(?)
MyArr-имя
db — размер элементов
100 — размер массива
Обращение
mov ax, MyArr[bx]; в bх индекс, как индексирующие регистры можно использовать bx, si, di (в режиме 386-все)
Для работы с массивом можно применять строковые команды типа stos movs и тп
LEA Загрузка исполнительного адреса
Признаки не меняются.
Команда: LEA destination,source.
Логика : destination = Addr(source).
Команда LEA присваивает значение смещения (offset) операнда source (а не его значение !) операнду destination. Операнд source должен быть ссылкой на память, а в качестве операнда destination может выступать любой 16-битный регистр, кроме сегментных.
Примечания :
Эта команда имеет то преимущество по сравнению с использованием оператора OFFSET в команде MOV, что операнду source можно иметь индексы. Например, следущая строчка не содержит ошибок :
LEA BX,TABLE[SI]
в то время, как строка
MOV BX,OFFSET TABLE[SI]
ошибочна, так как оператор OFFSET вычисляется во время ассемблирования, а указанный адрес не будет известен до тех пор, пока программа не будет запущена на счет.

Отправил эксперт: Sensey
Эксперт отправил ответов (всего): 173

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Подскажите, pls как асмом создать папку, в которой создать файл и записать в него каку-нибудь строку.

Только сильно не пинайте за ламерские вопросы, я читал как это делается, но не вЪехал.
Насколько я понял директория создаётся функцией 39h, при этом в DX — offset переменной, содержащей путь.

А файл создать — это вроде 3сh, но нужно указать атрибуты, а какие они бывают. и неясно чего ложить в dx.

А чтобы открыть файл нужно какой-то код открытия и указатель — увы не знаю что это такое.

Пожалуйста поподробнее, если можно
Заранее благодарен.

Здравствуйте, Semmy!
1.)

Создание подкаталога:
DS:DX должны указывать на строку, дающую накопитель и путь к
каталогу, в котором должен быть создан подкаталог. Строка должна
завершаться байтом ASCII 0. Для открытия подкаталога с именем
PRIMATES в корневом каталоге накопителя A: надо записать строку в
виде «A:\PRIMATES». Для открытия подкаталога в другом подкаталоге
с именем MAMMALS напишите «A:\MAMMALS\PRIMATES». Имя накопителя
A: может быть опущено если Вы работаете с накопителем, используе-
мым по умолчанию, и путь может начинаться с текущего каталога.
Поместите в AH 39H и выполните прерывание 21H; если указан пра-
вильный путь, то будет создан новый каталог. В противном случае
будет установлен флаг переноса, а AX будет содержать код ошибки 3
(путь неверен) или 5 (нет доступа). В примере создается подката-
лог PRIMATES:
;—в сегменте данных
PATH DB ‘A:MAMMALS\PRIMATES’,0

;—создаем подкаталог с именем PRIMATES
LEA DX,PATH ;DS:DX должны указывать на путь
MOV AH,39H ;номер функции
INT 21H ;создаем подкаталог
JC ERROR_ROUT ;обработка ошибок
2.)

Создание файла:
DOS Fn 3cH: создать файл через описатель
Вход

AH = 3cH
DS:DX = адрес строки ASCIIZ с именем файла
CX = атрибут файла
Выход
AX = код ошибки если CF установлен и описатель файла если ошибки нет
Описание:
DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. если диск и/или путь опущены, они принимаются по умолчанию.

файл создается в указанном (или умалчиваемом) оглавлении
файл открывается в режиме доступа чтение/запись
вы должны созранить описатель (handle) для последующих операций
если файл уже существует: при открытии файл усекается до нулевой длины
если атрибут файла — только чтение, открытие отвергается (атрибут можно изменить функцией 43H изменить атрибут)
CONFIG.SYS специфицирует число доступных описателей в системе
используйте функцию 5bH создать Новый файл, если вы не хотите перекрывать (усекать) существующий файл.

и так далее.
http://www.ya.ru/yandsearch?text=3ch+-+%F1%EE%E7%E4%E0%F2%FC+%F4%E0%E9%EB
http://www.codenet.ru/progr/dos/int_0026.php

Отправил эксперт: UFO
Эксперт отправил ответов (всего): 16

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Подписаться на рассылки

Форма подачи вопроса

ВНИМАНИЕ. Пожалуйста, НЕ высылайте один вопрос сразу нескольким подгруппам! Дополнения к вопросам, на которые эксперт уже ответил НЕ следует направлять ведущему рассылки (я не успеваю!). Просто скомбинируйте первый вопрос и дополнение к нему, а затем заново отправьте его, используя приведенную ниже форму!

Нажимайте кнопку «Отправить» только ОДИН раз и дождитесь полной загрузки страницы, иначе вопрос будет продублирован!

Ведущий рассылки,

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

indbooks

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

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

DOS, функция 00h

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Илон Маск рекомендует:  Excel vba подавление "горячих" клавиш

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

DS:DX – адрес DTA

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

AL=0Dh – общий IOCTL

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Илон Маск рекомендует:  Что такое код asp readfilter

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

BH – класс ошибки

BL – предлагаемое действие

CH – сфера (где произошла ошибка)

Описание. Эту функцию можно использовать, чтобы уточнить, что предпринять после сбоя функции DOS по ошибке (только DOS 3.0+). Ее можно вызывать: в обработчике критических ошибок INT 24h, после любой функции INT 21h, возвратившей флаг переноса после вызова FCB-функции, возвратившей AL=FFh.

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

DS:DX – адрес строки ASCIZ с диском и путем (заканчивается символом «\»)

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

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

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

DS:DX – (не изменяется) полное ASCIZ-имя нового файла

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

Описание. Открывает (создает) файл с уникальным именем в каталоге, заданном строкой ASCIZ, на которую указывает DS:DX. COMMAND.COM вызывает эту функцию, когда создает временные «канальные» файлы, используемые при переназначении ввода-вывода. Описание пути должно быть готово к добавлению в его конец имени файла. Необходимо обеспечить минимум 12 байт в конце строки. Сама строка должна быть заполнена в одной из форм: «^: \путь\»,0 (указан диск и путь), «d:»,0 (текущее оглавление диска) или «d: \»,0 (корневое оглавление диска).

Версии: DOS 3.00 и выше. DOS, функция 5Bh Создать новый файл

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

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

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

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

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

Описание. Файл открывается для чтения/записи в совместимом режиме доступа. Если диск и/или путь не указаны, принимаются значения по умолчанию. Этот вызов идентичен функции DOS 3Ch с тем исключением, что он вернет ошибку, если файл с заданным именем уже существует.

Версии: DOS 3.00 и выше. DOS, функция 5Ch Блокировать/разблокировать доступ к файлу

AL=00h – заблокировать область файла

AL=01h – разблокировать ранее заблокированную область

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

CX:DX – смещение ((CX*65536)+DX) от начала файла

SI:DI – длина блокируемой области ((SI*65536)+DI) байт

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

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

Описание. Блокирует или освобождает доступ к участку файла, указанного в BX. Область файла с логическим смещением CX:DX и длиной SI:DI блокируется (захватывается) или разблокируется (освобождается). Смещение и длина обязательно должны быть указаны. Разделение файлов должно быть активизировано (командой SHARE), иначе функция вернет код ошибки «Неверный номер функции».

Версии: DOS 3.00 и выше (при обязательной загрузке SHARE). DOS, функция 62h Получить адрес PSP

Выход: BX – сегментный адрес PSP выполняющейся программы

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

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

AL=01h – дать расширенную информацию страны DOS 3.3

AL=02h – дать таблицу преобразования строчных букв в прописные

AL=04h – то же для символов, допустимых в именах файлов

AL=06h – дать сопоставляющую последовательность

BX – кодовая страница (FFFFh – консоль)

CX – размер буфера возврата (должен быть минимум 5 байт)

ES:DI – адрес буфера возврата

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

ES:DI – адрес возвращенной информации

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

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

Версии: DOS 3.30 и выше. DOS, функция 66h Получить/установить глобальную кодовую страницу

AL=01h – запросить текущую глобальную кодовую страницу

AL=02h – установить активную кодовую страницу

BX – (при AL=02h) кодовая страница (Таблица Б-14)

DX – (при AL=02h) системная кодовая страница (устанавливаемая при загрузке)

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

Таблица Б-14. Значения кодовых страниц

BX – (если при вызове AL=01h) текущая активная кодовая страница

DX – (если при вызове AL=01h) системная кодовая страница (устанавливаемая при загрузке)

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

Описание. Эта функция выбирает новую кодовую страницу или получает значение текущей активной кодовой страницы (страниц). Программа DOS NLSFUNC должна быть загружена до этого вызова. Функция используется в сочетании с 65h или 38h.

Примечание. Устанавливая новую активную кодовую страницу, DOS читает данные из файла COUNTRY.SYS.

Версии: DOS 3.30 и выше. DOS, функция 67h Установить число описателей файлов

BX – максимальное число описателей (до FFFFh)

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

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

Описание. Эта функция устанавливает максимальное число описателей файлов, которые могут быть открыты одновременно. Если значение BX меньше 20, то принимается 20. Если значение BX меньше текущего максимума (нужно сократить число описателей), и в данный момент открыто более чем BX файлов, то изменение будет иметь место, когда число открытых файлов не будет превышать устанавливаемый максимум. Если BX больше текущего максимума (нужно увеличить число описателей), то DOS должна иметь доступную память, чтобы распределить ее под новые описатели. Функция 4Ah позволяет освободить память, чтобы она стала доступной DOS.

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

BX – описатель завершаемого файла

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

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

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

Версии: DOS 3.3 и выше. В версиях DOS от 2.0 до 3.2 можно использовать функцию DOS 45h, чтобы создать и затем закрыть дубликат.

MS-DOS Команда для создания *.txt файла с вложенным в него текстом

copy con имяфайла. txt

Вводишь всю необходимую информацию, когда заканчиваешь — жмешь F6 или Ctrl+Z. Такой способ поможет запиндюлить в файл не одну строку, а несколько.

Главное помнить: текст на русском языке вписанный подобным образом блокнотом отобразится в виде иероглифов, т. к. у DOS и Windows разные кодировки. Для вывода на экран такого файла в DOS необходимо набрать:
type имяфайла. txt

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

Если нужно к файлу добавить что-то, то вместо > надо использовать >>:

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

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.

Dos fn 5bh: создать новый файл

Автор: Рустам Гадеев, 15 May 98

Если вы заметили в документе
опечатки или неточности перевода,
просьба сообщить о них!
Перевод на русский язык и оформление:
Валерий Вотинцев

3.2. РАСШИРЕННЫЙ ИНТЕРФЕЙС DOS INT 21H (EXTENDED DOS API)

Перечень поддерживаемых функций:

09h Вывод строки на консоль Write string to console
1Ah Установить адрес DTA (disk transfer area) Set disk transfer area address
1Bh Получить характеристики текущего диска Get allocation information for default drive
1Ch Получить характеристики указанного диска Get allocation information for specific drive
1Fh Получить DPB (drive parameter block) для текущего диска Get drive parameter block for default drive
25h Установить обработчик прерывания (Set interrupt vector) Set interrupt vector
2Fh Получить адрес DTA (disk transfer area) Get disk transfer area address
32h Получить DPB (drive parameter block) для указанного диска Get drive parameter block for specific drive
34h Получить адрес флага InDos Get address of InDos flag
35h Получить адрес обработчика прерывания Get interrupt vector
39h Создать каталог (директорий) Create subdirectory
3Ah Удалить каталог (директорий) Remove subdirectory
3Bh Изменить текущий каталог Change current directory
3Ch Создать новый файл Create new file
3Dh Открыть существующий файл Open existing file
3Fh Чтение из файла Read from file
40h Запись в файл Write to file
41h Удалить файл с диска Delete file
43h Получить/Установить атрибуты файла Get/set file attributes
44h IOCTL IOCTL
47h Получить имя текущего каталога Get current directory
48h Выделить блок памяти DOS Allocate DOS memory block
49h Освободить блок памяти DOS Free DOS memory block
4Ah Изменить размер блока памяти DOS Resize DOS memory block
4Bh Загрузить и выполнить программы Load and execute child program
4Eh Найти первый файл по маске (Find first) Find first matching file
4Fh Найти следующий файл по маске (Find next) Find next matching file
56h Переименовать файл Rename file
5Ah Создать временный файл Create temporary file
5Bh Создать новый файл Create new file

Подробное описание функций WDOSX для расширенного интерфейса DOS INT 21h:

9h — Вывод строки на консоль

1Ah — Установить адрес DTA (disk transfer area)

1Bh — Получить характеристики текущего диска

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