Жанр: Учеба

Программно-аппаратная организация компьютера IBM PC

сторінка №11

существует,
их включение в текстовой файл не позволит другим программам его
использовать.
Прежде чем завершить рассмотрение текстовых файлов необходимо сделать
еще ряд замечаний, касающихся обычных символов текста. Любая система
кодирования определяет упорядоченную последовательность - своего рода
эквивалент алфавитного порядка символов. В коде ASCII все обычные знаки
пунктуации предшествуют буквенным кодам. Заглавные буквы располагаются
перед строчными. Кроме того, в отличие от кода EBCDIC, используемого
универсальными компьютерами фирмы "ИБМ", цифры располагаются перед
буквами.
Коды заглавных букв отличаются от кодов строчных букв на 32 (на 32
меньше). Этот факт можно использовать в программах преобразования
текстовых данных из верхнего регистра в нижний или наоборот.

5.10. Форматы записей данных

После текстовых файлов в коде ASCII наиболее распространены файлы с
фиксированной длиной записей. В таком файле логические единицы информации
называются записями и размер этих записей одинаков во всем файле. Файлы
такого формата создаются интерпретатором БЕЙСИКА в качестве произвольных
файлов, такой же формат имеют прямые файлы Паскаля и другие нетекстовые
файлы. При выполнении каждой операции чтения или записи (обозначаемых в
языке БЕЙСИК как INPUT# и WRITE#) пересылается одна запись.
Если текстовые файлы включают метки, отмечающие концы строк и конец
файла, то в файле с фиксированой длиной записей, записи ничем не
отделяются друг от друга. В таких файлах хранятся только данные без
каких-либо разделителей.
Поскольку записи в таком файле имеют одинаковую длину, можно
использовать простейшие арифметические вычисления для определения места,
где заканчивается одна запись и начинается другая. Служебные программы ДОС
для чтения и записи информации в файл, описанные в главе 4, используют
такой метод как при последовательном, так и при произвольном обращении к
файлу. Когда Ваши программы обращаются к файлам, ДОС выполняет все функции
поиска записей, так что Вашим программам не нужно заботится ни о каких
подробностях, связанных с поиском.
Рассмотрим пример. Если длина записей файла 100 и у ДОС запрашивается
чтение записи с номером 24, то ДОС вычисляет смещение в байтах от начала
файла умножением 24 х 100. Разделив полученное значение 2400 на размер
сектора, 512 байт, получим частное 4 и остаток 352. Это значит, что запись
расположена в пятом секторе файла (пропускаются 4 сектора) со смещением
352 байта.
(Такой способ подсчета предполагает, что нумерация записей начинается
с нуля. Если номер первой записи единица, то необходимо соответствующим
образом изменить формулу, хотя сам метод остается неизменным).
В файлах с фиксированной длиной записи ДОС не приходится заниматься
выравниванием записей - они располагаются одна за другой. Если длина
записи не укладывается точно в 512-байтовый размер сектора, то некоторые
записи могут размещаться в нескольких секторах, что несколько снижает
эффективность операций чтения и записи.
В нашем примере со 100-байтными записями, очередная, 25 запись,
частично размещается в 5-ом, а частично - в 6-ом секторе. Чтобы записать в
файл эту запись, необходимо сначала считать, а затем записать обратно на
диск два сектора.
Если Вы будете выбирать длину записи так, чтобы она была кратна 512,
то скорость чтения и записи несколько повысится. ДОС, однако, позволяет
работать с записями разной длины и, если не считать некоторого снижения
эффективности при чтении/записи записей, располагающихся в нескольких
секторах, Вам не нужно заботиться о размере записи.
Как Вы, вероятно, догадались, существует множество других форматов
файлов, помимо текстовых файлов и файлов с фиксированной длиной записи. Мы
так подробно остановились на этих двух форматах в связи с их широким
распространением. Другие форматы хранения данных обычно имеют структурные
требования, усложняющие процесс их чтения и записи, что может потребовать
использования специальных программ для работы с ними. Существенное
достоинство этих двух форматов заключается в их гибкости - в самых
различных ситуациях - так что они могут использоваться в очень многих
приложениях. Поскольку они поддерживаются очень многими программами, в том
числе различными языковыми процессорами и операционными системами, их
очень удобно использовать. На практике получается, что в связи с удобством
работы с текстовым форматом и широкой поддержкой его различными
программами редактирования и языками программирования, можно обнаружить
случаи приспосабливания форматов данных программ к текстовому формату в
коде ASCII.

5.11. Форматы программных файлов.

Существует два формата файлов для хранения программ. Для них
зарезервированы два расширения имен: ".COM" и ".EXE". Подробности
организации программных файлов потребуют полного изложения организации
ДОС, так что мы не будем сейчас их описывать, отметив только наиболее
важные моменты. (Файлы программ БЕЙСИКА с расширением ".BAS" строго говоря
не являются программными файлами - это файлы данных, которые считываются и
используются интерпретатором БЕЙСИКА.)
Программные файлы типа COM с расширением имени файла ".COM" - это
непосредственно загружаемые программы. В этих файлах хранится точный образ
задач в том виде, в котором они находятся в памяти. Для них не требуется
практически никакой подготовки к запуску после их загрузки в память
средствами ДОС. Если Вы будете просматривать файл типа COM, например,
программой DiskLook, Вы увидите команды машинного языка и данные,
образующие программу, и ничего больше. Когда ДОС подготавливает программу
из файла типа COM к выполнению, она формирует специальный
сегмент-приставку, необходимый для всех программ, загружает программу,
устанавливает регистры сегментов, присваивая им стандартные значения, и
передает управление программе.
Программные файлы типа EXE с расширением имени файла ".EXE" несколько
отличаются от файлов типа COM. Чтобы загрузить их для выполнения требуется
определенная подготовка. Наиболее важная часть такой подготовки называется
перемещением.
Программа может содержать адреса, значения которых должны меняться в
зависимости от того, в каком месте памяти находится программа. Если
программе это не требуется, то она называется само-перемещаемой. Программы
типа COM должны быть само-перемещаемыми, а перемещение программ типа EXE
должно выполняться специальной программой ДОС - загрузчиком.
Программы типа EXE начинаются специальной двухбайтовой меткой, 4D5A,
которая используется для различения программ разных типов. За этой меткой
следует определенная управляющая информация, включающая таблицу,
указывающую какое перемещение необходимо. Далее размещается собственно
программа.
Помимо перемещения, во время загрузки для программ типа EXE может
быть определен сегмент стека. Программы типа EXE могут определять куда они
должны загружаться - в верхнюю или в нижнюю часть доступной памяти.
В связи с простотой формата COM, можно создавать относительно
короткие и простые файлы типа COM в машинных кодах непосредственно, либо с
помощью программ для модификации содержимого файлов на дискетах, таких как
DEBUG или SecMod, либо путем написания короткой программы на БЕЙСИКЕ,
которая будет записывать байты программы прямо в файл типа COM. Такого
рода программ создано уже очень много.
Формат типа COM проще, компактнее и быстрее загружается в память. Для
программ, которым не нужны специальные услуги, обеспечиваемые форматом
типа EXE, предпочтительнее использовать формат типа COM.

Приложение 5.1. Текст программы анализа структуры справочника
(Паскаль).

const

directory_sectors_single_sided=4;
directory_sectors_double_sided=7;

directory_entries_single_sided=64; {4*16}
directory_entries_double_sided=112; {7*16}

hidden_attribute =wrd(2);
system_attribute =wrd(4);

{========================================================}

type

directory_entry_type=

record

filename : string(8);
extension : string(3);
attribute : byte; {hidden=2; system=4}
reserved : array[1..10] of byte;
creation_time : word; {hour*2048+minute*32+
secs}
creation_date : word; {(year-1980)*512+
month*32+day}
starting_cluster_number : word;
file_size : array[1..2] of word;

end;

{==========================================================}

complete_directory_type=array[1..112] of directory_entry_type;

Приложение 5.2. Текст программы анализа структуры таблицы размещения
файлов (Паскаль).

const

minimum_cluster = 2;
maximum_cluster_single_sided = 314;
maximum_cluster_double_sided = 316;

usual_fat_end_of_file = 4095;
minimum_fat_end_of_file = 4088;

bad_cluster_fat = 4087;

single_sided_indicator_byte = 254;

double_sided_indicator_byte = 255;

{==========================================================}

type

fat_sector_type=array[0..511] of byte;

fat_sector_structured_type=
record
scrambled_fat_pair: array[0..158]
of
record
scrambled_byte_1 : byte;
scrambled_byte_2 : byte;
scrambled_byte_3 : byte;
end;
unused_bytes_of_sector : array[1..35] of byte;
end;

Глава 6. ВЫБОРКА ИЗ ПЗУ


Программы, размещаемые в пассивном запоминающем устройстве (ПЗУ )
компьютера IBM/PC, определяют эффективность работы персонального
компьютера в целом. В данной главе мы излагаем самые общие сведения,
касающиеся ПЗУ. Мы рассмотрим назначение ПЗУ, специфику анализа и
декодирования (реконструкции) хранящейся там информации и, наконец,
сравним между собой две первые версии ПЗУ компьютера 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,
сообщим некоторые дополнительные сведения. Подобно остальным командам, эта
команда запускается путем набора на клавиатуре ее имени. В процессе ее
выполнения запросам на ввод исполнительных операторов предшествуют лишь
"тире": обычный запрос операционной системы (символ "А") в этом случае не
используется.
Большинство действий с программой DEBUG отображаются на экране
дисплея, однако может возникнуть потребность в их распечатке для
последующей работы. Собственно программа DEBUG не выводит результаты своей
работы на принтер.

В этой связи, однако, следует напомнить, что существует два способа
получить твердую копию. Первый способ заключается в использовании для
копирования текущего кадра клавиши PrtSc (Печатать содержимое экрана);
второй - состоит в использовании принтера для эхо-отображения путем
одновременного нажатия клавиш Ctrl и PrtSc.
Итак, мы приняли решение об исследовании участка ПЗУ, содержащего
Бейсик; нам также известно, что адрес начала этой программы соответствует
шестнадцатеричному адресу F600. Можно запускать программу DEBUG и
приступать к непосредственной работе с этой программой.
Предположим теперь, что адрес объекта наших поисков (F600) нам
неизвестен. В этом случае поиск может вестись в двух направлениях. Первое
- это методичное использование операции D (означающее "дамп" или
"отображение") до тех пор, пока не появится что-нибудь интересное. Второе
- более эффективное направление - состоит в предъявлении программе DEBUG
образца объекта, который, по нашему мнению должен находиться в памяти.
В качестве образца объекта поиска выберем сообщение об ошибке,
выдаваемое Бейсиком: "Illegal Function call" (Неверный вызов функции). На
рис 6.1 показана процедура запуска программы DEBUG и оператор поиска
указанного выше сообщения программы Бейсик. Предположим, для
определенности, что в качестве начального адреса просмотра (поиска)
программе DEBUG был передан адрес параграфа F000 (лежащий немного ниже
адреса начала Бейсика), а также размер (длина) просматриваемого участка
(L) равный 65535 байтам (`FFFF'в шестнадцатеричной системе счисления).
Программа DEBUG сообщает, что интересующий нас текстовой объект найден.
Это сообщение формируется в форме сегментированного адреса F000: 63F4,
означающего, что относительно параграфа F000 берется шестнадцатеричное
смещение 63F4. Выполнив действия над адресами, мы получим полный
20-байтовый адрес.

F000
+
63F4
_____________
F63F4

A > DEBUG

- S F000 : 0000 L FFFF "Illegal Function call"

F000 : 63F4

Рис. 6.1. Запуск программы DEBUG и поиск сообщения

Значение адреса искомого текстового объекта говорит о том, что
найденное сообщение расположено недалеко от начального параграфа
размещения Бейсика F600. Если представить 20-ти битовый адрес F63F4 в
сегментированном виде, используя в качестве базы параграф F600, то будем
иметь адрес F600:03F4. Таким образом, относительное смещение от начала
Бейсика составляет только 3F4/16 или 1012/16 байтов.
Вводя команду D F600 : 03E0 (вывод на экран содержимого области
памяти, начиная с адреса - т.е. области памяти, начинающейся несколько
раньше найденного сообщения - относительно базового адреса параграфа F600)
можно отобразить содержимое близлежащего пространства памяти, включающего
область найденного сообщения. На рисунке 6.2. представлен результат
выполнения этой команды. Программа DEBUG выводит на устройство отображения
- в шестнадцатеричном и символьном (ASCII) форматах - содержимое участка
памяти длиной 80 байт, причем этот участок памяти содержит искомое
сообщение. Нам таким образом представлено искомое сообщение, а также целый
ряд других сообщений об ошибках Бейсика, т.е. именно то, что - как
предполагалось - должно находиться где-то поблизости. При необходимости с
помощью программы DEBUG можно продолжить отображение на экране последующих
участков памяти; д

Список сторінок

Поділитися у соцмережах

☏ Замовлення реклами: +3805044-68-872

© Асоціація електронних бібліотек України

☝ Усі матеріали сайту (зокрема статті, зображення, рекламні оголошення тощо) призначені лише для попереднього ознайомлення. Усі права на публікації, представлені на сайті, належать їхнім законним власникам. Просимо Вас не зберігати копії інформації.