
- •36 Вопрос
- •15 Вопрос
- •9Вопрос
- •5 Вопрос
- •8 Вопрос
- •9 Вопрос
- •10Вопрос
- •14 Вопрос
- •15 Вопрос
- •16Вопрос
- •22 Вопрос
- •12 Вопрос
- •13 Вопрос
- •15 Вопрос
- •16 Вопрос
- •17 Вопрос
- •1 Вопрос
- •19 Вопрос
- •52 Вопрос
- •21 Вопрос
- •30 Вопрос
- •21 Вопрос
- •25 Вопрос
- •22 Вопрос
- •23 Вопрос
- •24 Вопрос
- •25 Вопрос
- •26 Вопрос
- •27 Вопрос
- •32 Вопрос
- •29 Вопрос
- •30 Вопрос
- •35 Вопрос
- •37 Вопрос
- •34 Вопрос
- •35 Вопрос
- •40 Вопрос
- •37 Вопрос
- •46 Вопрос
- •50Вопрос
- •42Вопрос
- •43 Вопрос
- •44 Вопрос
- •44 Вопрос
- •42 Вопрос
- •54 Вопрос
42 Вопрос
Макродирективы
С помощью макросредств ассемблера можно не только частично изменять входящие в макроопределение строки, но и модифицировать сам набор этих строк и даже порядок их следования. Сделать это можно с помощью набора макродиректив (далее — просто директив). Их можно разделить на две группы:
директивы повторения WHILE, REPT, IRP и IRPC. Директивы этой группы предназначены для создания макросов, содержащих несколько идущих подряд одинаковых последовательностей строк. При этом возможна частичная модификация этих строк.
директивы управления процессом генерации макрорасширения EXITM и GOTO. Они предназначены для управления процессом формирования макрорасширения из набора строк соответствующего макроопределения. С помощью этих директив можно как исключать отдельные строки из макрорасширения, так и вовсе прекращать процесс генерации. Директивы EXITM и GOTO обычно используются вместе с условными директивами компиляции, поэтому они будут рассмотрены вместе с ними. Директивы WHILE и REPT
Директивы WHILE и REPT применяют для повторения определенное количество раз некоторой последовательности строк. Эти директивы имеют следующий синтаксис:
WHILE константное_выражение
последовательность_строк
ENDM
REPT константное_выражение
последовательность строк
ENDM
Обратите внимание, что последовательность повторяемых строк в обеих директивах ограничена директивой ENDM.
При использовании директивы WHILE макрогенератор транслятора будет повторять последовательность_строк до тех пор, пока значение константное_выражение не станет равно нулю. Это значение вычисляется каждый раз перед очередной итерацией цикла повторения (то есть значение константное_выражение должно подвергаться изменению внутри последовательность_строк в процессе макрогенерации).
Директива REPT, подобно директиве WHILE, повторяет последовательность_строк столько раз, сколько это определено значением константное_выражение. Отличие этой директивы от WHILE состоит в том, что она автоматически уменьшает на единицу значение константное_выражение после каждой итерации.
54 Вопрос
Драйверы устройств в DOS — это исполнимые файлы со специальной структурой, которые загружаются на этапе запуска (при выполнении команд DEVICE или DEVICEHIGH файла config.sys) и становятся фактически частью системы. Драйвер всегда начинается с 18-байтного заголовка:
+00: 4 байта — дальний адрес следующего загружаемого драйвера DOS — так как в момент загрузки драйвер будет последним в цепочке, адрес должен быть равен FFFFh:FFFFh
+04: 2 байта — атрибуты драйвера
+06: 2 байта — адрес процедуры стратегии
+08: 2 байта — адрес процедуры прерывания
+0Ah: 8 байт — имя драйвера для символьных устройств (дополненное пробелами).
Для блочных устройств — байт по смещению 0Ah содержит число устройств, поддерживаемых этим драйвером, а остальные байты могут содержать имя драйвера.
Здесь следует заметить, что DOS поддерживает два типа драйверов — драйвер символьного устройства и драйвер блочного устройства. Первый тип используется для любых устройств — клавиатуры, принтера, сети, а второй — только для устройств, на которых могут существовать файловые системы, то есть для дисководов, RAM-дисков, нестандартных жестких дисков, для доступа к разделам диска, занятым другими операционными системами, и т.д. Чтобы обратиться к символьному устройству, программа должна открыть его при помощи функции DOS «открыть файл или устройство», а чтобы обратиться к блочному устройству — просто обратиться к соответствующему логическому диску.
Итак, код драйвера устройства представляет собой обычный код программы, как и в случае с СОМ-файлом, но в начале не надо размещать директиву org 100h для пропуска PSP. Можно также объединить драйвер и исполнимую программу, разместив в ЕХЕ-файле код драйвера с нулевым смещением от начала сегмента, а точку входа самой программы ниже.
При обращении к драйверу DOS сначала вызывает процедуру стратегии (адрес по смещению 06 в заголовке), передавая ей адрес буфера запроса, содержащий все параметры, передаваемые драйверу, а затем процедуру прерывания (адрес по смещению 08) без каких-либо параметров. Процедура стратегии должна сохранить адрес буфера запроса, а процедура прерывания — собственно выполнить все необходимые действия. Структура буфера запроса меняется в зависимости от типа команды, передаваемой драйверу, но структура его заголовка остаетсй постоянной:
+00h: байт — длина буфера запроса (включая заголовок)
+01h: байт — номер устройства (для блочных устройств)
+02h: байт — код команды (00h – 19h)
+03h: 2 байта — слово состояния драйвера — должно быть заполнено драйвером
бит 15: произошла ошибка
биты 10 – 14: 00000
бит 9: устройство занято
бит 8: команда обслужена
биты 7 – 0: код ошибки
00h: устройство защищено от записи
01h: неизвестное устройство
02h: устройство не готово
03h: неизвестная команда
04h: ошибка CRC
05h: ошибка в буфере запроса
06h: ошибка поиска
07h: неизвестный носитель
08h: сектор не найден
09h: нет бумаги
0Ah: общая ошибка записи
0Bh: общая ошибка чтения
0Ch: общая ошибка
0Fh: неожиданная смена диска
+05h: 8 байт — зарезервировано
+0Dh: отсюда начинается область данных, различающаяся для разных команд
Даже если драйвер не поддерживает запрошенную от него функцию, он обязательно должен установить бит 8 слова состояния в 1