Compteur de temps

Soyez le premier à donner votre avis sur cette source.

Snippet vu 3 038 fois - Téléchargée 16 fois

Contenu du snippet

CT est une simple macro qui utilise GetLocalTime afin de calculer le
nombre de millisecondes écoulées entre deux appels.Cela permet de voir
le temps mis par le processeur pour effectuer les instructions situées entre les deux appels de CT.
AFFdec affiche le nombre de milisecondes dans un messagebox

Source / Exemple :


compteur temps.asm;
------------------

.586
.model	flat,stdcall
option	casemap:none  

include compte temps.inc

INCLUDELIB user32.lib
INCLUDELIB kernel32.lib

Maitre			PROTO	:DWORD
GetModuleHandle TEXTEQU <GetModuleHandleA>
ExitProcess 	PROTO	dwExitCode:DWORD	
GetModuleHandle PROTO	pString:PTR BYTE	

.code
debut:
			invoke	GetModuleHandle,0
			invoke	Maitre,eax
			invoke	ExitProcess,0
			
Maitre	proc	Hdl_GetModuleHandle:dword
	
	LOCAL	depart,arrivee:dword

	
	CT
	mov depart,eax
	
	;---------------------
	;instruction à chronométrer
	
	mov ecx,100000000
@@:
	dec ecx
	cmp ecx,0
	jnz @b
	;-------------------- 
	
	CT
	mov arrivee,eax
	
	mov eax,arrivee
	sub eax,depart
	
	AFFdec			;=31 milliseconds
	
	ret
Maitre	endp

end debut

-----------------------------------------------------------------

compteur.inc;
------------

SYSTEMTIME STRUCT
	wYear WORD ?
	wMonth WORD ?
	wDayOfWeek WORD ?
	wDay WORD ?
	wHour WORD ?
	wMinute WORD ?
	wSecond WORD ?
	wMilliseconds WORD ?
SYSTEMTIME ENDS

GetLocalTime 	PROTO	pSystemTime:PTR SYSTEMTIME		
MessageBox 		TEXTEQU <MessageBoxA>
MessageBox 		PROTO :DWORD,:DWORD,:DWORD,:DWORD

CT	macro
	;---------------------------------
	;calcul le nombre de millisecondes
	;écoulées depuis minuit
	;sortie: eax contient le nbre de millisecondes
	;----------------------------------	
	LOCAL	heure,min,sec
	LOCAL	sysTime
	
.data
	heure	        dword	?
	min		dword	?
	sec		dword	?
	sysTime	SYSTEMTIME	<>
	
.code

	INVOKE GetLocalTime,addr sysTime
	
	movzx eax,sysTime.wHour
	mov   ebx,3600
	mul   ebx
	mov   heure,eax

	movzx eax,sysTime.wMinute
	mov   ebx,60
	mul   ebx
	mov   min,eax

	movzx eax,sysTime.wSecond
	mov  sec,eax

	mov  eax,heure
	add  eax,min
	add  eax,sec
	mov  ebx,1000		;milliseconds
	mul  ebx

	movzx ebx,sysTime.wMilliseconds
	add  eax,ebx	
		
endm

AFFdec macro

	;--------------------------
	;	affiche la valeur entiere
	;	non signée de eax dans
	;	un messagebox
	;--------------------------
	
	LOCAL	stocke,buffer,titre
	
.data

	stocke	qword	0
	buffer 	BYTE 12 DUP(30h),0			;12 caracteres+0 terminal	
	titre	BYTE	"temps écoulé en millisecondes",0
	
.code		
	mov dword ptr[stocke],eax
	mov esi,offset buffer
	add esi,11	;pointe sur dernier caracteres=celui de droite
	mov ecx,0
divise:
	mov edx,dword ptr stocke+4
	mov eax,dword ptr stocke
	mov ebx,10
	div ebx
	mov dword ptr stocke,eax
	add edx,30h
	mov [esi],dl
	dec esi
	cmp eax,0
	ja divise
	
	;affichage du temps
	invoke MessageBox,0,addr buffer,addr titre,0		
endm

A voir également

Ajouter un commentaire

Commentaires

cs_parki
Messages postés
78
Date d'inscription
mardi 29 juillet 2008
Statut
Membre
Dernière intervention
25 mars 2019
-
CT ne compte que les temps supérieurs à la milliseconde
BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13 -
Attention, sous Windows EBX est à sauvegarder, en 32 bits il n'y a que EAX, ECX et EDX qu'on peut considérer comme écrasés.

dec ecx
cmp ecx,0
CMP est absolument inutile et donc NUISIBLE pour les perfs. DEC positionne deja le flag ZF, on peut donc direct le lire avec JNE (ou JNZ idem).

Employer DIV pour faire du ultoa() est de l'absolu contre performant.

etc, etc, pas le temps de prendre point par point.
Ne le prends pas mal mais autant te dire qu'il n'y aura rien à garder de tout cela si tu veux continuer (et je t'y invite) en ASM.
cs_parki
Messages postés
78
Date d'inscription
mardi 29 juillet 2008
Statut
Membre
Dernière intervention
25 mars 2019
-
Merci pour ton commentaire BruNews,ça décoiffe mais
au moins ça me fera progresser.
Bonne Journée.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.