Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1084 connectés 

  FORUM HardWare.fr
  Programmation
  ASM

  Delphi et registre EAX

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Delphi et registre EAX

n°1353485
Tetranos
Posté le 25-04-2006 à 12:24:34  profilanswer
 

Bonjour à tous...
 
J'ai trouvé sur le net à l'adresse suivante http://groups.google.fr/group/comp [...] 99998e8d54
une petit explication pour pouvoir récupérer en delphi les informations d'un fichier.
 
A l'intérieur de ce HOWTO, la fonction en assembleur a attiré mon attention :
 

Code :
  1. function SwapLong(L: LongInt): LongInt; assembler;
  2.     asm rol eax, 16;
  3. end;


 
Je comprends bien le ROL et tout et tout, en revanche ce que je ne comprends pas c'est comment la paramétre L se retrouve dans le registre EAX, et comment le résultat de la fonction est renvoyé.
 
D'aprés ce qu'on m'a dit, la convention veut que le résultat d'une fonction soit toujours placé dans EAX, mais ça ne me dit pas comment le paramétre L est placé dans ce même registre.
 
Voilà, si vous avez des réponses, c'est plus par curiosité car pour que le tout soit un peu plus lisible (enfin moins sorti de l'espace) j'ai remplacé cette fonction par celle là :
 

Code :
  1. function SwapLong(nLong: LongInt): LongInt;
  2. begin
  3.   Result := (nLong shr 16) or (nLong shl 16);
  4. end;


 
Merci...et bon code

mood
Publicité
Posté le 25-04-2006 à 12:24:34  profilanswer
 

n°1353589
bjone
Insert booze to continue
Posté le 25-04-2006 à 14:06:56  profilanswer
 

la pluspart des compilateurs pratiquent effectivement généralement cette règle, passer les paramètres par les registres (puis par la pile si y'a pas assez de registres) puis les récupérer depuis les registres.
 
en fait dans ton cas L ne se retrouve pas dans eax, mais L est eax :D, et le retour est eax.
 
c'est la fonction appellante qui mets le longint dans eax avant l'appel, et  qui récupère le résultat depuis eax au retour.
 
swaplong:
    rol eax,16
    ret
 
machin_truc:
    mov eax,truc
    call swaplong
    mov zogzog,eax

n°1353590
bjone
Insert booze to continue
Posté le 25-04-2006 à 14:08:43  profilanswer
 

d'ailleurs dans ton cas, je me demande si la méthode avec les deux shifts et le or sera pas plus rapide.

n°1353599
Tetranos
Posté le 25-04-2006 à 14:22:26  profilanswer
 

Niveau perf, à ce niveau là je dois avouer que j'ai du mal...Mais bon, sans réfléchir j'aurais dit que ma méthode était plus longue (au moins 3 instructions asm, non ?)...

n°1353638
bjone
Insert booze to continue
Posté le 25-04-2006 à 15:08:25  profilanswer
 

de toutes manière le coût intrinsèque de l'instruction n'est pas pertinent si le compilo ne fait d'inline (le coût d'appel et de retour est plus important que le rol ou les shifts+or).
 
le pb de mettre de l'asm inline, c'est que ça peut couper localement des optimisations du compilo.

n°1353640
bjone
Insert booze to continue
Posté le 25-04-2006 à 15:09:35  profilanswer
 

d'ailleurs le rol doit être certainement éclaté en µops (par rapport à la solution 3 instructions triviales).


Message édité par bjone le 25-04-2006 à 16:28:23
n°1353727
Tetranos
Posté le 25-04-2006 à 16:26:13  profilanswer
 

ok, ok...
 
En tout cas merci pour l'info :D

n°1388579
anordem
Posté le 16-06-2006 à 00:28:31  profilanswer
 

bjone a écrit :

la pluspart des compilateurs pratiquent effectivement généralement cette règle, passer les paramètres par les registres (puis par la pile si y'a pas assez de registres) puis les récupérer depuis les registres.
 
en fait dans ton cas L ne se retrouve pas dans eax, mais L est eax :D, et le retour est eax.
 
c'est la fonction appellante qui mets le longint dans eax avant l'appel, et  qui récupère le résultat depuis eax au retour.
 
swaplong:
    rol eax,16
    ret
 
machin_truc:
    mov eax,truc
    call swaplong
    mov zogzog,eax


 
Attention tout de même!
Ceci est valable uniquement lorsque les options d'optimisation sont sélectionnées. Sinon les paramêtres sont passés par la pile.
http://nono40.developpez.com/tutor [...] sm/#LIII-D
 
Il est donc préférable de récupérer la variable par son nom plutôt qu'en supposant qu'elle se trouve à tel endroit. :)
 
Quant à la vitesse d'exécution des 2 fonctions, à moins qu'elles ne fassent parti d'un gros calcul lourd et répétitif, je ne pense pas que l'on sentira la différence! :)

n°1388651
bjone
Insert booze to continue
Posté le 16-06-2006 à 09:37:52  profilanswer
 

bin disons que tu fais pas une fonction call-ée avec 1 instruction dedans :D


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  ASM

  Delphi et registre EAX

 

Sujets relatifs
[Delphi] fichiers en cours d'ecritureComment lire dans la base de registre dans un .bat ?
Connexion PostgreSQL - Delphi[DELPHI] Enregistrement de fichiers texte
[Delphi] probleme requete nil[Delphi] Le Webbrowser et ses bordures :)
Delphi version Personnel vs Java ?(Résolu): n'affiche pas le premier registre de mes tables
[Delphi] Expression régulière - nom de fichier[DELPHI] récupérer les infos d'un ac3.
Plus de sujets relatifs à : Delphi et registre EAX


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR