Недокументированные возможности ms dos функция 13h прерывания 21h недокументированные возможности


Содержание

Организация оперативной памяти в MS DOS

MCB (Memory Control Block) является блоком DOS, описывающим каждый распределенный участок памяти. Как правило, MCB всегда строится перед PSP исполняемой программы и для «окружения» программы. Рассмотрим формат MCB.

Таблица 1. Формат MCB

Смещение Длина Содержимое
00h 1 тип блока:
‘M’ (4Dh) — промежуточный блок;
‘Z’ (5Ah) — последний блок
01h 2 сегмент владельца блока, 0 — свободный блок
03h 2 количество параграфов в блоке
05h 3 резерв
08h 9 имя программы формата ASCIZ для блоков с PSP

Размер блока — 16 байт.

Для определения первого блока цепочки можно воспользоваться недокументированной функцией MSDOS 52h, которая в es:bx возвращает list of list, в es:[bx-2] находится сегмент первого MCB блока.

Описатель начала цепочки UMB блоков находится по адресу 9FFF:0000 (недокументировано).

Обработка событий в MSDOS

В процессе работы могут возникать некоторые события. События бывают синхронные и асинхронные. Синхронные события — это те, которые происходят в процессе выполнения программы всегда в одном и том же месте. Асинхронные события — это те, которые происходят независимо от работы программы. К синхронным событиям относятся вызовы системы DOS, BIOS. К асинхронным событиям относятся вызовы обработчиков нажатий клавиши на клавиатуре, поступление символа по каналу связи и т.п. Асинхронные прерывания — это, обычно, аппаратные прерывания.

Первые 1024 байта — это таблица векторов (Interupt Table), содержащая для каждого из 256 векторов двухсловный указатель на обработчик. При вызове соответствующего прерывания контроллер прерываний сохраняет в стеке регистр флагов, устанавливает запрет прерываний с большим или равным номером IRQ (для аппаратных прерываний) сохраняет в стеке CS, IP и передает управление обработчику прерываний. Обработчик должен выполнить необходимые действия и вернуть управление командой IRET. В некоторой литературе ошибочно написано о необходимости разрешить прерывания перед возвратом, — этого делать не следует, т.к. после разрешения прерывания, перед инструкцией IRET начинается обработка следующего прерывания стоящего в очереди, и есть высокая вероятность получения сообщения:

Internal Stack Overflow. System halted.

Возможно два способа обработки событий своим обработчиком:

  1. полная замена обработчика;
  2. встраивание в цепочку обработчиков прерывания.

К полной замене приходится прибегать довольно редко. Обычно это используется для написания обработчика «пустых» векторов. Встраивание в цепочку обработчиков прерывания используют все программные драйверы, которым необходимо получить управление при возникновении тех или иных событий.

Встраивание в цепочку обработчиков прерывания происходит по следующей схеме:

Иногда необходимо получить управление как до старого обработчика, так и после него. Это производится следующим образом:

Команды Pushf и Call Far имитируют Int, команды Pushf, Popf, Retf 2 делают Iret, но возвращают вызвавшей программе флаги, которые вернул старый обработчик.

Приемы «красивого встраивания» с заменой части команды:

Функции прерывания DOS INT 21H

Дата добавления: 2015-06-12 ; просмотров: 1609 ; Нарушение авторских прав

Ниже приведены базовые функции для прерывания DOS INT 21H. Код функции устанавливается в регистре AH:

Завершение программы (аналогично INT 20H).

Ввод символа с клавиатуры с эхом на экран.

Вывод символа на экран.

Ввод символа из асинхронного коммуникационного канала.

Вывод символа на асинхронный коммуникационный канал.

Вывод символа на печать (гл.19).

Прямой ввод с клавиатуры и вывод на экран.

Ввод с клавиатуры без эха и без проверки Ctrl/Break.

Ввод с клавиатуры без эха с проверкой Ctrl/Break.

Вывод строки символов на экран.

Ввод с клавиатуры с буферизацией.

Проверка наличия ввода с клавиатуры.

Очистка буфера ввода с клавиатуры и запрос на ввод.

Установка текущего дисковода.

Открытие файла через FCB.

Закрытие файла через FCB.

Начальный поиск файла по шаблону.

Поиск следующего файла по шаблону.

Удаление файла с диска.

Последовательное чтение файла.

Последовательная запись файла.

Внутренняя операция DOS.

Определение текущего дисковода.

Установка области передачи данных (DTA).

Получение таблицы FAT для текущего дисковода.

Получение FAT для любого дисковода.

Чтение с диска с прямым доступом.

Запись на диск с прямым доступом.

Определение размера файла.

Установка номера записи для прямого доступа.

Установка вектора прерывания.

Создание программного сегмента.

Чтение блока записей с прямым доступом.

Запись блока с прямым доступом.

Преобразование имени файла во внутренние параметры.

Получение даты (CX-год,DН-месяц,DL-день).

Получение времени (CH-час,CL-мин,DН-с,DL-1/100с).

Установка/отмена верификации записи на диск.

Получение адреса DTA в регистровой паре ES:BX.

Получение номера версии DOS в регистре АХ.

Завершение программы, после которого она остается резидентной в памяти.

Получение вектора прерывания (адреса подпрограммы).

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

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

Создание подкаталога (команда MKDIR).

Удаление подкаталога (команда RMDIR).

Установка текущего каталога (команда CHDIR).

Создание файла без использования FCB.

Открытие файла без использования FCB.

Закрытие файла без использования FCB.

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

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

Удаление файла из каталога.

Установка позиции для последовательного доступа.

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

Управление вводом-выводом для различных устройств.

Дублирование файлового номера.

«Склеивание» дублированных файловых номеров.

Получение текущего каталога.

Выделение памяти из свободного пространства.

Освобождений выделенной памяти.

Изменение длины блока выделенной памяти.

Загрузка/выполнение программы (подпроцесса).

Завершение подпроцесса с возвратом управления.

Получение кода завершения подпроцесса.

Начальный поиск файла по шаблону.

Поиск следующего файла по шаблону.

Получение состояния верификации.

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

Получение расширенного кода ошибки.

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

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

Блокирование/разблокирование доступа к файлу.

Получение адреса префикса программного сегмента (PSP).

Порты

Порт представляет собой устройство, которое соединяет процессор с внешним миром. Через порт процессор получает сигналы с устройств ввода и посылает сигналы на устройство вывода. Теоретически процессор может управлять до 65 536 портами, начиная с нулевого порта. Для управления вводом-выводом непосредственно на уровне порта используются команды IN и OUT:

uКоманда IN передает данные из входного порта в регистр AL (байт) или в регистр АХ (слово). Формат команды:

uКоманда OUT передает данные в порт из регистра AL (байт) или из регистра АХ (слово). Формат команды:

Номер порта можно указывать статически или динамически:

1. Статическое указание порта возможно при непосредственном использовании значения от 0 до 255:

Ввод: IN AL.порт# ;Ввод одного байта

Вывод: OUT порт#,АХ ;Вывод одного слова

2. Динамическое указание порта устанавливается в регистре DX от 0 до 65535. Этот метод удобен для последовательной обработки нескольких портов. Значение в регистре DX в этом случае увеличивается в цикле на 1. Пример ввода байта из порта 60Н:

MOV DX,60H ;Порт 60Н (клавиатура)

IN AL,DX ;Ввод байта

Ниже приведен список некоторых портов (номера в шестнадцатеричном представлении):

Регистры маски прерывании.

Ввод с клавиатуры

Звуковой порт (биты 0 и 1)

Монохромный дисплей и параллельный адаптер печати

В случае, если, например, программа запрашивает ввод с клавиатуры, то она выдает команду прерывания INT 16H. В этом случае система устанавливает связь с BIOS, которая с помощью команды IN вводит байт с порта 60Н.

На практике рекомендуется пользоваться прерываниями DOS и BIOS.

Однако можно также успешно обойтись без BIOS при работе с портами 21, 40. 42, 60 и 201.

Организация прерываний в DOS

AH = 2Ch — Получить время [1] [2] [3] [4]

Возврат : CH = часы (от 0 до 23)

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

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

DL = сотые доли (с 0 до 99)

13.04.2013, 18:31

Организация обработки прерываний
Здравствуйте! Пытаюсь разобраться с механизмом обработки прерывания. Нужно написать такую.

Литература для написания обработчика прерываний MS DOS
Нужна литература чтобы выполнить лабораторную по теме «Использование стандартных функций и.

Обработка прерываний с клавиатуры на С++ с применением библиотеки dos.h
Добрый день! Очень сильно нуждаюсь в вашей помощи. Вот в чем вопрос: Осуществить коррекцию .

ASM, DOS, FAT32. Атрибуты файла без использования прерываний
Добрый день! Столкнулась с такой проблемой. В файловой системе FAT32 нужно прочитать атрибуты у.

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

Функции прерывания MS-DOS (прерывание INT 21H)

Функции прерывания INT 21H работают со стандартным устройством ввода и стандартным устройством вывода, которыми по умолчанию являются клавиатура и монитор.

Некоторые функции данного прерывания приведены в табл.12.4.

Таблица 12.4. Функции прерывания INT 21H

Назначение и номер функции Значения остальных регистров при вызове Значения регистров при возврате
Чтение символа из стандартного устройства ввода с эхом Функция читает один символ из буфера стандартного устройства ввода. Если символа нет, то функция переходит в состояние ожидания. Отображает этот символ на стандартное устройство вывода (эхо). AH = 01H AL – ASCII код символа
Вывод символа на стандартное устройство вывода Функция посылает один символ на стандартное устройство вывода и перемещает курсор на одну позицию вперед. AH = 02H DL – символ
Прямой ввод-вывод символов Функция выполняет чтение одного символа из стандартного устройства ввода без эха и без перехода в режим ожидания. Если символ есть, то сбрасывается флаг ZF и считывается ASCII код символа. Если символа нет, то флаг ZF устанавливается и управление передается вызывающей программе. Функция выполняет вывод символа на стандартное устройство вывода. AH = 06H DL – код символа при выводе DL = FFH при вводе При выводе нет. При вводе: Есть символ в буфере: ZF = 0 AL – ASCII код символа Нет символа в буфере: ZF = 1

Окончание табл. 12.4

Вывод строки символов Функция выводит на стандартное устройство вывода строку символов, которая оканчивается знаком $. AH = 09H DS:DX – адрес строки
Проверка состояния ввода Функция определяет состояние буфера стандартного устройства ввода AH = 0BH Есть символ в буфере: AL = 0FFH Нет символа в буфере: AL=00H
Определить системную дату Функция определяет системную дату. AH = 2AH CX – Год DH – Месяц DL – День AL – день недели (0 – воскресенье: 1 – понедельник и т.д.)
Определить системное время Функция определяет системное время. AH = 2CH CH – часы (0…23) CL – минуты (0…59) DH – секунды (0…59) DL – сотые доли секунды (0…99)
Завершить программу Функция выполняет завершение текущей программы. AH = 4CH AL – код завершения (0 – успешное выполнение программы)

Рассмотрим пример COM-программы, которая

– выводит на экран приглашение к работе;

– принимает с клавиатуры символ;

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

ААААА ААААА ААААА

Текст программы на языке ассемблера приведен на рис.12.3.

Группа дисковых функций MS-DOS

В эту группу входят прерывания, предназначенные для выполнения основных функций операционной системы, в том числе для выполнения операций с логическими дисками, файлами и каталогами [3, 10]. Дисковые функции DOS обладают достаточной полнотой и универсальностью для решения любых задач в реальном режиме DOS. Они могут применяться и в режиме линейной адресации памяти, но информацию в расширенную память приходится пересылать через промежуточный буфер в первом мегабайте адресного пространства процессора. Впрочем, дополнительные пересылки не особенно замедляют работу: поиск данных на диске и передача информации между диском и процессором занимает гораздо больше времени, чем копирование такого же объема данных с одного участка оперативной памяти в другой.’

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

• строка ASCIIZ — текстовая строка в ASCII-коде, которая завершается нулевым значением;

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

Классические функции для работы с дисками

К этой группе относятся функции, появившиеся в ранних версиях операционной системы MS-DOS и сохранившиеся с тех пор практически без изменений. Такие функции отличаются крайне примитивной обработкой ошибок:

• в случае успешного завершения операции флаг CF сбрасывается в 0;

• в случае ошибки флаг CF устанавливается в 1.

Для обращения к дисковым функциям DOS используется прерывание Int 21h.

Прерывание Int 21 h, функция OEh: сменить текущий логический диск

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


• в АН — значение OEh;

• в AL — код логического диска (0 — А:, 1 — В: и т. д.).

После завершения операции функция возвращает в регистре AL максимально возможный в данной системе номер логического дисковода (определяется параметром LASTDRIVE в файле CONFIG.SYS).

Прерывание Int 21 h, функция 19h: определить номер текущего дисковода

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

Перед вызовом прерывания требуется записать в регистр АН значение 19h.

После завершения операции функция возвращает в регистре AL код логического диска (0 — А:, 1 — В: и т. д.).

Прерывание Int 21 h, функция 1Ah: изменить адрес области обмена с диском

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

Перед вызовом прерывания требуется записать в регистры следующие значения:

• в АН — значение lAh;

• в DS: DX — указатель на новый адрес буфера обмена DTA. ПРИМЕЧАНИЕ

При запуске программы ее область DTA первоначально установлена по адресу PSP:0080h.

Прерывание Int 21 h, функция 2Fh: получить адрес области обмена с диском

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

Перед вызовом прерывания требуется записать в регистр АН значение 2Fh.

После завершения операции функция возвращает в ES: ВХ указатель на адрес буфера обмена DTA.

Прерывание Int 21 h, функция 36h: определить объем свободного места на диске

Функция определяет объем свободного места на заданном логическом диске.

Перед вызовом прерывания требуется записать в регистры следующие значения:

• в АН — значение 36h;

• в AL — код логического диска (0 — А:, 1 — В: и т. д.).

В случае ошибки в регистре АХ будет возвращен код OFFFFh (недопустимый код логического диска).

В случае успешного завершения операции функция возвращает:

• в АХ — число секторов в кластере;

• в ВХ — число свободных кластеров;

• в СХ — число байтов в секторе;

• в DX — полное число кластеров на диске.

Объем свободного пространства определяется произведением содержимого регистров АХ, ВХ и СХ, а полный объем диска в байтах — произведением АХ, СХ и DX.

Улучшенные функции для работы с дисками

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

Перечисленные ниже функции DOS имеют усовершенствованные средства контроля: в случае ошибки, кроме установки флага CF, выдают в регистре АХ код ошибки, по которому можно определить причину ее возникновения. Возможные значения кодов ошибок приведены в табл. 6.1. Однако следует учитывать, что содержимое регистра АХ в случае успешного завершения данных функций не сохраняется.

Таблица 6.1. Значения расширенных кодов ошибки

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

01h

06h

07h

08h

0Ah

0Bh

Ch

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

int 21h ;Вызов DOS

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

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

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

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

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

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

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

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

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

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

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

In_Area DB 20 DUP(?)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

int 21h ;Вызов DOS

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

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

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

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

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

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

int 21h ;Вызов DOS

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

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

Out_Area DB 20 DUP(?)

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

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

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

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

int 21h ;Вызов DOS

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


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

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

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

Клавиша

Код (hex)

Клавиша

Код (hex)

Клавиша

Код (hex)

Клавиша

Код (hex)

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

«Num Lock-выкл»

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Действие

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

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

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

src=byte ds:si Lodsb

src=word ds:si Lodsw

src=dword ds:si Lodsd

_

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

dst=byte es:di Stosb

dst=word es:di Stosw

dst=dword es:di Stosd

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

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

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

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

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

dst=byte es:di Scasb

dst=word es:di Scasw

dst=dword es:di Scasd

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

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

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

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

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

srcdst .

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

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

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

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

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

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

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

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

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

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

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

string DB 80 DUP(?)

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

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

start: mov ax,@data

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

mov dx,offset OK

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Недокументированные возможности ms dos функция 13h прерывания 21h недокументированные возможности

Например, в Blitz BASIC есть такие функции, как Handle и Object (и несколько других), описание которых не дано в официальной документации. Их назначение и использование было раскрыто пользователями [4] .

В компьютерных и электронных играх

Недекларированные возможности (информационная безопасность)


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

Например, имеется утверждённый председателем Государственной технической комиссии [5] при Президенте руководящий документ [6] , посвященный, в частности, классификации ПО средств защиты информации по уровню контроля отсутствия недекларированных возможностей, который определяет их следующим образом:

Преднамеренно внесённые в ПО функциональные объекты, обладающие такими возможностями названы программными закладками. Эти термины использует и ГОСТ Р 51275-2006 [7] . Иногда употребляется также сокращение «НДВ».

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

Программные закладки следует отличать от недекларированных возможностей, появившихся вследствие ошибок в программе (иногда называемых багами и «дырами») [8] .

Доктрина информационной безопасности РФ [9] среди угроз «безопасности информационных и телекоммуникационных средств и систем» называет также и «внедрение в аппаратные и программные изделия компонентов, реализующих функции, не предусмотренные документацией на эти изделия».

Примеры

Технические устройства и ПО

В качестве примеров недокументированных возможностей и команд могут быть приведены:

  • как правило, не документирующиеся специальные номера или комбинации клавиш сотовых телефонов, открывающие доступ к инженерным или диагностическим меню, получению дополнительной информации или использованию некоторых других возможностей [10] (например, команда мобильных телефонов *#06#, осуществляющая переход в меню отображения IMEI, а также, в зависимости от модели аппарата, различных аспектов его конфигурации);
  • команда перехода современных телевизоров и мониторов в инженерное меню — зажав несколько кнопок на пульте управления одновременно, оператор пульта попадает в исходно недоступное для пользователя пространство инженерного меню, в котором перемещается уже с помощью обычных команд пульта («вверх», «вниз», «влево», «вправо», «ok») команд [11] ;
  • в ОС Windows к таким возможностям часто относят работу с реестром, файлами, некоторые возможности Windows API. [12][13]
  • еггогология, занимающаяся различными недокументированными возможностями калькуляторов;
  • комбинация клавиш или удерживание спец клавиши при включении позволяет производить с принтером недокументированные в инструкции действия, такие как перевод в сервисный режим для диагностики или возврата к заводским установкам; [источник не указан 567 дней]

Массовая культура

  • переход из «матрицы» в «реальность» в фильме «Матрица» осуществлялся главными героями через ввод недокументированного кода в кабине виртуального телефона-автомата в «матрице».
  • в эпизоде 3.11 «Enter 77» сериала «Остаться в живых» переход к режиму основных возможностей, который не знали герои сериала, был случайно реализован одним из персонажей путём выигрыша в компьютерные шахматы.

См. также

Примечания

  1. Соответственно, эти возможности не описываются в пользовательской документации, но обычно документируются в технических руководствах для соответствующих специалистов
  2. Здесь и далее под продуктом мы для краткости понимаем «техническое устройство или программный продукт»
  3. Особенно актуально для программных библиотек, поскольку желательно, чтобы обновление их версий не приводило к необходимости доработки использующих их программы.
  4. http://blitz-coder.narod.ru/help.html
  5. В 2004 году. преобразована в ФСТЭК России.
  6. Руководящий документ. Защита от несанкционированного доступа к информации. Часть 1. Программное обеспечение средств защиты информации. Классификация по уровню контроля отсутствия недекларированных возможностей. Утверждено решением председателя Государственной технической комиссии при Президенте Российской Федерации от 4 июня 1999 г. № 114
  7. ГОСТ Р 51275-2006. «Защита информации. Объект информатизации. Факторы, воздействующие на информацию. Общие положения» (утв. приказом Федерального агентства по техническому регулированию и метрологии от 27 декабря 2006 г. N 374-ст).
  8. Подробнее об этом можно прочитать в разделе «Безопасность программного кода и отладка» статьи «Отладка», а также в статьях, входящих в категорию «Компьютерные ошибки».
  9. Доктрина информационной безопасности Российской Федерации
  10. Недокументированные возможности телефонов
  11. Описания инженерных меню некоторых мониторов.
  12. Свен Шрайбер «Недокументированные возможности Windows 2000». Спб, 2002
  13. Секреты Windows: статьи о реестре, rundll32.exe, программах. Книга Недокументированные возможности Windows XP. Часть 2

Литература

На английском языке

  • Gupta G. Computers in Engineering. American Society of Mechanical Engineers, 1991. ISBN 0791806227, ISBN 9780791806227, ISBN 0-7918-0622-7(в особенности раздел «Documented and Undocumented Features», p.78)
  • Szyperski C., Gruntz D., Murer S. Component software: beyond object-oriented programming. Pearson Education Publishers, 2003. ISBN 9780201178883(в особенности раздел 5.1.5. Undocumented «features», p.54)
  • Smith Sean W. Trusted computing platforms: design & applications. 2005, XX, 244 p. 28 illus., Hardcover. ISBN 978-0-387-23916-3(в особенности раздел 3.4 Undocumented Functionality, p.35)

На русском языке

  • Адаменко М.В. Секреты сотовых телефонов: сервисные коды мобильных телефонов; недокументированные возможности; изменение мелодии звонка; разблокировка телефонов. Изд. 2-е. М.: «ДМК Пресс, «СОЛОН-Пресс», 2002, 240 стр. — ISBN 5-98003-026-3, ISBN 5-94074-191-6
  • Букин М.С. Секреты сотовых телефонов. СПб.: «Питер», 2005, 208 стр. — ISBN 5-469-00638-7
  • Зыков Н.К. Недокументированные возможности Windows: Справочник для программиста-практика. М.: «Радио и связь», 1994, 176 стр. — ISBN 5-256-01212-6, ISBN 5-256-01212-6
  • Кингслей-Хагис К. Недокументированные возможности GPS. СПб.: «Питер», 2007 г., 304 стр. — ISBN 978-5-469-01410-2
  • Коберниченко А.В. Недокументированные возможности Windows NT. М.: «Нолидж», 287 стр. — ISBN 5-89251-048-4
  • Свен Шрайбер. Недокументированные возможности Windows 2000. СПб., 2002 г., 544 стр. — ISBN 5-318-00487-3
  • Фленов М.. Программирование в Delphi глазами хакера. Издательство: «БХВ-Петербург», 2007г. ISBN 978-5-9775-0081-4

Ссылки

Для улучшения этой статьи желательно ? :
  • Проставив сноски, внести более точные указания на источники.
Это заготовка статьи о технике. Вы можете помочь проекту, исправив и дополнив её.
Это примечание по возможности следует заменить более точным.

Wikimedia Foundation . 2010 .

Смотреть что такое «Недокументированные возможности» в других словарях:

Еггогология — Электроника МК 52 с сообщением «ERROR» (из за специфического отображения буквы r зачастую читалось как «ЕГГОГ») Еггогология& … Википедия

ЕГГОГ — Электроника МК 52 с сообщением ERROR (из за специфического отображения буквы r зачастую читалось как «ЕГГОГ» Еггогология изучение скрытых возможностей микрокалькуляторов. Содержание 1 Происхождение … Википедия

Еггог — Электроника МК 52 с сообщением ERROR (из за специфического отображения буквы r зачастую читалось как «ЕГГОГ» Еггогология изучение скрытых возможностей микрокалькуляторов. Содержание 1 Происхождение … Википедия

Microsoft Word — (Windows) … Википедия

Winword — Microsoft Word (Windows) Скриншот Microsoft Word 2007 Тип Текстовый процессор Разработчик Майкрософт … Википедия

Word — Microsoft Word (Windows) Скриншот Microsoft Word 2007 Тип Текстовый процессор Разработчик Майкрософт … Википедия

Двоичный формат файлов Microsoft Word 97—2000 — Microsoft Word (Windows) Скриншот Microsoft Word 2007 Тип Текстовый процессор Разработчик Майкрософт … Википедия

Двоичный формат файлов Microsoft Word 97—2007 — Microsoft Word (Windows) Скриншот Microsoft Word 2007 Тип Текстовый процессор Разработчик Майкрософт … Википедия

Майкрософт Ворд — Microsoft Word (Windows) Скриншот Microsoft Word 2007 Тип Текстовый процессор Разработчик Майкрософт … Википедия

Электроника Б3-34 — … Википедия

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

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

DOS, функция 00h

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

DS:DX – адрес DTA

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Организация оперативной памяти в MS DOS

MCB (Memory Control Block) является блоком DOS, описывающим каждый распределенный участок памяти. Как правило, MCB всегда строится перед PSP исполняемой программы и для «окружения» программы. Рассмотрим формат MCB.

Таблица 1. Формат MCB

Смещение Длина Содержимое
00h 1 тип блока:
‘M’ (4Dh) — промежуточный блок;
‘Z’ (5Ah) — последний блок
01h 2 сегмент владельца блока, 0 — свободный блок
03h 2 количество параграфов в блоке
05h 3 резерв
08h 9 имя программы формата ASCIZ для блоков с PSP

Размер блока — 16 байт.

Для определения первого блока цепочки можно воспользоваться недокументированной функцией MSDOS 52h, которая в es:bx возвращает list of list, в es:[bx-2] находится сегмент первого MCB блока.

Описатель начала цепочки UMB блоков находится по адресу 9FFF:0000 (недокументировано).

Обработка событий в MSDOS

В процессе работы могут возникать некоторые события. События бывают синхронные и асинхронные. Синхронные события — это те, которые происходят в процессе выполнения программы всегда в одном и том же месте. Асинхронные события — это те, которые происходят независимо от работы программы. К синхронным событиям относятся вызовы системы DOS, BIOS. К асинхронным событиям относятся вызовы обработчиков нажатий клавиши на клавиатуре, поступление символа по каналу связи и т.п. Асинхронные прерывания — это, обычно, аппаратные прерывания.

Первые 1024 байта — это таблица векторов (Interupt Table), содержащая для каждого из 256 векторов двухсловный указатель на обработчик. При вызове соответствующего прерывания контроллер прерываний сохраняет в стеке регистр флагов, устанавливает запрет прерываний с большим или равным номером IRQ (для аппаратных прерываний) сохраняет в стеке CS, IP и передает управление обработчику прерываний. Обработчик должен выполнить необходимые действия и вернуть управление командой IRET. В некоторой литературе ошибочно написано о необходимости разрешить прерывания перед возвратом, — этого делать не следует, т.к. после разрешения прерывания, перед инструкцией IRET начинается обработка следующего прерывания стоящего в очереди, и есть высокая вероятность получения сообщения:

Internal Stack Overflow. System halted.

Возможно два способа обработки событий своим обработчиком:

  1. полная замена обработчика;
  2. встраивание в цепочку обработчиков прерывания.

К полной замене приходится прибегать довольно редко. Обычно это используется для написания обработчика «пустых» векторов. Встраивание в цепочку обработчиков прерывания используют все программные драйверы, которым необходимо получить управление при возникновении тех или иных событий.

Встраивание в цепочку обработчиков прерывания происходит по следующей схеме:

Иногда необходимо получить управление как до старого обработчика, так и после него. Это производится следующим образом:

Команды Pushf и Call Far имитируют Int, команды Pushf, Popf, Retf 2 делают Iret, но возвращают вызвавшей программе флаги, которые вернул старый обработчик.

Приемы «красивого встраивания» с заменой части команды:

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