робника процесора
;---------------------------------------------------------------_ 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