PureBasic

Forums PureBasic
Nous sommes le Dim 22/Sep/2019 23:44

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 5 messages ] 
Auteur Message
 Sujet du message: Léa, elle est pas terroriste
MessagePosté: Sam 15/Sep/2012 17:44 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 09/Nov/2005 9:53
Messages: 4067
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 ////
Portable LENOVO ideapad 110-17ACL 64 bits
Version de PB : 5.70LTS - 32 bits


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Léa, elle est pas terroriste
MessagePosté: Sam 15/Sep/2012 17:51 
Hors ligne

Inscription: Lun 26/Avr/2004 0:40
Messages: 14535
Lea = Load Effective Adress

http://www.scm.tees.ac.uk/users/u000040 ... t/_LEA.htm

http://www.purebasic.fr/english/viewtopic.php?p=184665


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Léa, elle est pas terroriste
MessagePosté: Lun 17/Sep/2012 6:42 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 07/Avr/2005 1:06
Messages: 1489
Localisation: Rennes
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Léa, elle est pas terroriste
MessagePosté: Lun 17/Sep/2012 7:58 
Hors ligne

Inscription: Sam 23/Fév/2008 17:58
Messages: 556
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:
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.

Citation:

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:


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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Léa, elle est pas terroriste
MessagePosté: Ven 05/Oct/2012 4:45 
Hors ligne

Inscription: Mer 02/Aoû/2006 21:06
Messages: 321
le meilleur exemple est celui là :
Code:
lea eax, [esp+4]

est équivalent à :
Code:
mov eax, esp
add eax, 4


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 5 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  
cron

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye