Министерство образования и науки Российской Федерации
Федеральное агентство по образованию
Государственное образовательное учреждение высшего профессионального образования
«Комсомольский-на-Амуре государственный технический университет»
Факультет Компьютерных технологий
Кафедра математического обеспечения и применения ЭВМ
По курсу «ОСРР»
Выполнил студент группы Казаков М.Ю.
Преподаватель Трещев И.А.
Вариант: 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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.