Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Dos7book

.pdf
Скачиваний:
76
Добавлен:
09.02.2015
Размер:
5.1 Mб
Скачать

Глава 9: Примеры композиции исполняемых файлов

значениями переменных VL, V1 и V2. Первая операция попытка записи метки тома обратно на диск, а вторая условное удаление файла TMP.BAT, если оставленное после попытки записи значение кода уровня ошибки (errorlevel) отражает неудачное завершение попытки записи. С этого момента существование файла TMP.BAT является свидетельством успешной записи метки тома, и, следовательно, доступности испытуемого диска для записи.

Проверка наличия серийного номера диска в файле TMP.TXT, выполняемая в 66-й строке, добавляет к существованию файла TMP.BAT еще один аргумент, выраженный кодом уровня ошибки (errorlevel). Полученных двух аргументов оказывается достаточно для того, чтобы в строках 67 – 71 идентифицировать статус исследуемого диска. После этого исполнение подпрограммы исследования диска завершается вызовом подпрограммы L73 или L79, которые выводят на экран соответствующие сообщения.

Подпрограмма L73 вызывается в случае успешного завершения, когда после исследования можно в 78-й строке исполнить команду, показывающую размер диска и процент использованного дискового пространства. Подпрограмма L79 вызывается тогда, когда статус исследуемого диска не дает надежды на получение дополнительных сведений о нем. После вывода сообщения о результате исследования управление возвращается к продолжению исполнения цикла FOR в строке 23, из которого подпрограмма исследования диска была вызвана.

Цикл FOR в 23-й строке продолжит вызовы подпрограммы L53 для исследования каждого диска, включенного в список подлежащих исследованию дисков. Когда все диски будут исследованы, команда DEL в строке 24 удалит оставшиеся временные файлы, команда CTTY CON в 25-й строке восстановит нормальные связи функций ввода-вывода с аппаратурой компьютера, а цикл FOR в 26-й строке уничтожит все локальные переменные окружения. Из 27-й строки основной части программы происходит переход на конечную метку L87, и на этом исполнение batch-файла DISK.BAT завершается.

При пользовании batch-файлом DISK.BAT нужно иметь ввиду, что ему необходим прямой доступ к исследуемым дискам. Поэтому исполнять файл DISK.BAT в "окне DOS" операционной системы Windows нельзя, его можно исполнять только в среде MS-DOS7 или MS-DOS8. Помимо того, должны быть удовлетворены все пять общих условий исполнения batch-файлов, оговоренных во вводной статье к главе 9.

– 499 –

Глава 9: Примеры композиции исполняемых файлов

9.04Конфигурации с перебазированием на RAM-диск.

Предлагаемая здесь пара конфигурационных файлов (CONFIG.SYS и AUTOEXEC.BAT) предоставляет выбор из двух альтернатив: обычный вариант загрузки MS-DOS7 и вариант с перебазированием MS-DOS7 на виртуальный RAM-диск, создаваемый в выделенной области памяти компьютера. Виртуальный RAM-диск работает гораздо быстрее, чем любой реальный диск. Пользование виртуальным диском снижает нагрузку на реальный диск и уменьшает его износ.

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

Для образования виртуальных RAM-дисков в составе MS-DOS7 имеется драйвер RAMDRIVE.SYS (5.05-01). Общей проблемой для многих драйверов RAM-дисков, включая RAMDRIVE.SYS, является невозможность произвольного задания буквы диска. Драйверы просто берут первую свободную букву, которую предоставляет им MS-DOS. В результате RAM-диску оказывается присвоена буква, следующая за буквой последнего логического диска. Однако число логических дисков в разных компьютерах величина непостоянная, так что буква RAM-диска заранее неизвестна, ее еще надо определить. С этой целью в состав MS-DOS8 включены два специальных файла: batch-файл Findramd.bat и исполняемый файл Findramd.exe. Представленная здесь пара конфигурационных файлов решает ту же задачу иначе, исключительно с помощью стандартных средств MS-DOS7 и без привлечения каких-либо дополнительных файлов.

9.04-01 Файл CONFIG.SYS с драйвером RAMDRIVE.SYS.

Эта версия файла CONFIG.SYS представляет пример относительно простой блочной структуры. Первый блок с зарезервированным именем [menu] предлагает две альтернативы. При его исполнении на экран дисплея выводятся заголовки двух пунктов меню, и пользователю предстоит сделать выбор клавишами стрелок вверх (UP) или вниз (DOWN). Когда выбор подтвержден нажатием клавиши ENTER, загрузчик IO.SYS записывает выбранную альтернативу – "relocation" или "ordinary"

в значение переменной окружения CONFIG, а затем переходит к исполнению команд из одноименного блока файла CONFIG.SYS.

– 500 –

Глава 9: Примеры композиции исполняемых файлов

[menu] numlock off

menuitem=relocation, Relocate DOS onto a 5.6 Mb RAM-disk menuitem=ordinary, MS-DOS 7.10, ordinary loading menudefault=relocation,20

[relocation]

include=ordinary devicehigh=\DOS\DRV\Ramdrive.sys 5600 /E

[ordinary]

accdate c- d- e- r- device=\DOS\DRV\Himem.sys /v device=\DOS\DRV\Emm386.exe ram v dos=high,umb,noauto buffershigh=30,0

fileshigh=30

lastdrivehigh=Z

fcbshigh=1,0

stackshigh=8,256

country=007,866,\DOS\DRV\Country.sys

devicehigh=\DOS\DRV\Dblbuff.sys

devicehigh=\DOS\DRV\Ifshlp.sys

devicehigh=\DOS\DRV\Setver.exe devicehigh=\DOS\DRV\Atapimgr.sys /W:6 /NDR /T:5 /LUN devicehigh=\DOS\DRV\Oakcdrom.sys /D:CD001

[common]

installhigh=\DOS\DRV\Ctmouse.exe

installhigh=\DOS\DRV\Keyrus.com shell=\Command.com \ /E:2016 /L:511 /U:255 /p

Блок [ordinary] очень похож на содержимое файла CONFIG.SYS, представленного в разделе 9.01-01, но есть два различия. Во-первых, введена загрузка драйвера ATAPIMGR.SYS (5.07-01), открывающего доступ к дискам DVD. Второе, более существенное различие состоит в том, что ни в блоке [ordinary], ни во всем файле CONFIG.SYS нет загрузки драйвера MSCDEX.EXE (5.08-03), потому что здесь она повлияла бы на присвоение букв логическим дискам. Эквивалентный драйвер SHSUCDX.COM (5.08-04) будет загружен, но позже, в ходе интерпретации строк файла AUTOEXEC.BAT (9.04-02).

Разумеется, все пути, указываемые в файле CONFIG.SYS, должны соответствовать действительному размещению драйверов, и это соответствие надо

– 501 –

Глава 9: Примеры композиции исполняемых файлов

будет так или иначе обеспечить. Если Вы изберете альтернативу [ordinary], то MS-DOS7 загрузится как обычно и продолжит работать с загрузочного диска.

Блок [relocation] состоит всего из двух строк. Команда "include=" в первой строке заставляет загрузчик IO.SYS исполнить все командные строки блока [ordinary]. Потом вторая строка блока [relocation] загружает драйвер RAMDRIVE.SYS (5.05-01). Он создает в расширенной памяти RAM-диск емкостью 5600 кбайт. Такой размер диска можно себе позволить на компьютерах, имеющих память не менее 8 Мбайт, то есть фактически на всех современных и даже не очень современных компьютерах.

Последний блок в файле CONFIG.SYS имеет зарезервированное имя [common]. Блок с таким именем исполняется всегда, независимо от избранной альтернативы. Там загружаются драйвер "мыши" Ctmouse.exe (5.03-03) и комбинированный драйвер Keyrus.com (5.02-05) для переключения символов знакогенератора и раскладок клавиатуры. Последняя строка в блоке [common] передает управление командному интерпретатору COMMAND.COM: ему предстоит завершить конфигурирование исполнением команд из файла AUTOEXEC.BAT (9.04-02).

9.04-02 Файл AUTOEXEC.BAT с перебазированием на RAM-диск.

Приведенный здесь вариант файла AUTOEXEC.BAT написан для случая загрузки MS-DOS7 с диска A:, обязательно содержащего каталог \DOS. Диск A:

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

изменить назначаемую букву текущего диска в строке 5;

исключить этот диск из списка в строке 3 секции "_relocation";

исправить условия команд "IF" в строках 4 и 5 секции "_relocation".

Все перечисленные правки, конечно, можно автоматизировать, если определить букву текущего диска с помощью программы Reassign.com (9.06), например так, как предложено в разделе 9.01-03. Однако здесь лучше акцентировать внимание на другом: на принципе поиска назначенного RAM-диску буквенного обозначения, тем более что подобные сценарии загрузки, как правило, разворачиваются именно с диска A:.

@echo off

if %1"==J" if not %2"==" goto _%2 prompt $p$g

set dircmd= /A /O:GNE /P set dsk=A:

set comspec=%dsk%\Command.com goto _%config%

– 502 –

Глава 9: Примеры композиции исполняемых файлов

:_relocation echo.

echo Seeking RAM-disk as the last valid disk...

for %%Z in (C D E F G H I J K L) do call \Autoexec.bat J test %%Z: if A:==%dsk% echo RAM-disk is not found!

if A:==%dsk% goto _ordinary

echo RAM-disk is assumed to be %dsk% echo.

set comspec=%dsk%\Command.com \DOS\MS7\Xcopy.exe \*.* %dsk%\ /S /E %dsk%\Autoexec.bat J ordinary

:_ordinary %dsk%

cd \

if not exist TEMP\nul %comspec% nul /f /c md TEMP if exist TEMP\nul set Temp=%dsk%\TEMP

if %Temp%"==" echo Note: the TEMP variable is left not defined! Lh \DOS\DRV\Shsucdx.com /D:?CD001 /L:N /~+ /R /Q

set VC=%dsk%\DOS\VC4 path ;

path=%VC%;%dsk%\DOS\OTH;%dsk%\DOS\MS7 Vc.com /TSR /no2E /noswap

goto _end

:_test

echo Testing disk %3 ...

%comspec% nul /f /c if exist %3\nul cd DOS

if exist ..\nul set

dsk=%3

 

if exist ..\nul echo

 

valid

if

not exist ..\nul

echo

inaccessible

cd

\

 

 

:_end

Эта версия файла AUTOEXEC.BAT начинается с условного перехода в строке 2, обеспечивающего возможность рекурсивного вызова подпрограмм. Когда файл AUTOEXEC.BAT интерпретируется впервые, этот переход не происходит. Тогда далее производятся обычные присвоения значений переменным окружения. В 7-й строке происходит переход на метку, записанную в значение переменной %CONFIG% еще при исполнении файла CONFIG.SYS (9.04-01). Этим значением может быть либо "relocation", если Вы избрали перебазирование на RAM-диск, либо "ordinary", если Вы предпочли DOS, работающую с загрузочного диска.

– 503 –

Глава 9: Примеры композиции исполняемых файлов

Если значением переменной %CONFIG% является слово "ordinary", то будут интерпретироваться команды из секции "_ordinary". Они включают присвоение значений переменным %Temp% и %Path%, загрузку драйвера SHSUCDX.COM для доступа к дискам CD/DVD-ROM, а также файл-менеджера VC.COM. Кончается такая загрузка тем, что DOS продолжает работать с загрузочного диска.

Если же значением переменной %CONFIG% является слово "relocation", то будут интерпретироваться команды из секции "_relocation". В третьей строке этой секции исполняется цикл FOR, рекурсивно вызывающий подпрограмму тестирования из секции "_test" того же самого файла AUTOEXEC.BAT. Тестированию подвергаются диски, перечисленные в скобках в строке того же цикла FOR. Тестирование выполняется с целью обнаружить последнюю букву диска, которой соответствует реально доступный, действующий диск. Пока драйверы IFS и сетевые драйверы не загружены, найденная последняя "действующая" буква диска это как раз та, которая присвоена RAM-диску. Именно по этой причине, кстати, загрузка драйвера SHSUCDX.COM была

отложена и производится только во время исполнения команд из секции

"_ordinary".

Секция "_test" файла AUTOEXEC.BAT принимает букву диска, который надо тестировать, через свой третий параметр %3. Во второй строке секции "_test" проверяется наличие корневого каталога тестируемого диска, причем эта проверка применима даже к недоступным и к несуществующим дискам. Если корневой каталог на проверяемом диске "отзывается", то на текущем загрузочном диске происходит переход в каталог \DOS. А в следующей строке проверяется наличие родительского каталога по отношению к текущему: у каталога \DOS родительский каталог имеется, а у корневого нет. Если смена текущего каталога произошла, то буква тестируемого диска становится значением переменной %dsk%. Команда в последней строке секции "_test" снова делает текущим корневой каталог загрузочного диска.

При циклическом исполнении подпрограммы тестирования, буквы дисков из подготовленного списка, соответствующие доступным дискам, последовательно сменяют друг друга в значении переменной %dsk%. Но буква, соответствующая последнему действующему диску, останется зафиксированной в значении переменной %dsk% к моменту окончания цикла тестирования. Это будет как раз та буква, которая присвоена RAM-диску.

После окончания цикла FOR, вызывавшего подпрограмму тестирования, исполнение командных строк в секции "_relocation" продолжится. Значение переменной %COMSPEC% будет переопределено и на сей раз станет указывать на корневой каталог RAM-диска. Затем программа XCOPY.EXE скопирует все не-скрытые файлы вместе со всей структурой каталогов с загрузочного диска на RAM-диск. Скрытые системные файлы (IO.SYS и MSDOS.SYS) к этому моменту

– 504 –

Глава 9: Примеры композиции исполняемых файлов

уже сделали свое дело и для работы MS-DOS7 больше не нужны. Имейте ввиду, что программе XCOPY.EXE для копирования необходимо, чтобы в одном каталоге с ней (то есть в \DOS\MS7) находился еще файл XCOPY32.EXE (6.26).

Последняя строка в секции "_relocation" вызывает на исполнение не сам файл AUTOEXEC.BAT, а его копию, созданную программой XCOPY.EXE в корневом каталоге RAM-диска, потому что значение переменной %DSK% теперь уже другое и указывает именно на RAM-диск. По той же причине вся адресация с участием переменной %DSK% далее будет относиться к RAM-диску.

Исполнение копии файла AUTOEXEC.BAT начнется с первой строки в секции "_ordinary". Эта операция играет важную роль: она переназначает текущий диск с загрузочного на RAM-диск. С этого момента загрузочный диск становится не нужен: все файлы на нем закрыты, и его можно вынуть из дисковода. Теперь MS-DOS7 будет работать с RAM-диска. Дальнейшие операции в секции "_ordinary" будут выполняться так, как будто MS-DOS7 нормально загружается с RAM-диска.

9.05Примеры простейших программ

Хотя отладчик DEBUG.EXE (6.05) – не самый удобный инструмент для создания исполняемых программ, тем не менее писать программы COM-формата на нем все-таки можно. COM-формат замечателен тем, что программа "раскладывается" для исполнения в памяти компьютера точно так, как она представлена в файле. Поэтому начинать надо с программ COM-формата и, конечно, с самых простых. В представленных здесь простейших программах нет выделенных элементов структуры, нет обращений к дискам, к файлам, к пользователю. Это позволяет не забивать Вам голову многими ограничениями, с которыми необходимо считаться при составлении более сложных программ.

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

9.05-01 Программа коррекции яркости синего цвета.

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

– 505 –

Глава 9: Примеры композиции исполняемых файлов

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

Файл программы BLUE.COM получается в результате исполнения отладчиком DEBUG.EXE последовательности команд из командного файла BLUE.SCR, который надо набрать с помощью программы редактирования текстов (как показано во вводной статье к главе 9) и потом переслать отладчику через перенаправление ввода, например, так:

Debug.exe < Blue.scr

Командный файл BLUE.SCR должен содержать следующие строки:

A 100

 

 

 

MOV

AX,1010

;100 Функция установки яркости (8.01-24)

MOV

BX,0001

;103 Номер регистра преобразователя

MOV

CX,0015

;106 CL - уровень фона синего цвета,

MOV

DX,0000

;109

CH -зеленого, DH - красного

INT

10

;10C Вызов функции BIOS

MOV

AX,4C00

;10E Завершение программы (8.02-55)

INT

21

;111 Вызов функции DOS

N Blue.com R BX

0000 R CX 0013 W

Q

Первая строка командного файла BLUE.SCR переводит отладчик DEBUG.EXE в режим ассемблирования начиная с адреса CS:0100. Следующие семь строк определяют все действия программы BLUE.COM. Смысл каждого действия ясен из комментария, приведенного после знака точки с запятой в той же строке. Девятая строка оставлена пустой (7.01-04), она заставит отладчик DEBUG.EXE выйти из режима ассемблирования. Затем команда "N" (6.05-12) объявляет имя создаваемого исполняемого файла, а его длина (00000013h = 19 байт) вводится в регистры BX и CX. Команда "W" (6.05-19) в предпоследней строке вызывает запись набранных машинных команд в файл BLUE.COM. Наконец, команда "Q" в последней строке завершит сеанс работы отладчика DEBUG.EXE.

– 506 –

Глава 9: Примеры композиции исполняемых файлов

При исполнении команд файла BLUE.SCR отладчик DEBUG.EXE показывает на экране листинг. По нему можно контролировать правильность набора файла BLUE.SCR, сверяя смещение каждой команды с должным значением, которое представлено номером в начале комментария к той же строке. Методика сверки листинга детально изложена в разделе 9.07-01. Когда ошибок в листинге нет, полученный файл BLUE.COM можно запускать на исполнение, дальнейшее тестирование для настолько простых программ не требуется. Если установленный уровень яркости синего цвета Вас не удовлетворит, то надо будет изменить численное значение, вводимое в регистр CX в 4-й строке файла BLUE.SCR, и затем еще раз послать его через перенаправление ввода отладчику DEBUG.EXE.

Программу BLUE.COM запускают из той строки файла AUTOEXEC.BAT, которая предшествует вызову файл-менеджера. Помимо того, встречаются программы, задающие стандартные уровни яркости заново. К ним относятся, в частности, SCANDISK.EXE (6.21) и просмотрщик LXPIC.EXE, упоминаемый в одной из строк файла VC.EXT (6.25-03). После исполнения таких программ файл BLUE.COM приходится запускать снова. Это удобно делать автоматически, вписав вызов BLUE.COM в следующую строку batch-файла или того же файла VC.EXT. Здесь такие примеры не показаны, потому что целесообразность коррекции яркости синего цвета зависит от индивидуальных особенностей зрительного восприятия. Тем не менее цветокоррекция, выполняемая программой BLUE.COM, отображена на рис. 3 (в разделе 6.09) и на рис. 5 (в разделе 6.25-01).

9.05-02 Программа выключения электропитания.

Еще один повод для написания очень простой программы появился в 1999 году, когда на смену компьютерам в корпусах AT пришли компьютеры в корпусах ATX. Оказалось, что все они рассчитаны на программное выключение электропитания,

что действие кнопки выключателя на передней панели системного блока зависит от настроек BIOS Setup, и его не всегда удается предугадать. В DOS программы выключения электропитания никогда не было. Пришлось ее написать, и она получила название TURN_OFF.COM.

Исполняемый файл программы TURN_OFF.COM получается в результате исполнения отладчиком DEBUG.EXE последовательности команд из файла TURN_OFF.SCR, который должен быть набран с помощью программы редактирования текстов (как показано во вводной статье к главе 9) и потом переслан отладчику через перенаправление ввода, например, так:

Debug.exe < Turn_off.scr

Ниже приведен полный текст файла TURN_OFF.SCR.

– 507 –

Глава 9: Примеры композиции исполняемых файлов

a 100

 

 

 

mov

AX,5301

;100 Активизация APM

реального режима

mov

BX,0000

;103 Введем идентификатор APM BIOS

int

15

;106 Вызов процедуры

активизации APM

mov

AX,530E

;108 Запрос версии APM BIOS

mov

BX,0000

;10B Введем идентификатор APM BIOS

mov

CX,0102

;10E Запросим версию

1.2 APM

int

15

;111 Вызов процедуры

запроса версии

mov

AX,5307

;113 Запрос смены режима электропитания

mov

BX,0001

;116 Введем идентификатор всех приборов

mov

CX,0003

;119 Запрос операции

выключения

int

15

;11C Вызов процедуры

смены режима

mov

AX,4C00

;11E Код процедуры завершения

int

21

;121 Вызов процедуры

завершения

n turn_off.com r BX

0000 r CX 0023 w

q

Из текста программы видно, что она действительно очень проста: в ней нет условных переходов, используются лишь два вида ассемблерных команд, полная длина исполняемого файла составляет всего лишь 35 (23h) байт.

В первой строке команда "a 100" (6.05-02) переводит отладчик DEBUG.EXE в режим ассемблирования. В следующих 13 строках происходит набор машинных команд. В этих строках правее знака точки с запятой имеются комментарии, из которых становится понятна роль каждой команды. Дополнительные сведения о прерываниях INT 15\AH=53h приведены в разделах 8.01-708.01-72.

После 14-й строки текста следует пустая строка, которая обязательно должна быть в командном файле: она выведет отладчик из режима ассемблирования. Затем команда "n" (6.05-12) объявляет имя создаваемого исполняемого файла, а его длина вводится в регистры BX и CX. Команда "w" (6.05-19) в предпоследней строке вызывает запись набранных машинных команд в файл. Наконец, команда "q" в последней строке завершает сеанс работы отладчика DEBUG.EXE.

Настолько простые программы фактически нечего отлаживать, достаточно их набрать без ошибок. Для контроля правильности набора комментарий в каждой строке начинается с номера: это смещение вводимой в данной строке команды. Смещение надо сверять по выводимому отладчиком листингу. Методика сверки

– 508 –

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]