Salut,
je me demandais ce qu'est l'instruction "lea". Alors, a defaut de remettre la main sur mon livre asm, je vous pose la question...
Léa, elle est pas terroriste
Léa, elle est pas terroriste
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Re: Léa, elle est pas terroriste
En terme "Basic", cela équivaut à affecter une valeur à une variable
En PB c'est comme indiquer que A = 30 par exemple
Mais comme le souligne Dobro dans le second lien, l'instruction MOVE permet de faire la même chose
Mais, en assembleur, on recherche toujours à optimiser, il y a les aficionados qui préfèrent utiliser LEA.
En PB c'est comme indiquer que A = 30 par exemple
Mais comme le souligne Dobro dans le second lien, l'instruction MOVE permet de faire la même chose
Mais, en assembleur, on recherche toujours à optimiser, il y a les aficionados qui préfèrent utiliser LEA.
Re: Léa, elle est pas terroriste
Bonjour flaith
Ce n’est pas par une affection particulière que les programmeurs ASM utilisent les instructions permettant de travailler avec les adresses. Mais pour accéder par indexage aux données dans un vecteur dans un tableau par exemple.Et cerise sur le gâteau si mes souvenirs sont bons c'est une instruction qui prend moins ce cycle machine que MOV..
Exemple d’une procédure pour convertir un octet en hexadécimal
La procédure utilise !LEA pour charger l'adresse du premier octet d’une table et xlatb qui se sert de l’adresse de la table et d’un index 1/2 octet dans le registre AL pour aller chercher la valeur hexa. Normalement xlatb utilise une table de 256 octets mais ici la réduction de la table à 15 occurrences est naturel (on ne peut trouver sur 4 bits une valeur supérieure à 15 donc 16 positions avec la valeur 0).
Cette procédure est plus rapide sur un octet que l’instruction HEX() mais ce n'est pas la méthode la plus rapide.
Dans quelques jours je vous donnerai les résultats complets sur la conversion d’un octet en hexa
Voici à titre d »exemple les premiers résultats que j’ai obtenu.
test sur le nombre de cycles entre LEA et MOV.
A+
Ce n’est pas par une affection particulière que les programmeurs ASM utilisent les instructions permettant de travailler avec les adresses. Mais pour accéder par indexage aux données dans un vecteur dans un tableau par exemple.Et cerise sur le gâteau si mes souvenirs sont bons c'est une instruction qui prend moins ce cycle machine que MOV..
Exemple d’une procédure pour convertir un octet en hexadécimal
La procédure utilise !LEA pour charger l'adresse du premier octet d’une table et xlatb qui se sert de l’adresse de la table et d’un index 1/2 octet dans le registre AL pour aller chercher la valeur hexa. Normalement xlatb utilise une table de 256 octets mais ici la réduction de la table à 15 occurrences est naturel (on ne peut trouver sur 4 bits une valeur supérieure à 15 donc 16 positions avec la valeur 0).
Code : Tout sélectionner
Procedure.s CONV_CODEM_HEX(Octet.a)
Structure M16b
StructureUnion
va.a[2]
vb.b[2]
vc.c[2]
VW.w
VS${2}
EndStructureUnion
EndStructure
; p.v_Octet equ esp+PS0+0
; p.v_VAA equ esp+0
Define VAA.M16b
!XOR eax,eax ; 0 dans EAX
!LEA ebx,[Tab_Val_Hex2] ; Charge l'adresse de la table de conversion necessaire à l'instruction XLATB
!MOV al,[p.v_Octet] ; Charge l'octet dans le registre AL
!AND al,$0F ; Ne garde que les 4 bits les plus faibles
!XLATB ; Remplace la valeur de AL offset pour la table par la valeur trouvée dans la table adresse en EBX résultat dans AL
!MOV DH,al ; Sauvegarde de AL dans DH partie Haute de DX
!MOV al,[p.v_Octet] ; Charge l'octet dans le registre AL
!SHR AX,4 ; Ne garde que les 4 bits les plus forts
!XLATB ; Remplace la valeur de AL offset pour la table par la valeur trouvée dans la table adresse en EBX résultat dans AL
!MOV DL,al ; Sauvegarde de AL dans DL partie Basse de DX
!MOV [p.v_VAA],dx ; Sauvegarde de DX dans VAA
ProcedureReturn vAA\VS$ ; Passage de la valeur Hexa en retour de PRG
!Tab_Val_Hex2: ; Table de conversion de Binaire en Hexa
! DB "0123456789ABCDEF"
EndProcedure
Dans quelques jours je vous donnerai les résultats complets sur la conversion d’un octet en hexa
Voici à titre d »exemple les premiers résultats que j’ai obtenu.
On peut remarquer que la méthode la plus rapide est la conversion avec une table en accès direct.
CONDITIONS ==>: BMAX=20000 Hmin=0 Hmax=255
HEX(i): 4784090104 -Temps elapse =1500
rset(hex(i),2,'0'): 5545076192 -Temps elapse =1735
CONV_DEC_HEX(i): 3401841264 -Temps elapse =1062
CHARG_TAB_MAP(1): 3121535200 -Temps elapse =985
SANS CHARG_TAB_MAP(): 3125511976 -Temps elapse =968
SANS RIEN : 31941360 -Temps elapse =16
Temps réel de HEX()= 1484
Temps réel de RSet(Hex(i),2,'0')= 1719
Temps réel deCONV_CODEM_HEX(i)= 1046
Temps réel de Direct avec chargement de la table= 969
Temps réel de Direct sans charhement de la table= 952
NB CycleS HEX()= 4752159264
NB CycleS RSet(Hex(i),2,'0')= 5513142352
NB CycleS CONV_CODEM_HEX(i)= 3369931728
NB CycleS Direct avec chargement de la table= 3089606640
NB CycleS Direct sans charhement de la table= 3093578352
test sur le nombre de cycles entre LEA et MOV.
Code : Tout sélectionner
ProcedureDLL.q __nbcs() ;**** Procédure pour évaluer le nb de cycles machine
!RDTSC
ProcedureReturn
EndProcedure
Procedure LEA_()
!LEA eax,[Tab_Val_Hex2] ;
ProcedureReturn 0;
!Tab_Val_Hex2: ;
! DB "0123456789ABCDEF"
EndProcedure
Procedure MOV_ ()
!MOV ax,word [Tab_Val_Hex1] ;
ProcedureReturn 0;
!Tab_Val_Hex1: ;
! DB "0123456789ABCDEF"
EndProcedure
IMAX.l=200000
D1=__nbcs()
De1=ElapsedMilliseconds()
For i=0 To IMAX
LEA_()
Next
resultat$+" LEA_(): "+#TAB$+Str(__nbcs()-D1)+#TAB$+" -Temps elapse ="+Str(ElapsedMilliseconds()-De1)+#CRLF$
DUR1.q=ElapsedMilliseconds()-De1
D1=__nbcs()
De1=ElapsedMilliseconds()
For i=0 To IMAX
MOV_()
Next
resultat$+" MOV_(): "+#TAB$+Str(__nbcs()-D1)+#TAB$+" -Temps elapse ="+Str(ElapsedMilliseconds()-De1)+#CRLF$
DUR1.q=ElapsedMilliseconds()-De1
MessageRequester("ATTENTION",resultat$)
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Re: Léa, elle est pas terroriste
le meilleur exemple est celui là :
est équivalent à :
Code : Tout sélectionner
lea eax, [esp+4]
Code : Tout sélectionner
mov eax, esp
add eax, 4