Помощь в написании студенческих работ
Антистрессовый сервис

Диагностика типа CPU и его производительности

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

Если команда CPUID не поддерживается — определить производителя и другие параметры процессора возможно только какими-либо недокументированными путями. Отличие процессоров, не поддерживающих CPUID (80 386, 80 486, и более старые), заключается в возможности изменить 18 бит в EFLAGS. Если этот бит доступен, значит процессор — 486 или выше. В том же EFLAGS нужно попробовать изменить бит ID (21), если… Читать ещё >

Диагностика типа CPU и его производительности (реферат, курсовая, диплом, контрольная)

Федеральное агентство по образованию

Брянский государственный технический университет Кафедра «Информатика и программное обеспечение»

Курсовая работа

по курсу

" Организация ЭВМ и систем"

Тема: " Диагностика типа CPU и его производительности"

Выполнил: студент гр.13-ИВТ2 Ларичев П.А.

Преподаватель: Конкин В.В.

Брянск 2014

  • 1. Аннотация
  • 2. Постановка задачи
  • 3. Алгоритм программы
  • 3.1 CPUID
  • 3.2 Тактовая частота
  • 4. Конструкторская часть
  • 4.1 Листинг программы
  • 5. Список литературы

1. Аннотация

Данная курсовая работа посвящена разработке программы на ассемблере для определения типа центрального процессора и его производительности.

Достаточно очевидно, что оптимально для одного процессора может не являться таковым для другого. Можно сделать несколько вариантов наиболее критичных участков кода программы, чтобы они выполнялись максимально быстро на любом процессоре. Однако может потребоваться определить, на каком процессоре программа выполняется в настоящий момент. Если в программе используются инструкции, которые не поддерживаются всеми процессорами (условные перемещения, FCOMI, инструкции MMX и XMM), то необходимо сначала проверить, поддерживает ли процессор данные инструкции.

2. Постановка задачи

Возможность программного определения типа процессора заложена в архитектуру 32-разрядных процессоров со времени их появления. В любом процессоре сразу после аппаратного сброса в регистре (E) DX можно прочитать номер семейства (3 — 386, 4 — 486, 5 — Pentium, 6 — P6.), модели, типа и степпинга.

Информация из (E) DX доступна только для BIOS в самом начале запуска машины (ее может считать тест POST). Поскольку BIOS ориентирован на процессоры одного поколения (семейства), проблем с различием использования регистра (E) DX не возникает. Потребность в идентификации процессора операционной системой и приложениями созревала по мере расширения диапазона функциональных возможностей и уровня производительности процессоров. Начиная с процессоров Pentium появилась новая инструкция CPUID, по которой любая программа на любом уровне привилегий в любой момент времени может получить ту же информацию, что и BIOS после сброса, и, вдобавок, 32-битный набор флагов расширений базовой архитектуры, реализованных в данном процессоре. Полученную информацию программа может использовать, например, для выбора исполняемого кода, оптимального для данного процессора (или отказа исполнения на «недостойном» ее процессоре), а также для настройки констант программных реализаций задержек. Инструкция CPUID была реализована и в ряде поздних моделей процессоров класса 486. Формат инструкции практически безгранично расширяем, с ее помощью процессор может выдавать хоть весь свой словесный портрет (если эту возможность заложат его разработчики). Однако информация для CPUID «зашивается» в процессор на этапе изготовления кристалла, что не позволяет, например, «выпытать» у процессора его официальную тактовую частоту (она определяется позже — на этапе тестирования уже готового процессора).

процессор тактовая частота алгоритм

3. Алгоритм программы

Определение любого существующего intel-совместимого процессора складывается из 3 основных этапов:

· Определение поддержки инструкции CPUID.

· Если она поддерживается — определение остальных параметров.

· Определение тактовой частоты.

3.1 CPUID

CPUID (CPU Identification) — ассемблерная мнемоника инструкции процессоров x86, используется для получения информации о процессоре. Используя её, программа может определить тип ЦП и его возможности (например, можно определить, какие расширения поддерживаются процессором).

Инструкция CPUID впервые появилась в процессорах i486. Потом она начала поддерживаться всеми процессорами начиная с Intel 486DX/SX/DX2 SL, AMD 486DX4, Cyrix 6×86 (M1), UMC U5S.

Код операции: 0F A2.

Если команда CPUID не поддерживается — определить производителя и другие параметры процессора возможно только какими-либо недокументированными путями. Отличие процессоров, не поддерживающих CPUID (80 386, 80 486, и более старые), заключается в возможности изменить 18 бит в EFLAGS. Если этот бит доступен, значит процессор — 486 или выше. В том же EFLAGS нужно попробовать изменить бит ID (21), если его можно программно изменить — процессор поддерживает инструкцию CPUID.

CPUID имеет параметр, который задается в регистре EAX. Обычно в ответ на вызов CPUID с EAX=0 процессор возвращает в ЕАХ максимальное Инструкция CPUID по содержимому регистра EAX определяет какого рода информацию о процессоре необходимо вернуть. Первый раз её следует вызывать со значением EAX = 0. При этом будет возвращено максимально допустимое значение параметра инструкции, поддерживаемое данным процессором.

Для того, чтобы получить информацию о дополнительных функциях, имеющихся в процессорах, в регистре EAX перед вызовом CPUID должен быть установлен бит 31. Например, чтобы определить максимально допустимое значение параметра для дополнительных функций, необходимо выполнить CPUID со значением EAX = 8 000 0000h.

При EAX = 0 ЦП возвращает идентификатор производителя процессора (англ. Vendor ID) в виде 12 символов ASCII, содержащихся в регистрах EBX, EDX, ECX (именно в таком порядке). В регистре EAX же возвращается максимально допустимое значение EAX при вызове CPUID.

ASCII строка

HEX-значения EBX: EDX: ECX

Производитель

" GenuineIntel"

756E6547: 49656E69: 6C65746E

Intel

" AuthenticAMD"

68 747 541: 69746E65: 444D4163

AMD

" CyrixInstead"

69 727 943: 736E4978: 64 616 574

Cyrix

" CentaurHauls"

746E6543: 48 727 561: 736C7561

Centaur

" SiS SiS SiS «

20 536 953: 20 536 953: 20 536 953

SiS

" NexGenDriven"

477 8654E: 72446E65: 6E657669

NexGen

" GenuineTMx86″

756E6547: 54656E69: 363 8784D

Transmeta

" RiseRiseRise"

65 736 952: 65 736 952: 65 736 952

Rise

" UMC UMC UMC «

20434D55: 20434D55: 20434D55

UMC

" Geode by NSC"

646F6547: 79 622 065: 43534E20

National Semiconductor

При вызове CPUID с EAX=1 в регистре EAX возвращается информация о типе, модели и степпинге (изменения в рамках одной модели) процессора. Эти значения расшифровываются по специальным таблицам.

EAX [00: 03] - степпинг (stepping)

EAX [07: 04] - модель (model) EAX [11: 08] - семейство (family) EAX [13: 12] - тип (type) EAX [15: 14] - резерв (reserved) EAX [19: 16] - расширенная модель (extended model) (только Pentium 4) EAX [23: 20] - расширенное семейство (extended family) (только Pentium 4) EAX [31: 24] - резерв (reserved)

Регистр EDX содержит информацию о различных расширениях архитектуры (если определенный бит равен 1 — расширение поддерживается). Ниже приведена таблица с битами EDX и соответствующими им расширениями.

Бит

Описание

Наличие сопроцессора

Расширение для режима V86, наличие флагов VIP и VIF в EFLAGS

Расширения отладки (останов по обращению к портам)

Возможности расширения размера страниц до 4Мб

Наличие счетчика меток реального времени (и инструкции RDTSC)

Поддержка модельно-специфических регистров в стиле Pentium

Расширение физического адреса до 36 бит

Поддержка Machine Check Exception (исключение машинного контроля)

Инструкция CMPXCHG8B

Наличие APIC

RESERVED

Поддержка инструкций SYSENTER и SYSEXIT (для AMD — SYSCALL и SYSRET)

Регистры управления кэшированием (MTRR)

Поддержка бита глобальности в элементах каталога страниц

Поддержка архитектуры машинного контроля

Поддержка инструкций условной пересылки CMOVxx

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

Возможность использования режима PSE-36 для страничной адресации

Поддержка серийного номера процессора

Поддержка инструкции CLFLUSH

RESERVED

Поддержка отладочной записи истории переходов

Наличие управления частотой синхронизации (ACPI), для AMD — «фирменное» MMX

Поддержка MMX

Поддержка инструкций сохранениявосстановления контекста FPU

SSE

SSE2

Самослежение (Self Snoop)

RESERVED

Автоматическое снижение производительности при перегреве

Наличие расширенных инструкций AMD 3Dnow!

Наличие AMD 3Dnow!

Совместимые с Intel процессоры AMD и Cyrix поддерживают вызов «расширенных функций» CPUID со значениями ЕАХ, в которых самый старший бит всегда установлен в 1.

ЕАХ = 8 000 0000h: Возвращает в ЕАХ максимальный номер расширенной функции CPUID, поддерживаемой данным процессором.

ЕАХ = 8 000 0001h: Возвращает в EDX информацию о поддерживаемых расширениях (указаны только флаги, отличающиеся от CPUID с ЕАХ = 1).

Бит 5 EDX «MSR» — Процессор поддерживает машинно-специфичные регистры, совместимые с К5.

Бит 10 EDX Процессор поддерживает команды SYSCALL и SYSRET.

Бит 16 EDX — Процессор поддерживает команды FCMOVcc.

Бит 24 EDX — Процессор поддерживает ММХ с расширениями от Cyrix.

Бит 25 EDX — Процессор поддерживает набор команд AMD 3D.

ЕАХ = 8 000 0002h, 8 000 0003h и 8 000 0004h — последовательный вызов CPUID с этими значениями в ЕАХ возвращает в EAX: EBX: ECX: EDX последовательно четыре 16-байтные части строки — имени процессора. Например: «AMD-K5™ Processor» .

3.2 Тактовая частота

rdtsc (англ. Read Time Stamp Counter) — ассемблерная инструкция для платформы x86, читающая счётчик TSC (Time Stamp Counter) и возвращающая в регистрах EDX: EAX 64-битное количество тактов с момента последнего сброса процессора. rdtsc поддерживается в процессорах Pentium и более новых. Опкод: 0F 31. В многозадачных операционных системах инструкция может быть превращена в привилегированную (установлен 3 бит в управляющем регистре CR4), и её использование приведет к генерации исключения в программе.

В современных процессорах Intel, счетчик TSC не зависит от использования технологий энергосбережения и увеличивается на 1 каждый такт, вне зависимости от того, работал ли процессор или находился в состоянии сна. В некоторых реализациях счетчики TSC могут иметь синхронные значения на многоядерной системе.

Определение тактовой частоты в программе реализовано по следующему алгоритму:

1) Измеряем длительность (в тактах процессора) 16-ти временных интервалов между отсчетами системного таймера, после чего вычисляется средняя длительность интервала.

2) Полученное усредненное значение умножается на частоту тактового генератора системного таймера (1 193 180 Гц), а затем делится на коэффициент пересчета системного таймера (65 536).

3) Полученный результат делится на константу 1 000 000 для получения значения внутренней частоты процессора в мегагерцах.

4. Конструкторская часть

При запуске программы на экран выводится титульный лист, после чего работа программы приостанавливается до нажатия клавиши. После нажатия клавиши выводится меню, в котором можно выбрать вывод справки либо информации о процессоре. Для работы программы (вывода сведений о CPU) необходимо, чтобы процессор поддерживал команду CPUID. Если CPUID не поддерживается выводится соответствующее сообщение.

4.1 Листинг программы

; ———————————————————————————————;

; СЕГМЕНТ ДАННЫХ

; ———————————————————————————————;

DATSEG segment para 'DATA'

; **************** Данные для титульной страницы *************** ;

STR1 DB 20 DUP (20H)

DB 'МИНИСТЕРСТВО НАУКИ И ОБРАЗОВАНИЯ РФ', 13,10

DB 16 DUP (20H)

DB 'БРЯНСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ', 13,10

DB 31 DUP (20H)

DB 'Кафедра «Информатики и программного обеспечения» ', 13,10

DW 3 DUP (0A0DH)

DB 25 DUP (20H)

DB 'Курсовая работа по дисциплине:', 13,10

DB 27 DUP (20H)

DB '" Организация ЭВМ и систем" ', 13,10

DB 15 DUP (20H)

DB 'Тема: «Диагностика типа CPU и его производительности» ', 13,10

DW 3 DUP (0A0DH)

DB 32 DUP (20H)

DB 'Выполнил: Студент группы 13-ИВТ2 Ларичев П.А.', 13,10,13,10

DB 32 DUP (20H)

DB 'Преподаватель: Конкин В.В.', 13,10

DW 4 DUP (0A0DH)

DB 33 DUP (20H)

DB 'Брянск 2014', 13,10

DW 5 DUP (0A0DH)

DB 'Нажмите для продолжения$'

; ******** Данные для меню программы ***************** ;

MENPOINTS DB ' О программе '

DB ' Информация о процессоре '

DB ' Выход '

MESSAGE DB 'Выберете номер пункта меню: '

RAMKA DB '=========================='

MENLEN EQU 25

MESSLEN EQU 28

MENU_MAX EQU 2; кол-во пунктов меню

NOTCOLOR EQU 1FH

CHOSECOLOR EQU 4EH

CHOICE DB 0

MAIN_MENU DB 1; флаг — находиться ли мы в главном меню

HELP_STR DB ' Идентификация CPU и его производительности '

DB '—————————————————————————'

DB ' - для работы программы необходима поддержка '

DB ' процессором инструкции cpuid (процессоры 486 '

DB ' и выше), если cpuid не поддерживается — '

DB ' выводится соответствующее сообщение. '

DB ' - программа выводит общую информацию о '

DB ' процессоре (фирма изготовитель, полное имя, '

DB ' степпинг, модель и семейство), тактовую '

DB ' частоту (в ГГц) и набор поддерживаемых '

DB ' архитектурой расширений. '

DB '—————————————————————————'

DB ' Грицов М. В. '

HELP_STR_LEN EQU 50

; *********************** Остальные данные ******************* ;

CPUID_ERR_MESS DB ' Процессор не поддерживает инструкцию CPUID '

CPU_NAME DB 64 DUP (' ')

VENDOR_STR DB 'Изготовитель: '

DB 12 DUP (' ')

FREQ_STR DB 'Тактовая частота: ГГц'

CPU_STR DB 'Процессор: '

STEPPING_STR DB 'Степпинг: '

FAMILY_STR DB 'Семейство: '

MODEL_STR DB 'Модель: '

EXT_STR DB 'Поддержка расширений архитектуры'

COMMON_INFO_STR DB 'Общая информация о процессоре'

FULL_LIST DB ' (полный список)'

FREQ_WAIT DB 'Подождите, определяется тактовая частота процессора …'

FPU_STR DB 'FPU (наличие математического сопроцессора): да'

MMX_STR DB 'MMX (поддержка набора команд MMX): да'

SSE_STR DB 'SSE (наличие блока XMM): да'

SSE2_STR DB 'SSE2 (набор мультимедийных команд Intel): да'

DNOW_STR DB '3D NOW! (поддержка набора команд AMD 3D): да'

NO_MESS DB 'нет'

EXIT_MESS DB 'Для выхода нажмите любую клавишу'

ANY_KEY_MESS DB 'Для продолжения нажмите любую клавишу'

COMM_MESS DB 'Для выхода в меню нажмите Esc, для просмотра полного списка расширений — E'

DSTR DB 80 DUP ('=')

DSTR1 DB 80 DUP ('-')

DSTR2 DB 80 DUP (' ')

COLOR DB 1Fh

ROW DB 0

COLUMN DB 0

CPUID_ERR_MESS_LEN EQU 44

COMM_MESS_LEN EQU 74

ANY_KEY_MESS_LEN EQU 37

VENDOR_STR_LEN EQU 26

CPU_STR_LEN EQU 11

FAMILY_STR_LEN EQU 13

STEPPING_STR_LEN EQU 12

MODEL_STR_LEN EQU 10

FREQ_MESS_LEN EQU 18

FREQ_WAIT_LEN EQU 55

FPU_STR_LEN EQU 46

MMX_STR_LEN EQU 37

SSE_STR_LEN EQU 27

SSE2_STR_LEN EQU 44

DNOW_STR_LEN EQU 44

EXT_STR_LEN EQU 32

COMMON_INFO_STR_LEN EQU 29

FULL_LIST_LEN EQU 16

STARTTSC DD 0

FREQ DD 1; тактовая частота

CPUID_SUPP DB 1; поддерживает ли процессор команду cpuid

HEAX DD?; максимальный номер функции для cpuid

HEEAX DD?; максимальный номер расширенной функции для couid

FLAGS_LIST DB 'FPU (наличие сопроцессора) '

DB 'VME (расширение режима V86, наличие флагов VIP и VIF в EFLAGS) '

DB 'DE (возможности отладки: останов по обращению к портам) '

DB 'PSE (процессор поддерживает страницы до 4Мб) '

DB 'TSC (наличие счетчика меток реального времени: команда RDTSC) '

DB 'MSR (поддержка модельно-специфических регистров в стиле Pentium) '

DB 'PAE (расширение физического адреса до 32 бит) '

DB 'MCE (поддержка Machine Check Exception, бит MCE в CR4) '

DB 'CX8 (процессор поддерживает команду CMPXCHG8B) '

DB 'APIC (процессор содержит встроенный контролер прерываний) '

DB 'SEP (поддержка команд SYSENTER и SYSEXIT, для AMD — SYSCALL и SYSRET)'

DB 'MTRR (регистры управления кэшированием — MTRR) '

DB 'PGE (поддержка бита глобальности в элементах каталога страниц) '

DB 'MCA (поддержка архитектуры машинного контроля) '

DB 'CMOV (поддержка команд условной пересылки CMOVxx) '

DB 'PAT (процессор поддерживает таблицу атрибутов страниц) '

DB 'PSE36 (возможность использования 36-битной адресации для страниц 4Мб)'

DB 'MMX (процессор поддерживает набор команд MMX) '

DB 'FXSR (команды быстрого чтения/записи — MMX2) '

DB 'SSE (наличие блока XMM) '

FPU DD 01h

VME DD 02h

DE DD 04h

PSE DD 08h

TSC DD 10h

MSR DD 20h

PAE DD 40h

MCE DD 60h

CX8 DD 80h

APIC DD 100h

SEP DD 800h

MTRR DD 1000h

PGE DD 2000h

MCA DD 4000h

CMOV DD 8000h

PAT DD 1 0000h

PSE36 DD 2 0000h

MMX DD 80 0000h

FXSR DD 100 0000h

SSE DD 200 0000h

EXTENSIONS DW offset FPU

DW offset VME

DW offset DE

DW offset PSE

DW offset TSC

DW offset MSR

DW offset PAE

DW offset MCE

DW offset CX8

DW offset APIC

DW offset SEP

DW offset MTRR

DW offset PGE

DW offset MCA

DW offset CMOV

DW offset PAT

DW offset PSE36

DW offset MMX

DW offset FXSR

DW offset SSE

DATSEG ENDS

; ———————————————————————————————;

; СЕГМЕНТ СТЕКА

; ———————————————————————————————;

STSEG segment para 'STACK'

DB 128 DUP (?)

STSEG ENDS

; ———————————————————————————————;

; СЕГМЕНТ КОДА

; ———————————————————————————————;

CODSEG segment para 'CODE'

ASSUME CS: CODSEG, DS: DATSEG, SS: STSEG, ES: DATSEG

BEGIN:

.386

; установка сегментных регистров

mov ax, DATSEG

mov ds, ax

mov es, ax

mov ax, STSEG

mov ss, ax

;—— ВЫВОД ТИТУЛЬНОЙ СТРАНИЦЫ

mov ax, 3

int 10h

mov ah, 09

lea dx, STR1

int 21h

xor ah, ah

int 16h

; ————— ВЫВОД ФОНА ————

MENU_C: call clear_scr

MENU_R:

;—— МЕНЮ ПРОГРАММЫ

call menu_out

call menu_str_out

call getchar

jmp menu_r

ST_:

; проверка на возможность определения процессора

call check_cpuid

call clear_scr

; определение тактовой частоты

lea bp, FREQ_WAIT

mov cx, FREQ_WAIT_LEN

call str_out

mov ROW, 0

call get_cpu_freq

ST1:

; ********* вывод основной информации о процессоре **********

lea bp, DSTR2

mov cx, 80

call str_out

mov COLUMN, 0

lea bp, DSTR1

mov cx, 80

call str_out

inc ROW

lea bp, COMMON_INFO_STR

mov cx, COMMON_INFO_STR_LEN

call str_out

call vendor_out; фирма — изготовитель

call common_info_out; название, модификация, модель, семейство

call freq_out; частота

call check_ext; набор расширений: fpu, mmx, sse, sse2, 3D Now!

; вывод подсказки

mov ROW, 23

mov COLUMN, 0

lea bp, DSTR1

mov cx, 80

call str_out

inc ROW

lea bp, COMM_MESS

mov cx, COMM_MESS_LEN

call str_out

Read_key:

call getchar

jmp Read_key

; ———————————————————————————————;

; Макросы

; ———————————————————————————————;

rdtsc macro

DB 0fh, 31h ;команда RDTSC — чтение счетчика тактов

endm

; ———————————————————————————————;

cpuid macro

DB 0Fh, 0A2h ;инструкция cpuid (идентификация процессора)

ENDM

; ———————————————————————————————;

; Процедуры

; ———————————————————————————————;

; ———————————————————————————————;

; Вывод тактовой частоты процессора

; ———————————————————————————————;

freq_out proc

mov eax, FREQ

lea di, FREQ_STR

add di, FREQ_MESS_LEN

xor edx, edx; Перевод частоты в ГГц (делим на 1 000 000)

mov ebx, 1 000 000

div ebx

push edx

call reg_dec_out

mov al,','

mov [di], al

inc di

pop edx

mov eax, edx

xor edx, edx

mov ebx, 1000

div ebx

call reg_dec_out

lea bp, FREQ_STR

mov cx, 27

call str_out

ret

freq_out endp

; ———————————————————————————————;

; Вывод фирмы-изготовителя процессора

; ———————————————————————————————;

vendor_out proc

push eax

inc ROW

lea bp, DSTR1

mov cx, 80

call str_out

inc ROW

xor eax, eax

cpuid

mov dword ptr VENDOR_STR[+14], ebx

mov dword ptr VENDOR_STR[+18], edx

mov dword ptr VENDOR_STR[+22], ecx

lea bp, VENDOR_STR

mov cx, VENDOR_STR_LEN

call str_out

inc ROW

; Получаем максимальный номер функции

mov [HEAX], eax

; Получаем максимальной номер расширенной функции

mov eax, 8 000 0000H

cpuid

mov [HEEAX], eax

pop eax

ret

vendor_out endp

; ———————————————————————————————;

; Перевод содержимого регистра EAX в десятичное число (символы ASCII)

; di — указатель на буфер, где будет храниться число

; ———————————————————————————————;

reg_dec_out proc

mov ebx, 10; делитель

l1: xor edx, edx; обнуляем edx

div ebx; eax =edx: eax /ebx, остаток в edx

push dx; сохраняем в стеке

test eax, eax; все подили? (eax=0)?

jz l2

call l1; если нет, оставляем в стеке адрес метки l2

; и переходим на l1

l2: pop ax; достаем цифру из стека

add al, 30h; преобразуем в ASCII цифру

mov [di], al

inc di

ret; переходим на адрес возврата

reg_dec_out endp

; ———————————————————————————————;

; Определение тактовой частоты процессора

; eax — частота CPU в МГц

; ———————————————————————————————;

get_cpu_freq proc

push es

; Определить тактовую частоту

; Настройка сегментного регистра ES на область данных BOIS

xor ax, ax

mov es, ax

mov eax, es:[046ch]; Запомнить текущее время

; Ждем изменение состояния системного таймера

t0:

cmp eax, es:[046ch]

je t0

; Запоминаем значение счетчика тиков

rdtsc

mov [starttsc], eax

; Запоминаем начальное значение системного времени

mov eax, es:[046Ch]

; Ждем 16 тиков

add eax, 16

t1:

cmp eax, es:[046Ch]

ja t1

; Получаем конечное значение счетчика тиков

rdtsc

; Вычисляем среднюю длину интервала

; (число тактов в одном тике)

sub eax,[starttsc]

shr eax, 4 ;делим на 16

; Умножаем длительность интервала на частоту

; генератора системного таймера

mov edx, 1 193 180

mul edx

; Делим результат на коэффициент пересчета системного таймера (65 536)

shrd eax, edx, 16

xor edx, edx; Вычисляем частоту в МГц (делим на 1 000 000)

mov ebx, 1000

div ebx

; В eax частота CPU

mov [freq], eax

pop es

ret

get_cpu_freq endp

; ———————————————————————————————;

; Проверка поддержки расширений (FPU, MMX, SSE, SSE2, 3D NOW!)

; ———————————————————————————————;

check_ext proc

inc ROW

lea bp, DSTR1

mov cx, 80

call str_out

inc ROW

lea bp, EXT_STR

mov cx, EXT_STR_LEN

call str_out

inc ROW

lea bp, DSTR1

mov cx, 80

call str_out

inc ROW

; Проверяем есть ли FPU

lea bp, FPU_STR

mov cx, FPU_STR_LEN

call str_out

mov eax, 1

cpuid

test edx, 01h

jnz _MMX

lea bp, NO_MESS

mov COLUMN, 44

mov cx, 3

call str_out

_MMX:

inc ROW

mov COLUMN, 0

; Проверяем есть ли MMX

lea bp, MMX_STR

mov cx, MMX_STR_LEN

call str_out

test edx, 80 0000h

jnz _SSE

lea bp, NO_MESS

mov COLUMN, 35

mov cx, 3

call str_out

_SSE:

inc ROW

mov COLUMN, 0

; Проверяем есть ли SSE

lea bp, SSE_STR

mov cx, SSE_STR_LEN

call str_out

test edx, 200 0000h

jnz _SSE2

lea bp, NO_MESS

mov COLUMN, 25

mov cx, 3

call str_out

_SSE2:

inc ROW

mov COLUMN, 0

; Проверяем есть ли SSE2

lea bp, SSE2_STR

mov cx, SSE2_STR_LEN

call str_out

test edx, 400 0000h

jnz _3DNow

lea bp, NO_MESS

mov COLUMN, 42

mov cx, 3

call str_out

_3DNow:

; Проверяем наличие расширенных функций

mov eax, 8 000 0000h

cpuid

cmp eax, 8 000 0000h

jbe _NoExtendedMsr

inc ROW

mov COLUMN, 0

; Проверяем есть ли 3D NOW!

lea bp, DNOW_STR

mov cx, DNOW_STR_LEN

call str_out

mov eax, 8 000 0001h

cpuid

test edx, 8 000 0000h

JnZ _NoExtendedMsr

lea bp, NO_MESS

mov COLUMN, 42

mov cx, 3

call str_out

_NoExtendedMsr:

ret

check_ext endp

; ———————————————————————————————;

; Вывод на экран название процессора

; ———————————————————————————————;

common_info_out proc

push eax

lea bp, CPU_STR

mov cx, CPU_STR_LEN

call str_out

mov COLUMN, CPU_STR_LEN

mov eax, 8 000 0002h

cpuid

mov dword ptr CPU_NAME, eax

mov dword ptr CPU_NAME[+4], ebx

mov dword ptr CPU_NAME[+8], ecx

mov dword ptr CPU_NAME[+12], edx

mov eax, 8 000 0003h

cpuid

mov dword ptr CPU_NAME[+16], eax

mov dword ptr CPU_NAME[+20], ebx

mov dword ptr CPU_NAME[+24], ecx

mov dword ptr CPU_NAME[+28], edx

mov eax, 8 000 0004h

cpuid

mov dword ptr CPU_NAME[+32], eax

mov dword ptr CPU_NAME[+36], ebx

mov dword ptr CPU_NAME[+40], ecx

mov dword ptr CPU_NAME[+44], edx

lea bp, CPU_NAME

mov cx, 64

call str_out

mov eax, 1

cpuid

and al, 0Fh

xor ah, ah

lea di, STEPPING_STR

add di, STEPPING_STR_LEN

sub di, 2

call reg_dec_out

mov eax, 1

cpuid

shr al, 4

push eax

xor ah, ah

lea di, MODEL_STR

add di, MODEL_STR_LEN

sub di, 2

call reg_dec_out

pop eax

push eax

mov al, ah

xor ah, ah

lea di, FAMILY_STR

add di, FAMILY_STR_LEN

sub di, 2

call reg_dec_out

pop eax

inc ROW

mov COLUMN, 0

lea bp, STEPPING_STR

mov cx, STEPPING_STR_LEN

call str_out

inc ROW

lea bp, FAMILY_STR

mov cx, FAMILY_STR_LEN

call str_out

inc ROW

lea bp, MODEL_STR

mov cx, MODEL_STR_LEN

call str_out

inc ROW

pop eax

ret

common_info_out endp

; ———————————————————————————————;

; Проверка поддержки процессором команды cpuid

; ———————————————————————————————;

check_cpuid proc

.8086

; проверяем является ли данный процессор 386-ым

and ax, 0f000h

jz _No386

cmp ax, 0f000h

je _No386

jmp _CPU386

_No386:

; Если нет, выводим сообщение о невозможности работы

mov MAIN_MENU, 1

call clear_scr

mov COLUMN, 20

mov ROW, 10

lea bp, DSTR

mov cx, CPUID_ERR_MESS_LEN

call str_out

inc ROW

lea bp, CPUID_ERR_MESS

mov cx, CPUID_ERR_MESS_LEN

call str_out

inc ROW

lea bp, DSTR

mov cx, CPUID_ERR_MESS_LEN

call str_out

mov COLUMN, 0

mov ROW, 24

lea bp, ANY_KEY_MESS

mov cx, ANY_KEY_MESS_LEN

call str_out

xor ax, ax

int 16h

jmp MENU_C

_CPU386:

.386P

; проверяем поддержку команды cpuid

; пытаемся изменить содержимое 21 бита регистра EFLAGS

pushfd

pop eax

mov ecx, eax

xor eax, 20 0000h

push eax

popfd

pushfd

pop eax

xor eax, ecx

je Supported

; команда cpuid процессором не поддерживается

mov [CPUID_SUPP], 0

Supported:

ret

check_cpuid endp

; ———————————————————————————————;

; Вывод сведений о всех расширениях процессора

; ———————————————————————————————;

show_full_ext proc

call CLEAR_SCR

mov ROW, 0

mov COLUMN, 0

lea bp, CPU_NAME

mov cx, 64

call str_out

inc ROW

lea bp, EXT_STR

mov cx, EXT_STR_LEN

call str_out

mov COLUMN, EXT_STR_LEN

lea bp, FULL_LIST

mov cx, FULL_LIST_LEN

call str_out

mov COLUMN, 0

inc ROW

lea bp, DSTR1

mov cx, 80

call str_out

inc ROW

lea bp, FLAGS_LIST-69

mov di, 0

mov cx, 20

C1:

push cx

mov eax, 1

cpuid

test edx, dword ptr [EXTENSIONS+di]

pop cx

inc di

add bp, 69

jz C1

push cx

mov cx, 69

call str_out

inc ROW

pop cx

loop C1

mov ROW, 23

lea bp, DSTR1

mov cx, 80

call str_out

inc ROW

lea bp, ANY_KEY_MESS

mov cx, ANY_KEY_MESS_LEN

call str_out

xor ax, ax

int 16h

call CLEAR_SCR

mov ROW, 0

mov COLUMN, 0

_Exit:

ret

show_full_ext endp

; ———————————————————————————————;

; Вывод справки

; ———————————————————————————————;

help_out proc

mov ROW, 4

mov COLUMN, 15

lea bp, DSTR

mov cx, 50

call str_out

inc ROW

mov cx, 13

lea di, HELP_STR

H_out:

push cx

mov bp, di

mov cx, HELP_STR_LEN

call str_out

add di, HELP_STR_LEN

inc ROW

pop cx

loop H_out

lea bp, DSTR

mov cx, 50

call str_out

mov COLUMN, 0

mov ROW, 24

lea bp, ANY_KEY_MESS

mov cx, ANY_KEY_MESS_LEN

call str_out

xor ax, ax

int 16h

mov MAIN_MENU, 1

jmp MENU_C

ret

help_out endp

; ———————————————————————————————;

; Вывод строки

; bp — указатель на строку

; cx — кол-во символов

; ———————————————————————————————;

str_out proc

push ax

mov ah, 13h

mov al, 01h

mov bh, 00h

mov bl, COLOR

mov dh, ROW

mov dl, COLUMN

int 10h

pop ax

RET

str_out endp

; ———————————————————————————————;

; ОЧИСТКА ЭКРАНА

; ———————————————————————————————;

clear_scr proc

mov ah, 02

mov dh, 24

mov dl, 00

int 10h

mov ah, 09h

mov al,' '

mov bh, 00

mov bl, 13h

mov cx, 80

int 10h

mov ah, 02

mov dh, 00

mov dl, 00

int 10h

mov ah, 09h

mov al,' '

mov bh, 00

mov bl, 13h

mov cx, 80

int 10h

mov dh, 01

mov dl, 00

mov cx, 23

mov bl, 70h

cmp MAIN_MENU, 1

je BGROUND

mov bl, 13h

BGROUND:

push cx

mov ah, 02

int 10h

mov ah, 09h

mov al,' '

mov bh, 00h

mov cx, 80

int 10h

inc dh

pop cx

loop BGROUND

ret

clear_scr endp

; —————————————————————————————-;

; ОЖИДАНИЕ НАЖАТИЯ КЛАВИШИ

; —————————————————————————————-;

getchar proc

xor ah, ah

int 16h

; клавиша Enter

cmp al, 13

jne kb_Esc

cmp MAIN_MENU, 0

je Exit

call kb_enter_pressed

kb_Esc:

; клавиша ESC

CMP AL, 27

jne kb_H

cmp MAIN_MENU, 1

je Exit

mov MAIN_MENU, 1

call CLEAR_SCR

jmp MENU_R

kb_H:

; клавиша 'E'

CMP AL,'e'

jne Func

cmp main_menu, 1

je exit

call show_full_ext

jmp ST1

Func:

; находимся ли мы в главном меню

cmp MAIN_MENU, 1

jne EXIT

;—————- ПРОВЕРЯЕМ НА ФУНКЦИОНАЛЬНУЮ КЛАВИШУ ——————;

cmp al, 00

jne MENU_NUMBER_PRESS

; СТРЕЛКА ВВЕРХ

cmp ah, 50h

je MENU_DOWN_PRESS

; СТРЕЛКА ВНИЗ

cmp ah, 48h

je MENU_UP_PRESS

EXIT: ret

getchar endp

; —————————————————————————————-;

; Обработка события нажатия клавиши Enter

; (переход по соответствующему пункту меню)

; —————————————————————————————-;

kb_enter_pressed proc

cmp choice, 2

jne Test_cpu

MOV AX, 3

INT 10H

MOV AX, 4C00H

INT 21H

Test_cpu:

cmp choice, 1

jne About

mov MAIN_MENU, 0

mov ROW, 0

mov COLUMN, 0

jmp ST_

About:

cmp choice, 0

jne Return

mov MAIN_MENU, 0

mov ROW, 0

mov COLUMN, 0

call help_out

Return:

ret

kb_enter_pressed endp

; —————————————————————————————-;

; ВЫВОД МЕНЮ C РАМКОЙ

; —————————————————————————————-;

MENU_OUT PROC

; ————- ВЫВОД РАМКИ ——————

mov ROW, 08

mov COLUMN, 27

mov COLOR, NOTCOLOR

lea bp, RAMKA

mov CX, MENLEN

call str_out

mov ROW, 12

mov cx, MENLEN

call str_out

; ————- ВЫВОД МЕНЮ ——————;

mov ROW, 09

mov COLUMN, 27

mov COLOR, NOTCOLOR

lea bp, MENPOINTS

mov cx, MENLEN

call str_out

inc ROW

mov cx, 02

MEN:

push cx

add bp, MENLEN

mov cx, MENLEN

call str_out

inc ROW

pop cx

loop MEN

mov ROW, 24

mov COLUMN, 0

lea bp, MESSAGE

mov cx, MESSLEN

call str_out

mov COLUMN, 27

mov ah, 09

mov cx, 1

mov al, CHOICE

add al, 31H

int 10h

ret

menu_out endp

; —————————————————————————————-;

; ВЫВОД СТРОКИ МЕНЮ

; —————————————————————————————-;

menu_str_out proc

; ВЫЧИСЛЕНИЕ СТРОКИ НА ЭКРАНЕ

mov ax, 09

add al, BYTE PTR CHOICE

mov ROW, AL

; ВЫЧИСЛЕНИЕ ПУНКТА МЕНЮ

mov al, MENLEN

mul byte ptr CHOICE

lea bp, MENPOINTS

add bp, ax

mov cx, MENLEN

;—————————————-;

mov COLOR, CHOSECOLOR

call str_out

mov COLOR, NOTCOLOR

; ПОЗИЦИОНИРОВАНИЕ КУРСОРА

mov ah, 02

mov dl, ROW

mov dh, MESSLEN

int 10h

ret

menu_str_out endp

; —————————————————————————————-;

menu_down_press PROC

inc CHOICE

cmp CHOICE, MENU_MAX+1

je CHOICE_MIN

ret

CHOICE_MIN: mov CHOICE, 1

menu_down_press endp

; —————————————————————————————-;

menu_up_press proc

cmp CHOICE, 0

jne CHOICE_DEC

mov CHOICE, MENU_MAX

ret

CHOICE_DEC:

dec CHOICE

ret

menu_up_press endp

; —————————————————————————————-;

menu_number_press proc

cmp al,'4'

jl NEXT1

ret

NEXT1: cmp al,'0'

jg NEXT2

ret

NEXT2: sub al, 31h

mov CHOICE, al

ret

menu_number_press endp

; —————————————————————————————-;

CODSEG ENDS

END BEGIN5.

5. Список литературы

1. Пирогов В. Ю. «ASSEMBLER. Учебный курс» — М: Издательство Нолидж, 2001

2. Питер Абель, «Ассемблер и программирования для IBM PC»

3. Роберт Журден, «Программирование на Assembler»

4. Калашников О. «Ассемблер? Это просто! Учимся программировать» — Издательство БХВ-Петербург, 2006

Показать весь текст
Заполнить форму текущей работой