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

В связи с появлением
персональных компьютеров мгновенно вырос рынок аппаратных средств, как грибы
росло число производителей, предлагающих свою продукцию. При этом, покупая то
или иное аппаратное средство, производитель не может (а иногда и не хочет) дать
100% гарантию, что оно исправно. В связи с этим также стремительно развивался
и рынок программных тестирующих средств. На рынке существует огромное количество
отличных диагностических программ, написанных большими корпорациями: такими как
Symantec inc., APS (Advanced Personal Systems), Microsoft и т.д., но все
существующие диагностирующие программы написаны на язках высокого уровня, а
значит не достаточно быстры и надёжны. Автор проекта не берётся конкурировать
с огромными гигантами по количеству выполняемых этими программами тестов в силу
того, что это бессмысленно. Была предпринята попытка написать более надежную,
быструю диагностическую программу с использованием машинно-ориентированного
языка программирования – Ассемблер. Первая часть
программы - это часть программы, собирающая справки об
оборудовании, установленном на ПК, на котором программа выполняется. Справки
наводятся о следующих устройствах: Математический
сопроцессор – это микрочип, устанавливаемый на материнскую плату, который
работает совместно с основным процессором, осуществляет обработку чисел с
плавающей точкой, тем самым разгружая основной процессор. Может устанавливаться
опционально по желанию пользователя либо самим пользователем, т.е. СОМ порты – это порты с
последовательным типом передачи данных, предназначенные для подключения
коммуникационных, манипуляторных и других устройств, где требуется сравнительно
не- большая скорость передачи данных. . На
некоторых материнских платах существует ограничение на подключение
последовательных портов, например: если это значение будет два, и если вы
подключите четыре порта, то работать будут все равно два. LPT порты – это
порты с параллельным типом передачи данных, предназначенные для подключения
принтеров и других устройств, где требуется относительно большая скорость
передачи данных, а также могут использоваться для соединения двух компьютеров
между собой для обмена данными. Дисковод – устройство, предназначенное
для чтения/записи накопителей на магнитном диске (гибкий диск). Существует
четыре типа дисководов: Они различаются по формату обслуживаемых
дискет и максимально возможному объему данных, записываемых на дискету
соотвестсвующего типа. CD-ROM привод – устройство, предназначенное только для
чтения накопителей на лазерных дисках. Различаются по скорости доступа к данным
и скоростью вращения лазерного диска. РУЭ (расширенное управление электропитанием) – стандарт, служащий
для экономии электроэнергии. Представляет собой следующий набор
функций: автоматическое отключение питания
монитора; Может находиться в двух состояниях: включено или
выключено. - проверяет
на работоспособность память ПК, на котором выполняется программа. При запуске программы
на экран должна выводиться аннотация, затем, после нажатия на любую клавишу,
должен очищаться экран и появляться меню из трех пунктов: Для выбора интересующего пункта
необходимо нажать на клавиатуре цифры, соответствующие номерам пунктов. В
случае выбора пункта "Сбор сведений о системе" выполняется последовательный
вывод информации о ПК в виде списка устройств с текущим состоянием. Ниже
приведена таблица со списком устройств и их возможными состояниями. Присутствует, отсутствует Второй дисковод Количество установленных CD-ROM приводов Расширенное управление электропитанием(APM) В случае выбора пункта "тест памяти" программа должна выполнять
тестирование не менее 640Кб. памяти. В случае если память исправна, на экран
выводиться сообщение "тест пройден", в противном случае "тест не пройден". Также
необходимо реализовать задержку и возврат в меню. В случае выбора пункта
"выход", необходимо реализовать завершение работы программы и передачу
управления операционной системе DOS. Программа выполнена на языке ассемблера 8086
процессора, соответственно ей необходим IBM PC – совместимый компьютер с
процессором не ниже 8086, также программа может выполняться на компьютерах с
процессорами старшего поколения (например: 80286 или 80386), т.к. особенностью
архитектуры 80х86 является преемственность на уровне машинных команд: программы,
написанные для младших моделей процессоров, без всяких изменений могут быть
выполнены на более старших моделях. Компилированный код программы занимает
всего 2 Кб – это связано с отсутствием избыточного кода, которого очень много
при использовании языков высокого уровня. В связи с этим программа может легко
поместиться на дискету 360 Кб. Программа работает в текстовом режиме и не
использует цветовой гаммы, поэтому ей достаточно монитора CGA. Кроме того она
может без всяких изменений работать на мониторах старшего поколения таких, как
EGA, VGA и SVGA. 1.3.1. Обоснования выбора языка
программирования Для написания данной программы был выбран язык ассемблера.
В связи с тем, что он наиболее подходит для реализации такого рода задач, т.е.
где требуется доступ к портам, выполнение специальных прерываний, доступ к
области памяти BIOS и т.д. Язык ассемблера, представляет собой фактически
символьную форму записи машинного языка: в нем вместо цифровых кодов операций
вписывают привычные знаки операций или их словесные названия, вместо адресов –
имена, а константы записывают в десятичное системе счисления. Программу,
записанную в таком виде, вводят в ЭВМ и подают на вход специальному транслятору,
называемому ассемблером, который переводит её на машинный язык, и далее
полученную машинную программу выполняют. Для любой ЭВМ можно придумать разные
языки ассемблера, хотя бы потому, что можно по-разному обозначать машинные
операции. В частности, и для ПК разработано несколько таких языков(ASM-86, MASM,
TASM). Для реализации данной задачи был выбран язык, который создан фирмой
Borland и полное название которого – турбоассемблер, сокращенно TASM. Надо
отметить, что этот язык наиболее часто используется на ПК. Разработать программу тестирования
оперативной памяти и сбора сведений о ПК. 2 – тест памяти; Сбор сведений должен осуществляться в
виде списка устройств с текущим состоянием. Состояние от названия устройства
должно отделяться двоеточием. Список устройств и возможных их состояний см. в
таблице 1. Пункт "тест памяти" должен осуществлять проверку ячеек памяти на
работоспособность. Существует два типа неисправностей ячеек памяти:
" заключается в следующем: предположим, что
бит №4 в байте, изображенном на рис. 1 – неисправный. В данный момент в байт
записано число ноль (восемь нулей в двоичной системе cчисления), если считать
содержимое этого байта, то на выходе получиться ноль – вроде бы он исправен.
Но это лишь только видимость, если в этот байт записать число FFh (восемь
единиц в шестнадцатиричной системе счисления), что в двоичной системе счисления
эквивалентно восьми единицам, то получится картина, представленная на рис. 2. В
этом случае, если считать содержимое этого байта, на выходе получиться EFh, то
есть, записывая в бит №4 единицу, мы при считывании все равно получаем ноль.
" схож с видом "постоянные нули". Разница состоит лишь
в том, что в виде "постоянные нули" неисправные биты находятся всегда в нулевом
состоянии, а в виде "постоянные единицы" в единичном. В связи с этим
необходимо реализовать проверку ячеек памяти на два вида неисправностей:
"постоянные нули" и "постоянные единицы". Программа была реализована с помощью нескольких пользовательских
процедур и макросов (см. таблицу 2). Довольно часто в программах, особенно
больших, приходится несколько раз решать одну и ту же подзадачу и поэтому
приходится выписывать одинаковую группу команд, решающих эту подзадачу. Чтобы
избежать повторного выписывания такой группы команд, ее обычно выписывают один
раз и оформляют соответствующим образом, а затем в нужных местах программы
просто передают управление на эти команды, которые, проработав, возвращают
управление обратно. Такая группа команд, которая решает некоторую подзадачу и
которая организована таким образом, называется процедурой. Нередко бывает
полезным предварительное(до начала трансляции) преобразование текста программы.
Например, может потребоваться, чтобы какой-то фрагмент программы был
продублирован несколько раз или чтобы в зависимости от некоторых условий в
тексте программы были сохранены одни фрагменты и удалены другие. Подобную
возможность предоставляют так называемые макросредства. Расширение языка
ассемблера за счет этих средств обычно называютмакроязыком. Программа,
написанная на макроязыке, транслируется в два этапа. Сначала она переводится на,
так сказать, чистый язык ассемблера, т.е. преобразуется к виду, где нет никаких
макросредств. Этот этап называется макрогенерация, его осуществляет специальный
транслятор – макрогенератор. На втором этапе полученная программа переводится на
машинный язык. Это этап ассемблирования, его осуществляет
ассемблер. Назначение Реализует
задержку Осуществляет
тест памяти При выполнении программы на экран выводится
аннотация, пользователь, ознакомившись с программой, нажимает на любую клавишу,
и на экран выводится меню (с помощью процедуры ShowQuestion), в котором
пользователь может выбрать интересующий его пункт меню: Если выбран первый
пункт, выполняется процедура ShowSved. Внутри данной процедуры реализована
очистка экрана, с помощью макроса ClrScr, а также диагностика оборудования и
задержка, реализованные с помощью макроса press. После выполнения данной
процедуры программа переходит в начало, т.е. в меню. В случае выбора второго
пункта, выполняется процедура TestMem, тестирующая оперативную память ПК. Также
внутри данной процедуры реализованы очистка экрана и задержка перед выходом в
меню. 2.3. Описание алгоритма решения
задачи Если в оперативной памяти ПК имеется 2 в 20 степени ячеек, то для
ссылок на эти ячейки нужны 20-разрядные адреса; их принято называть физическими
адресами. Ясно, что при большом объеме памяти большим будет и размер физических
адресов, а это ведет к увеличению длины команд и к увеличению размера программ в
целом. Это плохо. Чтобы сократить размеры команд, поступают следующим
образом. Память условно делят на участки, которые принято называть сегментами.
Начальные адреса сегментов могут быть любыми, но на длину сегментов
накладывается ограничение: размер любого сегмента не должен превышать 64Кб. В
этих условиях физический адрес А любой ячейки памяти можно представить в виде
суммы A=B+ofs, где В – адрес сегмента, а ofs – смещение относительно адреса
В. Таким образом ,если в команде надо указать физический адрес А, то адрес
сегмента B – "прячем" в так называемый сегментный регистр, а в команде указываем
лишь этот регистр и слагаемое ofs. Это даёт экономию размера команд. Процедура теста памяти реализована с помощью вложенного цикла. Первый
цикл увеличивает на единицу кодификационный регистр BP до тех пор, пока BP
меньше 0A000h (это последний сегмент 640 Кб). Внутри этого цикла реализован еще
один цикл - он увеличивает на единицу кодификационный регистр SI до тех пор,
пока он меньше 16. Внутри вложенного цикла осуществляется непосредственно
проверка памяти на неисправные биты: сначала происходит проверка на "постоянные
единицы" - в сегмент по адресу BP со смещением SI записывается ноль (что в
двоичной системе счисления означает восемь нулей), затем осуществляется проверка
этого значения, т.е. нуля. Если это значение равно нулю, значит память исправна,
в противном случае - не исправна. Затем происходит проверка на "постоянные
нули": по тому же адресу записывается число FFh (что в двоичной системе
счисления означает восемь единиц), затем осуществляется проверка этого значения.
Если значение равно FFh, значит память исправна, в противном случае -
неисправна. Тестирование
производилось с помощью отладчика Turbo Debugger корпорации Borland. Была
выполнена трассировка всей программы. Трассировка – это процесс пошагового
выполнения команд с листингом состояний всех регистров, флагов, сегмента данных
на момент выполнения каждой команды. неправильное определение состояния математического
сопроцессора - неправильно указанная маска очистки, так называемого слова
"equpment list", получаемого с помощью прерывания 11h; "зависание" при вызове
процедуры TestMem - ошибка в реализации алгоритма теста памяти – неправильно
указанная метка перехода во вложенном цикле. Так как программа писалась на одном
компьютере, проверить её на правильность определения конфигурации ПК не
представлялось возможным, поэтому, после завершения программы, она выполнялась
на разных ПК с разными конфигурациями: в ходе этого теста ошибок обнаружено не
было – все аппаратные средства определялись правильно. Также невозможно было
проверить программу на правильность теста памяти на практике, потому что она
выполнялась на всех ПК с исправной памятью, а попытки найти ПК с заведомо
неисправной оперативной памятью не увенчались успехом. Тем не менее теоретически
тест должен работать правильно. Для
запуска программы выполните файл с именем "kurs.com". Вашему вниманию
представиться аннотация – внимательно прочитайте её, а затем нажмите любую
клавишу на клавиатуре (например, enter). Затем на экране высветится меню,
изображенное на рис. 3. 1 – Сведения о системе Для
того, чтобы получить краткие сведения о вашем ПК - нажмите клавишу "1", затем
"Enter" на вашей клавиатуре, и на экран высветится список устройств с текущем
состоянием. Для возврата в меню нажмите любую клавишу. Для того, чтобы
протестировать оперативную память вашего ПК – нажмите клавишу, "2" затем "Enter"
на вашей клавиатуре, и на экране высветится сообщение о состоянии памяти вашего
ПК. Для возврата в меню нажмите любую клавишу. 2.6.
Заключение о результатах проектируемой задачи В ходе выполнения
поставленной в курсовом проекте задачи были приобретены навыки реализации
сложных ассемблерных программ с использованием макросов и процедур. Кроме того,
был получен огромный опыт и умение работы с CMOS (область памяти, где хранятся
сведения о конфигурации ПК) на низком уровне, т.е. с использованием прерывания
BIOS 11h и 70h порта, а также опыт использования дополнительных сегментных
регистров и регистров модификаторов. Реализованная программа может быть
полезна при диагностике оборудования на относительно старых моделях ПК,
поскольку в программе используется система команд 8086 процессора, который был
выпущен в 1979 г. корпорацией Intel, и сейчас эта модель процессора является
устаревшей.