1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
; FCPU.ASM
; tasm.exe /m9 fcpu.asm
; tlink.exe fcpu.obj
; sous DOS (Pentium et plus, ne marche pas sur des 8086,186,286,386 et 486 !!!)
.486
code segment public use16
assume cs:code , ds:data , ss:stacks
debut:
mov ax,data
mov ds,ax
mov dx,offset mess_wait
mov ah,09h
int 21h
; compte le nombre de cycles entre 182 appels du timer
push ds
mov ax,0040h
mov ds,ax
mov si,006Ch
mov cx,[si] ; compteur incrémenté à chaque IRQ0(timer appelé 18.2 fois par seconde)
boucle_depart:
cmp cx,[si]
je boucle_depart
add cx,182+1 ; 18.2065*10 = 182 & on a déjà incrémenter de 1 avec boucle_depart
db 0Fh,31h ; RDTSC : nombre de cycles depuis le lancement
mov edi,eax ; partie basse
mov ebp,edx ; partie haute
boucle_fin:
cmp cx,[si]
jne boucle_fin
db 0Fh,31h ; RDTSC : nombre de cycles depuis le lancement
sub eax,edi ; difference basse
sbb edx,ebp ; difference haute
pop ds
; Calcule la fréquence en MHz
mov ecx,10*1000*1000 ; 1MHZ = 1000*1000 HZ & 18.2065*10=182
div ecx
inc eax
mov [frequence], eax
; affichage du resultat
mov eax,[frequence]
mov di,offset textx-1
mov ecx,010d
boucle_transfo_ascii:
xor edx,edx
div ecx
add dl,'0'
mov ds:[di],dl
dec di
cmp eax,0
jne boucle_transfo_ascii
mov dx,offset text
mov ah,09h
int 21h
mov ax,4C00h
int 21h ; sortie du prog
code ends
data segment public use16
frequence dd ?
text db " Le processeur a une frequence de "
db " "
textx db " MHz ",13,10,'$'
mess_wait db " Attendez 10 secondes SVP",13,10,'$'
data ends
stacks segment stack
remplissage db 256h dup (?)
stacks ends
end debut |
Partager