Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
54
Добавлен:
03.06.2014
Размер:
2.63 Mб
Скачать

ПрограммаCmosshow

Программа CMOSSHOW читает в массив первые 64 ячейки памяти CMOS и отображает содержимое некоторых из них:

CMOS Show (C)A. Frolov, 1997

RTC: 22 00 30 00 17 00 03 19 08 97 a6 02 00

Diagnostics byte: 08

Shutdown byte: 00

Reserved: 00 00 00 00 00 00 00 00 00 00 00 00

Extended RAM: 16384 Kbyte

Отображаются ячейки часов реального времени RTC, о которых мы расскажем позже в отдельной главе, диагностический байт и байт отключения, зарезервированные байты. Кроме того, на основании информации, хранящейся в ячейках 17hи18h программа вычисляет размер расширенной памяти, установленной в компьютере.

Исходный текст программы CMOSSHOW вы найдете в листинге 1.3.

Листинг 1.3. Файлcmosshow\cmosshow.c

// =====================================================

// Чтение и отображение ячеек памяти CMOS

//

// (C) Фролов А.В, 1997

//

// E-mail: frolov@glas.apc.org

// WWW: http://www.glasnet.ru/~frolov

// или

// http://www.dials.ccas.ru/frolov

// =====================================================

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

int main()

{

unsigned char cmos[64];

int i;

unsigned long nExtRam;

printf("\nCMOS Show (C)A. Frolov, 1997\n\n");

// Читаем 64 ячейки CMOS-памяти в массив cmos

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

{

outp(0x70,i);

cmos[i]=inp(0x71);

}

// Отображаем ячейки часов реального времени

printf("\nRTC: ");

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

{

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

}

// Отображаем состояние байта диагностики

// после включения питания

printf("\nDiagnostics byte: %02.2x",cmos[0xe]);

// Отображаем содержимое байта отключения

printf("\nShutdown byte: %02.2x\n",cmos[0xf]);

// Отображаем содержимое зарезервированных ячеек

printf("Reserved: ");

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

{

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

}

// Вычисляем объем расширенной памяти и отображаем

// его на консоли

nExtRam = ((unsigned long)cmos[0x18] << 8) + cmos[0x17];

printf("\nExtended RAM: %ld Kbyte\n", nExtRam);

getch();

return 0;

}

Определение типа центрального процессора

В некоторых случаях эффективность работы программы можно заметно повысить, если использовать команды новых моделей процессоровPentium, такие как, например, командыMMX. На сервереIntel с адресомhttp://www.intel.com вы найдете исчерпывающую информацию о том, как распознать различные модели процессоров, созданных этой фирмой. В нашей книге мы рассмотрим упрощенную методику, которая, тем не менее, может быть использована в большинстве случаев.

МоделиIntel 8086/8088

Способ распознавания процессоров Intel 8086/8088 основан на том факте, что биты 12-15 регистраFLAGS всегда установлены в единицу.

Прежде всего программа записывает текущее содержимое регистра FLAGS в регистрAX. Для этого используется стек:

pushf

pop ax

Первоначальное содержимое регистра FLAGS сохраняется в регистре CX:

mov cx, ax

Далее программа пытается записать нулевые значения в биты 12-15 регистра FLAGS:

and ax, 0fffh

push ax

popf

Теперь нужно проверить, изменилось ли содержимое указанных битов регистра FLAGS. Для этого новое содержимое регистраFLAGS записывается через стек в регистрAX, а затем, после наложения маски 0f000h, сравнивается со значением 0f000h:

pushf

pop ax

and ax, 0f000h

cmp ax, 0f000h

je is_8086

Если биты 12-15 остались установленными в единичное значение, программа работает на процессоре Intel 8086/8088, если нет – в компьютере установлена более старшая модель процессора.

Соседние файлы в папке несколько программ