Диагностика типа 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) - ассемблерная <#"justify">ASCII строкаHEX-значения EBX: EDX: ECXПроизводитель"GenuineIntel"756E6547: 49656E69: 6C65746EIntel"AuthenticAMD"68747541: 69746E65: 444D4163AMD"CyrixInstead"69727943: 736E4978: 64616574Cyrix"CentaurHauls"746E6543: 48727561: 736C7561Centaur"SiS SiS SiS "20536953: 20536953: 20536953SiS"NexGenDriven"4778654E: 72446E65: 6E657669NexGen"GenuineTMx86"756E6547: 54656E69: 3638784DTransmeta"RiseRiseRise"65736952: 65736952: 65736952Rise"UMC UMC UMC "20434D55: 20434D55: 20434D55UMC"Geode by NSC"646F6547: 79622065: 43534E20National Semiconductor

При вызове CPUID с EAX=1 в регистре 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 и соответствующими им расширениями.


БитОписание0Наличие сопроцессора1Расширение для режима V86, наличие флагов VIP и VIF в EFLAGS2Расширения отладки (останов по обращению к портам) 3Возможности расширения размера страниц до 4Мб4Наличие счетчика меток реального времени (и инструкции RDTSC) 5Поддержка модельно-специфических регистров в стиле Pentium6Расширение физического адреса до 36 бит7Поддержка Machine Check Exception (исключение машинного контроля) 8Инструкция CMPXCHG8B9Наличие APIC10RESERVED11Поддержка инструкций SYSENTER и SYSEXIT (для AMD - SYSCALL и SYSRET) 12Регистры управления кэшированием (MTRR) 13Поддержка бита глобальности в элементах каталога страниц14Поддержка архитектуры машинного контроля15Поддержка инструкций условной пересылки CMOVxx16Поддержка атрибутов страниц17Возможность использования режима PSE-36 для страничной адресации18Поддержка серийного номера процессора19Поддержка инструкции CLFLUSH20RESERVED21Поддержка отладочной записи истории переходов22Наличие управления частотой синхронизации (ACPI), для AMD - "фирменное" MMX23Поддержка MMX24Поддержка инструкций сохранения\восстановления контекста FPU25SSE26SSE227Самослежение (Self Snoop) 28RESERVED29Автоматическое снижение производительности при перегреве30Наличие расширенных инструкций AMD 3Dnow! 31Наличие AMD 3Dnow!

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

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

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

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

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

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

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

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

ЕАХ = 80000002h, 80000003h и 80000004h - последовательный вызов CPUID с этими значениями в ЕАХ возвращает в EAX: EBX: ECX: EDX последовательно четыре 16-байтные части строки - имени процессора. Например: "AMD-K5™ Processor".


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


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

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

)Полученный результат делится на константу 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 'Нажмите <ENTER> для продолжения$'


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

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_LENEQU 50


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


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


CPU_NAMEDB 64 DUP(' ')


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

DB 12 DUP(' ')

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

CPU_STRDB 'Процессор: '

STEPPING_STRDB 'Степпинг: '

FAMILY_STRDB 'Семейство: '

MODEL_STRDB 'Модель: '


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

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

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


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


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

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

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

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

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


NO_MESSDB 'нет'

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

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

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


DSTRDB 80 DUP('=')

DSTR1DB 80 DUP('-')

DSTR2DB 80 DUP(' ')


COLOR DB 1Fh

ROWDB 0

COLUMNDB 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_LISTDB '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 000000001h

VME DD 000000002h

DE DD 000000004h

PSE DD 000000008h

TSC DD 000000010h

MSR DD 000000020h

PAE DD 000000040h

MCE DD 000000060h

CX8 DD 000000080h

APIC DD 000000100h

SEP DD 000000800h

MTRR DD 000001000h

PGE DD 000002000h

MCA DD 000004000h

CMOV DD 000008000h

PAT DD 000010000h

PSE_36 DD 000020000h

MMX DD 000800000h

FXSR DD 001000000h

SSE DD 002000000h

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 PSE_36

DW offset MMX

DW offset FXSR

DW offset SSE

ENDS

; ---------------------------------------------------------------

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

; ---------------------------------------------------------------segment para 'STACK'

DB 128 DUP(?)ENDS

; ---------------------------------------------------------------

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

; ---------------------------------------------------------------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


; ---------- ВЫВОД ФОНА --------_C:call clear_scr_R:

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

call menu_out

call menu_str_out

call getchar

jmp menu_r

_:

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

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

:

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

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

_key:

call getchar

jmp Read_key

; ---------------------------------------------------------------

; Макросы

; ---------------------------------------------------------------macro

DB0fh,31h ;команда RDTSC - чтение счетчика тактов

; ---------------------------------------------------------------macro

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

; ---------------------------------------------------------------

; Процедуры

; ---------------------------------------------------------------


; ---------------------------------------------------------------

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

; ---------------------------------------------------------------_out proc

mov eax,FREQ


lea di,FREQ_STR

add di,FREQ_MESS_LEN


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

mov ebx,1000000

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_out endp

; ---------------------------------------------------------------

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

; ---------------------------------------------------------------_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,80000000H

cpuid

mov [HEEAX],eax

pop eax


ret_out endp

; ---------------------------------------------------------------

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

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

; ---------------------------------------------------------------_dec_out proc

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

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

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

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

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

jz l2

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

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

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

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

mov [di],al

inc di

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

; ---------------------------------------------------------------

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

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

; ---------------------------------------------------------------

get_cpu_freq proc

push es


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

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

xor ax,ax

mov es,ax

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

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

cmp eax,es:[046ch]

je t0

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

rdtsc

mov [starttsc],eax

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

mov eax,es:[046Ch]

; Ждем 16 тиков

add eax,16:

cmp eax,es:[046Ch]

ja t1

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

rdtsc

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

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

sub eax,[starttsc]

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

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

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

mov edx,1193180

mul edx

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

shrd eax,edx,16

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

mov ebx,1000

div ebx

; В eax частота CPU

mov [freq],eax


pop es

ret _cpu_freq endp

; ---------------------------------------------------------------

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

; ---------------------------------------------------------------_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,000000001h

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,000800000h

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,002000000h

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,004000000h

jnz _3DNow


lea bp,NO_MESS

mov COLUMN,42

mov cx,3

call str_out


_3DNow:

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

mov eax,080000000h

cpuid


cmp eax,080000000h

jbe _NoExtendedMsr


inc ROW

mov COLUMN,0

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

lea bp,DNOW_STR

mov cx,DNOW_STR_LEN

call str_out


mov eax,080000001h

cpuid

test edx,080000000h

JnZ _NoExtendedMsr


lea bp,NO_MESS

mov COLUMN,42

mov cx,3

call str_out

_NoExtendedMsr:

ret_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,80000002h

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,80000003h

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,80000004h

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_info_out endp

; ---------------------------------------------------------------

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

; ---------------------------------------------------------------_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,200000h

push eax

popfd

pushfd

pop eax

xor eax,ecx

je Supported

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

mov [CPUID_SUPP],0

:

ret_cpuid endp

; ---------------------------------------------------------------

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

; ---------------------------------------------------------------_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:

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_full_ext endp

; ---------------------------------------------------------------

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

; ---------------------------------------------------------------_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_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_out endp

; ---------------------------------------------------------------

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

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

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

; ---------------------------------------------------------------_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_out endp

; ---------------------------------------------------------------

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

; ---------------------------------------------------------------_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

:

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

_scr endp

; ------------------------------------------------------------

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

; ------------------------------------------------------------proc

xor ah,ah

int 16h

; клавиша Enter

cmp al,13

jne kb_Esc

cmp MAIN_MENU,0

je Exit

call kb_enter_pressed

_Esc:

; клавиша ESC

CMP AL,27

jne kb_H

cmp MAIN_MENU,1

je Exit

mov MAIN_MENU,1

call CLEAR_SCR

jmp MENU_R

_H:

; клавиша 'E'

CMP AL,'e'

jne Func

cmp main_menu,1

je exit


call show_full_ext

jmp ST1:

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

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

:retendp

; ------------------------------------------------------------

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

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

; ------------------------------------------------------------_enter_pressed proc

cmp choice,2

jne Test_cpu


MOV AX,3

INT 10H

MOV AX,4C00H

INT 21H

_cpu:

cmp choice,1

jne About

mov MAIN_MENU,0

mov ROW,0

mov COLUMN,0

jmp ST_:

cmp choice,0

jne Return

mov MAIN_MENU,0

mov ROW,0

mov COLUMN,0

call help_out:

ret_enter_pressed endp

; ------------------------------------------------------------

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

; ------------------------------------------------------------_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:

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_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_str_out endp

; ------------------------------------------------------------_down_press PROC


inc CHOICE

cmp CHOICE,MENU_MAX+1

je CHOICE_MIN


ret

_MIN:mov CHOICE,1_down_press endp

; ------------------------------------------------------------_up_press proc


cmp CHOICE,0

jne CHOICE_DEC


mov CHOICE,MENU_MAX

ret_DEC:

dec CHOICE

ret_up_press endp

; ------------------------------------------------------------_number_press proc

cmp al,'4'

jl NEXT1

ret:cmp al,'0'

jg NEXT2

ret:sub al,31h

mov CHOICE,al

ret_number_press endp

; ------------------------------------------------------------ENDSBEGIN5.

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


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

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

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

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


Теги: Диагностика типа CPU и его производительности  Курсовая работа (теория)  Информационное обеспечение, программирование
Просмотров: 18052
Найти в Wikkipedia статьи с фразой: Диагностика типа CPU и его производительности
Назад