Delphi et registre EAX

Delphi et registre EAX - ASM - Programmation

Marsh Posté le 25-04-2006 à 12:24:34    

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

Reply

Marsh Posté le 25-04-2006 à 12:24:34   

Reply

Marsh Posté le 25-04-2006 à 14:06:56    

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

Reply

Marsh Posté le 25-04-2006 à 14:08:43    

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

Reply

Marsh Posté le 25-04-2006 à 14:22:26    

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

Reply

Marsh Posté le 25-04-2006 à 15:08:25    

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.

Reply

Marsh Posté le 25-04-2006 à 15:09:35    

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
Reply

Marsh Posté le 25-04-2006 à 16:26:13    

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

Reply

Marsh Posté le 16-06-2006 à 00:28:31    

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! :)

Reply

Marsh Posté le 16-06-2006 à 09:37:52    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed