Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР И ПР.rtf
Скачиваний:
136
Добавлен:
11.04.2015
Размер:
5.69 Mб
Скачать

Практическая работа №4

Архитектура ЭВМ и вычислительных систем

Тема: CMOS - память компьютера

Цель работы: Познакомится с основными принципами работы с CMOS

Средства: Турбо Си+

Литература: Айден К., Колесниченко О. Аппаратные средства PC. 2-е издание. – СПб.: BHV-Санкт-Петербург, 1998

Краткие теоретические сведения:

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

Адрес ячейки Содержимое

00h - 0Dh +

Используются часами реального времени

0Eh Байт состояния диагностики при включении питания

0Fh Байт состояния отключения

10h Тип используемого НГМД

11h Зарезервировано

12h Тип НМД (если тип меньше 15)

13h Зарезервировано

14h Конфигурация оборудования

15h - 16h Объем основной памяти

17h - 18h Объем расширенной (extended) памяти

19h Тип первого НМД (если тип > 15)

1Ah Тип второго НМД (если тип > 15)

1Bh - 20h Зарезервировано

21h - 2Dh Зарезервировано

2Eh - 2Fh Контрольная сумма ячеек 10h - 20h

30h - 31h Объем расширенной (extended) памяти

32h Текущее столетие в двоично-десятичном

коде (19h для 19-го столетия)

33h Различная информация

34h - 3Fh Зарезервировано

Программа для чтения содержимого CMOS-памяти:

#include <stdio.h>

#include <stdlib.h>

main()

{

unsigned char cmos[164];

int i;

printf("\n*Чтение из CMOS* ©Фролов A. 1991\n\n");

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

{

outp(0x70,i);

cmos[i]=inp(0x71);

}

printf("\nЯчейки часов реального времени: ");

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

{

printf("%02.2x ",(unsigned)cmos[i]);

}

printf("\nБайт диагностики: %02.2x",cmos[0xe]);

printf("\nБайт отключения: %02.2x\n",cmos[0xf]);

printf("\nPassword : ");

for(i=0x34; i < 0x40; i++)

{

printf("%02.2x ",(unsigned)cmos[i]);

}

cmos[0x40]=0;

printf(">%s<\n",&cmos[0x34]);

return 0;

}

Задание: Написать программу чтения содержимого CMOS-памяти.

Порядок выполнения работы:

  1. Ввести и откомпилировать приведенную выше программу.

  2. Прокомментировать каждое предложение программы

Контрольные вопросы:

    1. Назначение CMOS-памяти

    2. Как осуществляется питание CMOS-памяти в современных ПК?

    3. По какому адресу находится текущее столетие в двоично-десятичном коде?

Практическая работа №5

Архитектура ЭВМ и вычислительных систем

Тема: Базовая система ввода/вывода BIOS

Цель работы: Познакомится с основными принципами работы с BIOS

Средства: Турбо Си+

Литература: Айден К., Колесниченко О. Аппаратные средства PC. 2-е издание. – СПб.: BHV-Санкт-Петербург, 1998

Краткие теоретические сведения:

Проверка состава оборудования

В программе, предназначенной для тиражирования, очень важной характеристикой является переносимость. Поскольку ПЭВМ разных пользователей могут иметь существенные отличия в конфигурации оборудования, важно, чтобы программа при ее запуске могла "произвести рекогносцировку" - проанализировать состав оборудования и выбрать ту ветвь своего алгоритма, которая обеспечивает функционирование на данном составе, или выдать отказ, если конфигурация не соответствует спецификациям.К действиям по рекогносцировке относятся:

  • определение типа ПЭВМ;

  • определение конфигурации подключенных внешних устройств;

  • определение объема ОЗУ;

  • определение версии DOS (хотя последняя проверка и не связана с оборудованием, логически ее место здесь).

Тип ПЭВМ

В конце ПЗУ BIOS по адресу FF00:0FFE записан байт типа ПЭВМ. Специфицированы следующие 4 значения этого байта для машин фирмы IBM: 0xFF - IBM PC; 0xFE - XT; 0xFD - PCjr; 0xFC - AT. Для ПЭВМ других производителей все наши эксперименты давали один из этих кодов в соответствии с классом компьютера, однако, стопроцентной гарантии этого дать нельзя.

Кроме того, 8 байт ПЗУ начиная с адреса 0xFF00:0x0FF5, содержат дату выпуска данной версии BIOS в символьном виде, например: 01/01/84. Эта информация может быть полезна только для пользователей продукции IBM, в условиях же калейдоскопа фирм-производителей пользу из этих данных извлечь трудно (мы встречали даже ПЭВМ, в которых дата выпуска BIOS отсутствовала вообще). Приведенная ниже программа извлекает из ПЗУ тип ПЭВМ и дату выпуска BIOS (пример 2.).

/*== ПРИМЕР 1 ==*/

/*======== Чтение типа ПЭВМ и даты издания BIOS =========*/

#include <dos.h>

main() {

unsigned char pc; /* Код типа PC */

char *PT[]= { "AT", "PCjr", "XT", "IBM PC", "???" };

unsigned int t; /* Текущее смещение */

printf("\nТип ПЭВМ = %x = ",pc=peekb(0xf000,0xfffe));

if ((pc-=0xfc)>4) pc=4;

printf("%s\n",PT[pc]);

printf("Дата издания BIOS = ");

for (t=0xfff5;t<0xfffd;t++) printf("%c",peekb(0xf000,t));

printf("\n");

}

Состав оборудования

Опеределять состав оборудования следует только после того, как мы определили тип ПЭВМ. Это обусловлено тем, что способы получения информации о составе оборудования различны для XT и для AT. Рассмотрим сначала машины класса XT.

Состав оборудования XT (и PC) определяется положением переключателей на специальных колодках. Состояние этих переключателей может быть прочитано из программы обращением к порту 0x60. Но необходимости в этом нет - эту операцию выполняет BIOS при инициализации системы. На основании этой информации BIOS формирует так называемый список оборудования - 2-байтное слово по адресу 0040:0010. Прочитать это слово можно либо обратившись по указанному адресу, либо обратившись к BIOS через прерывание 0x11. Назначения разрядов списка оборудования следующие:

0

- установлен в 1, если есть НГМД (см.разряды 6, 7);

1

- установлен в 1, если есть сопроцессор;

2,3

- число 16-Кбайтных блоков ОЗУ на системной плате;

4,5

- код видеоадаптера: 11 - MDA, 10 - CGA, 80 колонок, 01 - CGA, 40 колонок, 00 - другой;

6,7

- число НГМД-1 (если в разряде 0 единица);

8

- 0, если установлен канал ПДП;

9,10,11

- число последовательных портов RS-232;

12

- 1, если установлен джойстик;

13

- 1, если установлен последовательный принтер;

14,15

- число параллельных принтеров.

Для XT и AT биты 8 и 13 всегда будут нулевыми.

Ниже приведен пример получения и интерпретации списка оборудования.

/*= ПРИМЕР 2 =*/

/*============= Получение списка оборудования ============*/

#include <dos.h>

main()

{

union REGS rr;

unsigned int d; /* список оборудования */

int i;

/*== Чтение байта обоpудования через прерывание 0x11 ==*/

/* Прерывание 0x11 возвращает его в регистре AX */

int86(0x11,&rr,&rr);

/* Побитная распечатка списка оборудования */

printf

("Список активного оборудования из прерывания 11 - ");

for (i=15; i>=0; printf("%d",(rr.x.ax>>i--)&0x01));

printf(" (%04x)\n",rr.x.ax);

/* == Чтение байта обоpудования из памяти BIOS == */

/* Будет получено то же самое */

d=peek(0x40,0x10);

printf

("Список активного оборудования из памяти BIOS - ");

for (i=15; i>=0; printf("%d",(d>>i--)&0x01));

printf(" (%04x)\n",d);

/* == Раскодирование списка обоpудования == */

printf(" Дисководов ГМД - ");

if (d&0x0001) printf("%d\n",((d&0x00c0)>>6)+1);

else printf("нет\n");

printf(" Сопроцессор 8087 - ");

if (d&0x0002) printf("есть\n");

else printf("нет\n");

printf(" Тип дисплейного адаптера - ");

switch (d&0x0030) {

case 0: printf("EGA/VGA"); break;

case 0x10: printf("CGA,40-кол"); break;

case 0x20: printf("CGA,80-кол"); break;

case 0x30: printf("MDA"); break;

}

printf(" (неточно)\n");

printf(" Первичный блок памяти - ");

switch (d&0x000c) {

case 0: printf("16 Кбайт\n"); break;

case 4: printf("32 Кбайт\n"); break;

case 8: printf("48 Кбайт\n"); break;

case 12: printf("64 Кбайт или больше\n"); break;

}

printf(" Портов RS232 - %d\n",(d&0x0e00)>>9);

printf(" Джойстик - ");

if (d&0x1000) printf("есть\n");

else printf("нет\n");

printf(" Принтеров - %d\n",(d&0xe000)>>14);

}

Определение объема оперативной памяти

Методика определения объема памяти - такая же, как и определения списка оборудования. Объем ОЗУ (в Кбайтах) находится в области памяти BIOS по адресу 0040:0013 (2-байтное слово) и может быть получен при помощи прерывания 0x12, как это показано в следующем примере.

/*== ПРИМЕР 3 ==*/

/*======== Определение объема оперативной памяти =========*/

#include <dos.h>

main()

{

union REGS rr;

/* Прерывание 0x12 возвращает его в регистре AX */

int86(0x12,&rr,&rr);

printf("Объем памяти по прерыванию 12 - %d Кбайт\n",

rr.x.ax);

/* То же число можно получить чтением из 0040:0012 */

printf("Объем памяти из данных BIOS - %d Кбайт\n",

peek(0x40,0x13));

}

Для AT объем ОЗУ может быть также прочитан из регистров 0x15 (младший байт) и 0x16 (старший байт) CMOS-памяти. Кроме того, в AT может быть еще и расширенная (extended) память сверх 1 Мбайта (в AT она используется только для виртуальных дисков). Ее объем можно получить из регистров 0x17 (младший байт) и 0x18 (старший байт), или из регистров 0x30 (младший байт) и 0x31 (старший байт) или по функции 0x88 прерывания 0 x15.

/*== ПРИМЕР 4 ==*/

/*======= Определение характеристик памяти для AT ========*/

#include <dos.h>

union REGS rr;

main() {

unsigned char f, f1;

printf("Объем основной памяти - ");

outportb(0x70,0x15); f=inportb(0x71);

outportb(0x70,0x16); f1=inportb(0x71);

printf("%d Кбайт\n",(f1<<8)|f);

printf("Объем extended памяти - ");

outportb(0x70,0x17); f=inportb(0x71);

outportb(0x70,0x18); f1=inportb(0x71);

printf("%d Кбайт\n",(f1<<8)|f);

printf("Объем extended памяти - ");

outportb(0x70,0x30); f=inportb(0x71);

outportb(0x70,0x31); f1=inportb(0x71);

printf("%d Кбайт\n",(f1<<8)|f);

printf("Объем extended памяти - ");

rr.h.ah=0x88;

int86(0x15,&rr,&rr);

printf("%d Кбайт\n",rr.x.ax);

}

}

Определение версии DOS

Эта операция необходима, так как средства и структуры данных DOS могут существенно меняться от версии к версии. Функция DOS 0x30 возвращает в регистре AL старшее число номера версии, а в AH - младшее число.

/*== ПРИМЕР 5 ==*/

/*================ Определение версии DOS ================*/

#include <dos.h>

union REGS rr;

main() {

rr.h.ah=0x30;

intdos(&rr,&rr);

printf("Версия MS-DOS %d.%d\n",rr.h.al,rr.h.ah);

}

Задание: Составить программу проверки состава оборудования ПК

Порядок выполнения работы:

  1. Ввести и откомпилировать приведенную выше программу.

  2. Прокомментировать каждое предложение программы

Контрольные вопросы:

  1. Назначение BIOS

  2. По какому адресу BIOS формирует список оборудования ПК?

  3. Как определить тип ПК?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]