Глава – 6
Введение в основы компьютера
Введение
Иногда, в некоторых случаях, когда вы пытаетесь восстановить данные или выполняете какую-либо задачу по устранению неполадок данных и диска (или это может быть любая другая задача, связанная с системой), очень удобно использовать команду DEBUG DOC.
Кроме того, в некоторых конкретных случаях вам может быть проще выполнить эту конкретную задачу с помощью DEBUG, чем с программированием. Возьмем пример. Следующего кода отладки будет достаточно, чтобы сделать резервную копию DBR. Просто введите следующие строки:
DEBUG BKDBR.BIN
L 100 2 0 1
R CX
200
W
Q
Здесь вы можете видеть, что только набрав несколько строк выше, вы можете избежать написания программы. Давайте посмотрим еще один пример кода, который загружает резервную копию DBR на диск
Всегда помните! Не пытайтесь делать это без полного знания. Будьте уверены, что вы собираетесь делать. Неосторожное использование следующих Инструкций может привести к большой потере данных, так как неправильное использование Инструкции может сделать всю вашу информацию на диске недоступной.
DEBUG BKDBR.BIN
W 100 2 0 1
Q
Глядя на код этого примера, вы можете легко догадаться, насколько он может вам помочь, когда вам это нужно больше всего. Также не во всех случаях можно программировать. Однако в рамках простых случаев проблемы, чтобы использовать Инструкции по сборке, нужно просто скопировать файл debug.exe/debug.com на загрузочный диск и начать писать код.
Функции и примеры, описанные в этой главе и в этой книге, совместимы только с архитектурой семейства процессоров Intel x86.
Прежде всего нам нужно немного узнать об основах компьютерной архитектуры, чтобы понять термины, используемые в следующих разделах, при описании функционирования и примеров на разных этапах. Дайте нам знать некоторые основы компьютерной архитектуры:
Основные понятия
Центральный процессор
Эта часть также известна как центральный процессор или ЦП, который, в свою очередь, состоит из блока управления и арифметико-логического блока. Его функции заключаются в чтении и записи содержимого ячеек памяти, пересылке данных между ячейками памяти и специальными регистрами, а также в декодировании и выполнении инструкций программы. Процессор имеет ряд ячеек памяти, которые используются очень часто и, таким образом, являются частью ЦП.
Эти ячейки известны под названием регистров. Процессор может иметь один или два десятка таких регистров. Арифметико-логическое устройство ЦП реализует операции, связанные с числовыми и символьными вычислениями.
Обычно эти устройства способны выполнять только очень элементарные операции, такие как сложение и вычитание двух целых чисел, умножение и деление целых чисел, обработка битов регистров и сравнение содержимого двух регистров. Персональные компьютеры можно классифицировать по так называемому размеру слова, т. е. количеству битов, которое процессор может обрабатывать за один раз.
Центральная память
Это группа ячеек, изготовленных из полупроводников, используемых для общих процессов, таких как выполнение программ и хранение информации для операций. Каждая из этих ячеек может содержать числовое значение, и они обладают свойством направления. Это то, что они могут отличить один от другого с помощью уникального номера или адреса для каждой ячейки. Общее название этих запоминающих устройств – оперативное запоминающее устройство или ОЗУ.
Основным недостатком этого типа памяти является то, что интегральные схемы теряют хранящуюся в них информацию при прерывании подачи электроэнергии. Это послужило причиной создания воспоминаний, информация о которых не теряется при выключении системы. Эта память получает название Read Only Memory или ROM.
Для того, чтобы ПК мог обрабатывать информацию, необходимо, чтобы эта информация находилась в специальных ячейках, называемых регистрами. Регистры представляют собой группы из 8 или 16 триггеров.
Триггер — это устройство, способное хранить два уровня напряжения: низкое, обычно 0,5 В, и другое, обычно 5 В. Низкий уровень энергии в триггере интерпретируется как выключенный или 0, а высокий уровень как включенный или
- Эти состояния обычно известны как биты, которые являются наименьшей единицей информации в компьютере.
Группа из 16 бит называется словом; слово может быть разделено на группы по 8 бит, называемые байтами, а группы по 4 бита называются полубайтами.
Регистры процессора
ЦП имеет 4 внутренних регистра, каждый из 16-битных. Первые четыре, AX, BX, CX и DX, являются регистрами общего назначения и могут также использоваться как 8-битные регистры, если используются таким образом, к ним необходимо обращаться, например, как: AH и AL, которые являются старшим и младшим байтами регистра AX. Эта номенклатура также применима к регистрам BX, CX и DX.
Реестры, известные под своими именами:
Register |
Specific Name |
AX |
Accumulator |
BX |
Base register |
CX |
Counting register |
DX |
Data register |
DS |
Data segment register |
ES |
Extra segment register |
SS |
Battery segment register |
CS |
Code segment register |
BP |
Base pointers register |
SI |
Source index register |
DI |
Destination index register |
SP |
Battery pointer register |
IP |
Next Instruction pointer register |
F |
Flag register |
Тем не менее, мы будем использовать эти регистры в программировании прерываний на C в следующих главах подробно, но изучение основ языка ассемблера здесь будет идеальным, и это поможет нам в программировании операций с дисками и т. д.
Возможно визуализировать значения внутренних регистров ЦП с помощью программы отладки. Чтобы начать работу с отладкой, введите на своем компьютере следующую команду:
C:/>Отладка <Enter>
На следующей строке появится прочерк, это индикатор отладки, в этот момент инструкции по отладке можно ввести с помощью следующей команды:
- r <Enter>
Отображается все содержимое внутренних регистров ЦП. Альтернативой их просмотру является использование кнопки "r" используя в качестве параметра имя регистра, значение которого нужно просмотреть. Например:
-rbx <Enter>
Эта инструкция будет отображать только содержимое регистра BX, а индикатор отладки изменится с "-" на ":"
Когда приглашение похоже на это, можно изменить значение регистра, которое было просмотрено, введя новое значение и <Enter>, или старое значение можно оставить, нажав Enter, не вводя никакого другого значения.
Можно изменить значение флагового регистра и использовать его в качестве управляющей структуры в наших программах, как мы увидим позже. Каждый бит регистра имеет специальное имя и значение. В следующем списке описывается значение каждого бита, включенного или выключенного, и его связь с операциями процессора:
Overflow
NV = there is no overflow
OV = there is an overflow
Direction
UP = forward
DN = backward
Interrupts
DI = deactivated
EI = activated
Sign
PL = positive
NG = negative
Zero
NZ = it is not zero
ZR = it is zero
Auxiliary Carry
NA = there is no auxiliary carry
AC = there is auxiliary carry
Parity
PO = uneven parity
PE = even parity
Carry
NC = there is no carry
CY = there is carry
Структура ассемблера
В строках кода на ассемблере есть две части: первая — это имя инструкции, которая должна быть выполнена, а вторая — параметры команды. Например:
ДОБАВИТЬ ах, бх
Здесь "ДОБАВИТЬ" команда, которую необходимо выполнить; в данном случае добавление и "ах" а также "бх" являются параметрами.
Название Инструкции на языке состоит из двух, трех или четырех букв. Эти инструкции также называются мнемоническими именами или кодами операций, поскольку они представляют собой функцию, которую будет выполнять процессор. Некоторые команды не требуют параметров для своей работы, а другие требуют только один параметр.
Иногда инструкции используются следующим образом:
ADD al,[170]
Скобки во втором параметре указывают нам, что мы будем работать с содержимым ячейки памяти номер 170, а не со значением 170; это называется прямым направлением.
Теперь мы готовы написать код для нашей первой программы с помощью отладки. Мы собираемся создать программу, которая иллюстрирует то, что мы видели, и что мы сделаем, так это добавим два значения, которые мы непосредственно введем в программу.
Первым шагом является инициация отладки. Этот шаг состоит только из ввода команды debug <Enter> в командной строке операционной системы.
Чтобы собрать программу на отладке, "a" используется команда (собрать). Когда эта команда используется, адрес, с которого вы хотите начать сборку, может быть указан в качестве параметра, если параметр опущен, сборка будет инициирована в местоположении, указанном CS:IP, обычно 0100h, которое является местонахождением программ. с расширением .COM должны быть инициированы. И это место мы будем использовать, так как только Debug может создавать программы такого типа.
Несмотря на то, что в данный момент нет необходимости ставить "отлично" задайте параметр, рекомендуется сделать это, чтобы избежать проблем после использования регистров CS:IP, поэтому мы набираем:
-a0100 <Ввод>
Когда это будет сделано, на экране появится что-то вроде этого: 0C1B:0100 и курсор будет расположен справа от этих чисел, обратите внимание, что первые четыре цифры в шестнадцатеричной системе могут быть разными, но последние четыре должен быть 0100, так как это адрес, который мы указали в качестве начала. Теперь мы можем представить Инструкции:
0C1B:0100 mov ax,0002; puts the 0002 value on the ax register
0C1B:0103 mov bx,0004; puts the 0004 value on the bx register
0C1B:0106 add ax,bx; the content of bx is added to the content of ax
0C1B:0108 int 20; provoques the termination of the program.
0C1B:010A
Не обязательно писать комментарии, которые идут после ";". После ввода последней команды int 20, <Enter> нажимается без каких-либо дополнительных действий, чтобы снова увидеть приглашение отладчика.
Последняя написанная строка не является собственно инструкцией на ассемблере, это вызов оперативного прерывания системы, эти прерывания экономят нам много строк и очень полезны для доступа к оперативным системным функциям.
Чтобы выполнить написанную нами программу, "g" используется команда, и при ее использовании мы увидим сообщение, в котором говорится:
"Программа завершена нормально". Естественно, с таким сообщением мы не можем быть уверены, что программа выполнила добавление, но есть простой способ проверить это, используя "r" Командой Debug мы можем увидеть содержимое всех регистров процессора, просто набрав:
-r <Enter>
Каждый регистр с соответствующим фактическим значением появится на экране следующим образом:
AX=0006 BX=0004 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1B ES=0C1B SS=0C1B CS=0C1B IP=010A NV UP EI PL NZ NA PO NC
0C1B:010A OF DB
Существует вероятность того, что регистры содержат разные значения, но AX и BX должны быть одинаковыми, поскольку мы только что изменили их.
Еще один способ увидеть значения во время выполнения программы — использовать адрес, по которому мы хотим завершить выполнение, и показать значения регистров в качестве параметра для "g", в этом случае это будет :g108, эта Инструкция выполняет программу, она останавливается на 108 адресе и показывает содержимое регистров.
Отслеживание того, что происходит в регистрах, можно выполнить с помощью тега "t" команда (трассировка), функция этой команды - выполнить построчно то, что было собрано, показывая каждый раз содержимое регистров.
Чтобы выйти из режима отладки, используйте клавишу "q" (выйти) команду.
Преимущества Ассемблера
Первая причина работать с ассемблером заключается в том, что он дает возможность больше узнать о работе вашего ПК, что позволяет разрабатывать программное обеспечение более последовательным образом.
Вторая причина — это полный контроль над компьютером, который вы можете получить с помощью ассемблера. Другая причина заключается в том, что программы на ассемблере работают быстрее, а в некоторых случаях меньше по размеру и имеют больше возможностей, чем программы, созданные на других языках.
Позвольте мне сдержать обещание!!
В предыдущей части этой главы мы использовали некоторые инструкции в качестве примера, чтобы сделать резервную копию DBR и загрузить резервную копию DBR в исходное местоположение, когда это необходимо. Сначала изучаем Инструкцию по созданию резервной копии.
C:\>DEBUG A:\BKDBR.BIN <Enter>
File not found
- L 100 2 0 1 <Enter>
- R CX <Enter>
CX 0000
: 200 <Enter>
- W <Enter>
Writing 00200 bytes
- Q <Enter>
В этом примере начнем изучение с первой строки. Команда DEBUG A:\BKDBR.BIN Инициализирует команду отладки с созданием файла в дисководе A: с именем BKDBR.BIN, если его там еще нет. Вот почему мы получили сообщение «Файл не найден» при запуске.
В нашей второй инструкции L 100 2 0 1 команда L (загрузка) предназначена для загрузки DBR указанного диска. Давайте узнаем, как? В этой Инструкции цифра 100 - это адрес буфера, в котором будет храниться DBR, следующая цифра 2 используется для диска C(C:). Номера дисков даны следующим образом:
Drive Letter |
Number Used |
A: |
0 |
B: |
1 |
C: |
2 |
D: |
3 |
. |
. |
. |
. |
and so on |
. |
Следующее число 0 — это начальный номер сектора из числа секторов, которые нужно прочитать. Здесь мы используем 0 для чтения 1-го сектора, то есть сектора DBR. Следующее число, равное 1, используется для указания количества считываемых секторов.
Здесь мы указали 1, потому что хотим прочитать только один сектор. Однако мы можем использовать номера и расположение начальных и конечных секторов в соответствии с нашими потребностями в других типах операций. Поэтому он загрузит один сектор, начиная с 1-го сектора диска C: в ячейку памяти 100.
Инструкция R CX используется для изменения или определения длины данных, которые мы хотим записать в файл BKDBR.BIN. Эта инструкция покажет текущее значение регистра CX и позволит вам внести любые изменения. Мы ввели здесь 200, потому что команда DEBUG использует шестнадцатеричную систему, а размер DBR в шестнадцатеричной системе равен 200 (h) байт, что соответствует 512 байтам в десятичной системе.
W команда указывает DEBUG записать 200 (h) байтов из ячейки 100 в файл BKDBR.BIN. И, наконец, мы используем инструкцию Q, чтобы выйти из DEBUG и вернуться к командной строке DOS.
Предупреждение!!! Предупреждение!!! Внимание!!!
Настоятельно рекомендуется знать, что и как вы делаете в процедуре восстановления DBR любого диска. Если вы случайно сохраните недопустимый или DBR любого другого Диска, в большинстве случаев возможно, что полные данные диска могут стать недоступными.
когда вы вводите первую инструкцию кодировки, то есть:
ОТЛАДКА A:\BKDBR.BIN <Enter>
Файл должен находиться в указанном месте, где вы запускаете программу DEBUG. Теперь, если вы получите сообщение об ошибке «Файл не найден» перед приглашением DEBUG, немедленно остановите процесс с помощью команды Q (выход). Потому что это означает, что файл BKDBR.BIN не может быть найден или открыт программой DEBUG, и если вы продолжите этот процесс, некоторая ненужная информация будет записана в DBR, и это сделает весь раздел недоступным. |
Теперь давайте посмотрим, что мы сделали в кодировке Инструкции по восстановлению DBR из сделанного нами резервного файла с именем BKDBR.BIN. Команды DEBUG для восстановления резервной копии следующие:
C:\> DEBUG A:\BKDBR.BIN <Enter>
- W 100 2 0 1 <Enter>
- Q <Enter>
|
Эта инструкция запишет 1 сектор информации из файла BKDBR.BIN на дискету (a:) в ячейку памяти 100 в первый сектор, который является сектором 0 2-го диска, который является диском (C:).
Хранение и загрузка программ
Было бы непрактично набирать всю программу каждый раз, когда это необходимо, и, чтобы избежать этого, можно хранить программу на диске с огромным преимуществом, поскольку она уже собрана, и ее не нужно будет запускать. Выполните отладку еще раз, чтобы выполнить его.
Чтобы сохранить программу, которая уже хранится в памяти, выполните следующие действия:
- Получите длину программы, вычитая конечный адрес из начального адреса, естественно, в шестнадцатеричной системе.
- Дайте программе имя и расширение.
- Поместите длину программы в регистр CX.
- Приказать отладчику записать программу на диск.
Используя в качестве примера следующую программу, мы получим более четкое представление о том, как выполнять эти шаги. Когда программа будет окончательно собрана, она будет выглядеть так:
0C1B:0100 mov ax,0002
0C1B:0103 mov bx,0004
0C1B:0106 add ax,bx
0C1B:0108 int 20
0C1B:010 A
-h 10a 100
020a 000a
-n test.com
-rcx
CX 0000
:000a
-w
Запись 000A байт
Для получения длины программы "h" используется, так как она покажет нам сложение и вычитание двух чисел в шестнадцатеричном виде. Чтобы получить нашу длину, мы задаем в качестве параметров значение конечного адреса нашей программы (10A) и начальный адрес программы (100). Первый результат, который показывает команда, — это сложение параметров, а второй — вычитание.
Кнопка "n" Команда позволяет нам назвать программу. "RCX"; Команда позволяет нам изменить содержимое регистра CX на значение, которое мы получили из размера файла с «h», в данном случае 000a, поскольку результат вычитания конечного адреса из начального адреса.
Наконец, символ "w" Команда записывает нашу программу на диск, указывая, сколько байт она записала. Кроме того, для сохранения уже загруженного файла необходимы два шага:
- Укажите имя загружаемого файла.
- Загрузите его с помощью "l" (загрузить) команду.
Для получения правильного результата следующих шагов необходимо, чтобы указанная выше программа была уже создана.
Внутри Debug пишем следующее:
-n test.com
-l
-u 100 109
0C3D:0100 B80200 MOV AX,0002
0C3D:0103 BB0400 MOV BX,0004
0C3D:0106 01D8 ADD AX,BX
0C3D:0108 CD20 INT 20
Последнее "у" Команда используется для проверки того, что программа была загружена в память. Что он делает, так это дизассемблирует код и показывает его в дизассемблированном виде. Параметры указывают DEBUG откуда и куда дизассемблировать. DEBUG всегда загружает программы в память по адресу 100H, иначе указано.
Сегменты
Архитектура процессоров x86 вынуждает использовать сегменты памяти для управления информацией, размер этих сегментов составляет 64 КБ.
Причина существования этих сегментов заключается в том, что, учитывая, что максимальный размер числа, которым может управлять процессор, определяется 16-битным словом или регистром, доступ к более чем 65536 ячейкам памяти будет невозможен. используя только один из этих регистров, но теперь, если память разделена на группы или сегменты, каждая из 65536 мест, и мы используем адрес в эксклюзивном регистре, чтобы найти каждый сегмент, а затем мы делаем каждый адрес определенного слота с двумя регистрами, и мы можем получить доступ к 4294967296 байтам памяти.
Для того, чтобы ассемблер мог управлять данными, необходимо, чтобы каждая часть информации или инструкция находились в области, которая соответствует соответствующим сегментам. Ассемблер обращается к этой информации с учетом локализации сегмента, заданной регистрами DS, ES, SS и CS, и внутри регистра адресом указанной части информации. Именно из-за этого, когда мы создаем программу с помощью Debug, на каждой строке, которую мы собираем, появляется что-то вроде этого:
1CB0:0102 ДВИГАТЕЛЬ AX,BX
Где первое число, 1CB0, соответствует используемому сегменту памяти, второе относится к адресу внутри этого сегмента, и далее следуют инструкции, которые будут сохранены с этого адреса.
Ассемблер регулирует размер сегментов, взяв за основу количество байтов, необходимых для каждой собранной инструкции, поскольку использование целых сегментов было бы пустой тратой памяти. Например, если программе требуется всего 10 КБ для хранения данных, сегмент данных будет иметь размер только 10 КБ, а не 64 КБ, которые она может обработать.
Перемещение данных
Я привожу здесь некоторые инструкции на языке ассемблера для операций с данными для вашего удобства и понимания, когда мы будем программировать с помощью прерываний и других операций BIOS, нам понадобятся его основы.
Подробное введение и тщательное изучение языка ассемблера выходит за рамки этой книги. Хотя знание основ ассемблера необходимо для перехода к дальнейшим важным главам по программированию, тем не менее, если вам трудно понять все инструкции, вам не нужно беспокоиться, но рекомендуется получить базовое представление об инструкциях.
В любой программе необходимо перемещать данные в памяти и в регистрах процессора, и сделать это можно несколькими способами. он может копировать данные из памяти в какой-либо регистр, из регистра в регистр, из регистра в стек, из стека в регистр, передавать данные на внешние устройства, а также наоборот.
Перемещение данных регулируется правилами и ограничениями. Вот некоторые из них:
- Невозможно напрямую перемещать данные из одной ячейки памяти в другую. Необходимо сначала перенести данные исходного местоположения в регистр, а затем из регистра в место назначения.
- Невозможно переместить константу непосредственно в сегментный регистр; сначала он должен быть перемещен в регистр ЦП.
- Блоки данных можно перемещать с помощью инструкций MOVS, которые копируют цепочку байтов или слов. MOCSB копирует n байтов из одного места в другое, а MOVSW копирует n слов из одного места в другое. Последние две инструкции принимают значения из адресов, определенных DS:SI в качестве группы данных для перемещения, и ES:DI в качестве новой локализации данных.
Для перемещения данных также существуют структуры, называемые батареями, где данные вводятся с помощью инструкции push и извлекаются с помощью инструкции pop. В стеке первые данные, которые должны быть введены, являются последними, которые мы можем взять, это если в нашей программе мы используем эти инструкции:
PUSH AX
PUSH BX
PUSH CX
Для возврата правильных значений в каждый регистр в момент их взятия из стека необходимо сделать это в следующем порядке:
POP CX
POP BX
POP AX
Для связи с внешними устройствами команда out используется для отправки информации на порт, а команда in — для чтения информации, полученной от порта.
Синтаксис команды OUT:
ВЫХОД DX,AX
Где DX содержит значение порта, который будет использоваться для связи, а AX содержит информацию, которая будет отправлена.
Синтаксис команды IN:
В AX,DX
Где AX — это регистр, в котором будет храниться входящая информация, а DX содержит адрес порта, по которому будет поступать информация.
Инструкция MOV
Используется для передачи данных между ячейками памяти, регистрами и аккумулятором. Синтаксис следующий:
Место назначения, источник MOV
Различные перемещения данных, разрешенные для этой инструкции, показаны в следующей таблице:
S. No. |
Destination |
Source |
1. |
memory |
accumulator |
2. |
accumulator |
memory |
3. |
segment register |
memory/register |
4 |
memory/register |
segment register |
5. |
Register |
register |
6. |
Register |
memory |
7. |
memory |
register |
8. |
Register |
immediate data |
9. |
memory |
immediate data |
Let us see an example:
MOV AX,0006
MOV BX,AX
MOV AX,4C00
INT 21
Эта программа перемещает значение 0006H в регистр AX, затем перемещает содержимое AX (0006h) в регистр BX и, наконец, перемещает значение 4C00h в регистр AX, чтобы завершить выполнение с опцией 4C прерывания на 21 час. . Мы кратко рассмотрим прерывание 13H и прерывание 21H позже.
Прерывания
Прерывание — это аппаратная функция, которая заставляет ЦП приостановить выполнение, сохранить свое состояние и перейти в определенное место. Место передачи определяет адрес программы, которая должна выполнить действие в ответ на прерывание. Программа, которая выполняется в результате прерывания, называется программой обработки прерывания.
Например: если DOS хочет отправить некоторую информацию в BIOS или BIOS хочет отправить некоторую информацию в компьютерную систему, DOS или BIOS генерируют прерывания. Всякий раз, когда генерируется прерывание, компьютер приостанавливает все, что он делает, и сначала заботится об операции, вызвавшей прерывание.
Каждому устройству, способному генерировать прерывания, присваивается уникальный номер прерывания, чтобы определить, какое устройство генерирует эти прерывания. В этой книге мы обсудим все функции и подфункции прерывания 13H, расширения прерывания 13H и прерывания 21H.
В основном прерывания могут быть следующих трех типов:
- Внутренние аппаратные сбои
- Внешние аппаратные сбои
- Программные сбои
Внутренние аппаратные сбои
Внутренние прерывания генерируются определенными событиями, возникающими во время выполнения программы. Этот тип прерываний полностью управляется аппаратным обеспечением, и их невозможно изменить.
Ярким примером такого типа прерываний является то, которое актуализирует счетчик внутренних часов компьютера, аппаратное обеспечение делает вызов этого прерывания несколько раз в секунду, чтобы поддерживать актуальность времени.
Хотя мы не можем напрямую управлять этим прерыванием, поскольку мы не можем контролировать обновление времени с помощью программного обеспечения, мы можем использовать его влияние на компьютер в нашу пользу.
Например: чтобы создать постоянно обновляемые виртуальные часы, нам нужно только написать программу, которая считывает фактическое значение счетчика и переводит его в понятный пользователю формат.
Внешние аппаратные прерывания
Внешние прерывания генерируются периферийными устройствами, такими как клавиатуры, принтеры, коммуникационные карты и т. д. Они также генерируются сопроцессорами. Невозможно деактивировать внешние прерывания.
Эти прерывания не отправляются напрямую в ЦП, а передаются на интегральную схему, функция которой состоит исключительно в обработке прерываний этого типа.
Программные сбои
Программные прерывания могут быть напрямую активированы ассемблером, вызывающим номер желаемого прерывания с помощью инструкции INT.
Использование прерываний помогает нам в создании программ, и с их помощью наши программы становятся короче. Их легче понять, и они обычно имеют лучшую производительность, в основном из-за своего меньшего размера. Этот тип прерываний можно разделить на две категории: прерывания операционной системы DOS и прерывания BIOS.
Разница между ними заключается в том, что оперативные прерывания системы проще в использовании, но они также медленнее, поскольку эти прерывания используют BIOS для достижения своей цели, с другой стороны, прерывания BIOS намного быстрее, но они имеют Недостаток в том, что, поскольку они являются частью аппаратного обеспечения, они очень специфичны и могут различаться даже в зависимости от марки производителя схемы.
Выбор типа прерывания будет зависеть исключительно от характеристик, которые вы хотите придать своей программе.
Поскольку мы будем использовать прерывания для программирования восстановления данных с помощью языка C через обработку прерываний с помощью C, мы будем обсуждать только прерывание 13H, расширения прерывания 13H и прерывание 21H специально. Не столь важно обсуждать все остальные прерывания и их функции, потому что в языке C для выполнения большинства этих задач доступны более простые функции. Однако знание прерывания 13H и его расширений необходимо для программирования восстановления данных. |
Давайте кратко познакомимся с прерываниями 20H и Interrupt 21H. Значение, записанное в скобках (например, 0x20), указывает, как использовать
INT 20H ( 0x20) --> Terminate process
Call with: CS = segment address of program segment prefix
Returns: Nothing
Комментарии:
Завершает текущий процесс. Это один из нескольких методов, которые программа может использовать для окончательного выхода. Вы также можете использовать функции (00H, 31H или 4CH) INT 21H или просто INT 27H для выполнения окончательного выхода, где обычно предпочтительны функции 31H и 4CH INT 21H, поскольку они позволяют передать код возврата родительскому процессу.
Если вы использовали блоки управления файлами (FCB) для записи какого-либо файла, рекомендуется сначала закрыть файл, иначе вы можете потерять данные, потому что в действии окончательного выхода вся память, занятая процессом освобождается, буферы файлов сбрасываются, а все открытые дескрипторы файлов или устройств, принадлежащих процессу, закрываются.
Поэтому, если у вас есть открытые дескрипторы файла, вы можете потерять данные.
INT 21H (0x21)
Function 00H (0x00) --> Terminate process
Call with: AH = 00H
CS = segment address of program segment prefix
Returns: Nothing
Комментарии:
Это прерывание завершает текущий процесс. Это один из нескольких методов, которые программа может использовать для окончательного выхода. Для получения дополнительной информации см. INT 20H
INT 21H (0x21)
Function 01H (0x01) --> Character input with echo
Call with: AH = 01H
Returns: AL = 8-bit input data
Комментарии:
Это прерывание считывает символ со стандартного устройства ввода, такого как клавиатура, и выводит его на стандартное устройство вывода. Если ни один персонаж не готов, ждет, пока он не станет доступен.
INT 21H (0x21)
Function 02H (0x02) --> Character output
Call with: AH = 02H
DL = 8-bit data for output
Returns: Nothing
Комментарии:
Он выводит символ на стандартное устройство вывода. Вывод можно перенаправить. Если вывод перенаправляется, невозможно определить, что диск заполнен.
Строки также можно отправлять строки на дисплей, выполняя запись (INT 21H, функция 40H) с использованием предопределенного дескриптора для стандартного вывода (0001H), если вывод не был перенаправлен или дескриптор получил логическое устройство CON .
INT 21H (0x21)
Function 03H (0x03) --> Auxiliary input
Call with: AH = 03H
Returns: AL = 8-bit input data
Комментарии:
Он считывает символ со стандартного вспомогательного устройства. По умолчанию используется первый последовательный порт (COM1).
Если вспомогательное устройство отправляет данные быстрее, чем ваша программа может их обработать, символы могут быть потеряны. Пользовательская программа не может прочитать состояние вспомогательного устройства или обнаружить ошибки ввода-вывода, такие как потерянные символы, с помощью этого вызова функции.
INT 21H (0x21)
Function 04H (0x04) --> Auxiliary output
Call with: AH = 04H
DL = 8-bit data for output
Returns: Nothing
Комментарии:
Эта функция INT 21H выводит символ на стандартное вспомогательное устройство. По умолчанию используется первый последовательный порт (COM1). Строки также можно отправить на вспомогательное устройство, выполнив запись (INT 21H, функция 40H) с помощью предопределенного дескриптора для стандартного вспомогательного устройства (00034) или с помощью дескриптора, полученного при открытии логического устройства AUX.
INT 21H (0x21)
Function 05H (0x05) --> Printer output
Call with: AH = 05H
DL = 8-bit data for output
Returns: Nothing
Комментарии:
Эта функция отправляет символ на устройство стандартного списка. Устройством по умолчанию является принтер на первом параллельном порту (LPT1). Строки также можно отправить на принтер, выполнив запись (INT 21H, функция 40H) с использованием предопределенного дескриптора для стандартного устройства принтера (0004H) или с помощью дескриптора, полученного при открытии логического устройства PRN или LPT1.
INT 21H (0x21)
Function 06H (0x06) --> Direct console I/O
Call with: AH = 06H
DL = function requested such that,
If output request, 00H-FEH
If input request, 0FFH
Returns: Nothing, If called with DL = 00H-0FEH
If called with DL = FFH and a character is ready
Zero flag = clear
AL = 8-bit input data
If called with DL = FFH and no character is ready
Zero flag = set
Комментарии:
Он читает символ со стандартного устройства ввода или записывает символ на стандартное устройство вывода. Ввод-вывод может быть перенаправлен, но если ввод-вывод был перенаправлен, невозможно определить конец файла или переполнение диска. Эта функция INT 21H используется программами, которым необходимо читать и записывать все возможные символы и управляющие коды без какого-либо вмешательства со стороны операционной системы.
INT 21H (0x21)
Function 07H (0x07) --> Unfiltered character input
without Echo
Call with: AH = 07H
Returns: AL = 8-bit input data
Комментарии:
Эта функция считывает символ со стандартного устройства ввода, не выводя его на стандартное устройство вывода.
INT 21H (0x21)
Function 08H (0x08) --> Character input without
echo
Call with: AH = 08H
Returns: AL = 8-bit input data
Комментарии:
Эта функция считывает символ со стандартного устройства ввода, не выводя его на стандартное устройство вывода.
INT 21H (0x21)
Function 09H (0x09) --> Display string
Call with: AH = 09H
DS:DX = segment: offset of string
Returns: Nothing
Комментарии:
Он отправляет строку символов на стандартное устройство вывода. Вывод может быть перенаправлен. Если вывод был перенаправлен, невозможно определить, что диск заполнен. Строку также можно отправить на дисплей, выполнив запись (INT 21H, функция 40H), используя предопределенный дескриптор стандартного вывода (0001H), если он не был перенаправлен, или дескриптор, полученный при открытии логического устройства CON.
INT 21H (0x21)
Function 0AH (0x0A or 10) --> Buffered keyboard
input
Call with: AH = 0AH
DS:DX = segment: offset of buffer
Returns: Data placed in buffer, Returns Nothing
Комментарии:
Он считывает строку байтов со стандартного устройства ввода, вплоть до возврата каретки ASCII (0DH) включительно, и помещает их в указанный пользователем буфер. Символы выводятся на стандартное устройство вывода. Буфер, используемый функцией, имеет следующий формат:
Byte |
Contents |
0 |
Maximum number of characters to read, set by program |
1 |
Number of characters actually read (excluding carriage return), set by MS-DOS |
2+ |
String read from keyboard or standard input, terminated by a carriage return (0DH) |
INT 21H (0x21)
Function 0BH (0x0B or 11) --> Check input status
Call with: AH = 0BH
Returns: AL = 00H (if no character is available)
FFH (if at least one character is available)
Комментарии:
Проверяет, доступен ли символ со стандартного устройства ввода, такого как клавиатура. Эта функция эквивалентна IOCTL INT 21H Функция 44H Подфункция 06H.
INT 21H (0x21)
Function 0CH (0x0C or 12) --> Flush input buffer
and then Input
Call with: AH = 0CH
AL = number of input to be invoked after resetting
buffer (must be 01H, 06H, 07H, 08H or 0AH)
If AL = 0AH
DS: DX = segment: offset of input buffer
Returns: If called with AL = 01H, 06H, 07H, or 08H,
AL = 8-bit input data
If called with AL= 0AH,
Nothing (data placed in buffer)
Комментарии:
Очищает стандартный буфер ввода, а затем вызывает одну из функций ввода символов. Ввод может быть перенаправлен. Номер функции в AL, кроме 01H, 06H, 07H, 08H или 0AH, очищает входной буфер и возвращает управление вызывающей программе.
INT 21H (0x21)
Function 0DH (0x0D or 13) -> Disk reset
Call with: AH = 0DH
Returns:Nothing
Комментарии:
Эта функция очищает все файловые буферы. Функция не обновляет каталог диска для любых файлов, которые все еще открыты.
INT 21H (0x21)
Function 0EH (0x0E or 14) -> Select disk
Call with: AH = 0EH
DL = drive code (0 = A, 1= B, etc.)
Returns: AL = number of logical drives in system
Комментарии:
Выбирает указанный диск в качестве текущего или по умолчанию, диск и возвращает общее количество логических дисков в системе.
Приложения должны ограничиваться буквами дисков от A до Z (0 = A, 1 = B и т. д.). Логические диски означают общее количество блочных устройств, таких как гибкие диски, жесткие диски и т. д. Как правило, один физический жесткий диск разделен на два или более логических диска.
INT 21H (0x21)
Function 0FH (0x0F or 15) -> Open file
Call with: AH = 0FH
S: DX = segment: offset of file control block
Returns: If function successful and file found
AL = 00H
And FCB filled in by MS-DOS is as follows:
Drive field (offset 00H) =1 for drive A, 2 for drive B, etc. Current block field (offset 0CH) = 00H
Record size field (offset 0EH) = 0080H
Size field (offset 10H) = file size from directory
Data field (offset 14H) = date stamp from directory
Time field (offset 16H) = time stamp from directory
If function unsuccessful and file not found
AL = 0FFH
Комментарии:
Открывает файл и делает его доступным для последующей операции чтения/записи. Если программа собирается использовать размер записи, отличный от 128 байт, она должна установить поле размера записи со смещением FCB 0EH после успешного открытия файла и до любой другой операции с диском.
INT 21H (0x21)
Function 10H (0x10 or 16) -> Close file
Call with: AH = 10H
DS: DX = segment: offset of file control block
Returns: If function successful (directory update successful)
AL = 00H
If function unsuccessful (file not found in directory)
AL = FFH
Комментарии:
Используется для закрытия файла. Он закрывает файл, сбрасывает на диск все внутренние дисковые буферы MS-DOS, связанные с файлом, и обновляет каталог диска, если файл был изменен или расширен.
INT 21H (0x21)
Function 11H (0x11 or 17) -> Find first file
Call with: AH = 11H
DS: DX = segment: offset of file control block
Returns: If function successful and matching file found
AL = 00H
А буфер по адресу текущей области передачи диска (DTA) заполняется как неоткрытый обычный FCB или расширенный FCB, в зависимости от того, какой тип FCB был введен для работы.
If function unsuccessful (no matching filename found)
AL = FFH
Комментарии:
Он ищет в текущем каталоге на указанном диске совпадающее имя файла. Вы можете использовать подстановочные знаки (? и *). Эта функция возвращает первое совпадающее имя файла.
INT 21H (0x21)
Function 12H (0x12 or 18) -> Find next file
Call with: AH = 12H
DS: DX = segment: offset of file control block
Returns: If function successful and matching filename found
AL = 00H
And buffer at current disk transfer area (DTA) address set up as an unopened normal FCB or extended FCB, depending on which type of FCB was originally input to INT21H function 11H
If function unsuccessful and matching filenames not found
AL = FFH
Комментарии:
Это компаньон предыдущей функции. Если функция INT 21H 11H выполнена успешно, она возвращает следующее совпадающее имя файла, если таковое имеется. Эта функция предполагает, что FCB, используемый в качестве входных данных, был должным образом инициализирован предыдущим вызовом функции INT 21H 11H и возможными последующими вызовами функции INT 21H 12H, и что искомое имя файла или расширение содержало по крайней мере один символ подстановки.
INT 21H (0x21)
Function 13H (0x13 or 19) -> Delete file
Call with: AH = 13H
DS: DX = segment: offset of file control block
Returns: If function is successful and file or files deleted
AL = 00H
If function is unsuccessful and no matching files were found or at least one matching file was read-only,
AL = FFH
Комментарии:
Удаляет все соответствующие файлы из текущего каталога на диске по умолчанию или на указанном диске. Вы также можете использовать подстановочные знаки (? и *).
INT 21H (0x21)
Function 14H (0x14 or 20) -> Sequential read
Call with: AH = 14H
DS: DX = segment: offset of previously opened
file control block
Returns: AL = 00H if read successful
01H if end of file
02H if segment wrap
03H if partial record read at end of
file
Комментарии:
Эта функция считывает следующий последовательный блок данных из файла, затем соответствующим образом увеличивает указатель файла. Количество байтов данных для чтения определяется полем размера записи (смещение 0EH) блока управления файлом (FCB).
Запись считывается в память по адресу текущей дисковой области передачи (DTA), указанному последним вызовом функции INT 21H 1AH. Если размер записи и расположение буфера таковы, что может произойти переполнение сегмента или зацикливание, функция завершается ошибкой с кодом возврата 02H.
INT 21H (0x21)
Function 15H (0x15 or 21) --> Sequential write
Call with: AH = 15H
DS: DX = segment: offset of previously opened file control block
Returns: AL = 00H, if write successful
01H, if disk is file
02H, if segment wrap
Комментарии:
Эта функция записывает следующий последовательный блок данных в файл, затем соответствующим образом увеличивает указатель файла. Количество записываемых байтов определяется полем размера записи (смещение 0EH) блока управления файлом (FCB).
INT 21H (0x21)
Function 16H (0x16 or 22) --> Create file
Call with: AH = 16H
DS: DX = segment: offset of unopened file control block
Returns: If function is successful and file was created or truncated
AL = 00H
And FCB filled in by MS-DOS as follows:
Drive field (offset 00H) = 1 for drive A, 2 for drive B, etc.
Current block field (offset0CH) = 00H
Record size field (offset 0EH) = 0080H
Size field (offset 10H) = file size from directory
Date field (offset 14H) = date stamp from directory
Time field (offset 16H = time stamp from directory
If function unsuccessful (directory full)
AL = FFH
Комментарии:
Эта функция создает новую запись каталога в текущем каталоге или усекает любой существующий файл с таким же именем до нулевой длины. Также открывает файл для последующих операций чтения/записи. Эту функцию следует использовать с осторожностью, поскольку существующий файл с указанным именем усекается до нулевой длины и все данные в этом файле безвозвратно теряются.
INT 21H (0x21)
Function 17H (0x17 or 23) --> Rename file
Call with: AH = 17H
DS: DX = segment: offset of special file control block
Returns: If function is successful and one or more files renamed
AL = 00H
If function is unsuccessful and no matching files, or new filename matched an existing file
AL = FFH
Комментарии:
Эта функция изменяет имена всех соответствующих файлов в текущем каталоге на диске на указанном диске.
Вы также можете использовать подстановочные знаки. Специальный блок управления файлами имеет код диска, имя файла и расширение в обычном положении (байты от 0 до 0BH) и второе имя файла, начинающееся через 6 байтов после первого (смещение 11H).
INT 21H
Function 18H (0x18 or 24) --> Reserved
INT 21H (0x21)
Function 19H (0x19 or 25) --> Get current disk
Call with: AH = 19H
Returns: AL = drive code (0 for A drive, 1 for B drive etc.)
Комментарии:
Эта функция возвращает код текущего диска или диска по умолчанию.
INT 21H (0x21)
Function 1AH (0x1A or 26) --> Set DTA address
Call with: AH = 1AH
DS: DX = segment: offset of disk transfer area.
Returns: Nothing
Комментарии:
Эта функция задает адрес области передачи диска (DTA), которая будет использоваться для последующих вызовов функций, связанных с FCB.
INT 21H (0x21)
Function 1BH (0x1B or 27) --> Get default drive
data
Call with: AH = 1BH
Returns: If function successful
AL = sectors per cluster
DS: DX = segment offset of media ID byte
CX = size of physical sector in bytes
DX = number of clusters for default drive
If function unsuccessful (invalid drive or critical error)
AL = FFH
Комментарии:
Эта функция получает выбранную информацию о диске по умолчанию и указатель на байт идентификации носителя из его таблицы размещения файлов.
Байт идентификатора носителя имеет следующие значения:
Media Descriptor ID |
Medium |
0F0H |
3.5-inch Floppy Disk, double-sided, 18 sectors (or other) |
0F8H |
fixed disk |
0F9H |
5.25-inch Floppy Disk, double-sided, 15 sectors |
0F9H |
3.5-inch Floppy Disk, double-sided, 9 sectors |
0FCH |
5.25-inch Floppy Disk, single-sided, 9 sectors |
0FDH |
5.25-inch Floppy Disk, double-sided, 9 sectors |
0FDH |
8-inch Floppy Disk, single sided, single density |
0FEH |
5.25-inch Floppy Disk, single-sided, 8 sectors |
0FEH |
8-inch Floppy Disk, Single Sided, Single Density |
0FEH |
8-inch Floppy Disk, Double Sided, Double Density |
0FFH |
5.25-inch Floppy Disk, double-sided, 8 sectors |
INT 21H (0x21)
Function 1CH (0x1C or 28) --> Get drive data
Call with: AH = 1CH
DL = Drive Code
Returns: If function is successful
AL = sectors per cluster
DS: BX = segment: offset of media ID byte
CX = size of physical sector in bytes
DX = number of clusters for default or specified drive
If function is unsuccessful and invalid drive or critical error
AL = FFH
Комментарии:
Эта функция получает информацию о размещении указанного диска и указатель на байт идентификации носителя из его таблицы размещения файлов. Обратитесь к таблице байтов идентификатора дескриптора носителя, приведенной в INT 21H, функция 1BH, для получения информации об идентификаторе носителя.
INT 21H (0x21)
Function 1DH (0x1D or 29) --> Reserved
INT 21H (0x21)
Function 1EH (0x1E or 30) --> Reserved
INT 21H (0x21)
Function 1FH (0x1F or 31) --> Reserved
INT 21H (0x21)
Function 20H (0x20 or 32) --> Reserved
INT 21H (0x21)
Function 21H (0x21 or 33) --> Random read
Call with: AH = 21H
DS: DX = segment: offset of previously opened
file control block
Returns: AL = 00H if read successful
01H if end of file
02H if segment wrap, read canceled
03H if partial record read at end of
file
Комментарии:
Эта функция считывает выбранную запись из файла в память. Запись считывается в память по текущему адресу области передачи диска, указанному последним вызовом функции INT 21H 1AH.
INT 21H (0x21)
Function 22H (0x22 or 34) --> Random write
Call with: AH = 22H
DS: DX = segment: offset of previously opened
file control block
Returns: AL = 00H if write successful
01H if disk full
02H if segment wrap, write canceled
Комментарии:
Эта функция записывает данные из памяти в выбранную запись в файле.
INT 21H (0x21)
Function 23H (0x23 or 35) --> Get file size
Call with: AH = 23H
DS: DX = segment: offset of unopened file
control block
Returns: If function is successful and matching filename found
AL = 00H
And FCB relative-record field (offset 21H) set to the number of records in the file, rounded up if necessary to the next complete record
If function is unsuccessful and no matching file found
AL = FFH
Комментарии:
Эта функция ищет соответствующий файл в текущем каталоге; если он найден, обновляет FCB размером файла с точки зрения количества записей. Для этой функции нет размера записи по умолчанию, поэтому перед вызовом этой функции необходимо указать соответствующее значение в поле размера записи FCB (смещение 0EH).
INT 21H (0x21)
Function 24H (0x24 or 36) --> Set relative record
number
Call with: AH = 24H
DS: DX = segment: offset of previously opened
file control block
Returns: AL is destroyed (other register not affected)
FCB relative-record field (offset 21H) updated
Комментарии:
Эта функция устанавливает поле номера относительной записи блока управления файлом (FCB) в соответствие с текущей позицией файла, записанной в открытом FCB.
INT 21H (0x21)
Function 25H (0x25 or 37) --> Set interrupt vector
Call with: AH = 25H
AL = interrupt number
DS: DX = segment: offset of interrupt handling
routine
Returns: Nothing
Комментарии:
Эта функция инициализирует вектор прерывания ЦП, чтобы он указывал на процедуру обработки прерывания. Его следует использовать вместо прямого редактирования таблицы векторов прерываний в хорошо работающих приложениях.
INT 21H (0x21)
Function 26H (0x26 or 38) --> Create new Program
Segment Prefix (PSP)
Call with: AH = 26H
DX = segment: of new program segment
prefix (PSP)
Returns: Nothing
Комментарии:
Эта функция копирует префикс сегмента программы (PSP) выполняемой в данный момент программы в указанный адрес сегмента в свободной памяти, а затем обновляет новый PSP, чтобы сделать его пригодным для использования другой программой.
INT 21H (0x21)
Function 27H (0x27 or 39) --> Random block read
Call with: AH = 27H
CX = number of records to read
DS: DX = segment: offset of previously opened
file control block
Returns: AL = 00H if all requested records read
01H if end of file
02H if segment wrap
03H if partial record read at end of
file
CX = actual number of records read
Комментарии:
Эта функция считывает одну или несколько последовательных записей из файла в память, начиная с указанного места в файле. Если размер и расположение буфера таковы, что может произойти переполнение сегмента или циклический цикл, функция завершается ошибкой с кодом возврата 02H, а если неполная запись считывается в конце файла, оставшаяся часть записи дополняется нулями.
INT 21H (0x21)
Function 28H (0x28 or 40) --> Random block write
Call with: AH = 28H
CX = number of records to write
DS: DX = segment: offset of previously opened
file control block
Returns: AL = 00H if all requested records written
01H if disk full
02H if segment wrap
CX = actual number of records written
Комментарии:
Эта функция записывает одну или несколько последовательных записей из памяти в файл, начиная с указанного места в файле. Если размер и расположение буфера таковы, что может произойти переполнение сегмента или зацикливание, функция завершается ошибкой с кодом возврата 02H.
INT 21H (0x21)
Function 29H (0x29 or 41) --> Parse filename
Call with: AH = 29H
AL = flags to control parsing
Bit 0 = 1, if leading separators will be
scanned off (ignored).
= 0, if leading separators will not be
scanned off
Bit 1 = 1, if drive ID byte in FCB will be
modified only if a drive was
specified in the string being parsed.
= 0, if the drive ID byte in FCB will be
modified regardless, if no drive
specifier is present in the parsed string, FCB drive code field is set to 0 (default)
Bit 2 = 1, if filename field in FCB will be
modified only if a filename is
specified in the string being parsed.
= 0, if filename field in FCB will be modified regardless, if no filename is presenting the parsed string, FCB filename is set to ASCIIZ blanks.
Bit 3 = 1, if extension field in FCB will be
modified, only if an Extension is
specified in the string being parsed.
= 0, if extension field in FCB will be
modified regardless, if no extension
is present in the parsed string, FCB
extension is set to ASCIIZ blanks
DS: SI = segment: offset of string
ES: DI = segment: offset of file control block
Returns: AL = 00H, if no wildcard characters
Encountered 01H, if parsed string
contained wildcard characters FFH,
if drive specifier invalid
DS: SI = segment: offset of first character
after parsed filename
ES: DI = segment: offset of formatted
unopened file control block
Комментарии:
Эта функция разбирает текстовую строку на различные поля блока управления файлами (FCB).
Эта функция рассматривает символы (: . ; , = + пробел табуляции ) как символы-разделители и рассматривает все управляющие символы и символы (: . ; , = + пробел табуляции < > | / “ [ ]) как символы завершения .
INT 21H (0x21)
Function 2AH (0x2A or 42) --> Get day and date
Call with: AH = 2AH
Returns: CX = year (1980 through 2099)
DH = month (1 through 12)
DL = day (1 through 31)
AL = day of the week (0 = Sunday,
1= Monday, etc.)
Комментарии:
Эта функция получает системный день месяца, день недели, месяц и год.
INT 21H (0x21)
Function 2BH (0x2B or 43) --> Set date
Call with: AH = 2BH
CX = year (1980 through 2099)
DH = month (1 through 12)
DL = day (1 through 31)
Returns: AL = 00H if date set successfully
FFH if date not valid (ignored)
Комментарии:
Эта функция инициализирует драйвер системных часов на определенную дату, но системное время остается неизменным.
INT 21H (0x21)
Function 2CH (0x2C or 44) --> Get time
Call with: AH = 2CH
Returns: CH = hours (0 through 23)
CL = minutes (0 through 59)
DH = seconds (0 through 59)
DL = hundredths of seconds (0 through 99)
Комментарии:
Это используется для получения времени дня из системного драйвера часов реального времени, преобразованного в часы, минуты, секунды и сотые доли секунды.
INT 21H (0x21)
Function 2DH (0x2D or 45) --> Set time
Call with: AH = 2DH
CH = hours (0 through 23)
CL = minutes (0 through 59)
DH = seconds (0 through 59)
DL = hundredths of seconds (0 through 99)
Returns: AL = 00H, if time set successfully
FFH, if time not valid (ignored)
Комментарии:
Эта функция инициализирует системные часы реального времени на указанные часы, минуты, секунды и сотые доли секунды. Системная дата не изменяется.
INT 21H (0x21)
Function 2EH (0x2E or 46) --> Set verify flag
Call with: AH = 2EH
AL = 00H, if turning off verify flag
01H, if turning on verify flag
DL = 00H
Returns: Nothing
Комментарии:
Эта функция выключает или включает флаг операционной системы для автоматической проверки данных чтение-после-записи. По умолчанию флаг проверки отключен, так как проверка чтения после записи замедляет работу диска.
INT 21H (0x21)
Function 2FH (0x2F or 47) --> Get DTA address
Call with: AH = 2FH
Returns:ES: BX = segment: offset of disk transfer area
Комментарии:
Эта функция получает текущий адрес области передачи диска (DTA) для операций чтения/записи файла FCB.
INT 21H (0x21)
Function 30H (0x30 or 48) --> Get MS-DOS
version number
Call with: AH = 30H
AL = 00H
Returns: AL = major version number (MS-DOS 3.10=3, etc.)
AH = minor version number (MS-DOS 3.10= 0AH, etc.)
BH = Original Equipment Manufacturer’s
(OEM’s) serial number (OEM-dependent-usually 00H for IBM’s
PC-DOS, 0FFH or other values for MS-DOS)
BL: CX = 24-bit user serial number (optional, OEM-dependent)
Комментарии:
Возвращает номер версии операционной системы хоста MS-DOS.
INT 21H (0x21)
Function 31H (0x31 or 49) --> Terminate and Stay
Resident (TSR)
Call with: AH = 31H
AL = return code
DX = amount of memory in paragraphs, to reserve
Returns Nothing
Комментарии:
Эта функция завершает выполнение текущей программы, передавая код возврата родительскому процессу, но резервирует часть или всю память программы, чтобы она была перекрыта следующей временной программой, которая будет загружена. Эту функцию следует использовать вместо INT 27H, поскольку она поддерживает CS для содержания сегмента префикса сегмента программы.
INT 21H (0x21)
Function 32H (0x32 or 50) --> Reserved
INT 21H (0x21)
Function 33H (0x33 or 51) --> Get or set break flag, get boot Drive
Call with: If getting break flag
AH = 33H
AL = 00H
If setting break flag
AH = 33H
AL = 01H
DL = 00H if turning break flag OFF
01H if turning break flag ON
If getting boot drive
AH = 33H
AL = 05H
Returns: If called with AL = 00H or 01H
DL = 00H break flag is OFF
01H break flag is ON
If called with AL = 05H
DL = boot drive (1 = A, 2 = B, etc.)
Комментарии:
Эта функция получает или изменяет состояние флага прерывания операционной системы, который влияет на проверку Ctrl-C во время вызовов функций.
INT 21H (0x21)
Function 34H (0x34 or 52) --> Reserved
INT 21H (0x21)
Function 35H (0x35 or 53) --> Get interrupt vector
Call with: AH = 35H
AL = interrupt number
Returns: ES: BX = segment: offset of interrupt handler
Комментарии:
Эта функция получает адрес текущей процедуры обработки прерывания для указанного машинного прерывания.
INT 21H (0x21)
Function 36H (0x36 or 54) --> Get drive allocation
Information
Call with: AH = 36H
DL = drive code (0 default, 1 = A, etc.)
Returns: If function successful
AX = sector per cluster
BX = number of available cluster
CX = bytes per sector
DX = cluster per drive
If function unsuccessful (drive invalid)
AX = FFFFH
Комментарии:
Эта функция получает выбранную информацию о диске.
Эта функция очень важна при программировании восстановления данных и устранения неполадок диска, поскольку позволяет рассчитать емкость диска, оставшееся свободное место и многие другие важные параметры.
INT 21H (0x21)
Function 37H (0x37 or 55) --> Reserved
INT 21H (0x21)
Function 38H (0x38 or 56) --> Get or set country
information
Call with: If getting country information
AH = 38H
AL = 0, to get current country information
1-FEH, to get information for
countries with code <255
FFH, to get information for countries
with code >=255
BX = country code, if AL = FFH
DS:DX = segment: offset of buffer for returned information
If setting current country code
AH = 38H
AL = 1-FEH, country code for countries with code <255
FFH, for countries with code >=255
BX = country code, if AL = 0FFH
DX = FFFFH
Returns:
If function is successful
Carry flag = clear
And, if getting internationalization information
BX = country code
DS: DX = segment: offset of buffer holding internationalization Information.
If function is unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция позволяет получить международную информацию для текущей или указанной страны или установить текущий код страны.
INT 21H (0x21)
Function 39H (0x39 or 57) --> Create directory
Call with: AH = 39H
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция создает каталог, используя указанный диск и путь.
ASCIIZ известен как последовательность символов ASCII, заканчивающаяся нулем или нулем, байтом. |
INT 21H (0x21)
Function 3AH (0x3A or 58) --> Delete directory
Call with: AH = 3AH
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция удаляет каталог, используя указанный диск и путь. Если какой-либо элемент пути не существует, или каталог не пуст, или доступ запрещен, или указанный каталог также является текущим каталогом, функция удаления каталога завершается ошибкой.
INT 21H (0x21)
Function 3BH (0x3B or 59) --> Set current
directory
Call with: AH = 3BH
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция устанавливает текущий каталог или каталог по умолчанию, используя указанный диск и путь. Если указанный путь или любой элемент пути не существует, функция завершается ошибкой.
INT 21H (0x21)
Function 3CH (0x3C or 60) --> Create file
Call with: AH = 3CH
CX = file attribute, where attribute
significance bits may be Combined.
Значение битов указано в следующей таблице:
Bit(s) |
Significance (if set) |
0 |
Read-only |
1 |
Hidden |
2 |
System |
3 |
Volume label |
4 |
Reserved (0) |
5 |
Archive |
6 – 15 |
Reserved (0) |
DS: DX = segment: offset of ASCIIZ
pathname
Returns: If function successful
Carry flag = clear
AX = handle
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Если указано имя пути ASCIIZ, эта функция создает новый файл в указанном каталоге или каталоге по умолчанию на указанном диске или диске по умолчанию. Если указанный файл уже существует, он усекается до нулевой длины. В любом случае файл открывается и возвращается дескриптор, который может использоваться программой для последующего доступа к файлу.
Если какой-либо элемент пути не существует, или файл создается в корневом каталоге, а корневой каталог заполнен, или доступ запрещен, или файл с атрибутом только для чтения уже находится в указанном каталоге, функция создания файла завершается ошибкой. .
INT 21H (0x21)
Function 3DH (0x3D or 61) --> Open file
Call with: AH = 3DH
AL = access mode
Значение битов режима доступа указано в следующей таблице:
Bits |
Significance |
0 – 2 |
Access Mode
000 = read access
001 = write access
010 = read/write access |
3 |
Reserved (0) |
4 – 6 |
Sharing Mode
000 = compatibility mode
001 = deny all
010 = deny write
011 = deny read
100 = deny none |
7 |
Inheritance flag
0 = child process inherits handle
1 = child does not inherit handle |
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function successful
Carry flag = clear
AX = handle
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Если указан путь ASCIIZ, эта функция открывает указанный файл в указанном каталоге или каталоге по умолчанию на указанном диске или диске по умолчанию. Возвращается дескриптор, который может использоваться программой для последующего доступа к файлу.
INT 21H (0x21)
Function 3EH (0x3E or 62) --> Close file
Call with: AH = 3EH
BX = handle
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция сбрасывает все внутренние буферы, связанные с файлом, на диск, закрывает файл и освобождает для повторного использования дескриптор ранее открытого или созданного с успехом данного дескриптора. Если файл был изменен, отметка времени и даты, а также размер файла обновляются в записи каталога файла.
INT 21H (0x21)
Function 3FH (0x3F or 63) --> Read file or device
Call with: AH = 3FH
BX = handle
CX = number of bytes to read
DS: DX = segment: offset of buffer
Returns: If function successful
Carry flag = clear
AX = byte transferred
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция передает данные в текущей позиции указателя файла из файла в буфер, а затем обновляет позицию указателя файла для данного допустимого дескриптора файла из предыдущей операции открытия или создания, адрес буфера и длину в байтах.
INT 21H (0x21)
Function 40H (0x40 or 64) --> Write file or device
Call with: AH = 40H
BX = handle
CX = number of bytes to write
DS: DX = segment: offset of buffer
Returns: If function successful
Carry flag = clear
AX = byte transferred
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция передает данные из буфера в файл, а затем обновляет позицию указателя файла для данного допустимого дескриптора файла из предыдущей операции открытия или создания, адрес буфера и длину в байтах. Если функция вызывается с CX = 0, файл усекается или расширяется до текущей позиции указателя файла.
INT 21H (0x21)
Function 41H (0x41 or 65) --> Delete file
Call with: AH = 41H
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция удаляет файл со стандартного или указанного диска и каталога. Функция удаляет файл, заменяя первый символ его имени в корневом каталоге символом E5H (0xE5) и делая кластеры файла доступными для новых данных в таблице размещения файлов. До этого фактические данные, хранящиеся в этих кластерах, не перезаписываются.
INT 21H (0x21)
Function 42H (0x42 or 66) --> Set file pointer
Call with: AH = 42H
AL = method code
00H absolute offset from start of file
01H signed offset from current file
pointer
02H signed offset from end of file
BX = handle
CX = most significant half of offset
DX = least significant half of offset
Returns: if function is successful
Carry flag = clear
DX = most significant half of resulting file
pointer
AX = least significant half of resulting file
pointer
If function is unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция устанавливает положение указателя файла относительно начала файла, конца файла или текущей позиции файла.
INT 21H (0x21)
Function 43H (0x43 or 67) --> Get or set file
attributes
Call with: AH = 43H
AL = 00H to get attributes
01H to set attributes
CX = file attribute, if AL=01H. Bits can be combined
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function successful
Carry flag = clear
CX = file attribute
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция получает или изменяет атрибуты файла (только для чтения, скрытый, системный или архивный) или каталога. Значение битов для различных атрибутов см. в приведенной выше таблице значений битов.
INT 21H (0x21)
Function 44H (0x44 or 68) --> Input/Output
Control (I/O Ctrl)
Эта функция обеспечивает прямой канал связи между прикладной программой и драйвером устройства. Это позволяет программе получать аппаратно-зависимую информацию и запрашивать операции, которые не поддерживаются другими вызовами функций MS-DOS.
Подфункции управления вводом и выводом приведены в следующей таблице:
Sub function |
Operation Name |
00H |
Get Device Information |
01H |
Set Device Information |
02H |
Receive Control Data from Character Device Driver |
03H |
Send Control Data to Character Device Driver |
04H |
Receive Control Data from Block Device Driver |
05H |
Send Control Data to Block Device Driver |
06H |
Check Input Status |
07H |
Check Output Status |
08H |
Check If Block Device Is Removable |
09H |
Check If Block Device Is Remote |
0AH (10) |
Check If Handle Is Remote |
0BH (11) |
Change Sharing Retry Count |
0CH (12)
|
Generic I/O Control for Character Devices
Value |
Description |
CL = 45H |
Set Iteration Count |
CL = 4AH |
Select Code Page |
CL = 4CH |
Start Code Page Preparation |
CL = 4DH |
End Code Page Preparation |
CL = 5FH |
Set Display Information |
CL = 65H |
Get Iteration Count |
CL = 6AH |
Query Selected Code Page |
CL = 6BH |
Query Prepare List |
CL = 7FH |
Get Display Information |
|
0DH (13)
|
Generic I/O Control for Block Devices
Value |
Description |
CL = 40H |
Set Device Parameters |
CL = 41H |
Write Track |
CL = 42H |
Format and Verify Track |
CL = 47H |
Set Access Flag |
CL = 60H |
Get Device Parameters |
CL = 61H |
Read Track |
CL = 62H |
Verify Track |
CL = 67H |
Get Access Flag |
|
0EH (14) |
Get Logical Drive Map |
0FH (15) |
Set Logical Drive Map |
INT 21H (0x21)
Function 44H (0x44 or 68), sub function 00H (0x00)
I/O Ctrl --> get device information
Call with: AH = 44H
AL = 00H
BX = handle
Returns: If function successful
Carry flag = clear
DX = device information word
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта подфункция возвращает слово информации об устройстве для файла или устройства, связанного с указанным дескриптором.
INT 21H (0x21)
Function 44H (0x44 or 68), sub function 01H (0x01)
I/O Ctrl --> set device information
Call with: AH = 44H
AL = 01H
BX = handle
DX = device information word
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта подфункция функции 44H INT 21H устанавливает определенные флаги для дескриптора, связанного с символьным устройством. Эту подфункцию нельзя использовать для дескриптора, связанного с файлом.
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 02H (0x02)
I/O Ctrl --> read control data character device
driver
Call with: AH = 44H
AL = 02H
BX = handle
CX = number of bytes to read
DS: DX = segment: offset of buffer
Returns: If function is successful
Carry flag = clear
AX = bytes read
And buffer contains control data from driver
If function is unsuccessful
Carry flag = set
AX = error code
Комментарии:
Он считывает управляющие данные из драйвера символьного устройства. Длина и содержание данных указываются для каждого драйвера устройства и не соответствуют какому-либо стандартному формату. Эта функция не обязательно приводит к какому-либо вводу с физического устройства.
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 03H (0x03)
I/O Ctrl --> write control data character-device
driver
Call with: AH = 44H
AL = 03H
BX = handle
CX = number of bytes to write
DS: DX = segment: offset of data
Returns: If function successful
Carry flag = clear
AX = bytes transferred
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта подфункция передает управляющие данные из приложения в драйвер символьного устройства. Длина и содержание данных специфичны для каждого драйвера устройства и не соответствуют какому-либо стандартному формату. Эта функция не обязательно приводит к любому выводу на физическое устройство.
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 04H (0x04)
I/O Ctrl --> Read control data block-device driver
Call with: AH = 44H
AL = 04H
BL = device code (0= default, 1=A, 2=B, etc.)
CX = number of bytes to read
DS: DX = segment: offset of buffer
Returns: If function successful
Carry flag = clear
AX = bytes transferred
And buffer contains control data from device driver
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта подфункция передает управляющие данные из драйвера блочного устройства непосредственно в буфер прикладной программы. Длина и содержание данных специфичны для каждого драйвера устройства и не соответствуют какому-либо стандартному формату. Эта функция не обязательно приводит к вводу с физического устройства.
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 05H (0x05)
I/O Ctrl --> write control data block-device driver
Call with: AH = 44H
AL = 05H
BL = device code (0= default, 1=A, 2=B, etc.)
CX = number of bytes to write
DS: DX = segment: offset of data
Returns: If function successful
Carry flag = clear
AX = bytes transferred
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта подфункция передает управляющие данные из прикладной программы непосредственно в драйвер блочного устройства. Длина и содержание управляющих данных специфичны для каждого драйвера устройства и не соответствуют какому-либо стандартному формату. Эта функция не обязательно приводит к какому-либо выводу на физическое устройство.
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 06H (0x06)
I/O Ctrl --> check input status
Call with: AH = 44H
AL = 06H
BX = handle
Returns: If function successful
Carry flag = clear
And for a device:
AL = 00H, if device not ready
FFH, if device ready
For a file:
AL = 00H, if file pointer at EOF
FFH, if file pointer not at EOF
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Он возвращает код, указывающий, готовы ли устройство или файлы, связанные с дескриптором, для ввода.
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 07H (0x07)
I/O Ctrl --> check output status
Call with: AH = 44H
AL = 07H
BX = handle
Returns: If function successful
Carry flag = clear
And for a device:
AL = 00H, if device not ready
FFH, if device ready
For a file:
AL = FFH
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Он возвращает код, указывающий, готово ли устройство, связанное с дескриптором, для вывода.
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 08H (0x08)
I/O Ctrl --> check if block device is removable
Call with: AH = 44H
AL = 08H
BL = drive number (0 = default, 1=A, 2=B, etc.)
Returns: If function successful
Carry flag = clear
AL = 00H, if medium is removable
01H, if medium is not removable
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта подфункция проверяет, содержит ли указанное блочное устройство съемный носитель данных, например дискету. Если файл не найден должным образом на определенном диске, программа может использовать эту подфункцию, чтобы определить, следует ли пользователю предлагать вставить другой диск.
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 09H (0x09)
I/O Ctrl --> check if block device is remote
Call with: AH = 44H
AL = 09H
BL = drive number (0 = default, 1=A, 2=B, etc.)
Returns: If function successful
Carry flag = clear
DX = device attribute word
bit 12 = 0, if drive is local
= 1, if drive is remote
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта подфункция проверяет, является ли указанное блочное устройство локальным (подключенным к компьютеру, на котором запущена программа) или удаленным (перенаправленным на сетевой сервер).
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 0AH (0x0A or 10) I/O Ctrl --> check if handle is remote
Call with: AH = 44H
AL = 0AH
BX = handle
Returns: If function successful
Carry flag = clear
DX = attribute word for file or device
bit 15 = 0 if local
1 if remote
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Он проверяет, относится ли указанный дескриптор к файлу или устройству, которое является локальным (расположенным на ПК, на котором запущена программа) или удаленным (расположенным на сетевом сервере).
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 0BH (0x0B or 11) I/O Ctrl --> change sharing retry count
Call with: AH = 44H
AL = 0BH
CX = delays per retry (default = 1)
DX = number of retries (default = 3)
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта подфункция устанавливает, сколько раз MS-DOS повторяет операцию с диском после сбоя, вызванного нарушением общего доступа к файлам, прежде чем она вернет ошибку запрашивающему процессу. Эта подфункция недоступна, если не загружен модуль обмена файлами.
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 0CH (0x0C or 12) I/O Ctrl generic I/O control for
character devices
Call with: AH = 44H
AL = 0CH
BX = handle
CH =category (major) code:
00H = unknown
01H = COM1, COM2, COM3,OR COM4
03H = CON (keyboard and display)
05H = LPT1, LPT2, OR LPT3
CL = function (minor) code:
45H = Set Iteration Count
4AH = Select Code Page
4CH = Start Code Page Preparation
4DH = End Code Page Preparation
5FH = Set Display Information
65H = Get Iteration Count
6AH = Query Selected Code Page
6BH = Query Prepare List
7FH = Get Display Information
DS: DX = segment: offset of parameter block
Returns: If function successful
Carry flag = clear
And if called with CL = 65H, 6AH, 6BH or 7FH
DS: DX = segment: offset of parameter block
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Он обеспечивает механизм общего назначения для связи между прикладными программами и драйверами символьных устройств.
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 0DH (0x0D or 13) I/O Ctrl --> generic I/O control for block
devices
Call with: AH = 44H
AL = 0DH
BL = drive code (0 =default, 1=A, 2=B, etc.)
CH = category (major) code:
08H = disk drive
CL = function (minor) code:
40H = Set Drive Parameters
41H = Write Track
42H = Format and Verify Track
47H = Set Access Flag
60H = Get Device Parameters
61H = Read Track
62H = Verify track
67H = Get Access Flag
DS: DX = segment: offset of parameter block
Returns: If function successful
Carry flag = clear
And if called with CL = 60H or 61H
DS: DX = segment: offset of parameter block
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта подфункция обеспечивает универсальный механизм связи между прикладными программами и драйверами блочных устройств. Позволяет программе проверять или изменять параметры устройства для логического диска, а также считывать, записывать, форматировать и проверять дорожки диска аппаратно-независимым способом.
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 0EH (0x0E or 14) I/O Ctrl -->> get logical drive map
Call with: AH = 44H
AL = 0EH
BL = drive code (0 = default, 1=A, 2=B, etc.)
Returns: If function successful
Carry flag = clear
AL = mapping code
00H, if only one logical drive code
assigned to the block device
01H-1AH logical drive code (1=A,
2=B, etc.) mapped to the block device
If function unsuccessful
Carry flag = set
AX =error code
Комментарии:
Он возвращает код логического диска, который последний раз использовался для доступа к указанному блочному диску.
INT 21H (0x21)
Function 44H (0x44 or 68), Sub function 0FH (0x0F or 15) I/O Ctrl --> set logical drive map
Call with: AH = 44H
AL = 0FH
BL = drive code (0 = default, 1=A, 2=B, etc.)
Returns: If function successful
Carry flag = clear
AL = mapping code
00H, if only one logical drive code
assigned to the block device
01H-1AH, logical drive code (1=A,
2=B, etc.) mapped to the
block device
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта подфункция устанавливает следующий код логического диска, который будет использоваться для ссылки на блочное устройство.
INT 21H (0x21)
Function 45H (0x45 or 69) --> Duplicate handle
Call with: AH = 45H
BX = handle to be duplicated
Returns: If function successful
Carry flag = clear
AX = new handle
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция возвращает новый дескриптор, который ссылается на то же устройство или файл в той же позиции для данного дескриптора для открытого в данный момент устройства или файла.
INT 21H (0x21)
Function 46H (0x46 or 70) --> Redirect handle
Call with: AH = 46H
BX = handle for file or device
CX = handle to be redirected
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Если задано два дескриптора, эта функция заставляет второй дескриптор ссылаться на то же устройство или файл в том же месте, что и первый дескриптор. Затем говорят, что второй дескриптор перенаправлен.
INT 21H (0x21)
Function 47H (0x47 or 71) --> Get current
directory
Call with: AH = 47H
DL = drive code (0 =default, 1=A,
2=B, etc.)
DS: SI = segment: offset of 64-byte buffer
Returns: If function is successful
Carry flag = clear
And buffer is filled in with full pathname from root of current directory.
If function is unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция получает строку ASCIIZ, описывающую путь от корня до текущего каталога и имя этого каталога.
INT 21H (0x21)
Function 48H (0x48 or 72) --> Allocate memory
block
Call with: AH = 48H
BX = number of paragraphs of memory
needed
Returns: If function successful
Carry flag = clear
Ax = base segment address of allocated
block
If function unsuccessful
Carry flag = set
AX = error code
BX = size of largest available block
(paragraphs)
Комментарии:
Он выделяет блок памяти и возвращает указатель на начало выделенной области.
INT 21H (0x21)
Function 49H (0x49 or 73) --> Release memory
block
Call with: AH = 49H
ES = segment of block to be released
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция используется для освобождения блока памяти и делает его доступным для использования другими программами. Функция завершится ошибкой или может вызвать непредсказуемые системные ошибки, если программа освобождает блок памяти, который ей не принадлежит, или адрес сегмента, переданный в регистре ES, не является допустимым базовым адресом для существующего блока памяти.
INT 21H (0x21)
Function 4AH (0x4A or 74) --> Resize memory
block
Call with: AH = 4AH
BX = desired new block size in paragraphs
ES = segment of block to be modified
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
BX = maximum block size available
(paragraphs)
Комментарии:
Эта функция динамически сжимает или расширяет блок памяти в соответствии с потребностями прикладной программы.
INT 21H (0x21)
Function 4BH (0x4B or 75) --> Execute program (EXEC)
Call with: AH = 4BH
AL = sub function
00H = Load and Execute Program
03H = Load Overlay
ES: BX = segment: offset of parameter block
DS: DX = segment: offset of ASCIIZ program
pathname
Returns: If function successful
Carry flag = clear
Registers are preserved in the usual fashion.
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция позволяет прикладной программе запускать другую программу, восстанавливая контроль после ее завершения. Также может использоваться для загрузки оверлеев, хотя это редко используется.
INT 21H (0x21)
Function 4CH (0x4C or 76) --> Terminate process
with Return code
Call with: AH = 4CH
AL = return code
Returns: Nothing
Комментарии:
Эта функция завершает текущий процесс, передавая код возврата родительскому процессу. Это один из нескольких методов, которые программа может использовать для окончательного выхода.
INT 21H (0x21)
Function 4DH (0x4D or 77) --> Get return code
Call with: AH = 4DH
Returns: AH = exit type
00H, if normal termination by INT 20H, INT 21H
Function 00H, or INT 21H Functions 4CH
01H if termination by user’s entry of Ctrl-C
02H if termination by critical-error handler
03H if termination by INT21H Function 31H or
INT 27H |
AL = return code passed by child process
(0 if child terminated by INT 20H,
INT 21H Function 00H, or INT 27H)
Комментарии:
Эта функция используется родительским процессом после успешного выполнения вызова EXEC (INT 21H Function 4BH) для получения кода возврата и типа завершения дочернего процесса.
INT 21H (0x21)
Function 4EH (0x4E or 78) --> Find first file
Call with: AH = 4EH
CX = search attribute (bits may be combined)
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function successful and matching file found
Carry flag = clear
И результаты поиска возвращаются в текущей области передачи диска следующим образом:
Byte(s) |
Description |
00H-14H |
Reserved (0) |
15H |
Attribute of matched file or directory |
16H-17H |
File time
bits 00H-04H = 2-second increments (0-29)
bits 05H-0AH = minutes (0-59)
bits 0BH-0FH = hours (0-23) |
18H-19H
|
File date
bits 00H-04H = day (1-31)
bits 05H-08H = month (1-12)
bits 09H-0FH = year (relative to 1980) |
1AH-1DH |
File size |
1EH-2AH |
ASCIIZ filename and extension |
If function is unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция ищет в заданном по умолчанию или указанном каталоге на заданном по умолчанию или указанном диске первый соответствующий файл для заданной спецификации файла в виде строки ASCIIZ. Значение битов атрибутов см. в приведенной выше таблице значений битов.
INT 21H (0x21)
Function 4FH (0x4F or 79) --> Find next file
Call with: AH = 4FH
Returns: If function is successful and matching file found
Carry flag = clear
If function is unsuccessful
Carry flag = set
AX = error code
Комментарии:
Если имеется предыдущий успешный вызов функции INT 21H 4EH, эта функция находит следующий файл в каталоге по умолчанию или в указанном каталоге на заданном по умолчанию или указанном диске, который соответствует спецификации исходного файла.
INT 21H (0x21)
Function 50H (0x50 or 80) --> Reserved
INT 21H (0x21)
Function 51H (0x51 or 81) --> Reserved
INT 21H (0x21)
Function 52H (0x52 or 82) --> Reserved
INT 21H (0x21)
Function 53H (0x53 or 83) --> Reserved
INT 21H (0x21)
Function 54H (0x54 or 84) --> Get verify flag
Call with: AH = 54H
Returns: AL = current verify flag value
00H if verify off
01H if verify on
Комментарии:
Эта функция получает текущее значение флага проверки системы (чтение после записи).
INT 21H (0x21)
Function 55H (0x55 or 85) --> Reserved
INT 21H (0x21)
Function 56H (0x56 or 86) --> Rename file
Call with: AH = 56H
DS: DX = segment: offset of current ASCIIZ
pathname
ES: DI = segment: offset of new ASCIIZ
pathname
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция переименовывает файл и/или перемещает запись его каталога в другую запись на том же диске. В MS-DOS версии 3.0 и выше эту функцию также можно использовать для переименования каталогов
Если какой-либо элемент пути не существует, или файл с новым путем уже существует, или текущая спецификация пути содержит диск, отличный от нового пути, или файл перемещается в корневой каталог, а корневой каталог заполнен или у пользователя недостаточно прав, функция переименования файлов не работает.
INT 21H (0x21)
Function 57H (0x57 or 87) --> Get or set file date and time
Call with: If getting date and time
AH = 57H
AL = 00H
BX = handle
If setting date and time
AH = 57H
AL = 01H
BX = handle
CX = time
bits 00H-04H = 2-second increments (0-29)
bits 05H-0AH = minutes (0-59)
bits 0BH-0FH = hours (0-23)
DX = date
bits 00H-04H = day (1-31)
bits 05H-08H = month (1-12)
bits 09H-0FH = year (relative to 1980)
Returns: If function successful
Carry flag = clear
and, if called with AL = 00H
CX = time
DX = date
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция получает или изменяет отметку даты и времени в записи корневого каталога файла.
INT 21H (0x21)
Function 58H (0x58 or 88) --> Get or set allocation strategy
Call with: If getting strategy code
AH = 58H
AL = 00H
If setting strategy code
AH = 58H
AL = 01H
BX = desired strategy code
00H = first fit
01H = best fit
02H = last fit
Returns: If function successful
Carry flag = clear
and, if called with AL = 00H
AX = current strategy code
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Получает или изменяет код, указывающий текущую стратегию MS-DOS для выделения блоков памяти. Стратегия выделения памяти MS-DOS по умолчанию — First Fit (код 0).
При первом подходящем выделении памяти MS-DOS ищет доступные блоки памяти от младшего адреса к старшему, назначая первый достаточно большой, чтобы удовлетворить запрос на выделение блока.
В случае стратегии выделения наилучшего соответствия MS-DOS ищет все доступные блоки памяти и назначает наименьший доступный блок, который удовлетворит запросу, независимо от его положения.
В стратегии выделения памяти по последней подгонке MS-DOS ищет доступные блоки памяти от старших адресов к младшим адресам, назначая наибольший из них, достаточно большой, чтобы удовлетворить запрос на выделение блока.
INT 21H (0x21)
Function 59H (0x59 or 89) --> Get extended error
Information
Call with: AH = 59H
BX = 00H
Returns: AX = extended error code
Table of error codes has been given below:
Error Code |
Error |
01H |
function number invalid |
02H |
file not found |
03H |
path not found |
04H |
too many open files |
05H |
access denied |
06H |
handle invalid |
07H |
memory control blocks destroyed |
08H |
insufficient memory |
09H |
memory block address invalid |
0AH (10) |
environment Invalid |
0BH (11) |
format invalid |
0CH (12) |
access code invalid |
0DH (13) |
data invalid |
0EH (14) |
unknown unit |
0FH (15) |
disk drive invalid |
10H (16) |
attempted to remove current directory |
11H (17) |
not same device |
12H (18) |
no more files |
13H (19) |
disk write-protected |
14H (20) |
unknown unit |
15H (21) |
drive not ready |
16H (22) |
unknown command |
17H (23) |
data error (CRC) |
18H (24) |
bad request structure length |
19H (25) |
seek error |
1AH (26) |
unknown media type |
1BH (27) |
sector not found |
1CH (28) |
printer out of paper |
1DH (29) |
write fault |
1EH (30) |
read fault |
1FH (31) |
general failure |
20H (32) |
sharing violation |
21H (33) |
lock violation |
22H (34) |
disk change invalid |
23H (35) |
FCB unavailable |
24H (36) |
sharing buffer exceeded |
25H-31H |
reserved |
32H (50) |
unsupported network request |
33H (51) |
remote machine not listening |
34H (52) |
duplicate name on network |
35H (53) |
network name not found |
36H (54) |
network busy |
37H (55) |
device no longer exists on network |
38H (56) |
net BIOS command limit exceeded |
39H (57) |
error in network adapter hardware |
3AH (58) |
incorrect response from network |
3BH (59) |
unexpected network error |
3CH (60) |
remote adapter incompatible |
3DH (61) |
print queue full |
3EH (62) |
not enough space for print file |
3FH (63) |
print file canceled |
40H (64) |
network name deleted |
41H (65) |
network access denied |
42H (66) |
incorrect network device type |
43H (67) |
network name not found |
44H (68) |
network name limit exceeded |
45H (69) |
net BIOS session limit exceeded |
46H (70) |
file sharing temporarily paused |
47H (71) |
network request not accepted |
48H (72) |
print or disk redirection paused |
49H-4FH |
reserved |
50H (80) |
file already exists |
51H (81) |
reserved |
52H (82) |
cannot make directory |
53H (83) |
fail on INT 24H (critical error) |
54H (84) |
too many redirections |
55H (85) |
duplicate redirection |
56H (86) |
invalid password |
57H (87) |
invalid parameter |
58H (88) |
network device fault |
59H (89) |
function not supported by network |
5AH (90) |
required system component not installed |
BH = error class
01H |
if out of resource (such as storage or handles) |
02H |
if not error, but temporary situation (such as locked region in file) that can be expected to end |
03H |
if authorization problem |
04H |
if internal error in system software |
05H |
if hardware failure |
06H |
if system software failure not the fault of the active process (such as missing configuration files) |
07H |
if application program error |
08H |
if file or item not found |
09H |
if file or item of invalid type or format |
0AH (10) |
if file or item locked |
0BH (11) |
if wrong disk in drive, bad spot on disk, or storage medium problem |
0CH (12) |
if item already exists |
0DH (13) |
unknown error |
BL = recommend action
01H |
Retry reasonable number of times, then prompt user to select abort or ignore |
02H |
retry reasonable number of times with delay between retries, then prompt user to select abort or ignore |
03H |
get correct information from user (typically caused by incorrect file name or device specification) |
04H |
abort application with cleanup (i.e., terminate the program in as orderly a manner as possible: releasing locks, closing files, etc.) |
05H |
perform immediate exit without cleanup |
06H |
ignore error |
07H |
retry after user intervention to remove cause of error |
CH = error locus
01H unknown
02H block device (disk or disk emulator)
03H network
04H serial device
05H memory
ES: DI = ASCIIZ volume label of disk to
insert, if AX = 0022H (invalid disk change)
Комментарии:
Эта функция получает подробную информацию об ошибке после предыдущего неудачного вызова функции INT 21H, включая рекомендуемые действия по исправлению.
INT 21H (0x21)
Function 5AH (0x5A or 90) --> Create temporary
file
Call with: AH = 5AH
CX = attribute (bits may be combined)
DS: DX = segment: offset of ASCIIZ path
Returns: If function is successful
Carry flag = clear
AX = handle
DS: DX = segment: offset of complete ASCIIZ
pathname
If function is unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция создает файл с уникальным именем в текущем или указанном каталоге на диске по умолчанию или указанном и возвращает дескриптор, который может использоваться программой для последующего доступа к файлу. Имя, сгенерированное для файла, также возвращается в буфер, указанный программой.
Если какой-либо элемент пути не существует или файл создается в корневом каталоге, а корневой каталог заполнен, функция завершается ошибкой.
INT 21H (0x21)
Function 5BH (0x5B or 91) --> Create new file
Call with: AH = 5BH
CX = attribute (bits may be combined)
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function is successful
Carry flag = clear
AX = handle
If function is unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция создает файл в указанном каталоге или каталоге по умолчанию на указанном диске или диске по умолчанию и возвращает дескриптор, который может использоваться программой для последующего доступа к файлу для данного пути ASCIIZ.
Если файл с таким именем и путем уже существует, или какой-либо элемент указанного пути не существует, или файл создается в корневом каталоге, а корневой каталог заполнен или у пользователя недостаточно прав доступа, функция не работает.
INT 21H (0x21)
Function 5CH (0x5C or 92) --> Lock or unlock file region
Call with: AH = 5CH
AL = 00H if locking region
01H if unlocking region
BX = handle
CX = high part of region offset
DX = low part of region offset
SI = high part of region length
DI = low part of region length
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция блокирует или разблокирует указанную область файла. Эта функция недоступна, если не загружен модуль обмена файлами (например, SHARE.EXE).
INT 21H (0x21)
Function 5DH (0x5D or 93) --> Reserved
INT 21H (0x21)
Function 5EH (0x5E or 94), sub function 00H (0x00)
--> Get machine name
Call with: AH = 5EH
AL = 00H
DS: DX = segment: offset of buffer to receive
string
Returns: If function is successful
Carry flag = clear
CH = 00H if name not defined
<> 00H if name defined
CL = netBIOS name number (if CH <> 0)
DX: DX = segment: offset of identifier (if CH <> 0)
If function is unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта подфункция возвращает адрес строки ASCIIZ, идентифицирующей локальный компьютер. Этот вызов функции доступен только при работающей сети Microsoft.
INT 21H (0x21)
Function 5EH (0x5E or 94), sub function 02H (0x02)
--> Set printer setup string
Call with: AH = 5EH
AL = 02H
BX = redirection list index
CX = length of setup string
DS: SI = segment: offset of setup string
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта подфункция задает строку, которая будет отправляться перед всеми файлами, направляемыми на конкретный сетевой принтер, что позволяет пользователям на разных сетевых узлах задавать индивидуальные режимы работы на одном и том же принтере.
INT 21H (0x21)
Function 5EH (0x5E or 94), sub function 03H (0x03)
--> Get printer setup string
Call with: AH = 5EH
AL = 03H
BX = redirection list index
ES: DI = segment: offset of buffer to receive
setup string
Returns: If function successful
Carry flag = clear
CX = length of printer setup string
ES: DI = segment: offset of buffer to receive
setup string
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция используется для получения строки настройки принтера для определенного сетевого принтера.
INT 21H (0x21)
Function 5FH (0x5F or 95), sub function 02H (0x02)
--> Get redirection list entry
Call with: AH = 5FH
AL = 02H
BX = redirection list index
DS: SI = segment: offset of 16-byte buffer to
receive local device name
ES: DI = segment: offset of 128-byte buffer to
receive network name
Returns: If function successful
Carry flag = clear
BH = device status flag
Bit 0 = 0 if device valid
= 1 if not valid
BL = device type
03H, if printer
04H, if drive
CX = stored parameter value
DX = destroyed
BP = destroyed
DS: SI = segment: offset of ASCIIZ local
device name
ES: DI = segment: offset of ASCIIZ network
name
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта подфункция позволяет просматривать системный список перенаправления, который связывает локальные логические имена с сетевыми файлами, каталогами или принтерами. Этот вызов функции доступен, только когда запущены Microsoft Networks и загружен модуль обмена файлами.
INT 21H (0x21)
Function 5FH (0x5F or 95), sub function 03H (0x03) --> Redirect device
Call with: AH = 5FH
AL = 03H
BL = device type
03H, if printer
04H, if drive
DS: SI = segment: offset of ASCIIZ local
device name
ES: DI = segment: offset of ASCIIZ network
name, followed by ASCIIZ password
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Устанавливает перенаправление по сети, связывая имя локального устройства с сетевым именем. Этот вызов функции доступен только при запущенных Microsoft Networks и загруженном модуле общего доступа к файлам (SHARE.EXE).
INT 21H (0x21)
Function 5FH (0x5F or 95), sub function 04H (0x04)
--> Cancel device redirection
Call with: AH = 5FH
AL = 04H
DS: SI = segment: offset of ASCIIZ local
device name
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта подфункция отменяет предыдущий запрос на перенаправление, удаляя связь имени локального устройства с сетевым именем. Этот вызов функции доступен, только когда запущены Microsoft Networks и загружен модуль обмена файлами, такой как SHARE.EXE.
INT 21H (0x21)
Function 60H (0x60 or 96) --> Reserved
INT 21H (0x21)
Function 61H (0x61 or 97) --> Reserved
INT 21H (0x21)
Function 62H (0x62 or 98) --> Get Program Segment
Prefix (PSP) address
Call with: AH = 62H
Returns: BX = segment address of program segment
prefix
Комментарии:
Эта функция получает адрес сегмента (абзаца) префикса сегмента программы (PSP) для выполняемой в данный момент программы.
INT 21H (0x21)
Function 64H (0x64 or 100) --> Reserved
INT 21H
Function 65H (0x65 or 101) --> Get extended
country Information
Call with: AH = 65H
AL = sub function
00H = Get General
Internationalization Information
02H = Get Pointer to Uppercase
Table
04H = Get Pointer to Filename
Uppercase Table
06H = Get Pointer to Collating Table
07H = Get Pointer to Double-Byte
Character Set (DBCS) Vector
BX = code page of interest (-1 = active
CON device)
CX = length of buffer to receive
information (must be >=5)
DX = country ID (-1 = default)
ES: DI = address of buffer to receive
information
Returns: If function successful
Carry flag = clear
And requested data placed in calling program’s buffer
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Получает информацию об указанной стране и/или кодовой странице. Обратитесь к таблице интернационализации, приведенной ранее, чтобы узнать об информационных байтах.
INT 21H (0x21)
Function 66H (0x66 or 102) --> Get or set code
page
Call with: AH = 66H
AL = sub function
01H = Get Code Page
02H = Select Code Page
BX = code page to select, if AL = 02H
Returns: If function is successful
Carry flag = clear
And, if called with AL = 01H
BX = active code page
DX = default code page
If function is unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция получает или выбирает текущую кодовую страницу.
INT 21H (0x21)
Function 67H (0x67 or 103) --> Set handle count
Call with: AH = 67H
BX = number of desired handles
Returns: If function is successful
Carry flag = clear
If function is unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция устанавливает максимальное количество файлов и устройств, которые могут быть открыты одновременно с использованием дескрипторов текущим процессом.
INT 21H (0x21)
Function 68H (0x68 or 104) --> Commit file
Call with: AH = 68H
BX = handle
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция заставляет все данные во внутренних буферах MS DOS, связанные с указанным дескриптором, быть физически записанными на устройство. Если дескриптор относится к файлу, и файл был изменен, отметка времени и даты, а также размер файла в записи корневого каталога файла обновляются.
INT 21H (0x21)
Function 69H (0x69 or 105) --> Reserved
INT 21H (0x21)
Function 6AH (0x6A or 106) --> Reserved
INT 21H (0x21)
Function 6BH (0x6B or 107) --> Reserved
INT 21H (0x21)
Function 6CH (0x6C or 108) --> Extended open file
Call with: AH = 6CH
AL = 00H
BX = open mode
Bit(s) |
Significance |
0-2 |
Access type
000 = read-only
001 = write-only
010 = read/write |
3 |
Reserved (0) |
4-6 |
Sharing mode
000 = compatibility
001 = deny read/write (deny all)
010 = deny write
011 = deny read
100 = deny none |
7 |
Inheritance
0 = child process inherits handle
1 = child does not inherit handle |
8-12 |
Reserved (0) |
13 |
Critical error handling
0 = execute INT 24H
1 = return error to process |
14 |
Write-through
0 = writes may be buffered and deferred
1 = physical write at request time |
15 |
Reserved (0) |
CX = file attribute (bits may be combined;
if ignored if openrefer Bits Significance table.
DX = open flag
Bit(s) |
Significance |
0-3 |
Action if file exists
0000 = fail
0001 = open file
0010 = replace file |
4-7 |
Action if file does not exists
0000 = fail
0001 = create file |
8-15 |
Reserved (0) |
DS: SI = segment: offset of ASCIIZ pathname
Returns:mIf function successful
Carry flag = clear
AX = handle
CX = action taken
1 = file existed and was
opened
2 = file did not exists and
was created
3 = file existed and was
replaced
If function unsuccessful
Carry flag = set
AX = error code
Комментарии:
Эта функция открывает, создает или заменяет файл в указанном каталоге или каталоге по умолчанию на указанном диске или диске по умолчанию для заданного имени пути ASCIIZ и возвращает дескриптор, который может использоваться программой для последующего доступа к файлу.
Если какой-либо элемент пути не существует, или файл создается в корневом каталоге, и корневой каталог заполнен, или файл создается, а файл с таким именем и атрибутом только для чтения уже существует в указанный каталог или у пользователя недостаточно прав доступа, функция не работает.
Страница изменена: 15/03/2022