Диагностика типа CPU и его производительности
Разработка программы на языке Ассемблер для определения типа центрального процессора и его производительности. Основные этапы определения любого существующего Intel-совместимого процессора. Тактовая частота процессора, алгоритм и листинг программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 26.07.2014 |
Размер файла | 47,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Федеральное агентство по образованию
Брянский государственный технический университет
Кафедра "Информатика и программное обеспечение"
Курсовая работа
по курсу
"Организация ЭВМ и систем"
Тема: "Диагностика типа 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 6x86 (M1), UMC U5S.
Код операции: 0F A2.
Если команда CPUID не поддерживается - определить производителя и другие параметры процессора возможно только какими-либо недокументированными путями. Отличие процессоров, не поддерживающих CPUID (80386, 80486, и более старые), заключается в возможности изменить 18 бит в EFLAGS. Если этот бит доступен, значит процессор - 486 или выше. В том же EFLAGS нужно попробовать изменить бит ID (21), если его можно программно изменить - процессор поддерживает инструкцию CPUID.
CPUID имеет параметр, который задается в регистре EAX. Обычно в ответ на вызов CPUID с EAX=0 процессор возвращает в ЕАХ максимальное Инструкция CPUID по содержимому регистра EAX определяет какого рода информацию о процессоре необходимо вернуть. Первый раз её следует вызывать со значением EAX = 0. При этом будет возвращено максимально допустимое значение параметра инструкции, поддерживаемое данным процессором.
Для того, чтобы получить информацию о дополнительных функциях, имеющихся в процессорах, в регистре EAX перед вызовом CPUID должен быть установлен бит 31. Например, чтобы определить максимально допустимое значение параметра для дополнительных функций, необходимо выполнить CPUID со значением EAX = 80000000h.
При EAX = 0 ЦП возвращает идентификатор производителя процессора (англ. Vendor ID) в виде 12 символов ASCII, содержащихся в регистрах EBX, EDX, ECX (именно в таком порядке). В регистре EAX же возвращается максимально допустимое значение EAX при вызове CPUID.
ASCII строка |
HEX-значения EBX: EDX: ECX |
Производитель |
|
"GenuineIntel" |
756E6547: 49656E69: 6C65746E |
Intel |
|
"AuthenticAMD" |
68747541: 69746E65: 444D4163 |
AMD |
|
"CyrixInstead" |
69727943: 736E4978: 64616574 |
Cyrix |
|
"CentaurHauls" |
746E6543: 48727561: 736C7561 |
Centaur |
|
"SiS SiS SiS " |
20536953: 20536953: 20536953 |
SiS |
|
"NexGenDriven" |
4778654E: 72446E65: 6E657669 |
NexGen |
|
"GenuineTMx86" |
756E6547: 54656E69: 3638784D |
Transmeta |
|
"RiseRiseRise" |
65736952: 65736952: 65736952 |
Rise |
|
"UMC UMC UMC " |
20434D55: 20434D55: 20434D55 |
UMC |
|
"Geode by NSC" |
646F6547: 79622065: 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 и соответствующими им расширениями.
Бит |
Описание |
|
0 |
Наличие сопроцессора |
|
1 |
Расширение для режима V86, наличие флагов VIP и VIF в EFLAGS |
|
2 |
Расширения отладки (останов по обращению к портам) |
|
3 |
Возможности расширения размера страниц до 4Мб |
|
4 |
Наличие счетчика меток реального времени (и инструкции RDTSC) |
|
5 |
Поддержка модельно-специфических регистров в стиле Pentium |
|
6 |
Расширение физического адреса до 36 бит |
|
7 |
Поддержка Machine Check Exception (исключение машинного контроля) |
|
8 |
Инструкция CMPXCHG8B |
|
9 |
Наличие APIC |
|
10 |
RESERVED |
|
11 |
Поддержка инструкций SYSENTER и SYSEXIT (для AMD - SYSCALL и SYSRET) |
|
12 |
Регистры управления кэшированием (MTRR) |
|
13 |
Поддержка бита глобальности в элементах каталога страниц |
|
14 |
Поддержка архитектуры машинного контроля |
|
15 |
Поддержка инструкций условной пересылки CMOVxx |
|
16 |
Поддержка атрибутов страниц |
|
17 |
Возможность использования режима PSE-36 для страничной адресации |
|
18 |
Поддержка серийного номера процессора |
|
19 |
Поддержка инструкции CLFLUSH |
|
20 |
RESERVED |
|
21 |
Поддержка отладочной записи истории переходов |
|
22 |
Наличие управления частотой синхронизации (ACPI), для AMD - "фирменное" MMX |
|
23 |
Поддержка MMX |
|
24 |
Поддержка инструкций сохранения\восстановления контекста FPU |
|
25 |
SSE |
|
26 |
SSE2 |
|
27 |
Самослежение (Self Snoop) |
|
28 |
RESERVED |
|
29 |
Автоматическое снижение производительности при перегреве |
|
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 (англ. 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 'Нажмите <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_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 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
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 ; Перевод частоты в ГГц (делим на 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
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,80000000H
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,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
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,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
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,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
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,200000h
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
Размещено на Allbest.ru
Подобные документы
История развития центрального процессора. Основные проблемы создания многоядерных процессоров. Проектирование микропроцессорной системы на базе процессора Intel 8080. Разработка принципиальной схемы и блок-схемы алгоритма работы микропроцессорной системы.
курсовая работа [467,6 K], добавлен 11.05.2014Управление взаимодействием всех устройств ЭВМ. История создания и развития производства процессора. Структура центрального процессора. Регистры общего назначения. Обозначения популярных моделей процессоров Intel и AMD. Команды центрального процессора.
реферат [111,2 K], добавлен 25.02.2015Распараллеливание операций, кэширование памяти и расширение системы команд как способы совершенствования архитектуры и роста производительности компьютеров. Внутренняя структура конвейера центрального процессора Pentium i486. Корпус и колодки ЦП Intel.
презентация [281,2 K], добавлен 27.08.2013Гнездовой или щелевой разъём центрального процессора для облегчения его установки. Стандартный слот типа Socket. История изменения и характеристики всех сокетов, используемых для установки процессоров Intel. Разработка новых интерфейсов компании Intel.
реферат [202,4 K], добавлен 01.10.2009Принцип работы процессора, способы его охлаждения, кодовые названия. Шины процессора, разрядность и кэш–память. Технологии расширения и поток команд процессора. Процессорные вентиляторы и их характеристика. Алгоритм и способы разгона процессора.
реферат [38,0 K], добавлен 21.02.2009Рост производительности и снижение потребляемой мощности процессора. Упрощенная-схема процессора BF535. Поддержка моделей памяти. Стандарты коммуникационных протоколов. Системные регистры процессора. Регистровый файл данных. Шины связи регистрового файла.
презентация [6,3 M], добавлен 14.12.2013Разработка модели процессора, выполняющего набор машинных команд. Структурная схема процессора (операционного и управляющего автоматов), анализ принципа работы. Содержательный алгоритм микропрограммы, синтез управляющего автомата на основе жесткой логики.
курсовая работа [871,9 K], добавлен 16.09.2010История развития производства процессоров. Intel 4040, упрощенная структурная схема. Регистры общего, специального назначения. Основные параметры процессора: разрядность, тактовая частота. Подбор под запросы пользователя. Программа CPU-Z, окно параметров.
контрольная работа [529,7 K], добавлен 29.10.2014История появления и развития первых процессоров для компьютеров. Общая структура центрального процессора. Устройство блока интерфейса. Основные характеристики процессора. Кеш-память разных уровней. Разрядность и количество ядер. Частота и системная шина.
презентация [1,4 M], добавлен 11.04.2019Понятия и принцип работы процессора. Устройство центрального процессора. Типы архитектур микропроцессоров. Однокристальные микроконтроллеры. Секционные микропроцессоры. Процессоры цифровой обработки сигналов. Эволюция развития микропроцессоров Intel.
реферат [158,8 K], добавлен 25.06.2015