Министерство образования и науки Российской Федерации
Федеральное агентство по образованию
Государственное образовательное учреждение
высшего профессионального образования
«Комсомольский-на-Амуре государственный
технический университет»
Факультет компьютерных технологий
Кафедра «МОП ЭВМ»
ЛАБОРАТОРНАЯ РАБОТА 2
по курсу «ОСРР»
Студент группы 4ВС-1 Неделько Н.И
Преподаватель: Трещев И.А.
Комсомольск-на-Амуре
2006
Тема: «Исследование памяти ПВЭМ»
Цель работы: Изучить структуру памяти ПВЭМ
Задание: 1. Изучить структуру и порядок программирования CMOS памяти персональной ПЭВМ и написать модуль, читающий и расшифровывающий все данные CMOS памяти ПЭВМ;
2. Изучить структуру ОЗУ ПЭВМ (в ОС реального режима), разобрать понятия CMA, UMA, HMA, EMA, XMA, EMS, XMS, UMB. Исследовать оперативную память компьютера в ОС реального режима с помощью системных утилит MEM, MSD, программ CHECIT, SI и составить сравнительную таблицу показаний этих программ по всем видам памяти ПЭВМ;
3. Изучить технологию выделения блоков памяти ОС реального режима при загрузке и выполнении программ и исследовать ( с помощью отладчика или написанного собственноручно модуля) цепочку MCB в памяти ПЭВМ.
Алгоритм работы программы
Для просмотра распределения памяти необходимо открыть отладчик TD.EXE и напечатать команду mov ah,52h
int 21 h
После этого переходим в окно данных и переходим в ES:BX, поднимаемся на 2 байта назад. Там храниться информация о первом адресе. Следующий адрес вычисляется сложением первого адреса, 1 параграфа и размера.
Чтение блоков памяти MCB
Запускаем Turbo Debugger и выполняем следующие команды:
mov ah, 52h
int 21h
и переходим в окне дампа по адресу ES:BX (см. рис. 1.).
Рис. 1.
Отнимем 2 байта и получим адрес 0C 02 - адрес 1-го блока памяти (см. рис. 2.).
Рис. 2.
Перейдем по адресу 020Ch:0000h (см. рис. 3.).
Рис. 3.
Чтобы перейти на следующий блок, необходимо к смещению 1-го блока прибавить 1 и размер (4 и 5 байты): 020С + 1 + 0529 = 0736. 0736 – адрес 2-го блока (см. рис. 4.).
Рис. 4.
Адрес 3-го блока равен: 0736 + 1 + 00B5 = 07EC (см. рис. 5.).
Рис. 5.
Адрес 4-го блока равен: 07EC + 1 + 0007 = 07F4 (см. рис. 6.).
Рис. 6.
Адрес 5-го блока равен: 07F4 + 1 + 0042 = 0837 (см. рис. 7.).
Рис. 7.
Адрес 6-го блока равен: 0837 + 1 + 0034 = 086C (см. рис. 8.).
Рис. 8.
Адрес 7-го блока равен: 086C + 1 + 001D = 088A (см. рис. 9.).
Рис. 9.
Адрес 8-го блока равен: 088A + 1 + 00A7 = 0932 (см. рис. 10.).
Рис. 10.
Адрес 9-го блока равен: 0932 + 1 + 087A = 11AD (см. рис. 11.).
Рис. 11.
Адрес 10-го блока равен: 11AD + 1 + 0008 = 11B6 (см. рис. 12.).
Рис. 12.
Адрес 11-го блока равен: 11B6 + 1 + 0035 = 11EC (см. рис. 13.).
Рис. 13.
Адрес 12-го блока равен: 11EC + 1 + 017D = 0136A (см. рис. 14.).
Рис. 14.
Адрес 13-го блока равен: 136A + 1 + 4700 = 5A6B (см. рис. 15.).
Рис. 15.
Адрес 14-го блока равен: 5A6B + 1 + 1000 = 6A6C (см. рис. 16.).
Рис. 16.
Последний блок.
Утилита mem.exe(см. рис. 17.).
Рис. 17.
Sysinfo.exe(см. рис. 18.).
Рис .18.
Chekit(см. рис. 19.).
Рис .19.
Размер памяти в Кб |
||||||
Программа |
CMA |
UMA |
HMA |
XMA |
EMS |
XMS |
MEM |
638К |
0 |
64К |
30656 |
30976К |
30656К |
MSD |
638К |
0 |
64К |
31744К |
30976К |
5552К |
SI |
638К |
0 |
64К |
31744К |
30976К |
31744К |
CHECIT |
640К |
0 |
64К |
31744К |
30976К |
31744К |
Программа, читающая CMOS память
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#define byte unsigned char
char *d[7] = {"Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг",
"Пятница", "Суббота"};
char *m[12] = {"Января", "Февраля", "Марта", "Апреля", "Мая", "Июня",
"Июля", "Августа", "Сентября", "Октября", "Ноября", "Декабря"};
char *yn[2] = {"Да", "Нет"};
int fb(int x)
{ return (int)(x%16+x/16*10); }
int cb(int b, int bit, int kol)
{ int i, sbit = 0;
int m[8]={1, 2, 4, 8, 16, 32, 64, 128};
for (i = bit; i<(bit+kol); i++)
sbit += m[i];
return (b&sbit)>>bit;
}
void main()
{byte cs[64];
int i, j;
for (i = 0; i<64; i++)
{ outp(0x70, i);
cs[i] = inp(0x71);
}
//---------clrscr();
cout<<"Лабораторная работа №2: Сведения CMOS"<<endl;
cout<<"Часы реального времени (00h-0Dh):"<<endl;
printf("Время: %d:%d:%d\n", fb(cs[4]), fb(cs[2]), fb(cs[0]));
printf("Дата: %s %d %s %d года\n", d[fb(cs[6])-1], fb(cs[7]), m[fb(cs[8])-1], fb(cs[0x32])*100+fb(cs[9]));
printf("Жесткий диск есть: %s\n", yn[1-cb(cs[0x0E], 3, 1)]);
printf("Бартарея CMOS исправна: %s\n", yn[cb(cs[0x0E], 7, 1)]);
getch();
Результаты работы программы
Список использованных источников
1. Фролов А.В., Фролов Г.В. Библиотека системного программиста. Т. 1. Часть 1, 2, 3. Операционная система MS-DOS. М: ДИАЛОГ-МИФИ, 1991, 1993
2. Фролов А.В., Фролов Г.В. Библиотека системного программиста. Т. 2. Аппаратное обеспечение IBM PC. Часть 1, 2. М: ДИАЛОГ-МИФИ, 1992
3. Фролов А.В., Фролов Г.В. Библиотека системного программиста. Т. 6. Защищенный режим процессоров Intel 80286/80386/80486. М: ДИАЛОГ-МИФИ, 1993
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.