Dos fn 4dh дать код выхода программы wait


Dos fn 4dh: дать код выхода программы wait

31H и INT 27H Завершиться, но остаться резидентным

00H и INT 20H традиционный TERMINATE: завершение программы

4cH TERMINATE: Завершиться, передав код выхода родительскому процессу
4dH получить код выхода завершившегося процесса

INT 23H завершение через Ctrl-Break
INT 24H завершение через Обработчик критических ошибок

Запуск и завершение программ
Префикс программного сегмента (PSP)
Структура заголовка файла EXE

Запуск и завершение программ

Ввиду сегментации адресного пространства процессора 8088/86/286 и того факта,
что переходы (JMP) и вызовы (CALL) используют относительную адресацию, оба типа
программ могут выполняться в любом месте памяти. Программы НИКОГДА не пишутся
в предположении, что они будут загружаться с определенного адреса (за исключе-
нием некоторых самозагружающихся, защищенных от копирования игровых программ).

• Файл COM-формата — это двоичный образ кода и данных программы. Такой файл
должен занимать менее 64K и не содержит перемещаемых адресов сегментов.

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

Перед загрузкой COM- или EXE-программы DOS определяет
сегментный адрес, называемый префиксом программного сегмента
(PSP), как базовый для программы. DOS выбирает при этом наименьший доступный
адрес; другая управляющая программа (скажем, Microsoft Windows) может выбрать
любую часть памяти. Затем DOS выполняет следующие шаги:

1. Создает копию текущего Окружения DOS для программы. Функция DOS 4bH (EXEC)
позволяет родительской программе создать другое окружение. Например, про-
грамма может запустить COMMAND.COM, установив в качестве подсказки DOS
текст «Use EXIT to return to UltraProg>».

2. Помещает путь, откуда загружена программа, в конец окружения. DOS 3.0+

3. Заполняет поля PSP информацией, полезной для загружаемой программы

5. Загружает регистр AX значением, отражающим корректность обозначений дисков
(если есть) в параметрах, введенных в командной строке:

• если AL=0ffH, то первое обозначение диска неверно
• если AH=0ffH, то второе обозначение диска неверно

EXE-программы содержат несколько программных сегментов, вклю-
чая сегмент кода, данных и стека. EXE-файл загружается, начи-
ная с адреса PSP:0100. В процессе загрузки считывается информация заголовка EXE
в начале файла и выполняется перемещение адресов сегментов. Это означает, что
ссылки типа

mov ax,data_seg
mov ds,ax
и
call my_far_proc

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

После перемещения управление передается загрузочному модулю посредством инструк-
ции далекого перехода (FAR JMP) к адресу CS:IP, извлеченному из заголовка EXE.

В момент получения управления программой EXE-формата:

• DS и ES указывают на PSP
• CS, IP, SS и SP инициализированы значениями, указанными в заголовке EXE
• поле PSP MemTop содержит значение, указанное в заголовке EXE. Обычно вся
доступная память распределена программе.

COM-программы содержат единственный сегмент (или, во всяком
случае, не содержат явных ссылок на другие сегменты). Образ
COM-файла считывается с диска и помещается в память, начиная с PSP:0100. Заме-
тим, что COM-программа может использовать множественные сегменты, но она должна
сама вычислять сегментные адреса, используя PSP как базу.

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

После загрузки двоичного образа:

• CS, DS, ES и SS указывают на PSP
• SP указывает на конец сегмента PSP (обычно 0fffeH, но может быть и меньше,
если полный 64K сегмент недоступен). Слово по смещению 06H в PSP указывает,
какая часть программного сегмента доступна.
• Вся память системы за программным сегментом распределена программе.
• Слово 00H помещено (PUSH) в стек.
• IP содержит 100H (первый байт модуля) в результате команды JMP PSP:100

Одно время (в эпоху DOS 1.1), описание схемы выхода из
программы, которую изобрел для DOS Rube Goldberg, зани-
мало несколько страниц. Начиная с DOS 2.0, жить стало легче. Вы можете выйти:

• через функцию 4cH (EXIT) в любой момент, независимо от значений регистров.
• через функцию 00H или прерывание INT 20H , когда ваш CS указывает на PSP.

До версии DOS 2.0, вы должны были сохранять сегмент PSP при запуске. Затем,
чтобы выйти, вам приходилось помещать этот сегмент в стек, далее помещать в
стек слово 00H, и наконец выполнять FAR RET. Это передавало управление на
адрес PSP:0000, содержащий код прерывания INT 20H. Эта процедура гарантировала,
что регистр CS устанавливался таким, каким его ожидала DOS.

Функция DOS 4cH устраняет эти сложности и позволяет вам возвращать родительскому
процессу (обычно COMMAND.COM) код выхода , который может быть проверен вызываю-
щей программой или командой COMMAND.COM «IF ERRORLEVEL».

Вы можете также завершить программу и оставить ее постоянно резидентной (TSR),
используя либо INT 27H , либо функцию DOS 31H (KEEP). Последний способ имеет
те преимущества, что резидентный код может быть длиннее 64K, и что вы можете
сформировать код выхода для родительского процесса.

TSR-программы удобны при установке пользовательских заплат для DOS и BIOS.
Эта концепция используется popup-утилитами, такими как SideKick и ваш покорный
слуга TECH Help! (если называть наиболее важные примеры).

Следующие пункты имеют отношение к рассматриваемой теме:

Функции управления процессами индекс функций запуска и завершения
Префикс программного сегмента детальная структура PSP
DOS Fn 26H . построить PSP
DOS Fn 4bH (EXEC). загрузить и выполнить программу
DOS Fn 62H . получить значение PSP для текущей программы
DOS Fn 2fH . получить текущий DTA
Окружение DOS . определить диск и оглавление, из которых
загружена текущая программа

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

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

1. Вызовите функцию 4aH с ES=сегменту PSP и BX=минимальному объему
памяти, требуемой вашей программе (в параграфах).
2. Подготовьте строку ASCIIZ с именем вызываемого программного фай-
ла и установите DS:DX на первый символ этой строки.
3. Подготовьте Блок Параметров EXEC со всеми необходимыми полями.
4. Сохраните текущие значения SS, SP, DS, ES и DTA в переменных,
адресуемых через регистр CS (CS — это единственная точка для
ссылок после того, как EXEC вернет управление от ребенка).
5. Выдайте вызов EXEC с AL=0.
6. Восстановите локальные значения SS и SP.
7. Проверьте флаг CF, чтобы узнать, не было ли ошибки при EXEC.
8. Восстановите DS, ES и локальную DTA, если необходимо.
9. Проверьте код выхода через функцию 4dH WAIT (если надо).

Все открытые файлы дублируются, так что ребенок может обрабатывать
данные как через описатели файлов, так и через стандартный в/в.
Режимы доступа описателей дублируются, но любые активные блокировки
файлов не будут относиться к ребенку. См. функцию 5cH.

После возврата из ребенка, векторы INT 22H Terminate, INT 23H Ctrl-
Break и INT 24H Critical Error восстанавливаются в их предыдущие
значения.

Вместо разбора собственных FCB (как требуется для EPB), вы можете
найти удобным загрузить и выполнить вторичную копию файла
COMMAND.COM, используя опцию /C. Например, чтобы выполнить
программу FORMAT.COM, установите DS:DX на адрес строки ASCIIZ:
«\command.com»,0
и установите EPB+2 на сегмент и смещение следующей строки команд:
0eH,»/c format a:/s/4″,0dH

Такой вторичный интерпретатор команд использует очень мало памяти
(около 4K). Вы можете поискать в Окружении DOS строку COMSPEC=,
чтобы установить точное местоположение файла COMMAND.COM.

См.также: Функции управления процессами Запуск и завершение Функции DOS

DOS Fn 62H: Дать адрес PSP
Вход AH 62H DOS 3.0+
Выход BX сегментный адрес PSP выполняющейся программы

Описание: Эта функция возвращает в BX адрес PSP текущей программы.

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

Версии: Доступна, начиная с DOS 3.0

DOS Fn 26H: Построить PSP
Вход AH 26H
DX адрес сегмента (параграфа) для нового PSP
CS сегмент PSP, используемого как шаблон для нового PSP
Выход Нет

См.также: PSP (Program Segment Prefix) Окружение DOS Функции DOS

Структура заголовка файла EXE

Поскольку EXE-файл может быть загружен в любой сегмент, все абсолютные сегмент-
ные ссылки (FAR CALL, далекие указатели, ссылки типа MOV AX,data_seg) должны
быть приведены к адресам памяти, соответствующим загрузке. Ниже приведены шаги,
используемые программой загрузки DOS (функция 4bH ) при загрузке файла EXE:

1. создать PSP посредством функции DOS 26H

2. прочитать 1cH байт файла EXE (форматированную порцию заголовка EXE)
в локальную область памяти

3. определить размер модуля = ( (PageCnt*512)-(HdrSize*16) ) — PartPag

4. определить файловое смещение загружаемого модуля = (HdrSize * 16)

5. выбрать сегментный адрес, START_SEG, для загрузки (обычно PSP + 10H)

6. считать модуль в область памяти, начинающуюся с адреса START_SEG:0000

7. LSEEK (уст. указатель файла) на начало таблицы перемещения (TablOff)

8. для каждого элемента перемещения (ReloCnt):

9. Распределить память для программы согласно MaxMem и MinMem

10. Инициализировать регистры и запустить программу:

Замечание: Последние добавления в формат EXE, особенно версии EXE-файлов
«CodeView» и «Windows», содержат дополнительную информацию, включенную в
выполнимый файл. Эти добавления не отражены в этой версии TECH Help!.

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

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

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

Dos fn 4dh: дать код выхода программы wait

DOS INT 21h — DOS Function Codes

The follow abridged list of DOS interrupts has been extracted from a large list compiled by Ralf Brown. These are available on any Simtel mirror (e.g. sunsite.anu.edu.au) under the directory ms-dos/info/interNNp.zip

AH Description AH Description
01 Read character from STDIN 02 Write character to STDOUT
05 Write character to printer 06 Console Input/Output
07 Direct char read (STDIN), no echo 08 Char read from STDIN, no echo
09 Write string to STDOUT 0A Buffered input
0B Get STDIN status 0C Flush buffer for STDIN
0D Disk reset 0E Select default drive
19 Get current default drive 25 Set interrupt vector
2A Get system date 2B Set system date
2C Get system time 2D Set system time
2E Set verify flag 30 Get DOS version
35 Get Interrupt vector
36 Get free disk space 39 Create subdirectory
3A Remove subdirectory 3B Set working directory
3C Create file 3D Open file
3E Close file 3F Read file
40 Write file 41 Delete file
42 Seek file 43 Get/Set file attributes
47 Get current directory 4C Exit program
4D Get return code 54 Get verify flag
56 Rename file 57 Get/Set file date

AH = 01h — READ CHARACTER FROM STANDARD INPUT, WITH ECHO

Return: AL = character read

  • ^C/^Break are checked
  • ^P toggles the DOS-internal echo-to-printer flag
  • ^Z is not interpreted, thus not causing an EOF if input is redirected character is echoed to standard output

AH = 02h -WRITE CHARACTER TO STANDARD OUTPUT

Entry: DL = character to write

Return: AL = last character output

  • ^C/^Break are checked
  • the last character output will be the character in DL unless DL=09h on entry, in which case AL=20h as tabs are expanded to blanks
  • if standard output is redirected to a file, no error checks (write- protected, full media, etc.) are performed

AH = 05h — WRITE CHARACTER TO PRINTER

Entry: DL = character to print

  • keyboard checked for ^C/^Break
  • STDPRN is usually the first parallel port, but may be redirected under DOS 2+
  • if the printer is busy, this function will wait

SeeAlso: INT 17/AH=00h

AH = 06h — DIRECT CONSOLE OUTPUT

Entry: DL = character (except FFh)

Return: AL = character output

Notes: does not check ^C/^Break

AH = 06h — DIRECT CONSOLE INPUT

Entry: AH = 06h DL = FFh

  • ZF set if no character available and AL = 00h
  • ZF clear if character available AL = character read

  • ^C/^Break are NOT checked
  • if the returned character is 00h, the user pressed a key with an extended keycode, which will be returned by the next call of this function
  • although the return of AL=00h when no characters are available is not documented, some programs rely on this behavior

AH=07h — DIRECT CHARACTER INPUT, WITHOUT ECHO

Return: AL = character read from standard input


Notes: does not check ^C/^Break

AH = 08h — CHARACTER INPUT WITHOUT ECHO

Return: AL = character read from standard input

Notes: ^C/^Break are checked

AH = 09h — WRITE STRING TO STANDARD OUTPUT

Entry: DS:DX -> ‘$’-terminated string

Notes: ^C/^Break are checked

AH = 0Ah — BUFFERED INPUT

Return: buffer filled with user input

  • ^C/^Break are checked
  • reads from standard input

Format of DOS input buffer:

Offset Size Description
00 1 maximum characters buffer can hold
01 1 number of chars from last input which may be recalled OR number of characters actually read, excluding CR
02 n actual characters read, including the final carriage return

AH=0Bh — GET STDIN STATUS

  • AL = 00h if no character available
  • AL = FFh if character is available

Notes: ^C/^Break are checked

AH = 0Ch — FLUSH BUFFER AND READ STANDARD INPUT

  • AL = STDIN input function to execute after flushing buffer
  • other registers as appropriate for the input function

Return: as appropriate for the specified input function

Note: if AL is not one of 01h,06h,07h,08h, or 0Ah, the buffer is flushed but no input is attempted

AH = 0Dh — DISK RESET

Notes: This function writes all modified disk buffers to disk, but does not update the directory information

AH = 0Eh — SELECT DEFAULT DRIVE

Entry: DL = new default drive (0=A:, 1=B:, etc)

Return: AL = number of potentially valid drive letters

Notes: the return value is the highest drive present

AH = 19h — GET CURRENT DEFAULT DRIVE

Return: AL = drive (0=A:, 1=B:, etc)

AH = 25h — SET INTERRUPT VECTOR

  • AL = interrupt number
  • DS:DX -> new interrupt handler

Notes: this function is preferred over direct modification of the interrupt vector table

AH = 2Ah — GET SYSTEM DATE

Return: CX = year (1980-2099) DH = month DL = day AL = day of week (00h=Sunday)

AH = 2Bh — SET SYSTEM DATE

Entry: CX = year (1980-2099) DH = month DL = day

  • AL = 00 successful
  • FFh invalid date, system date unchanged

Note: DOS 3.3+ also sets CMOS clock

AH = 2Ch — GET SYSTEM TIME

Return: CH = hour CL = minute DH = second DL = 1/100 seconds

Note: on most systems, the resolution of the system clock is about 5/100sec, so returned times generally do not increment by 1 on some systems, DL may always return 00h

AH = 2Dh — SET SYSTEM TIME

Entry: CH = hour CL = minute DH = second DL = 1/100 seconds

  • AL = 00h successful
  • FFh if invalid time, system time unchanged

Note: DOS 3.3+ also sets CMOS clock

AH = 2Eh — SET VERIFY FLAG

Entry: AL = new state of verify flag (00 off, 01h o)

  • default state at system boot is OFF
  • when ON, all disk writes are verified provided the device driver supports read-after-write verification

AH=30h — GET DOS VERSION

Entry: AL = what to return in BH (00h OEM number, 01h version flag)

Entry: AL = interrupt number

Return: ES:BX -> current interrupt handler

AH = 36h — GET FREE DISK SPACE

Entry: DL = drive number (0=default, 1=A:, etc)


    AX = FFFFh if inval >Notes:

  • free space on drive in bytes is AX * BX * CX
  • total space on drive in bytes is AX * CX * DX
  • «lost clusters» are cons instead

AH = 39h — «MKDIR» — CREATE SUBDIRECTORY

Entry: DS:DX -> ASCIZ pathname

  • CF clear if successful AX destroyed
  • CF set on error AX = error code (03h,05h)

  • all directories in the given path except the last must exist
  • fails if the parent directory is the root and is full
  • DOS 2.x-3.3 allow the creation of a directory sufficiently deep that it is not possible to make that directory the current directory because the path would exceed 64 characters

AH = 3Ah — «RMDIR» — REMOVE SUBDIRECTORY

Entry: DS:DX -> ASCIZ pathname of directory to be removed

  • CF clear if successful, AX destroyed
  • CF set on error AX = error code (03h,05h,06h,10h)

Notes: directory must be empty (contain only ‘.’ and ‘..’ entries)

AH = 3Bh — «CHDIR» — SET CURRENT DIRECTORY

Entry: DS:DX -> ASCIZ pathname to become current directory (max 64 bytes)

  • CF clear if successful, AX destroyed
  • CF set on error AX = error code (03h)

Notes: if new directory name includes a drive letter, the default drive is not changed, only the current directory on that drive

SeeAlso: AH=47h,AH=71h,INT 2F/AX=1105h

AH = 3Ch — «CREAT» — CREATE OR TRUNCATE FILE

  • CF clear if successful, AX = file handle
  • CF set on error AX = error code (03h,04h,05h)

Notes: if a file with the given name exists, it is truncated to zero length

AH = 3Dh — «OPEN» — OPEN EXISTING FILE

  • AL = access and sharing modes
  • DS:DX -> ASCIZ filename

  • CF clear if successful, AX = file handle
  • CF set on error AX = error code (01h,02h,03h,04h,05h,0Ch,56h)

  • file pointer is set to start of file
  • file handles which are inherited from a parent also inherit sharing and access restrictions
  • files may be opened even if given the hidden or system attributes

AH = 3Eh — «CLOSE» — CLOSE FILE

Entry: BX = file handle

  • CF clear if successful, AX destroyed
  • CF set on error, AX = error code (06h)


Note: if the file was written to, any pending disk writes are performed, the time and date stamps are set to the current time, and the directory entry is updated

AH = 3Fh — «READ» — READ FROM FILE OR DEVICE

  • BX = file handle
  • CX = number of bytes to read
  • DS:DX -> buffer for data

  • CF clear if successful — AX = number of bytes actually read (0 if at EOF before call)
  • CF set on error AX = error code (05h,06h)

  • data is read beginning at current file position, and the file position is updated after a successful read
  • the returned AX may be smaller than the request in CX if a partial read occurred
  • if reading from CON, read stops at first CR

AH=40h — «WRITE» — WRITE TO FILE OR DEVICE

  • BX = file handle
  • CX = number of bytes to write
  • DS:DX -> data to write

  • CF clear if successful -AX = number of bytes actually written
  • CF set on error — AX = error code (05h,06h)

  • DS:DX -> ASCIZ filename (no wildcards, but see notes)
  • CL = attribute mask for deletion (server call only, see notes)

  • CF clear if successful, AX destroyed (DOS 3.3) AL seems to be drive of deleted file
  • CF set on error AX = error code (02h,03h,05h)

  • (DOS 3.1+) wildcards are allowed if invoked via AX=5D00h, in which case the filespec must be canonical (as returned by AH=60h), and only files matching the attribute mask in CL are deleted
  • DOS does not erase the file’s data; it merely becomes inaccessible because the FAT chain for the file is cleared
  • deleting a file which is currently open may lead to filesystem corruption.

AH=42h — «LSEEK» — SET CURRENT FILE POSITION

  • AL = origin of move 00h start of file 01h current file position 02h end of file
  • BX = file handle
  • CX:DX = offset from origin of new file position

  • CF clear if successful, DX:AX = new file position in bytes from start of file
  • CF set on error, AX = error code (01h,06h)

  • for origins 01h and 02h, the pointer may be positioned before the start of the file; no error is returned in that case, but subsequent attempts at I/O will produce errors
  • if the new position is beyond the current end of file, the file will be extended by the next write (see AH=40h)

AH=43 — GET FILE ATTRIBUTES

  • CF clear if successful CX = file attributes
  • CF set on error, AX = error code (01h,02h,03h,05h)

BUG: Windows for Workgroups returns error code 05h (access denied) instead of error code 02h (file not found) when attempting to get the attributes of a nonexistent file.

AH=43 — «CHMOD» — SET FILE ATTRIBUTES

  • CF clear if successful, AX destroyed
  • CF set on error, AX = error code (01h,02h,03h,05h)

  • will not change volume label or directory attribute bits, but will change the other attribute bits of a directory
  • MS-DOS 4.01 reportedly closes the file if it is currently open

SeeAlso: AX=4300h,AX=4311h,AX=7143h,INT 2F/AX=110Eh

Bitfields for file attributes:

Bits 7 6 5 4 3 2 1
Description shareable archive directory vol. label system hidden read-only

AH = 47h — «CWD» — GET CURRENT DIRECTORY

  • DL = drive number (00h = default, 01h = A:, etc)
  • DS:SI -> 64-byte buffer for ASCIZ pathname

  • CF clear if successful
  • CF set on error, AX = error code (0Fh)

  • the returned path does not include a drive or the initial backslash
  • many Microsoft products for Windows rely on AX being 0100h on success

AH = 4Ch — «EXIT» — TERMINATE WITH RETURN CODE

Entry: AL = return code

Return: never returns

Notes: unless the process is its own parent, all open files are closed and all memory belonging to the process is freed

AH = 4Dh — GET RETURN CODE (ERRORLEVEL)


    AH = termination type (00=normal, 01h control-C abort, 02h=critical error abort, 03h terminate and stay res >Notes:

  • the word in which DOS stores the return code is cleared after being read by this function, so the return code can only be retrieved once
  • COMMAND.COM stores the return code of the last external command it executed as ERRORLEVEL

AH = 54h — GET VERIFY FLAG

Return: AL = verify flag (00h=off, 01h=on, i.e. all disk writes verified after writing)

AH = 56h — «RENAME» — RENAME FILE

  • DS:DX -> ASCIZ filename of existing file (no wildcards, but see below)
  • ES:DI -> ASCIZ new filename (no wildcards)
  • CL = attribute mask (server call only, see below)

  • CF clear if successful
  • CF set on error, AX= error code (02h,03h,05h,11h)

  • allows move between directories on same logical volume
  • this function does not set the archive attribute
  • open files should not be renamed
  • (DOS 3.0+) allows renaming of directories

AH = 57h — GET FILE’S LAST-WRITTEN DATE AND TIME

  • AL = 00h (Get attribute)
  • BX = file handle

  • CF clear if successful, CX = file’s time DX = file’s date
  • CF set on error, AX = error code (01h,06h)

Bitfields for file time:

Bits 15-11 10-5 4-0
Description hours minutes seconds

Bitfields for file date:

Bits 15-9 8-5 4-0
Description year (1980-) month day

AH = 57h — SET FILE’S LAST-WRITTEN DATE AND TIME

  • CF clear if successful
  • CF set on error AX = error code (01h,06h)

Программирование в среде однозадачной операционной системы

МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

«ПЕНЗЕНСКАЯ ГОСУДАРСТВЕННАЯ ТЕХНОЛОГИЧЕСКАЯ АКАДЕМИЯ

Е.В. Грачева

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

Персональных ЭВМ

доктор технических наук, пофессор

зав.кафедрой «Вычислительные машины и системы»

доктор технических наук, пофессор

кафедры «Информационно-вычислительные системы»

Пензенского государственного университета

Грачева Е.В.

Системное программное обеспечение персональных ЭВМ:

Учебнле пособие /Е.В. Грачева – Пенза

Учебное пособие подготовлено на кафедре «Вычислительные машины и системы»

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

Программирование в операционной среде

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


Программирование в среде однозадачной операционной системы

Программы для MS DOS могут быть одного из двух форматов: COM или EXE.

Программы типа COM не могут быть размером более 64 Кб и состоят только из одного сегмента – сегмента кода.

Размер программы типа EXE может превышать 64 кб.

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

Главным входом большинства функций DOS служит прерывание, вызываемое с помощью команды INT 21h. Параметры функциям DOS передаются через регистры микропроцессора: AX (AH и AL), BX, CX, DX; регистровые пары DS:DX и ES:BX используются в основном при передаче адреса ячейки памяти. Через эти же регистры возвращаются результат работы функции DOS, кроме того могут быть установлены флаги в регистре флагов.

Как и любая операционная система, DOS загружает и выполняет программы. При загрузке программы в начале отводимого для нее блока памяти (для СОМ-программ это вся свободная на данный момент память) создается структура данных PSP (префикс программного сегмента) размером 256 байт (100h). Затем DOS создает копию текущего окружения для загружаемой программы, помещает полный путь и имя программы в конец окружения, заполняет поля PSP следующим образом:

+00h: слово – CDh 20h – команда INT 20h. Если СОМ-программа завершается командой RETN, управление передается на эту команду.

+02h: слово – сегментный адрес первого байта после области памяти, выделенной для программы

+04h: байт – не используется DOS

+05h: 5 байт – 9Ah F0h FEh 1Dh F0h – команда CALL FAR на абсолютный адрес 000C0h, записанная так, чтобы второй и третий байты составляли слово, равное размеру первого сегмента для СОМ-файлов (в этом примере FEF0h). Введено для совместимости с командой СР/М CALL 5.

+0Ah: 4 байта – адрес обработчика INT 22h (выход из программы)

+0Eh: 4 байта – адрес обработчика INT 23h (обработчик нажатия Ctrl-Break).

+12h: 4 байта – адрес обработчика INT 24h (обработчик критических ошибок)

+16h: слово – сегментный адрес PSP процесса, из которого был запущен текущий.

+18h: 20 байт – JFT – список открытых идентификаторов, один байт на идентификатор, FFh – конец списка.

+2Ch: слово – сегментный адрес копии окружения для процесса.

+2Eh: 2 слова – SS:SP процесса при последнем вызове INT 21h.

+32h: слово – число элементов JFT (по умолчанию 20).

+34h: 4 байта – дальний адрес JFT (по умолчанию PSP:0018).

+38h: 4 байта – дальний адрес предыдущего PSP.

+3Ch: байт – флаг, указывающий, что консоль находится в состоянии ввода 2-байтного символа.

+3Dh: байт – флаг, устанавливаемый функцией В711h прерывания 2Fh (при следующем вызове INT 21h для работы с файлом имя файла будет замечено на полное).

+3Eh: слово – не используется в DOS.

+40h: слово – версия DOS, которую вернет функция DOS 30h (DOS 5.0+).

+42h: 12 байт – не используется в DOS.

+50h: 2 байта – CDh 21h – команда INT 21h.

+54h: 7 байт – область для расширения первого FCB (FCB, FileControlBlok — это метод работы с файлами, являющийся рудиментом от ранних версий DOS’а. При его использовании можно работать только с файлами в текущем каталоге, причем даже нет возможности сменить каталог (точнее, даже понятия «каталог» в момент создания этих функций вообще не было). Современные программы эти функции не используют. MS-DOS обеспечивает две технологии обслуживания файлов. Первая была разработана при создании версий 1.Х. Эта технология основана на использовании структур данных, называемых блоками управления файлом (FCB). В то время подавляющее большинство компьютеров работало под управлением операционной системы CPM. Блоки FCB обеспечивали совместимость файлов MS-DOS с файлами этой системы. При разработке MS-DOS версий 2.Х, когда была предложена иерархическая структура организации файлов, была разработана вторая технология их обслуживания. Она основана на использовании ссылок на управляющую запись файла и не требует организации FCB. После того, как эта технология была опробована на операционной системе UNIX, она получила широкое распространение.).

+5Ch: 16 байт – первый FCB, заполняемый из первого аргумента командной строки.

+6Ch: 16 байт – второй FCB, заполняемый из второго аргумента командной строки.

+7Ch: 4 байта – не используется в DOS.

+80h: 128 байт – командная строка и область DTA по умолчанию.

Затем DOS записывает программу в память, начиная с адреса PSP:0100h.

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

При запуске СОМ-программы регистры устанавливаются следующим образом:

AL = FFh, если первый параметр командной строки содержит неправильное имя диска (например, z:/something), иначе – 00h.

АН = FFh, если второй параметр содержит неправильное имя диска, иначе 00h.

CS = DS = ES = SS = сегментный адрес PSP.

SP = адрес последнего слова в сегменте (обычно FFFEh; меньше, если не хватает памяти).

При запуске ЕХЕ-программы регистры SS:SP устанавливаются в соответствии с сегментом стека, определенным в программе, затем в любом случае в стек помещается слово 0000h и выполняется переход на начало программы (PSP:0100h для СОМ, собственная точка входа для ЕХЕ).

Все эти действия выполняет одна функция DOS – DOS 4Bh – загрузить и выполнить программу. В качестве параметров этой функции передаются:

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

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

DS:DX – адрес ASCIZ-строки с полным именем программы
ES:BX – адрес блока параметров ЕРВ:

+00h: слово – сегментный адрес окружения, которое будет скопировано для нового процесса (или 0, если используется текущее окружение)
+02h: 4 байта – адрес командной строки для нового процесса
+06h: 4 байта – адрес первого FCB для нового процесса
+0Ah: 4 байта – адрес второго FCB для нового процесса
+0Eh: 4 байта – здесь будет записан SS:SP нового процесса после его завершения (только для AL = 01)
+12h: 4 байта – здесь будет записан CS:IP (точка входа) нового процесса после его завершения (только для AL = 01)

AL = 03h – загрузить как оверлей;
DS:DX – адрес ASCIZ-строки с полным именем программы
ES:BX – адрес блока параметров:

+00h: слово – сегментный адрес для загрузки оверлея
+02h: слово – число, которое будет использовано в командах, использующих непосредственные сегментные адреса, – обычно то же самое число, что и в предыдущем поле. 0 для СОМ-файлов

AL = 05h – подготовиться к выполнению (используется в ОС MS DOS начиная с версии 5.0 и выше)
DS:DX – адрес следующей структуры:

+00h: слово – 00h
+02h: слово:

бит 0 – программа – ЕХЕ
бит 1 – программа – оверлей

+04h: 4 байта – адрес ASCIZ-строки с именем новой программы
+08h: слово – сегментный адрес PSP новой программы
+0Ah: 4 байта – точка входа новой программы
+0Eh: 4 байта – размер программы, включая PSP

CF = 0, если операция выполнена, ВХ и DX модифицируются,
CF = 1, если произошла ошибка, АХ = код ошибки (2 – файл не найден, 5 – доступ к файлу запрещен, 8 – не хватает памяти, 0Ah – неправильное окружение, 0Bh – неправильный формат).

Как уже отмечалось, прерывание INT 21h (сервис DOS) служит главным входом большинства функций DOS. Программа, запрашивающая сервис DOS, должна подготовить всю необходимую информацию в регистрах и управляющих блоках, указать в регистре AH номер желаемой функции DOS и затем вызвать прерывание INT 21H.

В таблице 1 приведены функции прерывания INT 21h.

Таблица 1 -Функции прерывания INT21h

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

Лучшие изречения: Студент — человек, постоянно откладывающий неизбежность. 10529 — | 7318 — или читать все.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Элегантный способ проверить код выхода программы

Вопрос по программированию на пайпах и сигналах. Есть такой вот код:

Хотелось бы более элегантное решение, например:

Кто как подобное делает в баше?

Я обычно делаю так:

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

Да я в курсе, просто привычка :)

Я тоже так делаю, но там строчка вызова программы довольно длинная, как-то некрасиво смотрится :)

но там строчка вызова программы довольно длинная

B bash короче всего проверить заведомо числовую переменную на ноль/не ноль — let.
Можно ещё

Так bash или POSIX sh?

Хотелось бы более элегантное решение

ТС так и делает, просит более элегантное решение.

В переменной может быть -:

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

Вообще-то [ по количеству аргументов сам догадывается, о чём его спрашивают.

А вообще так не очень наглядно и явно не лучше чем if-then-else. С точки зрения удобства лучше использовать в таких случаях: someprogram && do-something-if-someprogram-succeded

В $? которую засунули в $rc . Фантазируйте дальше.

Хотелось бы более элегантное решение, например:
if test —is-exit-success «$rc» ; then

Напиши функцию exit_success? в которой скроешь всю «неэлегантность»

Не нужно так делать: ? раскроется в символ в имени существующего файла, попадающего под эту маску:

Ну не делайте, не в этом же смысл

Научитесь читать на что отвечаете целиком и внимательно.

Хм, не знал. Но я бы не закладывался на то что в чуть более сложном выражении он не сломается, а также на то что все реализации test так работают (хотя FreeBSD’шная работает).

И не подумаю. Прекратите офтопить, тут не урок истории, а конкретно о $?

А вот это хорошо, почти. Но тут проверяется на ноль/не ноль. А надо на == EXIT_SUCCESS

Шикарно, руби стайл.

Пришла в голову вот такая фиговина: http:// >

Если не сохранять $? в отдельную переменную, то даже прилично выглядит

Асемблер различия функции 4C и вызова прерывания 21h от прерывания 20h

Какие всё же различия функции 4C и вызова прерывания 21h от прерывания 20h, ведь и то, и другое вызывает завершение программы.

1 ответ 1

Можно же открыть документацию и посмотреть. Уделите внимание требованию равенства CS=PSP и выполнению этого правила в .EXE и .COM программах и различии в проверке этого равенства в этих прерываниях. При INT 20h соблюдение данного правила в файлах .EXE лежит на программисте.

INT 20H — Завершить программу

Это прерывание используется для выхода из программы и возврата управления родительскому процессу (обычно интерпретатору команд DOS — COMMAND.COM). Оно восстанавливает значения управляющих векторов INT 22H INT 23H INT 24H. Оно также сбрасывает все файловые буфера (если длина файла изменилась, то файл должен быть предварительно закрыт).

Важно: Регистр CS должен содержать значение PSP завершающегося процесса. Если ваш CS не равен PSP, вы можете выдать JMP или RET на PSP:0000.

Рекомендуется использовать функцию 4cH Terminate, чтобы избежать трудностей, связанных с неравенством CS и PSP. Она позволяет также задать код выхода. Программы COM-формата обычно выполняются при CS=PSP, так что им можно выдавать INT 20H в любой момент. EXE-программы могут выдавать FAR JMP или FAR RET, чтобы передать управление на PSP:0000, где содержится инструкция INT 20H.

INT 21H — Сервис DOS Fn 4cH — Завершить программу — EXIT

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

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


Dos fn 4dh: дать код выхода программы wait

Плохо смотрел значит, там все что нужно есть, даже больше чем тебе сейчас нужно знать

═══════════════════════════════════ ════════════════════╡ Функции DOS │
DOS Fn 00H: Завершить программу
DOS Fn 01H: Ввод с клавиатуры
DOS Fn 02H: Вывод на дисплей
DOS Fn 03H: Ввод AUX
DOS Fn 04H: Вывод AUX
DOS Fn 05H: Вывод на принтер
DOS Fn 06H: Обмен с консолью
DOS Fn 07H: Нефильтрующий консольный ввод без эха
DOS Fn 08H: Консольный ввод без эха
DOS Fn 09H: Выдать строку
DOS Fn 0aH: Буферизованный ввод строки
DOS Fn 0bH: Проверить статус ввода
DOS Fn 0cH: Ввод с очисткой
DOS Fn 0dH: Сбросить диск
DOS Fn 0eH: Выбрать умалчиваемый диск DOS
DOS Fn 0fH: Открыть файл через FCB
DOS Fn 10H: Закрыть файл через FCB
DOS Fn 11H: Найти 1-й совпадающий файл через FCB
DOS Fn 12H: Найти следующий совпадающий файл через FCB
DOS Fn 13H: Удалить файл через FCB
DOS Fn 14H: Читать последовательный файл через FCB
DOS Fn 15H: Писать последовательный файл через FCB
DOS Fn 16H: Создать файл через FCB
DOS Fn 17H: Переименовать файл через FCB
DOS Fn 19H: Дать умалчиваемый диск DOS
DOS Fn 1aH: Установить адрес DTA
DOS Fn 1bH: Дать информацию FAT (текущий диск)
DOS Fn 1cH: Дать информацию FAT (любой диск)
DOS Fn 21H: Читать запись произвольного файла
DOS Fn 22H: Писать запись произвольного файла
DOS Fn 23H: Дать размер файла через FCB
DOS Fn 24H: Установить адрес блока произвольного файла
DOS Fn 25H: Установить вектор прерывания
DOS Fn 26H: Создать префикс программного сегмента
DOS Fn 27H: Читать блок произвольного файла
DOS Fn 28H: Писать блок произвольного файла
DOS Fn 29H: Разобрать имя файла
DOS Fn 2aH: Дать дату DOS
DOS Fn 2bH: Установить дату DOS
DOS Fn 2cH: Дать время DOS
DOS Fn 2dH: Установить время DOS
DOS Fn 2eH: Установить/сбросить переключатель верификации
DOS Fn 2fH: Дать текущий DTA
DOS Fn 30H: Дать номер версии DOS
DOS Fn 31H: Завершиться и остаться резидентным — KEEP
DOS Fn 32H: Дать дисковую информацию DOS (недокументировано)
DOS Fn 33H: Установить/опросить уровень контроля прерывания DOS
DOS Fn 34H: Адрес статуса реентерабельности DOS
DOS Fn 35H: Дать вектор прерывания
DOS Fn 36H: Дать свободную память диска
DOS Fn 37H: Установить/опросить символ-переключатель (недокументировано)
DOS Fn 38H: Дать/Установить информацию страны
DOS Fn 39H: Создать новое оглавление — MKDIR
DOS Fn 3aH: Удалить оглавление — RMDIR
DOS Fn 3bH: Установить умалчиваемое оглавление DOS — CHDIR
DOS Fn 3cH: Создать описатель файла
DOS Fn 3dH: Открыть описатель файла
DOS Fn 3eH: Закрыть описатель файла
DOS Fn 3fH: Читать файл через описатель
DOS Fn 40H: Писать в файл через описатель
DOS Fn 41H: Удалить файл
DOS Fn 42H: Установить указатель файла — LSEEK
DOS Fn 43H: Установить/опросить атрибут файла — CHMOD
DOS Fn 44H: Управление вводом-выводом устройства — IOCTL
DOS Fn 45H: Дублировать описатель файла — DUP
DOS Fn 46H: Переназначить описатель — FORCDUP
DOS Fn 47H: Дать умалчиваемое оглавление DOS
DOS Fn 48H: Распределить память (дать размер памяти)
DOS Fn 49H: Освободить блок распределенной памяти
DOS Fn 4aH: Сжать или расширить блок памяти
DOS Fn 4bH: Выполнить или загрузить программу — EXEC
DOS Fn 4cH: Завершить программу — EXIT
DOS Fn 4dH: Дать код выхода программы — WAIT
DOS Fn 4eH: Найти 1-й совпадающий файл
DOS Fn 4fH: Найти следующий совпадающий файл
DOS Fn 54H: Дать переключатель верификации DOS
DOS Fn 56H: Переименовать/переместить файл
DOS Fn 57H: Установить/опросить время/дату файла
DOS Fn 59H: Дать расширенную информацию об ошибке
DOS Fn 5aH: Создать уникальный временный файл
DOS Fn 5bH: Создать новый файл
DOS Fn 5cH: Блокировать/разблокировать доступ к файлу
DOS Fn 5eH: Различные сетевые функции
DOS Fn 5fH: Переназначение устройств в сети
DOS Fn 62H: Дать адрес префикса программного сегмента
═══════════════════════════════════ ════════════════════╡ Прерывания DOS
INT 20H: Завершить программу
INT 21H: Функции DOS
INT 22H: Адрес завершения
INT 23H: Адрес выхода по Ctrl-Break
INT 24H: Обработчик критических ошибок
INT 25H/26H: Прямые дисковые чтение/запись
INT 27H: Завершиться и остаться резидентным
INT 28H: Квант времени DOS (недокументировано)
INT 2eH: Выполнить команду DOS (недокументировано)
INT 2fH: Мультиплексное прерывание

Ассемблер

Прерывание 21h: общие функции DOS

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

Функция 02: вывод одного символа на экран

Для вывода одного символа на экран ПК используется

функция 02 прерывания 21h:

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

Особым образом осуществляется вывод символов с кодами 7, 8, 9, 10 (0Ah) и 13 (0Dh). Символ с кодом 7 (bell, звонок) на экране не высвечивается (и курсор не сдвигается), а вызывает звуковой сигнал. Символ с кодом 8 (backspase, шаг назад) возвращает курсор на одну позицию влево, если только он не был в самой левой позиции строки. Символ с кодом 9 (tab, табуляция) смещает курсор вправо на ближайшую позицию, кратную 8. Символ с кодом 10 (line feed, перевод строки) перемещает курсор в следующую строку экрана, оставляя его в той же колонке. Символ с кодом 13 (carrige returne, возврат каретки) устанавливает курсор на начало текущей строки; вывод подряд символов с кодами 13 и 10 означает перевод курсора на начало следующей строки.

Функция 9: вывести строку на экран дисплея

Для вывода на экран строки (последовательности символов) можно, конечно, использовать функцию 02, однако сделать это можно и за один прием с помощью функции 09 прерывания 21h:

DS:DX := начальный адрес строки

Перед обращением к этой функции в регистр DS должен быть помещен номер того сегмента памяти, в котором находится выводимая строка, а в регистр DX — смещение строки внутри этого сегмента. При этом в конце строки должен находиться символ $ (код 24h), который служит признаком конца строки и сам не выводится.

Хотя эта функция может оказаться намного удобнее функций побайтового вывода на экран (функция 2 и 6), она имеет тот недостаток, что вполне обычный символ $ используется как ограничитель строки. Это еще один побочный продукт совместимости с CP/M.

Расширенные функции операционной системы DOS в качестве ограничителя строки используют CHR$(0). Это соответствует соглашениям, принятым в операционной системе UNIX и языке программирования Си.

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

Функция 4Ch: завершение программы

Завершив все свои действия, программа обязана вернуть управление операционной системе, чтобы пользователь мог продолжить работу на ПК. Такой возврат реализуется функцией 4Ch прерывания 21h, которую помещают в конце программы:

Каждая программа, вообще говоря, обязана сообщить, успешно или нет она завершила свою работу. Дело в том, что любая программа вызывается из какой-то другой программы (например, из операционной системы), и иногда вызвавшей программе, чтобы правильно продолжить работу, надо знать, выполнила ли вызванная программа все, что надо, или она проработала с ошибкой. Такая информация передается в виде кода завершения программы (некоторого целого числа), который должен быть нулевым, если программа проработала правильно, и ненулевым (каким именно — оговаривается в каждом случае особо) в противном случае. (Узнать код завершения вызванной программы можно с помощью функции 4Dh прерывания 21h.) Потребуется этот код или нет, программа все равно должна выдать его.

Dos fn 4dh: дать код выхода программы wait

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

1 копирование и перенос файлов

Копирование или пересылка (перенос) файлов осуществляется транзитной
программой «сору». Эта программа вызывается командой:
сору [ключи] откуда куда
Если Вы хотите при копировании изменить имя файла, то после указания пути
копирования необходимо указать желаемое имя и/или расширение файла.

При работе программы «сору» можно использовать ключи — необязательные
параметры:

/М — осуществляет операцию MOVE;

/С — переводит сегментированные файлы в непрерывные;

/S — переводит непрерывные файлы в сегментированные;

/В — работает с дополнительным буфером;

/D — спрашивает диск-источник и диск-приемник;

/U — перед копированием удаляет файл с тем же именем;

Откуда — [путь] и/или [шаблон или имя];

Куда — [путь] и/или [шаблон или имя].

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

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

Примеры: копирование содержимого главного каталога с дисковода А на
дисковод В:
сору А: В:

копирование файлов с расширением com из главного каталога в подкаталог
SHELL с переустановкой дисков:
сору /D A:com A:SHELL
Ключи можно задавать в виде:
/М/U или /М /U /D.

Возможно использование нескольких ключей одновременно.

2 СОЗДАНИЕ ПОДКАТАЛОГОВ

Для создания подкаталогов служит транзитная программа «mkdir». Она
вызывается командой:

mkdir [Ключи] :путь

Возможно использование следующих ключей:

р — создается защищенный подкаталог,

h — создается невидимый подкаталог;

с — создается непрерывный подкаталог;

— размер подкаталога в блоках.

mkdir S:CEPBHCVHELP — создает на системном устройстве, в каталоге
СЕРВИС, подкаталог с именем HELP незащищенный, видимый,
сегментированный, размером в 2 блока (здесь размер подкаталога установился по
умолчанию — 2 блока. Один блок каталога может вместить 8 файлов (это
относится к непрерывным каталогам)).

3 СОЗДАНИЕ УСТРОЙСТВ

Программа CREATE.COM позволит Вам создавать каталоговые устройства в
стандарте iS-DOS на уже отформатированной дискете или электронном диске.

Эта программа очень полезна при создании копий системы, т.к. форматирует
и размечает дискету необходимым образом и готовит ее для переноса системы iS-
DOS. CREATE.COM может работать как в ручном режиме (в этом случае она
внешне напоминает программы, FORMAT.COM и DOCTOR.COM), так и в
автономном. В последнем случае CREATE.COM выполняет задание по
параметрам, указанным в командной строке.

u Create.com» используется в командных файлах и запускается командой вида:
create [ключи].

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

— — указывает, на каком дисководе следует создавать устройство;
d :размер> — размер устройства в блоках /округляется до кратного 8 в меньшую
сторону/;

cO/cl — сегментированный/непрерьшный корневой каталог;
s

— размер корневого каталога в блоках;
п — не спрашивать, не пересоздавая;

г — пересоздавать, не спрашивая (доминантен по отношению к предыдущему
ключу);

m — работать в ручном режиме;

vO/vl — проверять (1) или нет (0) читаемость диска перед созданием устройства,
b — создать файл BOOT.sys для загрузчика в стандарте:
0: TR-DOS;
1: MAGIC-BOX;

2: Незагрузочный диск (BOOT.sys не создается).
Параметры ключей c,v по умолчанию — в зависимости от настройки программы.
Например:

create SYSTEM /-Т /d3200

создает на текущем диске устройство с именем «SYSTEM», размером 3200
блоков, с корневым каталогом размером в 6 блоков (этот размер устанавливается
по умолчанию).

4 СОЗДАНИЕ ДИСКОВ — КОПИЙ СИСТЕМЫ

При работе с компьютером необходимо иметь копии рабочих дискет, т.к.
случайный сбой в работе компьютера, поломка, скачок напряжения могут «убить»
Вашу программу или даже весь диск. Для создания копии системного диска
отформатируйте дискету программой format или программой create (в этом случае
создайте каталоговое устройство с необходимыми параметрами). Дальнейшие
действия зависят от того, сколько дисководов у Вашего компьютера — два или
один. Если у Вас один дисковод, то с помощью клавиши («crDIR») на диске-
копии создайте все необходимые каталоги и подкаталоги и последовательно
копируйте системный диск, отмечая файлы для копирования клавишей .

Копирование в этом случае выполняется программой «filecopy», которая
вызывается клавишей . Таким способом последовательно перекопируйте
содержимое системных каталогов SHELL, СЕРВИС, UTIL, RES, EDIT. После
копирования всей нужной Вам информации подключите систему и загрузчик (см.
ниже) для того, чтобы диск-копия стал загружаемым.

Если у Вашего компьютера два дисковода, то Вы можете действовать двумя
путями. Первый — аналогично работе с одним дисководом. Второй путь — создание
командных файлов типа .bat с использованием транзитных программ «mkdir» и
«сору» для создания каталогов и копирования файлов соответственно.

5 подключение копий системы

В предыдущем разделе было описано, как создать резервную копию системы.
Для того, чтобы диск-копия был запускаемым, на нем необходимо подключить и
проинициализировать iS-DOS. Эту задачу выполняет программа «con» или
«connect». Программа подключает файл-крпию системы на указанном устройстве.
Запустить программу con можно из командной строки или из командного файла,
набрав команду следующего вида:

con : , т.е. перезапустите оболочку iS-DOS. Теперь
замените системный диск на Ваш диск-копию, откройте на нем каталог,
содержащий программу «con» и вызовите монитор командной строки. В
командной строке наберите вышеуказанную команду для подключения файла-
системы и нажмите клавишу . Если после отработки этой команды ее
текст исчез из командной строки, оставив только курсор, то файл-копия системы
подключился; в противном случае проверьте, правильно ли Вы указали все
параметрыкоманды и при необходимости отредактируйте ее.

б подключение загрузчика

Для того, чтобы Ваш диск-копия или рабочий диск был загружаемым, на нем
надо подключить загрузчик «boot». Для этого запустите оболочку с системного
диска, замените его на подключаемый диск, войдите в каталог «СЕРВИС»,
подведите курсор к файлу «boot.com» и нажмите . Теперь попробуйте
перезапустить компьютер клавишей .

Если компьютер «сбросился», то постарайтесь вспомнить, правильно ли Вы
отформатировали дискету, скопировали программы, подключили систему. Если
Вам кажется, что Вы все сделали правильно, то обратитесь в фирму «IskraSOFT»
за консультацией. Мы всегда рады Вам помочь!

7 программа перевода устройств
в режим ожидания

Перевод блочных устройств в режим ожидания нажатия клавиши при
переключениях выполняется программой «wait» и вызывается из монитора или
«ЬаГ-файла командой: wait [ключи]. Ключи указывают, какие устройства

необходимо перевести в данный режим.

В случае отсутствия ключей программа снимает со всех блочных устройств
режим ожидания. Ключи можно задавать ъ виде: /А/С или /В Ю.

Программа «wait» позволяет на одном дисководе обращаться к разным дискам.
При любом переходе с диска на диск компьютер ждет нажатия клавиши .
После нажатия появляется надпись:

где после двоеточия указан диск, к которому идет обращение.
Если системное устройство — А, а текущее — С, то команда:
wait /s/b/T/d

позволит Вам перевести блочные устройства А, В, С, D в режим ожидания
нажатия клавиши при переключениях (в этой команде отражено, что
устройство А установлено системным, а устройство С — текущим). Программа
«wait» весьма полезна при работе с несколькими логическими устройствами на
одном дисководе.

8 распаковщик файлов —
командный файл «exepac.com»

Этот файл является распаковщиком файлов, которые упакованы с помощью
программ «nmipack.com» или «cdpacker.com». Он необходим для распаковки и
запуска программ с расширением «рас». Файлы с расширением «рас», упакованные
программой «nmipack.com всегда запускаются сразу после распаковки, а для
файлов, упакованных с помощью «cdpacker.com», возможен выход из «exepac.com»
в запускающую программу после распаковки.

Для распаковки (или распаковки с запуском) файлов с расширением «рас» при
нажатии клавиши требуется поместить следующую строку в файл «extent,
txl» (в корневом каталоге):
pac:Q:SHELLexepac

Альтернативные способы запуска таких файлов — это использование командной
строки или текстовых командных файлов типа *.bat. В этих случаях строка:
Q:SHELLexepac Т: имя файла.рас

набирается соответственно в командной строке, либо в редакторе (в редакторе
создаются командною файлы типа *.bat). В случае распаковки без запуска выход
из «exepac.com» происходит с установкой Im 2 при разрешенных прерываниях.

Если после распаковки необходим запуск программы, та «exepac.com»
ориентируется по первому символу имени файла (как и в TR-DOS’e). Если первый
символ «$», то устанавливается IM 2, в остальных случаях — IM 1. Сами
прерывания в этом случае после распаковки остаются запрещенными (независимо
от имени файла).

9 распаковщик экранных файлов —
командный файл «exescr.com»

Этот файл необходим для вывода на экран экранных файлов графических
изображений (картинок) с расширением «scr» (в том числе и упакованных
программой «spacker.com»).

Для вывода файлов с расширением «scr» на экран, при нажатии клавиши
(VIEW), требуется поместить следующую строку в файл «extview.txt» (в каталоге
SHELL):

Как и при работе с файлом «exepac.com» (см.ранее), можно использовать для
вывода экранных файлов на экран командную строку или текстовый командный
файл типа *.bat.

В этих случаях строка: Q:SHELLexescr Т: имя_файла.всг также
набирается в командной строке, либо в редакторе. Поместив несколько подобных
строк без ключа /w в текстовый командный файл типа *.bat, можно выполнить
демонстрацию нескольких картинок, непрерывно сменяющих друг друга.
Возможен рекурсивный вызов такого файла *.bat до 200 раз (т.е. *.bat может
вызывать сам себя до 200 раз). Дня примера покажем, как простыми средствами
iS-DOS получить непрерывную, повторяющуюся смену картинок. (Зацикливание
не должно превышать 200 раз, т.е. клавиша
должна быть нажата
раньше). Достаточно иметь несколько (желательно упакованных) экранных
файлов в какомлибо подкаталоге, например SCR, и создать файл, например,
«show.bat» (желательно в том же подкаталоге, чтобы исключить лишние
обращения к другому подкаталогу и не писать имя каталога перед именами
файлов экранов):

Запустив этот файл, Вы просмотрите картинки 1, 2, 3, сменяющие друг друга.

Для управления выводом на экран предусмотрены такие ключи:

/w — ключ ожидания (wait);

/s — ключ считывания сразу на экран (screen).

Илон Маск рекомендует:  Что такое код ncurses_color_set
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL
Номер функции Название Входные данные Выходные данные Описание
Функции ввода/вывода данных
01H Ввод с клавиатуры AH = 01H AL = символ, полученный из стандартного ввода Считывает (ожидает) символ со стандартного входного устройства. Отображает этот символ на стандартное выходное устройство (эхо). При распознавании Ctrl-Break выполняется INT 23H. Замечание: Ввод расширенных клавиш ASCII (F1-F12, pgup, курсор и т.п.) требует двух обращений к этой функции. Первый вызов возвращает AL=0. Второй вызов возвращает в AL расширенный код ASCII.
02H Вывод на дисплей AH = 02H DL = символ, выводимый на стандартный вывод Посылает символ из DL на стандартный вывод. Обрабатывает символ Backspace (ASCII 8), перемещая курсор влево на одну позицию и оставляя его в новой позиции. При обнаружении Ctrl-Break выполняется INT 23H.
03H Вспомогательный ввод AH = 03H AL = символ, полученный со стандартного вспомогательного устр-ва Считывает (ожидает) символ со стандартного вспомогательного устройства, COM1 или AUX и возвращает этот символ в AL. Замечание: Ввод не буферизуется и должен опрашиваться (не управляется прерываниями). При запуске DOS порт AUX (COM1) инициализируется так: 2400 бод, без проверки на четность, 1 стоп-бит, 8-битовые слова. Команда DOS MODE используется для установки иных характеристик.
04H Вспомогательный вывод AH = 04H DL = символ, записываемый на стандартное вспомогательное устр-во Посылает символ в DL на стандартное вспомогательное устройство, COM1 или AUX.
05H Вывод на принтер AH = 05H DL = символ, записываемый на стандартный принтер Посылает символ в DL на стандартное устройство принтера, обычно LPT1. Замечание: Команда DOS «MODE» может перенаправить этот вывод в последовательный порт.
06H Консольн. ввод-вывод AH = 06H DL = символ (от 0 до 0feh), посылаемый на стандартный вывод DL = 0ffh запрос ввода со стандартного ввода ZF = Сброшен (NZ), если символ готов при запросе ввода При DL = 0ffh выполняет ввод с консоли «без ожидания», возвращая взведенный флаг нуля (ZF), если на консоли нет готового символа. Если символ готов, сбрасывает флаг ZF (NZ) и возвращает считанный символ в AL. Если DL не равен 0ffh, то DL направляется на стандартный вывод. Замечание: Не проверяет Ctrl-Break. Вызывайте дважды для расширенного ASCII.
07H Нефильтрующий консольный ввод без эха AH = 07H AL = символ, полученный через стандартный ввод Считывает (ожидает) символ со стандартного входного устройства и возвращает этот символ в AL. Не фильтрует: Не проверяет на Ctrl-Break, backspace и т.п. Замечания Вызывайте дважды для ввода расширенного символа ASCII. Используйте функцию 0bh для проверки статуса (если не хотите ожидать нажатия клавиши).
08H Консольный ввод без эха AH = 08H AL = символ, полученный через стандартный ввод Считывает (ожидает) символ со стандартного входного устройства и возвращает этот символ в AL. При обнаружении Ctrl-Break выполняется прерывание INT 23H. Замечание: Вызывайте дважды для ввода расширенного символа ASCII.
09H Выдать строку на дисплей AH = 09H DS:DX = адрес строки, заканчивающейся символом ‘$’ (ASCII 24H) Строка, исключая завершающий ее символ ‘$’, посылается на стандартный вывод. Символы Backspace обрабатываются как в функции 02H Display Char. Обычно, чтобы перейти на новую строку, включают в текст пару CR/LF (ASCII 0dh и ASCII 0ah). Строки, содержащие ‘$’, можно выдать через 40H Write Handle (BX=0).
0ah Ввод строки в буфер AH = 0ah DS:DX = адрес входного буфера (смотри ниже) Буфер содержит ввод, заканчивающийся символом CR (ASCII 0dh) При входе буфер по адресу DS:DX должен быть оформлен так:
Max * * * *

Где max – максимальная допустимая длина ввода (от 1 до 254)

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

Max Len T E X T 0dh

Где len– действительная длина данных без завершающего CR (здесь — 04H). Символы считываются со стандартного ввода вплоть до CR (ASCII 0dh) или до достижения длины MAX-1. Если достигнут MAX-1, включается консольный звонок для каждого очередного символа, пока не будет введен возврат каретки CR (нажатие Enter).

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

0bh Проверить статус ввода AH = 0bh AL = 0ffh, если символ доступен со стандартного ввода Проверяет состояние стандартного ввода. При распознавании Ctrl-Break выполняется INT 23H. Замечание: используйте перед функциями 01H 07H и 08H, чтобы избежать ожидания нажатия клавиши. Эта функция дает простой неразрушающий способ проверки Ctrl-Break в процессе длинных вычислений или другой обработки, обычно не требующей ввода. Это позволяет вам снимать счет по нажатию Ctrl-Break.
0ch Ввод с очисткой AH = 0ch AL = номер функции ввода DOS (01H, 06H, 07H, 08H или 0ah) Очищает буфер опережающего ввода стандартного ввода, а затем вызывает функцию ввода, указанную в AL. Это заставляет систему ожидать ввод очередного символа. Следующие значения допустимы в AL: 01H ввод с клавиатуры 06H ввод с консоли 07H Нефильтрующий без эха 08H ввод без эха 0ah буферизованный ввод
Операции с файлами
3ch Создать файл через описатель (дескриптор) AH = 3ch DS:DX = адрес строки ASCIIZ с именем файла CX = атрибут файла AX = код ошибки если CF установлен и описатель файла если ошибки нет DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Файл создается в указанном (или умалчиваемом) оглавлении Файл открывается в режиме доступа чтение/запись Вы должны сохранить описатель (дескриптор, handle) для последующих операций. Если файл уже существует: При открытии файл усекается до нулевой длины Если атрибут файла — только чтение, открытие отвергается (атрибут можно изменить функцией 43H изменить атрибут) CONFIG.SYS специфицирует число доступных описателей в системе Используйте функцию 5bh создать Новый файл, если вы не хотите перекрывать (усекать) существующий файл.
3dh Открыть описатель файла AH = 3dh DS:DX = адрес строки ASCIIZ с именем файла AL = режим открытия AX = код ошибки если CF установлен и описатель файла если нет ошибки. DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Файл должен существовать. См. Функцию 3ch (создать файл). Файл открывается в выбранном режиме доступа / режиме открытия для совместимости с DOS 2.x и избежания сетевых режимов, задавайте: AL = 0 чтобы открыть для чтения AL = 1 чтобы открыть для записи AL = 2 чтобы открыть для чтения и записи Указатель чтения/записи устанавливается в 0. См. 42H (LSEEK) Вы должны сохранить описатель (handle) для последующих операций Разделение файлов должно быть активизировано (команда DOS SHARE), если запрашивается открытие в одном из режимов разделения. CONFIG.SYS специфицирует число доступных описателей файлов.
3eh Закрыть описатель файла AH = 3eh BX = описатель файла AX = код ошибки если CF установлен BX содержит описатель файла (handle), возвращенный при открытии. Файл, представленный этим описателем, закрывается, его буфера сбрасываются, и оглавление обновляется корректными размером, временем и датой. Из-за нехватки описателей файлов (максимум 20, по умолчанию 8), вам может понадобиться закрыть часть умалчиваемых описателей, как, например, описатель 3 (стандартный AUX).
3fh Читать файл через описатель AH = 3fh BX = описатель файла DS:DX = адрес буфера для чтения данных CX = число считываемых байт AX = код ошибки если CF установлен или число действительно прочитанных байт CX байт данных считываются из файла или устройства с описателем, указанным в BX. Данные читаются с текущей позиции указателя чтения/записи файла и помещаются в буфер вызывающей программы, адресуемый через DS:DX. Используйте функцию 42H LSEEK, чтобы установить указатель файла, если необходимо (OPEN сбрасывает указатель в 0). Модифицирует указатель чтения/записи файла, подготавливая его к последующим операциям чтения или записи. Вы должны всегда сравнивать возвращаемое значение AX (число прочитанных байт) с CX (запрошенное число байт): Если AX = CX, (и CF сброшен) — чтение было корректным без ошибок Если AX = 0, достигнут конец файла (EOF) Если AX При чтении с устройства — входная строка имеет длину AX байт При чтении из файла — в процессе чтения достигнут EOF Замечания: Эта функция превосходит сложные и неудобные FCB-функции. Она эффективно сочетает произвольный и последовательный доступ, позволяя пользователю выполнять свое собственное блокирование. Удобно использовать эту функцию для чтения стандартных описателей, таких как описатели стандартного в/в, взамен многочисленных буферизующих и посимвольных FCB-функций ввода. Когда вы читаете с устройства, AX возвращает длину считанной строки с учетом завершающего возврата каретки CR (ASCII 0dh).
40H Писать в файл через описатель AH = 40H BX = описатель файла DS:DX = адрес буфера, содержащего записываемые данные CX = число записываемых байт AX = код ошибки если CF установлен AL = число реально считанных байт (лучший тест для ошибок) CX байт данных записывается в файл или на устройство с описателем, заданным в BX. Данные берутся из буфера, адресуемого через DS:DX. Данные записываются, начиная с текущей позиции указателя чтения/записи файла. Используйте функцию 42H LSEEK, чтобы установить указатель файла, если необходимо (OPEN сбрасывает указатель в 0). Обновляет указатель чтения/записи файла, чтобы подготовиться к последующим операциям последовательного чтения или записи. Вы должны всегда сравнивать возвращаемое значение AX (число записанных байт) с CX (запрошенное число байт для записи). Если AX = CX, запись была успешной Если AX Замечание: Эта функция превосходит сложные и неудобные FCB-функции. Она эффективно сочетает произвольный и последовательный доступ, позволяя пользователю осуществлять собственное блокирование. Удобно использовать эту функцию для вывода на умалчиваемые устройства, такие как стандартный вывод, взамен использования различных функций вывода текста.
42H Установить указатель файла – LSEEK AH = 42H BX = описатель файла CX:DX = на сколько передвинуть указатель: (CX 65536) + DX AL = 0 переместить к началу файла + CX:DX AL = 1 переместить к текущей позиции + CX:DX AL = 2 переместить к концу файла + CX:DX AX = код ошибки если CF установлен DX:AX = новая позиция указателя файла (если нет ошибки) Перемещает логический указатель чтения/записи к нужному адресу. Очередная операция чтения или записи начнется с этого адреса. Замечание: Вызов с AL=2, CX=0, DX=0 возвращает длину файла в DX:AX. DX здесь старшее значащее слово: действительная длина (DX 65536) + AX.
Операции с файловой системой
0dh Сброс диска AH = 0dh Сбрасывает (пишет на диск) все файловые буфера. Если размер файла изменился, такой файл должен быть предварительно закрыт (при помощи функций 10H или 3eh).
0eh Установить текущий диск DOS AH = 0eh DL = номер диска (0=A, 1=B и т.д.), который становится текущим AL = общее число дисководов в системе Диск, указанный в DL, становится текущим (умалчиваемым) в DOS. Проверка: используйте функцию 19H «дать текущий» для проверки. В регистре AL возвращается число дисководов всех типов, включая твердые диски и «логические» диски (как B: в 1-floppy системе).
19H Дать текущий диск DOS AH = 19H AL = номер текущего умалчиваемого диска (0=A, 1=B, и т.д.) Возвращает номер дисковода текущего умалчиваемого диска DOS.
1bh Дать информацию FAT (текущий диск) AH = 1bh DS:BX = адрес байта FAT > Возвращает информацию о размере и типе умалчиваемого диска. Размер диска в байтах = (DX*AL*CX). Ищите свободную память функциями 36h Disk Free или 32h Disk Info. Версии: DOS 1.x держит FAT в памяти и возвращает DS:BX => FAT. DOS 2.0+ может держать в памяти лишь порцию всей FAT. Предупреждение: Эта функция изменяет содержимое регистра DS.
1ch Дать информацию FAT (любой диск) AH = 1ch DL = номер диска (0=текущий, 1=A, и т.д.) DS:BX = адрес байта FAT > Аналогична функции 1bh Get FAT Cur, с той разницей, что регистр DL указывает диск, для которого вы хотите получить информацию. Версии: Недоступна для DOS 1.x.
32H Дать информацию DOS о диске AH = 32H DL = номер диска (0=текущий, 1=A, и т.д.) AL = 0 если DL задавал корректный диск FF = 0ffh если диск задан неверно DS:BX = адрес блока информации диска для запрошенного устройства Возвращает блок информации, представляющей интерес для приложений и утилит, выполняющих доступ к диску, поддерживаемый драйверами устройств, на уровне секторов. Некоторые дисководы (особенно незагружаемые) функционируют исключительно через свои драйверы устройств. Такие диски могут содержать неверную информацию в корневой записи и таблице разделов, что делает очень трудным определение, например, размера корневого оглавления, числа таблиц FAT, и т.п. Блок информации диска содержит все данные такого рода в хорошо форматированной структуре. Это может быть единственным способом определить адрес драйвера устройства. Предупреждение: Изменяет сегментный регистр DS. Эта недокументированная функция может измениться в будущих версиях.
36H Дать свободную память диска AH = 36H DL = номер диска (0=текущий, 1=A, и т.д.) AX = 0ffffh, если AL содержал неверный номер диска или число секторов на кластер, если нет ошибок. BX = доступных кластеров. CX = байт на сектор. DX = всего кластеров на диске. Возвращает данные для подсчета общей и доступной дисковой памяти. Если в AX возвращено 0ffffh, значит, вы задали неверный диск. Иначе, свободная память в байтах = (AX*BX*CX) всего памяти в байтах = (AX*CX*DX)
39H Создать новое оглавление — MKDIR AH = 39H DS:DX = адрес строки ASCIIZ с именем оглавления AX = код ошибки если CF установлен DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяоглавл»,0 если диск и/или корневой путь опущены, то принимаются по умолчанию. Подоглавление создается и связывается с существующим деревом. Если флаг CF установлен при возврате, то AX содержит код ошибки, и оглавление не создается.
3ah Удалить оглавление – RMDIR AH = 3ah DS:DX = адрес строки ASCIIZ с именем оглавления AX = код ошибки если CF установлен DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяоглавл»,0. Если диск и/или корневой путь опущены, то принимаются по умолчанию. Подоглавление удаляется из структуры оглавления. Если флаг CF установлен при возврате, то AX содержит код ошибки, и оглавление не удаляется. Замечание: Оглавление не должно содержать файлов и подоглавлений и не должно быть связано возможными ограничениями DOS (например, не должно быть задействовано в активных командах JOIN или SUBST).
3bh Установить умалчиваемое оглавление DOS – CHDIR AH = 3bh DS:DX = адрес строки ASCIIZ с именем оглавления AX = код ошибки если CF установлен DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяоглавл»,0. Если диск и/или корневой путь опущены, то принимаются по умолчанию. Указанное подоглавление для указанного диска становится текущим (умалчиваемым) оглавлением DOS для этого (или текущего) диска. Если флаг CF установлен при возврате, то AX содержит код ошибки, и текущее оглавление для выбранного диска не изменяется.
41H Удалить файл AH = 41H DS:DX = адрес строки ASCIIZ с именем файла AX = код ошибки если CF установлен DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Имя файла не может содержать обобщенные символы (‘?’ и ‘*’). Файл удаляется из заданного оглавления заданного диска. Если файл имеет атрибут только чтение, то перед удалением необходимо изменить этот атрибут через функцию 43H CHMOD.
43H Установить/опросить атрибут файла – CHMOD AH = 43H DS:DX = адрес строки ASCIIZ с именем файла AL — код подфункции: = 0 — извлечь текущий атрибут файла AL = 1 — установить атрибут файла CX = новый атрибут файла (для подфункции 01H) AX = код ошибки если CF установлен CX = текущий атрибут файла (для подфункции 00H) DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Атрибут файла извлекается или устанавливается, согласно коду в AL. Замечание: Чтобы спрятать оглавление, используйте CX=02H (а не 12H, как вы, возможно, ожидали, см. описание файловой системы FAT, аттрибуты файлов).
45H Дублировать описатель файла – DUP AH = 45H BX = существующий описатель файла AX = новый описатель файла, дублирующий оригинал или код ошибки если CF установлен. Создает дополнительный описатель файла, ссылающийся на тот же поток в/в, что и существующий описатель. Любое продвижение указателя чтения/записи для одного описателя действует на его дубликат — включая любые операции чтения, записи или перемещения указателя посредством функции 42H LSEEK. Новый описатель наследует ограничения режима открытия оригинала. Эта функция используется с одной главной целью: вы можете закрыть описатель, заставляя DOS записать файловые буфера. Такой способ DUP/CLOSE — быстрее, чем закрытие и повторное открытие файла. Оставить комментарий – для сохранения файла без его закрытия – CTRL+S
46H Переназначить описатель – FORCDUP AH = 46H BX = целевой описатель файла (должен уже существовать) CX = исходный описатель файла (должен уже существовать) AX = код ошибки если CF установлен Заставляет описатель файла (handle) ссылаться на другой файл или устройство. Описатель в CX (источник) закрывается, если он открыт, а затем становится дубликатом описателя в BX (назначения). Иными словами, описатели в CX и BX будут ссылаться на один и тот же физический файл или устройство. Используется для переназначения стандартного в/в. Пример: Откроем файл «C:\STDOUT.TXT» через функцию 3dh Open File и получим описатель (например, 05). Установим BX=05, CX=01 и вызовем эту функцию. (замечание: описатель 01 — это предопределенный описатель «стандартного выходного устройства»). Теперь можно вызвать функцию 3eh Close File и закрыть handle 05. Можно обращаться к файлу STDOUT.TXT через описатель 01. Стало быть, дисковый файл «C:\STDOUT.TXT» будет отныне получать весь вывод, создаваемый всеми процессами (текущим и порожденными) через любую функцию символьного в/в DOS, так же как и любой вывод в описатель файла 01 через функцию DOS 40H. Когда вы выходите в COMMAND.COM, предопределенные описатели устанавливаются на обычные устройства (например, описатель 01 устанавливается на «CON»).
47H Дать умалчиваемое оглавление DOS AH = 47H DS:SI = адрес локального буфера для результирующего пути (64 байта) DL = номер диска (0=текущий, 1=A, и т.д.) AX = код ошибка если CF установлен В пользовательский буфер по адресу DS:SI помещается в форме ASCIIZ путь текущего умалчиваемого оглавления для диска, указанного в DL. Путь возвращается в формате: «путь\оглавление»,0. Не подставляется впереди буква диска, а сзади не подставляется символ «\». Например, если текущим является корневое оглавление, эта функция вернет вам пустую строку (DS:[SI] = 0).
4eh Найти 1-й совпадающий файл AH = 4fh DS:DX = адрес строки ASCIIZ с именем файла (допускаются ? И *) CX = атрибут файла для сравнения AX = код ошибки если CF установлен DTA = заполнена данными (если не было ошибки) DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они подразумеваются по умолчанию. Обобщенные символы и ? Допускаются в имени файла и расширении. DOS находит имя первого файла в оглавлении, которое совпадает с заданным именем и атрибутом, и помещает найденное имя и другую информацию в DTA, как показано ниже: Замечания: Атрибут файла обычно используется во «включающем» поиске. Если вас интересуют как файлы, так и оглавления, установите бит атрибута 4 (т.е. Attr | 10H). См. Атрибут файла для полной информации. Типичная последовательность, используемая для поиска всех подходящих файлов: Используйте вызов 1ah, чтобы установить DTA на локальный буфер (или используйте умалчиваемую DTA в PSP по смещению 80H) Уст. CX=атрибут, DS:DX => ASCIIZ диск, путь, обобщенное имя Вызовите функцию 4eh (Найти 1-й) Если флаг CF указывает ошибку, вы закончили (нет совпадений) Уст. DS:DX => DTA (или на данные, которые вы скопировали из DTA после вызова функции 4eh) Повторять Обработать имя файла и данные по адресу DS:DX Вызвать функцию 4fh (Найти следующий) Пока CF=1 не покажет, что совпадений больше нет
4fh Найти следующий совпадающий файл AH = 4fh DS:DX = адрес данных, возвращенных предыдущей 4eh Найти 1-й файл AX = код ошибки если CF установлен DTA = заполнена данными DS:DX указывает на 2bh-байтовый буфер с информацией, возвращенной функцией 4eh Найти 1-й (либо DTA, либо буфер, скопированный из DTA). Используйте эту функцию после вызова 4eh. Следующее имя файла, совпадающее по обобщенному имени и атрибуту файла, копируется в буфер по адресу DS:DX вместе с другой информацией (см. Функцию 4eh о структуре файловой информации в буфере, заполняемом DOS).
56H Переименовать/переместить файл AH = 56H DS:DX = адрес старого ASCIIZ имени (путь/имя существующего файла) ES:DI = адрес нового ASCIIZ имени (новые путь/имя) AX = код ошибки если CF установлен DS:DX и ES:DI указывают на строки ASCIIZ: «d:\путь\имяфайла»,0. Старое имя DS:DX должно отвечать существующему файлу и не может содержать обобщенных символов. Диск и путь необязательны (если опущены, они принимаются по умолчанию). Новое имя ES:DI должно описывать НЕ существующий файл. Если указан диск, он должен быть тем же, что и в старом имени. Если диск или путь опущены, принимаются текущие умолчания. Если старое и новое имя содержат разные пути (явно или принятые по умолчанию), то элемент оглавления для файла ПЕРЕМЕЩАЕТСЯ в оглавление, указанное в новом имени. Замечание: Если ID диска в старом имени отличается от текущего диска DOS, не забывайте указывать такой же ID диска в новом имени.
57H Установить/опросить дату/время файла AH = 57H AL = 0 чтобы получить дату/время файла = 1 чтобы установить дату/время файла BX = описатель файла (handle) CX = (если AL=1) новая отметка времени в формате время/дата файла DX = (если AL=1) новая отметка даты в формате время/дата файла AX = код ошибки если CF установлен CX = отметка времени файла в формате время/дата файла DX = отметка даты файла в формате время/дата файла BX должен содержать описатель открытого файла (см. 3ch или 3dh ). Укажите подфункцию, 0 или 1, в регистре AL. DX и CX задаются в формате памяти; например, младшие 8 бит даты находятся в DH.
5ah Создать уникальный временный файл AH = 5ah DOS 3.0+ DS:DX = адрес строки ASCIIZ с диском и путем (заканчивается \) CX = атрибут файла AX = код ошибки если CF установлен и описатель файла (если нет ошибки) DS:DX = (не изменяется) становится полным ASCIIZ-именем нового файла Открывает (создает) файл с уникальным именем в оглавлении, указанном строкой ASCIIZ, на которую указывает DS:DX. COMMAND.COM использует эту функцию, когда создает временные «канальные» файлы, используемые при переназначении ввода-вывода. Описание пути должно быть готово к присоединению в его конец имени файла. Вы должны обеспечить минимум 12 байт в конце строки. Сама строка должна быть заполнена в одной из форм: «d:\путь\»,0 (указаны диск и путь) ИЛИ «d:»,0 (умалчиваемое оглавление диска) ИЛИ «d:\»,0 (корневое оглавление диска) ИЛИ «»,0 (умалчиваемые диск и оглавление) После возврата строка DS:DX будет дополнена именем файла. Замечания: DOS создает имя файла из шестнадцатеричных цифр, получаемых из текущих даты и времени. Если имя файла уже существует, DOS продолжает создавать новые имена, пока не получит уникальное имя. Создаваемые таким способом файлы — по существу НЕ ВРЕМЕННЫЕ, и их следует удалять посредством функции DOS 41H , когда они не нужны. Версии: Доступна, начиная с DOS 3.0
5bh Создать новый файл AH = 5bh DOS 3.0+ DS:DX = адрес строки ASCIIZ с именем файла CX = атрибут файла AX = код ошибки если CF установлен и описатель файла если ошибок нет DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Этот вызов идентичен функции DOS 3ch CREATE, с тем исключением, что он вернет ошибку, если файл с заданным именем уже существует. Файл открывается для чтения/записи в совместимом режиме доступа
5ch Блокировать/разблокировать доступ к файлу AH = 5ch DOS 3.0+ AL = подфункция: 0 = заблокировать область файла = 1 = разблокировать ранее захваченную область BX = описатель файла (handle) CX:DX = смещение ((CX 65536) + DX) от начала файла SI:DI = длина блокируемой области ((SI 65536) + DI) байт AX = код ошибки если CF установлен Блокирует или освобождает доступ к участку файла, идентифицируемого описателем в BX. Область файла, начинающаяся по логическому смещению CX:DX и имеющая длину SI:DI, блокируется (захватывается) или разблокируется (освобождается). Смещение и длина обязательны. Разделение файлов ДОЛЖНО быть активизировано (командой SHARE), иначе функция вернет код ошибки «неверный номер функции.» Блокировка действует на операции чтения, записи и открытия со стороны порожденного или конкурирующего процесса. При попытке такого доступа (и режиме доступа , определенном при OPEN как «режим разделения», который запрещает такой доступ), DOS отвергает операцию через вызов INT 24H (обработчик критических ошибок) после трех попыток. DOS при этом выдает сообщение «Abort, Retry, Ignore». Рекомендуемое действие — НЕ пытаться читать файл и ожидать кода ошибки. Вместо этого попытайтесь заблокировать область и действуйте в соответствии с кодом возврата. Это позволяет избежать довольно неустойчивого состояния DOS, связанного с выполнением INT 24H. Блокировка за концом файла не является ошибкой. Вы можете захватить весь файл, задав CX=0, DX=0, SI=0ffffh, DI=0ffffh и AL=0. При освобождении, смещение и длина участка должны точно совпадать со смещением и длиной захваченного участка. Замечания: Дублирование описателя через 45H или 46H дублирует и блокировки. Даже если во время OPEN выбран режим доступа Inherit, механизм блокировки не даст никаких привилегий доступа порожденным процессам, созданным функцией 4bh EXEC (они трактуются как отдельные). Важно, чтобы все блокировки файла были сняты до завершения программы. Если вы используете блокировку, особо отслеживайте вызовы INT 23H (выход Ctrl-Break) и INT 24H (выход по критической ошибке), чтобы снять блокировки до действительного завершения программы. Рекомендуется освобождать блокировки как можно скорее. Всегда блокируйте, обрабатывайте файл и освобождайте блокировку одной операцией. Версии: Доступна, начиная с DOS 3.0
Операции с системой прерываний
25H Установить вектор прерывания AH = 25H AL = номер прерывания DS:DX = вектор прерывания: адрес программы обработки прерывания Устанавливает значение элемента таблицы векторов прерываний для прерывания с номером AL равным DS:DX. Это равносильно записи 4-байтового адреса в 0000:(AL*4), но, в отличие от прямой записи, DOS здесь знает, что вы делаете, и гарантирует, что в момент записи прерывания будут заблокированы. Предупреждение: Не забудьте восстановить DS (если необходимо) после этого вызова.
26H Построить PSP AH = 26H DX = адрес сегмента (параграфа) для нового PSP CS = сегмент PSP, используемого как шаблон для нового PSP Устанавливает PSP для порождаемого процесса по адресу DX:0000. Текущий PSP (100H байт, начиная с CS:0), копируется в DX:0 Поле memtop соответственно корректируется Векторы Terminate, Ctrl-Break и Critical Error копируются в PSP из векторов прерываний INT 22H, INT 23H и INT 24H после этого вы можете загрузить программу с диска и передать ей управление посредством FAR JMP. Замечание: Если вы перехватываете INT 21H, позаботьтесь о помещении в стек корректного CS:IP. Еще лучше использовать функцию 4ch (EXEC).
2ah Дать системную дату AH = 2ah AL = день недели (0=Вск, 1=Пнд. 6=Суб) DOS 3.0+ CX = год (1980 до 2099) DH = месяц (1 до 12) DL = день (1 до 31) Возвращает текущую дату, как она известна системе. Версии: DOS 2.x не гарантирует возврата в AL значения дня; все версии 1.0+ возвращают правильный день недели. Версии до 2.1 имеют проблемы с переходом даты.
2bh Установить системную дату AH = 2bh CX = год (1980 до 2099) DH = месяц (1 до 12) DL = день (1 до 31) AL = 0 если дата корректна Устанавливает системную дату DOS.
2ch Дать время DOS AH = 2ch CH = часы (0 до 23) CL = минуты (0 до 59) DH = секунды (0 до 59) DL = сотые доли секунды (0 до 99) Возвращает текущее время, как оно известно системе. Замечание: Поскольку системные часы имеют частоту 18.2 тиков в секунду (интервал 55мс), DL имеет точность 0.04 сек.
2dh Установить время DOS AH = 2dh CH = часы (0 до 23) CL = минуты (0 до 59) DH = секунды (0 до 59) DL = сотые доли секунды (0 до 99) AL = 0 если время корректно Устанавливает системное время DOS.
2eh Установить/сбросить переключатель верификации AH = 2eh AL = 0 отключить верификацию = 1 включить верификацию Устанавливает, должна ли DOS верифицировать (считывать обратно) каждый сектор, записываемый на диск. Это замедляет операции записи на диск, но гарантирует максимальную надежность записи. Функция 56H Get Verify возвращает текущий статус верификации DOS.
2fh Дать адрес текущей DTA AH = 2fh ES:BX = адрес начала текущей DTA Возвращает адрес начала области ввода-вывода (DTA). Поскольку DTA глобальна для всех процессов, в рекурсивной процедуре (например, при проходе по дереву оглавления) может потребоваться сохранить адрес DTA, а впоследствии восстановить его посредством функции 1ah «Уст. DTA». Замечание: Эта функция изменяет сегментный регистр ES.
30H Дать номер версии DOS AH = 30H AL = старший номер версии AH = младший номер версии BX,CX = 0000H DOS 3.0+ Возвращает в AX значение текущего номера версии DOS. Например, для DOS 3.2, в AL возвращается 3, в AH — 2. Замечание: Если в AL возвращается 0, можно предполагать, что работает DOS более ранней версии, чем DOS 2.0. Версии: DOS 2.x не гарантирует очистки регистров CX и BX.
31H Завершиться и остаться резидентным – KEEP AH = 31H AL = код выхода DX = объем памяти, оставляемой резидентной, в параграфах Выходит в родительский процесс, сохраняя код выхода в AL. Код выхода можно получить через функцию 4dh Wait. DOS устанавливает начальное распределение памяти, как специфицировано в DX, и возвращает управление родительскому процессу, оставляя указанную память резидентной (число байт = DX 16). Эта функция перекрывает функцию INT 27H, которая не возвращает код выхода и неспособна установить резидентную программу, большую 64K.
33H Установить/опросить статус Ctrl-Break AH = 33H AL = 0 чтобы опросить текущий статус контроля Ctrl-Break AL = 1 чтобы установить статус контроля Ctrl-Break DL = требуемый статус (0=OFF, 1=ON) (только при AL=1) DL = текущий статус (0=OFF, 1=ON) Если AL=0, в DL возвращается текущий статус контроля Ctrl-Break. Если AL=1, в DL возвращается новый текущий статус. Когда статус ON, DOS проверяет на Ctrl-Break с консоли для большинства функций (исключая 06H и 07H). При обнаружении, выполняется INT 23H (если оно не перехватывается, то это снимает процесс). Когда статус OFF, DOS проверяет на Ctrl-Break лишь при операциях стандартного в/в, стандартной печати и стандартных операциях AUX.
35H Дать вектор прерывания AH = 35H AL = номер прерывания (00H до 0ffh) ES:BX = адрес обработчика прерывания Возвращает значение вектора прерывания для INT (AL); то есть, загружает в BX 0000:[AL*4], а в ES — 0000:[(AL*4)+2]. Предупреждение: Эта функция изменяет сегментный регистр ES.
44H Управление устройством в/в – IOCTL AH = 43H AL = код подфункции: AL = 0ch — (зарезервировано) Прочие = (в зависимости от подфункции) AX = код ошибки если CF установлен или иное значение (в зависимости от подфункции) IOCTL предоставляет метод взаимодействия с устройствами и получения информации о файлах. Входные параметры и выходные значения варьируются в зависимости от кода подфункции в регистре AL. Версии: Подфункции 0-7 . DOS 2.1+ Подфункции 8,0bh . DOS 3.0+ Подфункции 9,0ah . DOS 3.1+ Подфункции 0dh,0eh,0fh . DOS 3.2+ ———————————— Подфункция 00H: Запросить флаги информации об устройстве Вход: BX= описатель файла (устройство или дисковый файл) Выход: DX= IOCTL Инф об устр ———————————— Подфункция 01H: установить флаги информации об устройстве Вход: BX = описатель файла (устройство или дисковый файл) DX = IOCTL Инф об устр (DH должен быть нулевым) Выход: DX= IOCTL Инф об устр ———————————— Подфункция 02-03: читать (AL=02H) или писать (AL=03H) строку IOCTL на СИМВОЛЬНОЕ устр Вход: DS:DX = адрес буфера (чтение) или данных (запись) CX= число передаваемых байт BX= описатель файла (только устройство — не файл!) Выход: AX= код ошибки если CF установлен ———————————— Подфункция 04-05: читать (AL=04H) или писать (AL=05H) строку IOCTL на БЛОЧНОЕ устр Вход: DS:DX = адрес буфера (чтение) или данных (запись) CX = число передаваемых байт BL = : Вход: CL = код действия 40H = установить параметры устройства 60H = дать параметры устройства 41H = писать дорожку логического устройства 61H = читать дорожку логического устройства 42H = форматировать дорожку с верификацией 62H = Верифицировать дорожку логического устройства DS:DX=> адрес пакета данных IOCTL Выход: AX= код ошибки если CF установлен DS:DX=> пакет данных может содержать информацию возврата. ———————————— Подфункция 0eh: Выяснить, назначил ли драйвер устройства несколько логических устройств одному физическому устройству. [DOS 3.2+] Вход: BL= . Эта функция позволяет вам сообщать DOS, что диск с указанным >
48H Распределить память (дать размер памяти) AH = 48H BX = запрошенное количество памяти в 16-байтовых параграфах AX = код ошибки если CF установлен BX = размер доступной памяти в параграфах (если памяти не хватает) AX = сегментный адрес распределенного блока (если нет ошибок) Распределяет блок памяти длиной BX параграфов, возвращая сегментный адрес этого блока в AX (блок начинается с AX:0000). Если распределение неудачно, устанавливается CF, в AX возвращается код ошибки, а BX содержит максимальный размер доступной для распределения памяти (в параграфах). Чтобы определить наибольший доступный кусок, общепринято устанавливать BX=0ffffh перед вызовом. Распределение завершится с ошибкой, возвратив размер максимального блока памяти в BX. Замечание: Когда процесс получает управление через функцию 4bh EXEC, вся доступная память уже распределена ему.
49H Освободить распределенный блок памяти AH = 49H ES = сегментный адрес (параграф) освобождаемого блока памяти AX = код ошибки если CF установлен Освобождает блок памяти, начинающийся с адреса ES:0000. Этот блок становится доступным для других запросов системы. Вообще говоря, вы должны освобождать лишь те блоки памяти, которые вы получили через функцию 48H распределить память. Родитель отвечает за освобождение памяти порожденных процессов. Тем не менее, ничто не препятствует вам освобождать память чужих процессов.
4ah Сжать или расширить блок памяти AH = 4ah ES = сегмент распределенного блока памяти BX = желаемый размер блока в 16-байтовых параграфах AX = код ошибки если CF установлен BX = наибольший доступный блок (если расширение неудачно) Изменяет размер существующего блока памяти. Когда программа получает управление, функция 4bh EXEC уже распределила блок памяти, начиная с PSP, который содержит всю доступную память. Чтобы освободить память для запуска порождаемых процессов, блок памяти, начинающийся с PSP, необходимо сначала сжать. Замечание: Функция 31H (KEEP) и INT 27H (TSR) сжимают блок по адресу PSP.
4bh Выполнить или загрузить программу – EXEC AH = 4bh DS:DX = адрес строки ASCIIZ с именем файла, содержащего программу ES:BX = адрес EPB (EXEC Parameter Block — блока параметров EXEC) AL = 0 = загрузить и выполнить AL = 3 = загрузить программный оверлей AX = код ошибки если CF установлен Предоставляет средства одной программе (родителю) вызвать другую программу (ребенка), которая по завершению возвратит управление родителю. DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имяфайла»,0. Если диск или путь опущены, они подразумеваются по умолчанию. ES:BX указывает на блок памяти, подготовленный как EPB, формат которого зависит от запрошенной подфункции в AL. AL=0 EXEC: так как родительская программа первоначально получает всю доступную память в свое распоряжение, вы должны освободить часть памяти через функцию 4ah до вызова EXEC (AL=0). Обычная последовательность: 1. Вызовите функцию 4ah с ES=сегменту PSP и BX=минимальному объему памяти, требуемой вашей программе (в параграфах). 2. Подготовьте строку ASCIIZ с именем вызываемого программного файла и установите DS:DX на первый символ этой строки. 3. Подготовьте блок параметров EXEC со всеми необходимыми полями. 4. Сохраните текущие значения SS, SP, DS, ES и DTA в переменных, адресуемых через регистр CS (CS — это единственная точка для ссылок после того, как EXEC вернет управление от ребенка). 5. Выдайте вызов EXEC с AL=0. 6. Восстановите локальные значения SS и SP. 7. Проверьте флаг CF, чтобы узнать, не было ли ошибки при EXEC. 8. Восстановите DS, ES и локальную DTA, если необходимо. 9. Проверьте код выхода через функцию 4dh WAIT (если надо). Все открытые файлы дублируются, так что ребенок может обрабатывать данные как через описатели файлов, так и через стандартный в/в. Режимы доступа описателей дублируются, но любые активные блокировки файлов не будут относиться к ребенку. См. Функцию 5ch. После возврата из ребенка, векторы INT 22H Terminate, INT 23H Ctrl-Break и INT 24H Critical Error восстанавливаются в их предыдущие значения. AL=3 LOAD: Эта подфункция используется для загрузки «оверлея». DS:DX указывает на ASCIIZ имя файла, а ES:BX указывает на «LOAD»-версию блока параметров EXEC. Главное значение этой подфункции в том, что она считывает заголовок EXE и выполняет необходимые перемещения сегментов, как это требуется для программ .EXE. Замечания: Эта функция использует программу-загрузчик из COMMAND.COM, который транзитен в DOS 2.x (и, возможно, уже перекрыт программой). В этом случае возникнет ошибка, если DOS не найдет файл COMMAND.COM. Вы должны обеспечить корректную строку COMSPEC= в окружении перед вызовом этой функции. Вместо разбора собственных FCB (как требуется для EPB), вы можете найти удобным загрузить и выполнить вторичную копию файла COMMAND.COM, используя опцию /C. Например, чтобы выполнить программу FORMAT.COM, установите DS:DX на адрес строки ASCIIZ: «\command.com»,0 и установите EPB+2 на сегмент и смещение следующей строки команд: 0eh,»/c format a:/s/4″,0dh такой вторичный интерпретатор команд использует очень мало памяти (около 4K). Вы можете поискать в окружении DOS строку COMSPEC=, чтобы установить точное местоположение файла COMMAND.COM.
4ch Завершить программу – EXIT AH = 4ch AL = код выхода Возвращает управление от порожденного процесса его родителю, устанавливая код выхода, который можно опросить функцией 4dh WAIT. Управление передается по адресу завершения в PSP завершающейся программы. Векторы Ctrl-Break и Critical Error восстанавливаются к старым адресам, сохраненным в родительском PSP. Замечание: Значение ERRORLEVEL (используемое в пакетных файлах DOS) можно использовать для проверки кода выхода самой последней программы.
4dh Дать код выхода программы – WAIT AH = 4dh AL = код выхода последнего завершившегося процесса AH = 0 — нормальное завершение AH = 1 — завершение через Ctrl-Break AH = 2 — завершение по критической ошибке устройства AH = 3 — завершение через функцию 31H KEEP Возвращает код выхода последнего из завершившихся процессов. Эта функция возвращает правильную информацию только однажды для каждого завершившегося процесса.
54H Дать переключатель верификации DOS AH = 54H AL = 0 если верификация выключена (OFF) AL = 1 если верификация включена (ON) Возвращает текущий статус верификации записи DOS. Если в AL возвращается 1, то DOS считывает обратно каждый сектор, записываемый на диск, чтобы проверить правильность записи. Функция DOS 2eh позволяет установить/изменить режим верификации.
59H Дать расширенную информацию об ошибке AH = 59H DOS 3.0+ BX = 0000H (номер версии: 0000H для DOS 3.0, 3.1 и 3.2) AX = расширенный код ошибки (0, если не было ошибки) BH = класс ошибки BL = предлагаемое действие CH = сфера (где произошла ошибка) Используйте эту функцию, чтобы уточнить, что предпринять после сбоя функции DOS по ошибке (только DOS 3.0+ ). Вызывайте ее: В обработчике критических ошибок INT 24H После любой функции INT 21H , возвратившей Carry-флаг После вызова FCB-функции, возвратившей AL=0ffh Версии: Эта функция отсутствует в версиях до DOS 3.00. В DOS 2.x, когда флаг CF указывает на ошибку, используйте логику вашей программы, чтобы отреагировать на ошибку. В DOS 3.0+, когда функция возвращает CF=1, рекомендуем вам игнорировать код ошибки, возвращенный в AX, вызвать эту функцию и выполнить действие, предложенное в BL.
5eh Разные сетевые функции AH = 5eh DOS 3.1+ AL = подф.: 0=дать имя машины (узла) в сети AL = 2=установить стартовую строку сетевого принтера AL = 3=извлечь стартовую строку сетевого принтера Прочие = (зависят от подфункции) AX = код ошибки если CF установлен Прочие = (зависят от подфункции) Эти функции доступны при установленной IBM PC Network Program. Версии: Доступны, начиная с DOS 3.1 ———————————— Подф. 00H: Извлекает имя машины (узла), как оно известно в сети. Вход: DS:DX=> буфер пользователя для ASCIIZ сетевого имени Выход: DS:DX=> буфер, содержащий сетевое имя CH= 0=имя не определено; иначе=имя определено CL= номер имени NETBIOS (если CH ненулевой) AX= код ошибки если CF установлен Замечание: Сетевое имя — 15-симв. (дополненная пробелами) строка ASCIIZ ———————————— Подф. 02H: Задает настроечную строку, посылаемую на принтер каждый раз, когда эта машина выдает результаты на сетевой принтер. Вход: DS:SI=> буфер, содержащий настроечную строку (до 64 байт) CX= длина настроечной строки BX= индекс в списке назначений, отвечающий принтеру Выход: AX= код ошибки если CF установлен ———————————— Подф. 03H: Извлекает настроечную строку принтера, заданную ранее посредством DOS Fn 5eh подф. 02H. Вход: DS:DI=> 64-байтовый буфер пользователя для результата bx= индекс принтера в списке назначений Выход: ES:DI=> буфер, заполненный настроечной строкой CX= длина настроечной строки AX= код ошибки если CF установлен Замечание: Поскольку индекс в списке назначений может измениться в любой момент, используйте функцию 5fh подф. 02H, чтобы получить индекс непосредственно перед вызовом этой функции.
5fh Переназначение устройств в сети AH = 5fh DOS 3.1+ AL = подф.: 2=получить элемент списка переназначений устройств = 3=переназначить сетевое устройство = 4=отменить переназначение сетевого устройства Прочие = (зависят от подфункции) AX = код ошибки если CF установлен Эти функции доступны при установленной IBM PC Network Program. Версии: Доступны, начиная с DOS 3.1 ———————————— Подф. 02H: Извлекает элемент из списка переназначений сетевых устройств. Вход: DS:DI=> 128-байтовое ASCIIZ локальное имя устр. («LPT1»,0) ES:DI=> 128-байтовый буфер с ASCIIZ сетевым именем BX= индекс в списке назначений Выход: DS:DI=> ASCIIZ локальное имя устройства (напр., «LPT1»,0) ES:DI=> ASCIIZ сетевое имя BL= тип устр: 3=принтер; 04=файл ‘устройство’ BH= статус устр: бит 0=1 -неверное устр.; 0=верное CX= сохраненный параметр (при NETBIOS, всегда 0) AX= код ошибки если CF установлен DX,BP = (изменены) Замечание: обычно эту функцию вызывают с BX=0, затем повторяют вызовы, увеличивая значение BX, пока DOS не вернет ошибку 12H (больше нет файлов). ———————————— Подф. 03H: этот вызов определяет имена оглавлений для сети и перенаправляет доступ на сетевые принтеры. Замеч: доступ к принтеру переназначается на уровне ROM-BIOS INT 17H. Вход: DS:SI = ASCIIZ имя исходного устройства ES:DI = ASCIIZ назначение (сетевой путь с паролем) BL= тип устр: 03=принтер; 04=файл ‘устройство’ CX= параметр для вызывающего (задавайте 0 для NETBIOS) Выход: AX= код ошибки если CF установлен Замеч: если BL=03, то источник задает ASCIIZ-имя принтера (например, «LPT1»,0). Назначение кодируется в форме: [\\computername\],0,[password],0. Если пароль начинается с 00, считается, что пароля нет. Если BL=04, то источник задает ASCIIZ-имя диска (например, «F:»,0), а назначение — ASCIIZ-имя пути. После вызова этой функции, локальные обращения к этому диску переназначаются на выбранные имя компьютера и путь. ———————————— Подф. 04H: Отменить сетевое переназначение для указанного устройства. Вход: DS:SI=> ASCIIZ-имя устройства или ,0), то переназначение этого диска прекращается, и ID диска восстанавливает свое предыдущее значение.