Дизассемблеры и отладчики. Теоретические сведения о структуре и порядке программирования CMOS памяти

Страницы работы

Фрагмент текста работы

Министерство образования  и науки Российской Федерации

Федеральное агентство по образованию

Государственное образовательное учреждение высшего профессионального образования

«Комсомольский-на-Амуре государственный технический университет»

Факультет Компьютерных технологий

Кафедра математического обеспечения и применения ЭВМ

Лабораторная работа №2

По курсу «ОСРР»

Выполнил студент группы                                                                                                           Казаков М.Ю.

Преподаватель                                                                                                                                            Трещев И.А.

Вариант:                                                                                                                                                                             5

Комсомольск-на-Амуре

2006


Тема:           Дизассемблеры  и  отладчики

Цель:           Научиться работать с отладчиком и дизассемблером

Задание:     Изучить структуру и порядок программирования CMOS памяти персональной ПЭВМ и написать модуль, читающий и расшифровывающий данные CMOS памяти ПЭВМ. Изучить структуру ОЗУ ПЭВМ (в ОС реального режима), разобрать понятия CMA, UMA, HMA, EMA, XMA, EMS, XMS, UMB. Исследовать оперативную память компьютера в ОС реального режима с помощью системных утилит MEM, MSD, программ CHECIT, SI и составить сравнительную таблицу показаний этих программ по всем видам памяти ПЭВМ. Изучить технологию выделения блоков памяти ОС реального режима при загрузке и выполнении программ и исследовать цепочку MCB в памяти ПЭВМ.


Теоретические сведения о структуре и порядке программирования CMOS памяти

Энергонезависимая память CMOS используется в современных компьютерах для хранения текущей конфигурации аппаратных средств. Эта память расположена в отдельной микросхеме, подпитываемой встроенным аккумулятором, и состоит из набора ячеек, доступ к которым для чтения и записи выполняется через порты ввода и вывода с адресами 70h и 71h.

Процедура чтения ячейки памяти CMOS состоит из двух шагов. На первом шаге программа записывает в выходной порт с адресом 70h номер ячейки, из которой необходимо прочитать информацию. На втором шаге программа читает содержимое данной ячейки из входного порта с адресом 71h:

int nCellContent;

outp(0x70, nCell);

nCellContent = inp(0x71);

Запись данных в ячейку памяти CMOS выполняется аналогично, только после записи номера ячейки в порт 70h программа должна записать новое значение для этой ячейки в порт с адресом 71h:

outp(0x70, nCell);

outp(0x71, nNewValue);

В памяти CMOS хранится текущее время и дата, сведения о конфигурации системы, результат тестирования при включении питания и другая информация.


Листинг программы чтения CMOS памяти

#include <iostream.h>

#include <conio.h>

void main()

{

clrscr();

char *dow[] = {"Воскресенье", "Понедельник", "Вторник", "Среда",

"Четверг",     "Пятница",     "Суббота"};

char *month[] = {"Янв", "Фев", "Мар", "Апр", "Май", "Июн",

"Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"};

int cmos[64];

int i;

outp(0x70, 11);

outp(0x71, 6);

for (i = 0; i < 64; ++i)

{

outp(0x70, i);

cmos[i] = inp(0x71);

}

cout << "Байты 0-9 содержат информацию о дате, дне недели и времени"

<< endl << "Содержимое этих байтов: ";

for (i = 0; i <= 9; ++i)

cout << cmos[i] << " ";

cout << endl << endl << "Текущее время: " << cmos[4] << ":" << cmos[2]

<< ":" << cmos[0] << endl

<< "День недели: " << dow[cmos[6] - 1] << endl

<< "День: " << cmos[7] << " " << month[cmos[8] - 1] << " "

<< cmos[0x32] * 100 + cmos[9] << endl;

cout << "--------" << endl;

cout << "Байт 0bh - регистр B состояния RTC" << endl

<< "Содержимое байта - " << cmos[0xb] << endl << endl;

switch ((cmos[0xb] >> 1) & 1)

{

case 1: cout << "Бит 1 = 1 => Вывод времени осуществляется в 24-часовом                 формате"; break;

case 0: cout << "Бит 1 = 0 => Вывод времени осуществляется в 12-часовом формате";

}

cout << endl;

switch ((cmos[0xb] >> 2) & 1)

{

case 1: cout << "Бит 2 = 1 => Данные о времени и дате хранятся в двоичном формате"; break;

case 0: cout << "Бит 2 = 0 => Данные о времени и дате хранятся в BCD формате";

}

cout << endl << "--------" << endl;

cout << "Байт 0eh - байт состояния диагностики POST" << endl

<< "Содержимое байта - " << cmos[0xe] << endl << endl;

switch ((cmos[0xe] >> 3) & 1)

{

case 1: cout << "Бит 3 = 1 => Проблемы с жестким диском"; break;

case 0: cout << "Бит 3 = 0 => Жесткий диск исправен";

}

cout << endl;

switch ((cmos[0xe] >> 6) & 1)

{

case 1: cout << "Бит 6 = 1 => Контрольная сумма не верная"; break;

case 0: cout << "Бит 6 = 0 => Контрольная сумма верна";

}

cout << endl << "--------" << endl;

cout << "Байт 10h содержит информацию о типе НГМД" << endl

<< "Содержимое байта - " << cmos[0x10] << endl << endl;

switch (cmos[0x10] & 0xf)

{

case 0: cout << "Биты 3210 = 0000 => Первый НГМД высокой вместимости"; break;

case 1: cout << "Биты 3210 = 0001 => Первый НГМД на 360К"; break;

case 4: cout << "Биты 3210 = 0100 => Первый НГМД отсутствует";

}

cout << endl;

switch ((cmos[0x10] >> 4) & 0xf)

{

case 0: cout << "Биты 3210 = 0000 => Второй НГМД высокой вместимости"; break;

case 1: cout << "Биты 3210 = 0001 => Второй НГМД на 360К"; break

Похожие материалы

Информация о работе

Тип:
Отчеты по лабораторным работам
Размер файла:
197 Kb
Скачали:
0