сравним между собой две первые версии ПЗУ компьютера IBM/PC. Все эти
материалы являются базой для последующих пяти глав, в которых
функциональные возможности IBM/PC рассматриваются более детально.
Здесь важно иметь в виду три аспекта. Все о чем пойдет речь в данной
главе в полной мере относится только к IBM/PC и, вообще говоря, не
распространяется на все семейство компьютеров, работающих под управлением
MS-DOS. Для остальных компьютеров семейства PC эти сведения следует
рассматривать применительно к конкретному компьютеру (поскольку каждой
модели присущи свои особенности). Тем не менее, имеются все основания
считать, что прерывания или вызовы функции обслуживания для большинства
компьютеров совпадают. Поэтому, несмотря на возможное изменение адресов
программ обслуживания, находящихся в ПЗУ компьютера той или иной модели
материалы настоящей и последующих пяти глав сохраняют свою актуальность.
6.1. Организация ПЗУ и его использование
Программы, хранящиеся в ПЗУ, представляют собой чрезвычайно важную
компоненту IBM/PC, поскольку являются основой управляющей программы,
делающей ПЭВМ эффективным инструментом обработки данных. Сам факт их
размещения в ПЗУ превращает эти программы в стабильный и надежный
инструмент - они не могут быть стерты или уничтожены. Кроме того, они
доступны для любой программы, выполняемой на IBM/PC, независимо от
специфики используемой операционной системы.
Большинство программ обслуживания, размещаемых в ПЗУ, допускают
перемещение. Эти программы написаны таким образом, что при необходимости
их можно легко переместить, соответственно перестроив обращение к ним.
Специфика обращения к программам ПЗУ состоит в том, что их активизация
производится всегда через систему прерываний. Изменив таблицу векторов
прерываний, можно легко изменить точку входа в ту или иную программу
обслуживания. Эти вопросы уже рассматривались нами при изучении материала
главы 3.
Как уже говорилось выше, все пространство памяти ПЗУ компьютера
IBM/PC делится на три части, под которые отводятся старшие адреса
миллионного пространства памяти.
Самые старшие адреса памяти, соответствующие началу параграфа
сегмента с адресом FE20/16, и охватывающие 8Кбайт до конца памяти
отводятся под BIOS, или Базовую Систему Ввода-Вывода. Базовая Система
Ввода-Вывода (BIOS) выполняет все операции по обслуживанию периферийных
устройств IBM/PC, таких как дисплеи или накопители на гибких магнитных
дисках. Все программы операционной системы, обеспечивающие
функционирование ПЭВМ ориентируются на использование BIOS. Область памяти
ПЗУ, содержащая BIOS, представляет особый интерес для тех, кто хотел бы в
полной мере использовать возможности IBM/PC. В последующих пяти главах по
мере рассмотрения конкретных функций IBM/PC мы будем детально обсуждать
служебные обращения к BIOS, обеспечивающие реализацию этих функций.
Справочное руководство по техническому обслуживанию персонального
компьютера содержит полный текст первой версии BIOS; при этом комментарии
хорошо поясняют, что делается и как делается; вопрос, почему это делается,
раскрыт слабо. Если Вы имеете навыки интерпретации листингов на языке
ассемблера, то при изучении листинга BIOS Вы получите ответы на любые
вопросы о принципах функционирования ПЭВМ.
Вторая часть ПЗУ, соответствует параграфу с шестнадцатеричным адресом
F600 и занимает 32 Кбайт памяти. Она содержит (хранит) программы
интерпретатора языка Бейсик. В ПЗУ хранится ядро интерпретатора языка
Бейсик для IBM/PC. Все кассетные версии языка Бейсик соответствуют
Бейсик-ПЗУ; основные функциональные возможности дисковой версии Бейсика, а
также расширенный Бейсик (BASICA) фактически реализованы в ПЗУ.
Практически все, что делают две указанные выше версии Бейсика - это
расширение версии Бейсик-ПЗУ. Соответственно, Бейсик-ПЗУ - это полная
версия языка Бейсик, содержащая основные программы, требуемые для дисковых
версий.
С появлением в справочном руководстве по техническому обслуживанию
текста программ BIOS не имеет смысла приводить текст программ Бейсик-ПЗУ;
однако в ряде случаев мы будем использовать фрагменты этой программы для
иллюстрации методов исследования содержимого ПЗУ.
Сама по себе область ПЗУ, содержащая Бейсик, не представляет особого
интереса, однако коль скоро в этой области расположено множество полезных
программ, то почему бы ими не воспользоваться в своей собственной
разработке? Поиск и декодирование нужных фрагментов Бейсика с последующим
их тщательным документированием представляет собой весьма трудоемкую
задачу, нами в данной работе не решаемую.
Подпрограмма или функция Бейсика может быть непосредственно
активизирована из программы пользователя с помощью механизма прерываний. В
главе 11 эти вопросы рассматриваются с необходимой полнотой.
Третий и последний участок ПЗУ нами здесь не рассматривается. Фирма
IBM оставляет за собой право расширять состав программ ПЗУ; пользователи
также могут встраивать в ПЗУ свои программы, расширяя таким образом
функциональные возможности IBM/PC. Дополнительные программы можно включать
в любое место миллионного адресного пространства, однако блок,
начинающийся с шестнадцатиричного адреса параграфа F400 и занимающий
8Кбайт, вплотную прилегающий к участку памяти, отведенного под Бейсик
специально выделен для таких программ. Если требуется свыше 8Кбайт памяти,
то программу можно сместить в область памяти с более низкими адресами.
Именно посредством включения в ПЗУ специализированных программ можно
превратить IBM/PC в специализированный компьютер. Прежде чем приступить к
более глубокому изучению BIOS мы продемонстрируем (в двух последующих
параграфах) способы исследования содержимого ПЗУ.
6.2. Анализ содержимого ПЗУ средствами программы DEBUG
В данной главе мы рассмотрим особенности анализа программ и данных,
размещаемых в ПЗУ. Несмотря на то, что предлагаемая методика ориентируется
главным образом на программы, расположенные в ПЗУ, она может
использоваться также и в случае программ, хранящихся на дискете. Поэтому
все, о чем пойдет здесь речь применимо как к компонентам DOS,
расположенным на дискете, так и к компонентам, входящим в состав других
программ.
Доступ к любому фрагменту ПЗУ может быть осуществлен также средствами
Бейсика или Паскаля. Методы адресации объектов памяти, рассмотренные в
главе 3, позволяют работая на Бейсике или Паскале, обратиться к любой
ячейке памяти. Ниже приводится пример программы на Бейсике, отображающий
содержимое ПЗУ.
100 REM отображение фрагмента ПЗУ в шестн. формате
110 PARAGRAPH=&HF600
120 DEF SEG=PARAGRAPH
130 PRINT
140 PRINT "Отображение содержимого параграфа",HEX$(PARAGRAPH)
150 PRINT
160 PRINT "Десятичное Шестнадцатеричное"
170 PRINT "Смещение Смещение Содержимое ПЗУ";
180 OFFSET%=0
190 FOR LINES%=1 TO 16
200 PRINT
210 PRINT OFFSET%, HEX$(OFFSET%)
Хотя приведенная программа позволяет нам судить о содержимом ПЗУ,
смысл данных остается "за кадром". Мы, таким образом, подошли к очень
важному и необходимому инструменту, поставленному в составе DOS -
программе DEBUG.
Программа DEBUG позволяет осуществлять три вида действий в отношении
содержимого ПЗУ: выборку произвольного участка памяти и отображать ее
содержимое в двух форматах:
1)шестнадцатеричный / ASCII.
2)формат не связанный с деассемблированием.
Программа DEBUG может быть также использована для исследования
программ, хранящихся на дискете. В последнем случае, правда,
представляется более эффективным использовать программу Disklook,
записанную на дискету, прилагаемую к данной книге или программу SecMod
входящую в состав программ Norton Utility. Прежде чем двигаться дальше,
поясним смысл термина "деассемблирование".
Программы, представленные на языке машинных команд, чрезвычайно
сложны для восприятия человеком. Даже в случае компьютеров, имеющих
сравнительно простой формат машинных команд, этот язык весьма сложен для
понимания. Микропроцессор 8088 регламентирует очень сложную структуру
языка машинной команды. Это положение справедливо в отношении большинства
микропроцессоров - их проектировщики жертвуют простотой для достижения
максимальной производительности и компактности кода. Вследствие этого,
требуется приложить значительные усилия для просмотра и понимания
листинга, представленного на языке машинных команд в шестнадцатеричном
коде.
Процесс деассемблирования, реализуемый программой DEBUG, значительно
облегчает процедуру интерпретации машинного языка. Деассемблирование - это
процесс трансляции или преобразования инструкций машинного языка,
представленных в абсолютном шестнадцатеричном виде в символическую нотацию
языка ассемблера. Так, например, на языке ассемблера можно записать INC AX
(увеличить содержимое регистра AX на единицу); ассемблер переведет эту
конструкцию в команду на машинном языке с кодом 40/16. Функция
деассемблера состоит в том, чтобы привести команду машинного языка с кодом
40/16 обратно к виду INC AX.
Шестнадцатеричный код 40 сравнительно легко может быть преобразован и
вручную, при наличии таблицы кодов команд микропроцессора 8088. С
большинством кодов остальных команд дело обстоит не так просто, поскольку
в ряде случаев смысл команды изменяется в зависимости от значения
конкретных битов. В случае использования команды DEBUG все запутанные
случаи декодирования преодолеваются в режимах команды деассемблирования.
Несмотря на то, что деассемблер может выполнить преобразование команд
машинного языка к более удобным командам языка ассемблера, целый ряд
весьма существенных компонентов программы, написанной на языке ассемблера
реконструкции не поддается. Так, очевидно, не могут быть восстановлены
весьма полезные комментарии программиста. Кроме того, не представляется
возможным восстановить оригинальные символические имена адресов памяти.
Таким образом, вместо оригинальной авторской конструкции типа
IMP FINISH; выполнено, перейти к завершающей процедуре
деассемблер сгенерирует строку вида
IMP OE6C
Пользователь видит перед собой команду перехода, однако ее смысл
остается для него неясным.
Деассемблер, безусловно, не в состоянии полностью заменить
программиста, особенно, в том, что касается смысла деассемблируемой
программы. Но он существенно упрощает задачу, когда предъявляет
пользователю команду, а также помогает отличить область памяти, содержащую
данные от области памяти, содержащую команды.
Для иллюстрации особенностей исследования программ ПЗУ возьмем
программу Бейсика и используем ее в качестве объекта приложения программы
DEBUG. Все дополнительные сведения будут сообщены ниже, либо проясняться в
ходе рассмотрения примера. Для детального изучения программы DEBUG -
следует внимательно прочесть соответствующие разделы руководства по
операционной системе; этот материал не прост для усвоения, однако он
содержит многие важные технические детали.
Для пользователей, не работавших с программой (командой) DEBUG,
сообщим некоторые дополнительные сведения. Подобно остальным командам, эта
команда запускается путем набора на клавиатуре ее имени. В процессе ее
выполнения запросам на ввод исполнительных операторов предшествуют лишь