Диагностическая программа

Диагностическая программа
ВВЕДЕНИЕ
В связи с появлением персональных компьютеров мгновенно вырос рынок аппаратных
средств, как грибы росло число производителей, предлагающих свою продукцию. При
этом, покупая то или иное аппаратное средство, производитель не может (а иногда
и не хочет) дать 100% гарантию, что оно исправно.
В связи с этим также стремительно развивался и рынок программных тестирующих
средств. На рынке существует огромное количество отличных диагностических
программ, написанных большими корпорациями: такими как Symantec inc., APS
(Advanced Personal Systems), Microsoft и т.д., но все существующие
диагностирующие программы написаны на язках высокого уровня, а значит не
достаточно быстры и надёжны.
Автор проекта не берётся конкурировать с огромными гигантами по количеству
выполняемых этими программами тестов в силу того, что это бессмысленно. Была
предпринята попытка написать более надежную, быструю диагностическую программу с
использованием машинно-ориентированного языка программирования – Ассемблер.
ОБЩИЙ РАЗДЕЛ
1.1. Технико-математическое описание задачи
Программа делится на две части:
Первая часть программы - Сбор сведений - это часть программы, собирающая справки
об оборудовании, установленном на ПК, на котором программа выполняется. Справки
наводятся о следующих устройствах:
математическом сопроцессоре;
СОМ портах;
LPT портах;
дисководах;
CD-ROM приводах;
расширенном управлении электропитанием;
манипуляторе “мышь”.
Математический сопроцессор – это микрочип, устанавливаемый на материнскую плату,
который работает совместно с основным процессором, осуществляет обработку чисел
с плавающей точкой, тем самым разгружая основной процессор. Может
устанавливаться опционально по желанию пользователя либо самим пользователем,
т.е. может либо присутствовать, либо отсутствовать.
СОМ порты – это порты с последовательным типом передачи данных, предназначенные
для подключения коммуникационных, манипуляторных и других устройств, где
требуется сравнительно не- большая скорость передачи данных. Количество
установленных последовательных портов может варьироваться от одного до четырёх.
На некоторых материнских платах существует ограничение на подключение
последовательных портов, например: если это значение будет два, и если вы
подключите четыре порта, то работать будут все равно два.
LPT порты – это порты с параллельным типом передачи данных, предназначенные для
подключения принтеров и других устройств, где требуется относительно большая
скорость передачи данных, а также могут использоваться для соединения двух
компьютеров между собой для обмена данными. Количество установленных LPT портов
может варьироваться от одного до четырёх.
Дисковод – устройство, предназначенное для чтения/записи накопителей на
магнитном диске (гибкий диск). Существует четыре типа дисководов:
360 Кб.;
720 Кб.;
1.2 Мб.;
1.44 Мб.
Они различаются по формату обслуживаемых дискет и максимально возможному объему
данных, записываемых на дискету соотвестсвующего типа.
CD-ROM привод – устройство, предназначенное только для чтения накопителей на
лазерных дисках. Различаются по скорости доступа к данным и скоростью вращения
лазерного диска. Обычно устанавливают не более одного привода.
РУЭ (расширенное управление электропитанием) – стандарт, служащий для экономии
электроэнергии. Представляет собой следующий набор функций:
автоматическое отключение электропитания;
“спящий” режим;
автоматическое отключение питания монитора;
автоматическое отключение питания жестких дисков.
Может находиться в двух состояниях: включено или выключено.
Вторая часть программы - диагностика памяти - проверяет на работоспособность
память ПК, на котором выполняется программа.
1.2. Требования к функциональным характеристикам

При запуске программы на экран должна выводиться аннотация, затем, после нажатия
на любую клавишу, должен очищаться экран и появляться меню из трех пунктов:
1 – сбор сведений о системе;
2 – тест памяти;
3 – выход.
Для выбора интересующего пункта необходимо нажать на клавиатуре цифры,
соответствующие номерам пунктов.
В случае выбора пункта “Сбор сведений о системе” выполняется последовательный
вывод информации о ПК в виде списка устройств с текущим состоянием. Ниже
приведена таблица со списком устройств и их возможными состояниями.
Таблица 1
Таблица возможных состояний устройствУстройствоВозможные состояния
Математический сопроцессорПрисутствует, отсутствует
Максимальное количество подключаемых СОМ-портовОт 0 до 4
Количество CОМ-портовОт 0 до 4
Количество LPT-портовОт 0 до 4
Первый дисководОтсутствует, 360Kb, 720Kb, 1.2Mb, 1.44Mb.
Второй дисководОтсутствует, 360Kb, 720Kb, 1.2Mb, 1.44Mb.
Количество установленных CD-ROM приводовОт 0 до 4
Расширенное управление электропитанием(APM)Отсутствует, присутствует,
включено/выключено
Манипулятор “мышь”Отсутствует, присутствует

После вывода списка устройств, в программе необходимо реализовать задержку,
затем возврат в меню.
В случае выбора пункта “тест памяти” программа должна выполнять тестирование не
менее 640Кб. памяти. В случае если память исправна, на экран выводиться
сообщение “тест пройден”, в противном случае “тест не пройден”. Также необходимо
реализовать задержку и возврат в меню.
В случае выбора пункта “выход”, необходимо реализовать завершение работы
программы и передачу управления операционной системе DOS.
1.3. Требования техническим и программным средствам
Программа выполнена на языке ассемблера 8086 процессора, соответственно ей
необходим IBM PC – совместимый компьютер с процессором не ниже 8086, также
программа может выполняться на компьютерах с процессорами старшего поколения
(например: 80286 или 80386), т.к. особенностью архитектуры 80х86 является
преемственность на уровне машинных команд: программы, написанные для младших
моделей процессоров, без всяких изменений могут быть выполнены на более старших
моделях.
Компилированный код программы занимает всего 2 Кб – это связано с отсутствием
избыточного кода, которого очень много при использовании языков высокого уровня.
В связи с этим программа может легко поместиться на дискету 360 Кб.
Программа работает в текстовом режиме и не использует цветовой гаммы, поэтому ей
достаточно монитора CGA. Кроме того она может без всяких изменений работать на
мониторах старшего поколения таких, как EGA, VGA и SVGA.
Так как программа тестирует 640 Кб оперативной памяти, этот объем является
минимумом.
1.3.1. Обоснования выбора языка программирования
Для написания данной программы был выбран язык ассемблера. В связи с тем, что он
наиболее подходит для реализации такого рода задач, т.е. где требуется доступ к
портам, выполнение специальных прерываний, доступ к области памяти BIOS и т.д.
Язык ассемблера, представляет собой фактически символьную форму записи машинного
языка: в нем вместо цифровых кодов операций вписывают привычные знаки операций
или их словесные названия, вместо адресов – имена, а константы записывают в
десятичное системе счисления. Программу, записанную в таком виде, вводят в ЭВМ и
подают на вход специальному транслятору, называемому ассемблером, который
переводит её на машинный язык, и далее полученную машинную программу выполняют.
Для любой ЭВМ можно придумать разные языки ассемблера, хотя бы потому, что можно
по-разному обозначать машинные операции. В частности, и для ПК разработано
несколько таких языков(ASM-86, MASM, TASM). Для реализации данной задачи был
выбран язык, который создан фирмой Borland и полное название которого –
турбоассемблер, сокращенно TASM. Надо отметить, что этот язык наиболее часто
используется на ПК.
СПЕЦИАЛЬНЫЙ РАЗДЕЛ
2.1. Постановка задачи
Разработать программу тестирования оперативной памяти и сбора сведений о ПК.
Реализовать меню, в котором пользователю предлагается выбор из трёх пунктов:
1 – сбор сведений о системе;
2 – тест памяти;
3 – выход.
Сбор сведений должен осуществляться в виде списка устройств с текущим
состоянием. Состояние от названия устройства должно отделяться двоеточием.
Список устройств и возможных их состояний см. в таблице 1.
Пункт “тест памяти” должен осуществлять проверку ячеек памяти на
работоспособность. Существует два типа неисправностей ячеек памяти:
“постоянные нули”;
“постоянные единицы”.
Вид неисправности “постоянные нули” заключается в следующем: предположим, что
бит №4 в байте, изображенном на рис. 1 – неисправный. В данный момент в байт
записано число ноль (восемь нулей в двоичной системе cчисления), если считать
содержимое этого байта, то на выходе получиться ноль – вроде бы он исправен.
Но это лишь только видимость, если в этот байт записать число FFh (восемь единиц
в шестнадцатиричной системе счисления), что в двоичной системе счисления
эквивалентно восьми единицам, то получится картина, представленная на рис. 2. В
этом случае, если считать содержимое этого байта, на выходе получиться EFh, то
есть, записывая в бит №4 единицу, мы при считывании все равно получаем ноль.
Следовательно бит № 4, а значит и байт, неисправен.
Вид неисправности “постоянные единицы” схож с видом “постоянные нули”. Разница
состоит лишь в том, что в виде “постоянные нули” неисправные биты находятся
всегда в нулевом состоянии, а в виде “постоянные единицы” в единичном.
В связи с этим необходимо реализовать проверку ячеек памяти на два вида
неисправностей: “постоянные нули” и “постоянные единицы”.
2.2. Описание структуры программы
Программа была реализована с помощью нескольких пользовательских процедур и
макросов (см. таблицу 2).
Довольно часто в программах, особенно больших, приходится несколько раз решать
одну и ту же подзадачу и поэтому приходится выписывать одинаковую группу команд,
решающих эту подзадачу. Чтобы избежать повторного выписывания такой группы
команд, ее обычно выписывают один раз и оформляют соответствующим образом, а
затем в нужных местах программы просто передают управление на эти команды,
которые, проработав, возвращают управление обратно. Такая группа команд, которая
решает некоторую подзадачу и которая организована таким образом, называется
процедурой.
Нередко бывает полезным предварительное(до начала трансляции) преобразование
текста программы. Например, может потребоваться, чтобы какой-то фрагмент
программы был продублирован несколько раз или чтобы в зависимости от некоторых
условий в тексте программы были сохранены одни фрагменты и удалены другие.
Подобную возможность предоставляют так называемые макросредства. Расширение
языка ассемблера за счет этих средств обычно называютмакроязыком.
Программа, написанная на макроязыке, транслируется в два этапа. Сначала она
переводится на, так сказать, чистый язык ассемблера, т.е. преобразуется к виду,
где нет никаких макросредств. Этот этап называется макрогенерация, его
осуществляет специальный транслятор – макрогенератор. На втором этапе полученная
программа переводится на машинный язык. Это этап ассемблирования, его
осуществляет ассемблер.
Таблица 2
Таблица процедур и макросовНазваниеТипНазначение
MovcurМакросПремещает курсор
ClrscrМакросОчищает экран
PrintМакросВыводит на экран строку
PressМакросРеализует задержку
ShowQuestionПроцедураВыводит на экран меню
SborSvedПроцедураОсуществляет сбор сведений
TestMemПроцедураОсуществляет тест памяти

При выполнении программы на экран выводится аннотация, пользователь,
ознакомившись с программой, нажимает на любую клавишу, и на экран выводится меню
(с помощью процедуры ShowQuestion), в котором пользователь может выбрать
интересующий его пункт меню:
сбор сведений о ПК;
тест памяти;
выход.
Если выбран первый пункт, выполняется процедура ShowSved. Внутри данной
процедуры реализована очистка экрана, с помощью макроса ClrScr, а также
диагностика оборудования и задержка, реализованные с помощью макроса press.
После выполнения данной процедуры программа переходит в начало, т.е. в меню.
В случае выбора второго пункта, выполняется процедура TestMem, тестирующая
оперативную память ПК. Также внутри данной процедуры реализованы очистка экрана
и задержка перед выходом в меню.
Если выбран третий пункт, программа, не очищая экран, передает управление
операционной системе DOS .
2.3. Описание алгоритма решения задачи
Если в оперативной памяти ПК имеется 2 в 20 степени ячеек, то для ссылок на эти
ячейки нужны 20-разрядные адреса; их принято называть физическими адресами.
Ясно, что при большом объеме памяти большим будет и размер физических адресов, а
это ведет к увеличению длины команд и к увеличению размера программ в целом. Это
плохо. Чтобы сократить размеры команд, поступают следующим образом.
Память условно делят на участки, которые принято называть сегментами. Начальные
адреса сегментов могут быть любыми, но на длину сегментов накладывается
ограничение: размер любого сегмента не должен превышать 64Кб.
В этих условиях физический адрес А любой ячейки памяти можно представить в виде
суммы A=B+ofs, где В – адрес сегмента, а ofs – смещение относительно адреса В.
Таким образом ,если в команде надо указать физический адрес А, то адрес сегмента
B – “прячем” в так называемый сегментный регистр, а в команде указываем лишь
этот регистр и слагаемое ofs. Это даёт экономию размера команд.
В связи с этим максимальный объем сегмента равен 64Кб, а минимальный равен 16
байтам.
Процедура теста памяти реализована с помощью вложенного цикла. Первый цикл
увеличивает на единицу кодификационный регистр BP до тех пор, пока BP меньше
0A000h (это последний сегмент 640 Кб). Внутри этого цикла реализован еще один
цикл - он увеличивает на единицу кодификационный регистр SI до тех пор, пока он
меньше 16. Внутри вложенного цикла осуществляется непосредственно проверка
памяти на неисправные биты: сначала происходит проверка на “постоянные единицы”
- в сегмент по адресу BP со смещением SI записывается ноль (что в двоичной
системе счисления означает восемь нулей), затем осуществляется проверка этого
значения, т.е. нуля. Если это значение равно нулю, значит память исправна, в
противном случае - не исправна. Затем происходит проверка на “постоянные нули”:
по тому же адресу записывается число FFh (что в двоичной системе счисления
означает восемь единиц), затем осуществляется проверка этого значения. Если
значение равно FFh, значит память исправна, в противном случае - неисправна.

2.4. Отладка и тестирование

Тестирование производилось с помощью отладчика Turbo Debugger корпорации
Borland. Была выполнена трассировка всей программы. Трассировка – это процесс
пошагового выполнения команд с листингом состояний всех регистров, флагов,
сегмента данных на момент выполнения каждой команды.
В ходе трассировки были обнаружены следующие ошибки:
неправильное определение состояния математического сопроцессора - неправильно
указанная маска очистки, так называемого слова “equpment list”, получаемого с
помощью прерывания 11h;
“зависание” при вызове процедуры TestMem - ошибка в реализации алгоритма теста
памяти – неправильно указанная метка перехода во вложенном цикле.
Кроме того, было обнаружено множество ошибок в синтаксисе команд.
Так как программа писалась на одном компьютере, проверить её на правильность
определения конфигурации ПК не представлялось возможным, поэтому, после
завершения программы, она выполнялась на разных ПК с разными конфигурациями: в
ходе этого теста ошибок обнаружено не было – все аппаратные средства
определялись правильно.
Также невозможно было проверить программу на правильность теста памяти на
практике, потому что она выполнялась на всех ПК с исправной памятью, а попытки
найти ПК с заведомо неисправной оперативной памятью не увенчались успехом. Тем
не менее теоретически тест должен работать правильно.
2.5. Инструкция к пользователю
Для запуска программы выполните файл с именем “kurs.com”. Вашему вниманию
представиться аннотация – внимательно прочитайте её, а затем нажмите любую
клавишу на клавиатуре (например, enter). Затем на экране высветится меню,
изображенное на рис. 3.
1 – Сведения о системе
2 - Тест памяти
3 – Выход
Ваш выбор ? :

рис. 3
Для того, чтобы получить краткие сведения о вашем ПК - нажмите клавишу “1”,
затем “Enter” на вашей клавиатуре, и на экран высветится список устройств с
текущем состоянием. Для возврата в меню нажмите любую клавишу.
Для того, чтобы протестировать оперативную память вашего ПК – нажмите клавишу,
“2” затем “Enter” на вашей клавиатуре, и на экране высветится сообщение о
состоянии памяти вашего ПК. Для возврата в меню нажмите любую клавишу.
Для того, чтобы выйти из программы - нажмите клавишу “3”, затем “Enter” на вашей
клавиатуре.
2.6. Заключение о результатах проектируемой задачи
В ходе выполнения поставленной в курсовом проекте задачи были приобретены навыки
реализации сложных ассемблерных программ с использованием макросов и процедур.
Кроме того, был получен огромный опыт и умение работы с CMOS (область памяти,
где хранятся сведения о конфигурации ПК) на низком уровне, т.е. с использованием
прерывания BIOS 11h и 70h порта, а также опыт использования дополнительных
сегментных регистров и регистров модификаторов.
Реализованная программа может быть полезна при диагностике оборудования на
относительно старых моделях ПК, поскольку в программе используется система
команд 8086 процессора, который был выпущен в 1979 г. корпорацией Intel, и
сейчас эта модель процессора является устаревшей.