Léa, elle est pas terroriste

Pour discuter de l'assembleur
Avatar de l’utilisateur
SPH
Messages : 4721
Inscription : mer. 09/nov./2005 9:53

Léa, elle est pas terroriste

Message par SPH »

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...
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
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Léa, elle est pas terroriste

Message par flaith »

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.
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Léa, elle est pas terroriste

Message par PAPIPP »

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).

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  
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.

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
On peut remarquer que la méthode la plus rapide est la conversion avec une table en accès direct.

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$)
A+
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.
minirop
Messages : 321
Inscription : mer. 02/août/2006 21:06

Re: Léa, elle est pas terroriste

Message par minirop »

le meilleur exemple est celui là :

Code : Tout sélectionner

lea eax, [esp+4]
est équivalent à :

Code : Tout sélectionner

mov eax, esp
add eax, 4
Répondre