j'ai lancé ton code et j'ai la même valeur pour les 2 codes, 2280.
J'ai regardé à nouveau dans le bouquin de Michael Abrash, édition sybex, : Programmation graphique C/C++ Assembleur.
Pour LEA, sur pentium, mais pour d'autre instructions également, il y a les verrouillages du pipeline (AGI = Adress generation Interlock) qui peuvent ralentir les instructions.
Si on modifie n'importe quelle partie d'un registre pendant un cycle, on ne peut pas utiliser ce registre pour adresser la mémoire pendant ce cycle ou le cycle suivant. (1 instruction est effectuée dans le pipeline U et l'instruction suivante est effectuée dans le pipeline V pendant le même cycle d'horloge et prend donc 1 cycle si la règle de l'AGI est respectée).
Si on effectue le code suivant, on perd 1 cycle d'établissement dans les pipelines)
C'est pour ça que dans ton code que j'ai modifié j'ai placé le ADD edx, edx bien avant le LEA
Voici le code que j'ai utilisé pour comparer les vitesse sur celeron 2 Go.
J'ai refait des tests et je me suis rendu compte que je n'avais pas désactivé le débugger
Sans le débugger, le code avec le ROL est légèrement plus rapide pour une chaine courte et légèrement plus long pour une chaine longue, le tout pour moins de 1 %.
Code : Tout sélectionner
Procedure ValHex(Chaine.s)
Valeur.l
MOV ecx,Chaine
CMP byte [ecx],'$'
JNZ NonChaineHexa
!LEA ebx,[TableValeur]
MOV edx,0
XOR eax,eax
!Encore:
INC ecx
MOV al,byte [ecx]
CMP al,0
JE FinChaineHexa
XLATB
CMP al,$FF
JE NonChaineHexa
ROL edx,4
ADD edx,eax
JMP Encore
!FinChaineHexa:
MOV Valeur,edx
ProcedureReturn Valeur
!NonChaineHexa:
ProcedureReturn 0
!TableValeur:
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$0A,$0B,$0C,$0D,$0E,$0F,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$0A,$0B,$0C,$0D,$0E,$0F,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
EndProcedure
;
Procedure ValHex1(Chaine.s)
Valeur.l
MOV ecx,Chaine
CMP byte [ecx],'$'
JNZ NonChaineHexa1
!LEA ebx,[TableValeur1]
MOV edx,0
XOR eax,eax
!Encore1:
INC ecx
MOV al,byte [ecx]
CMP al,0
JE FinChaineHexa1
XLATB
ADD edx, edx
CMP al,$FF
JE NonChaineHexa1
LEA edx, [edx*8+eax]
; ROL edx,4
; ADD edx,eax
JMP Encore
!FinChaineHexa1:
MOV Valeur,edx
ProcedureReturn Valeur
!NonChaineHexa1:
ProcedureReturn 0
!TableValeur1:
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$0A,$0B,$0C,$0D,$0E,$0F,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$0A,$0B,$0C,$0D,$0E,$0F,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
! DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
EndProcedure
SetPriorityClass_(GetCurrentProcess_(),#HIGH_PRIORITY_CLASS )
Temps1 = ElapsedMilliseconds()
For i = 1 To 50000000
ValHex("$A0")
Next i
Temps2 = ElapsedMilliseconds()
For i = 1 To 50000000
ValHex1("$A0")
Next i
Temps3 = ElapsedMilliseconds()
SetPriorityClass_(GetCurrentProcess_(),#NORMAL_PRIORITY_CLASS)
MessageRequester("Test rapidité", "Solution 1 : " + Str(Temps2 - Temps1) + " ; Solution 2 : " + Str(Temps3 - Temps2) + Chr(10) + "Ratio = 1 / " + StrF((Temps2 - Temps1) / (Temps3 - Temps2)), 0)
SetPriorityClass_(GetCurrentProcess_(),#HIGH_PRIORITY_CLASS )
Temps1 = ElapsedMilliseconds()
For i = 1 To 5000000
ValHex("$ABCDEF19")
Next i
Temps2 = ElapsedMilliseconds()
For i = 1 To 5000000
ValHex1("$ABCDEF19")
Next i
Temps3 = ElapsedMilliseconds()
SetPriorityClass_(GetCurrentProcess_(),#NORMAL_PRIORITY_CLASS)
MessageRequester("Test rapidité", "Solution 1 : " + Str(Temps2 - Temps1) + " ; Solution 2 : " + Str(Temps3 - Temps2) + Chr(10) + "Ratio = 1 / " + StrF((Temps2 - Temps1) / (Temps3 - Temps2)), 0)