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

; Использование счетчика тактов для определения

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

.8086

include "c:\masm61\include\dos.inc"

seg data public 'data'

; Начальное значение счетчика тактов

StartTSC DD ?

val DD ?

result dd 13 dup (0)

; Текстовые сообщения

Txt1 DB "Определение тактовой частоты "

DB "процессора при помощи команды RDTSC",0

Txt2 DB "Тактовая частота процессора (МГц):",0

TxtW DB "Ждите ...",0

AnyK DB "Нажмите любую клавишу",0

ends

seg code public para 'code'

assume cs:code, ds:data

;*****************************

;* Основной модуль программы *

;*****************************

proc ProcFrequency

.386

mov AX,DGROUP

mov DS,AX

; Установить текстовый режим и очистить экран

mov AX,3

int 10h

; Скрыть курсор - убрать за нижнюю границу экрана

@SetCsrPos 90,10

; Вывести текстовые сообщения на экран

@ShowStr Txt1

@ShowStr Txt2

@ShowStr TxtW

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

mov AX,0

mov ES,AX

; Запомнить текущее время

mov EAX,[ES:046Ch]

; Ожидать изменения состояния системного таймера

@@T0: cmp EAX,[ES:046Ch]

je @@T0

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

DB 0Fh,31h ;команда RDTSC

mov [StartTSC],EAX

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

mov EAX,[ES:046Ch]

; Ожидать в течение 8 тиков

add EAX,8

@@T1: cmp EAX,[ES:046Ch]

ja @@T1

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

DB 0Fh,31h ;команда RDTSC

; Вычислить среднюю длительность интервала

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

sub EAX,[StartTSC]

shr EAX,3 ;деление на 8

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

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

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

mov EDX,1193180

mul EDX

; Разделить результат на коэффициент

; пересчета системного таймера (65536)

shrd EAX,EDX,16

; Вычислить частоту в МГц (разделить на 1000000)

xor EDX,EDX

mov EBX,1000000

div EBX

; Вывести результат в десятичном коде

mov val,EAX

mov ecx,12

lable:

mov edx,0

mov ebx,10

div ebx

add dl,"0"

mov [result+12-ecx],dl

loop lable

@ShowStr "result"

; Ожидать нажатия любой клавиши

@ShowStr AnyK

@GetChar

; Переустановить текстовый режим и очистить экран

mov AX,3

int 10h

; Выход в DOS

mov AH,4Ch

.8086

int 21h

ENDP ProcFrequency

ENDS

END ProcFrequency