ПрограммаCpuinfo
Программа CPUINFO определяет модель и характеристики процессора, пользуясь только что описанной нами методикой. Полученная информация выводится на консоль в следующем виде (для процессораPentium Pro):
*CPU Information*, (C) A. Frolov, 1997
CPU model: 5
Vendor ID: GenuineIntel
CPU Signature 00000619
CPU Feature EDX 0000F9FF
CPU type: 0
CPU family: 6
CPU model: 1
CPU stepping: 9
FPU detected
В листинге 1.4 вы найдете исходный текст модуля, составленного на языке ассемблера. В этом модуле определены все функции, необходимые для распознавания процессора и получения его характеристик.
Листинг 1.4. Файлcpuinfo\askcpu.asm
; =====================================================
; Get CPU information
;
; (C) A. Frolov, 1997
;
; E-mail: frolov@glas.apc.org
; WWW: http://www.glasnet.ru/~frolov
; or
; http://www.dials.ccas.ru/frolov
; =====================================================
.model small
CPU_ID MACRO
db 0fh
db 0a2h
ENDM
.stack 100h
.data
public _vendor_id_msg
public _cpu_model
public _cpu_signature
public _features_ecx
public _features_edx
public _features_ebx
public _get_cpu_model
_vendor_id_msg db "............", 0dh, 0ah, "$"
_cpu_model db 0
_cpu_signature dd 0
_features_ecx dd 0
_features_edx dd 0
_features_ebx dd 0
.code
; ============================================
; _get_cpu_model
; ============================================
.8086
_get_cpu_model proc
call cpu_8086
cmp ax, 0
jz try_80286
mov _cpu_model, 0
jmp end_of_detect
try_80286:
call cpu_80286
cmp ax, 0
jz try_80386
mov _cpu_model, 2
jmp end_of_detect
try_80386:
call cpu_80386
cmp ax, 0
jz try_80486
mov _cpu_model, 3
jmp end_of_detect
try_80486:
call cpu_80486
cmp ax, 0
jz Pent_CPU
mov _cpu_model, 4
jmp end_of_detect
Pent_CPU:
mov _cpu_model, 5
.386
pusha
mov eax, 00h
CPU_ID
mov dword ptr _vendor_id_msg, ebx
mov dword ptr _vendor_id_msg[+4], edx
mov dword ptr _vendor_id_msg[+8], ecx
cmp eax, 1
jl end_of_detect
mov eax, 1
CPU_ID
mov _cpu_signature, eax
mov _features_ebx, ebx
mov _features_edx, edx
mov _features_ecx, ecx
popa
end_of_detect:
.8086
ret
_get_cpu_model endp
; ============================================
; cpu_8086
; ============================================
cpu_8086 proc
pushf
pop ax
mov cx, ax
and ax, 0fffh
push ax
popf
pushf
pop ax
and ax, 0f000h
cmp ax, 0f000h
je is_8086
mov ax, 0
ret
is_8086:
mov ax, 1
ret
cpu_8086 endp
; ============================================
; cpu_80286
; ============================================
.286
cpu_80286 proc
mov ax, 0f000h
push ax
popf
pushf
pop ax
and ax, 0f000h
jz is_80286
mov ax, 0
ret
is_80286:
mov ax, 1
ret
cpu_80286 endp
; ============================================
; cpu_80386
; ============================================
.386
cpu_80386 proc
pushfd
pop eax
mov ecx, eax
xor eax, 40000h
push eax
popfd
pushfd
pop eax
xor eax, ecx
jz is_80386
mov ax, 0
ret
is_80386:
push ecx
popfd
mov ax, 1
ret
cpu_80386 endp
; ============================================
; cpu_80486
; ============================================
cpu_80486 proc
pushfd
pop eax
mov ecx, eax
xor eax, 200000h
push eax
popfd
pushfd
pop eax
xor eax, ecx
je is_80486
mov ax, 0
ret
is_80486:
mov ax, 1
ret
cpu_80486 endp
end
Данный файл был оттранслирован при помощи пакетного файла, представленного в листинге 1.5.
Листинг 1.5. Файлcpuinfo\mk.bat
masm /Zi askcpu.asm,,,,
Главный файл программы приведен в листинге 1.6.
Листинг 1.6. Файлcpuinfo\cpuinfo.c
// =====================================================
// Определение типа процессора
//
// (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>
#include <memory.h>
extern void GET_CPU_MODEL(void);
extern char VENDOR_ID_MSG[12];
extern char CPU_MODEL;
extern long CPU_SIGNATURE;
extern long FEATURES_ECX;
extern long FEATURES_EDX;
extern long FEATURES_EBX;
int main(void)
{
char buf[128];
printf("*CPU Information*, (C) A. Frolov, 1997\n\n");
GET_CPU_MODEL();
printf("CPU model: %d\n", (unsigned)CPU_MODEL);
if(CPU_MODEL >= 5)
{
memcpy(buf, VENDOR_ID_MSG, 12);
buf[12] = 0;
printf("Vendor ID: %s\n\n", buf);
printf("CPU Signature %08.8X\n", CPU_SIGNATURE);
printf("CPU Feature EDX %08.8X\n\n", FEATURES_EDX);
printf("CPU type: %d\n",
(CPU_SIGNATURE & 0x3000) >> 12);
printf("CPU family: %d\n",
(CPU_SIGNATURE & 0xF00) >> 8);
printf("CPU model: %d\n",
(CPU_SIGNATURE & 0xF0) >> 4);
printf("CPU stepping: %d\n\n", CPU_SIGNATURE & 0xF);
if(FEATURES_EDX & 0x1)
printf("FPU detected\n");
if(FEATURES_EDX & 0x800000)
printf("MMX supported\n");
}
getch();
return 0;
}
- Аннотация
- Введение
- Благодарности
- Авторский компакт-диск
- Как связаться с авторами
- 1 Определение конфигурации компьютера
- Определение конфигурации с помощьюBios
- Наличие нмд
- Наличие арифметического сопроцессора
- Начальный режим работы видеоадаптера
- Стандартная оперативная память
- Расширенная оперативная память
- ПрограммаHdwcfg
- Код модели компьютера и версияBios
- ПрограммаBiosinfo
- Конфигурация в памяти cmos
- 00H - 0Dh - область часов реального времени
- 0Eh - байт диагностики
- 0Fh - байт отключения
- 10H - тип накопителей нгмд
- 11H - зарезервировано дляIbm pc/at, тип нмд дляIbm ps/2
- 12H - тип первого и второго нмд
- 13H - зарезервировано
- 14H - конфигурация оборудования
- 15H-16h - объем стандартной оперативной памяти
- ПрограммаCmosshow
- Определение типа центрального процессора
- МоделиIntel 8086/8088
- Модель Intel 80286
- МодельIntel 80386
- МодельIntel 80486
- Команда cpuid
- ПрограммаCpuinfo
- 2 Клавиатура
- Как работает клавиатура
- Клавиатурная матрица
- Скан-код клавиши
- КодAscii нажатой клавиши
- Режим автоповтора
- Типы клавиатур
- Порты для работы с клавиатурой
- КомпьютерIbm pc/xt
- Современные компьютеры
- ПрограммаKbdled
- Аппаратное прерывание клавиатуры
- Стандартный обработчик прерывания int 09h
- Буфер клавиатуры
- Переключающие клавиши
- Средства bios для работы с клавиатурой
- Чтение символа с ожиданием
- ПрограммаKbdscan
- Проверка буфера на наличие в нем символов
- ПрограммаChkbuf
- Получение состояния переключающих клавиш
- Установка временных характеристик клавиатуры
- Запись символов в буфер клавиатуры
- Чтение символа с ожиданием для 101-клавишной клавиатуры
- Проверка буфера на наличие в нем символов для 101-клавишной клавиатуры
- Получение состояния переключающих клавиш для 101-клавишной клавиатуры
- Режимы работы клавиатуры
- Сравнение режимов
- Изменение режима
- Средства ms-dos для работы с клавиатурой
- Буферизованный ввод с эхо-выводом
- Буферизованный ввод без эхо-вывода
- Нефильтрованный ввод без эхо-вывода
- Вводс консоли и вывод на консоль
- Ввод строки символов
- Проверка состояния стандартного ввода
- Сброс буфера клавиатуры
- Клавиатурные функции стандартной библиотеки c
- Функции getch и getche
- ПрограммаKbdascii
- Функцияkbhit
- ПрограммаKbdhit
- Функция cgets
- Функция gets
- Функция scanf
- Как устроена мышь?
- Драйверы мыши в ms-dos
- Прерывание для обслуживания мыши
- Инициализация мыши
- Включить курсор мыши
- Выключить курсор мыши
- ПрограммаMscursor
- Определить положение курсора
- ПрограммаMsgcurs
- Установить курсор
- Определить положение курсора при нажатии клавиши
- Определить положение курсора при отпускании клавиши
- Задать диапазон движения курсора по горизонтали
- Задать диапазон движения курсора по вертикали
- Задать форму курсора в графическом режиме
- ПрограммаMsgform
- Задать форму курсора в текстовом режиме
- ПрограммаMstform
- Определить содержимое счетчиков перемещения
- Установить драйвер событий
- ПрограммаMsdriver
- Включить эмуляцию светового пера
- Выключить эмуляцию светового пера
- Задать скорость перемещения курсора мыши
- Установить область исключения для курсора
- Задать увеличенный графический курсор
- Определить порог удвоения скорости
- Заменить драйвер событий
- Определить размер буфера состояния драйвера
- Сохранить состояние драйвера
- Восстановить состояние драйвера
- Установить альтернативный драйвер событий
- Получить адрес альтернативного драйвера событий
- Установить чувствительность мыши
- Определить чувствительность мыши
- Установить частоту прерываний для Inport Mouse
- Установить номер страницы видеопамяти
- Определить номер страницы видеопамяти
- Отключить драйвер мыши
- Восстановить драйвер мыши
- Сбросить драйвер мыши
- Определить тип мыши
- МышьMicrosoft IntelliMouse
- Проверка наличия мыши Microsoft IntelliMouse
- Проверка в среде Microsoft Windows 95 и Microsoft Windows nt версии 3.51
- Проверка в среде Microsoft Windows nt версии 4.0
- Определение величины свертки
- Определение величины свертки в среде Microsoft Windows 95 и Microsoft Windows nt версии 3.51
- Определение величины свертки в среде Microsoft Windows nt версии 4.0
- Сообщение msh_mousewheel
- Сообщение wm_mousewheel
- Другие сообщения от мыши Microsoft IntelliMouse
- ПриложениеRtfpad
- 4 Часы реального времени
- Регистры часов реального времени
- Регистры счетчиков
- Регистр состоянияA
- Регистр состояния b
- Регистр состояния c
- Регистр состояния d
- Прерывание от часов реального времени
- Функции прерыванияInt 1Ah
- Сброс будильника
- ПрограммаRtcalarm
- 5 Системный таймер
- Обработка прерываний таймера
- Микросхемы таймера 8253 и 8254
- Режимы работы таймера
- Режим однократного выполнения функций
- Работа с перезапуском
- Формат управляющего регистра
- Формат команды чтения слова состояния канала
- Формат слова состояния канала
- Последовательность действий
- ПрограммаTimerst
- Средства bios для работы с таймером
- Чтение счетчика таймера
- Установка счетчика таймера
- Установка таймера с сигнализацией
- Формирование задержки
- Второй способ проигрывания музыки
- Проигрывание музыки в фоновом режиме
- ПрограммаTmsound
- ПрограммаIosound
- ПрограммаRandom
- 6 Асинхронный последовательный адаптер
- Основные понятия и термины
- Аппаратная реализация
- МикросхемаUart
- Разъемы адаптера
- Порты асинхронного адаптера
- Порт 3f8h
- Порт 3f9h
- Порт 3fAh
- Порт 3fBh
- Порт 3fCh
- Порт 3fDh
- Порт 3fEh
- Функции bios для работы с последовательным асинхронным адаптером
- Инииализация портов асинхронного адаптера
- Передача байта
- Прием байта
- Определение состояния асинхронного адаптера
- Программирование асинхронного адаптера
- Инициализация асинхронного адаптера
- Передача данных
- Прием данных
- ПрограммаComtest
- Использование прерываний
- 7 Параллельный адаптер
- Порты параллельного адаптера
- Порт 378h
- Порт 37Ah
- Порт 379h
- Разъем параллельного адаптера
- Вывод байта на принтер через параллельный адаптер
- Функции bios для работы с принтером
- Печать символа
- Инициализация принтера
- Определение состояния принтера
- ПрограммаPrintfl
- Функции ms-dos для работы с принтером
- ФункцияMs-dos для вывода на принтер
- Система буферизованной печати
- Проверка установки системы буферизованной печати
- Запуск процесса печати файла
- Отмена печати файла
- Отмена печати всех файлов
- Определение состояния и блокировка системы буферизованной печати
- Разблокирование системы буферизованной печати
- Коды ошибок
- Программирование принтера
- Подключение принтера к компьютеру
- Установка переключателей конфигурации
- Программирование режимов работы принтера
- Инициализация принтера
- Контроллер прямого доступа ibm pc/xt
- Регистры каналов dma
- Порты 00h - 07h
- Порт 08h
- Порт 09h
- Порт 0Ah
- Порт 0Bh
- Порт 0Ch
- Порт 0Dh
- Порт 0Eh
- Порт 0Fh
- Порты 81h-8Fh
- Инициализация канала dma
- Контроллер прямого доступа ibm at
- Регистры каналовDma
- Регистры страниц
- Порты 0c0h - 0dFh
- Порты 0d0h-0dFh
- 9 Устройство чтения cd-rom
- Драйвер устройства чтенияCd-rom
- РасширениеMscdex
- ФункцииMscdex
- Определение количества устройствCd-rom
- Получение списка устройств cd-rom
- Получение имени файла прав собственности
- Получение имени файла резюме
- Получение имени файла библиографической документации
- Чтение сектора оглавления компакт-диска
- Чтение сектора по абсолютному адресу
- Проверка устройства чтения cd-rom
- Определение версии mscdex
- Определение обозначения устройств чтения cd-rom
- Вызов драйвера cd-rom
- Работа через драйверCd-rom
- Заголовок запроса
- Команды драйвера cd-rom
- Инициализация
- ЧтениеIoctl Input
- Определение адреса заголовка драйвера cd-rom
- Определение положения головки
- Получение информации о звуковых каналах
- Чтение данных из устройства
- Определение состояния устройства
- Определение размера сектора
- Определение размера тома
- Проверка замены носителя данных
- Получение информации о компакт-диске
- Получение информации о дорожкекомпакт-диска
- Получение информации о канале q
- Получение информации о подканале
- Получение штрих-кода изготовителя компакт-диска
- Сброс входных буферов
- ЗаписьIoctl Output
- Извлечение компакт-диска
- Блокирование и разблокирование компакт-диска в устройстве
- Сброс устройства чтения cd-rom
- Управление звуковыми каналами
- Запись в устройство управляющей строки
- Чтение длинное с предварительной выборкой
- Проигрывание звуковой дорожки
- Остановка проигрывания звуковой дорожки
- Возобновление проигрывания звуковой дорожки
- ПрограммаCdinfo
- ПрограммаCdplay
- 10 Арифметический сопроцессор
- Вещественные числа
- Целые числа
- Регистры сопроцессора
- Численные регистры
- Регистр тегов
- Регистр управления
- Регистр состояния
- Регистры указателя команды и указателя операнда
- Система команд сопроцессора
- Команды пересылки данных
- Запись в стек
- Извлечение из стека
- Копирование данных
- Загрузка констант
- Арифметические команды
- Команды сравнений чисел
- Трансцендентные команды
- Управляющие команды
- Программирование сопроцессора
- ПрограммаNpu1
- Обработка особых случаев
- Неточный результат
- Переполнение
- Антипереполнение
- Деление на нуль
- Недействительная операция
- Денормализованный операнд
- Ошибка в процессореPentium
- 11 Расширенная память
- Основные понятия
- Установка драйвера himem.Sys
- Спецификация xms
- Проверка подключения драйвера
- Получение адреса управляющей программы
- Описание функций драйвера himem.Sys
- Получить версию xms
- Запросить область hma
- Освободить область hma
- Глобальное открывание линии a20
- Глобальное закрывание линии a20
- Освободить блок emb
- Копирование блоков emb
- Блокирование emb
- Разблокирование emb
- Получить информацию об идентификаторе блока emb
- Изменить размер emb
- Запросить область umb
- Освободить область umb
- Коды ошибок
- Ограничения при использовании области hma
- Примеры программ
- ПрограммаTesthma
- ПрограммаCallhma
- Предметный указатель
- Литература
- Оглавление
- 1 Определение конфигурации компьютера 7
- 2 Клавиатура 38
- 3 Мышь 64
- 4 Часы реального времени 102
- 5 Системный таймер 113
- 6 Асинхронный последовательный адаптер 132
- 7 Параллельный адаптер 149
- 8 Контроллер прямого доступа к памяти 162
- 9 Устройство чтения cd-rom 170
- 10 Арифметический сопроцессор 216
- 11 Расширенная память 243