7 6 5 4 3 2 1 0
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
рис.1
Но это лишь только видимость, если в этот байтзаписать число FFh (восемь единиц в шестнадцатеричной системе счисления), что вдвоичной системе счисления эквивалентно восьми единицам, то получится картина,представленная на рис. 2. В этом случае, если считать содержимое этого байта, на выходе получиться EFh, то есть, записывая в бит №4 единицу, мы присчитывании все равно получаем ноль. Следовательно бит № 4, а значит и байт,неисправен.
7 6 5 4 3 2 1 0
1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 |
рис.2
Вид неисправности «постоянныеединицы» схож с видом «постоянные нули». Разница состоит лишь в том, что ввиде «постоянные нули» неисправные биты находятся всегда в нулевом состоянии, ав виде «постоянные единицы» в единичном.
В связи с этим необходимо реализоватьпроверку ячеек памяти на два вида неисправностей: «постоянные нули» и«постоянные единицы».
2.2. Описание структуры программы
Программа была реализована с помощьюнескольких пользовательских процедур и макросов (см. таблицу 2).
Довольно часто в программах, особеннобольших, приходится несколько раз решать одну и ту же подзадачу и поэтомуприходится выписывать одинаковую группу команд, решающих эту подзадачу. Чтобыизбежать повторного выписывания такой группы команд, ее обычно выписывают одинраз и оформляют соответствующим образом, а затем в нужных местах программыпросто передают управление на эти команды, которые, проработав, возвращают управлениеобратно. Такая группа команд, которая решает некоторую подзадачу и котораяорганизована таким образом, называется процедурой.
Нередко бывает полезнымпредварительное(до начала трансляции) преобразование текста программы.Например, может потребоваться, чтобы какой-то фрагмент программы былпродублирован несколько раз или чтобы в зависимости от некоторых условий втексте программы были сохранены одни фрагменты и удалены другие. Подобнуювозможность предоставляют так называемые макросредства. Расширение языкаассемблера за счет этих средств обычно называют макроязыком.
Программа, написанная на макроязыке,транслируется в два этапа. Сначала она переводится на, так сказать, чистый языкассемблера, т.е. преобразуется к виду, где нет никаких макросредств. Этот этапназывается макрогенерация, его осуществляет специальный транслятор –макрогенератор. На втором этапе полученная программа переводится на машинныйязык. Это этап ассемблирования, его осуществляет ассемблер.
Таблица 2
Таблица процедур имакросов
Название | Тип | Назначение |
Movcur | Макрос | Перемещает курсор |
Clrscr | Макрос | Очищает экран |
Макрос | Выводит на экран строку | |
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» на вашей клавиатуре, ина экране высветится сообщение о состоянии памяти вашего ПК. Для возврата вменю нажмите любую клавишу.