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

  FORUM HardWare.fr
  Programmation
  ASM

  Fantastique les compilateurs d'aujourd'hui

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4  5  6
Page Précédente
Auteur Sujet :

Fantastique les compilateurs d'aujourd'hui

n°841956
AthlonSold​ier
Feel the power
Posté le 04-09-2004 à 02:07:12  profilanswer
 

Salut,
 
Je me suis amusé à déassembler le code d'une dll que j'avais codé en C++ et voilà ce que j'obtiens :
http://www.phlos.com/ovh/compilateur.jpg
 
On comprends pourquoi le code est de plus en plus lent  :whistle:


Message édité par AthlonSoldier le 19-04-2007 à 22:38:21
mood
Publicité
Posté le 04-09-2004 à 02:07:12  profilanswer
 

n°841963
bjone
Insert booze to continue
Posté le 04-09-2004 à 02:21:06  profilanswer
 

:D
 
c'est une blague :D

n°841966
AthlonSold​ier
Feel the power
Posté le 04-09-2004 à 02:27:26  profilanswer
 

Et non  [:spamafote]


Message édité par AthlonSoldier le 04-09-2004 à 02:27:34
n°841977
bjone
Insert booze to continue
Posté le 04-09-2004 à 02:35:46  profilanswer
 

c'est quoi comme compilo ?
 
il est en mode debug pas convaincu ?

n°841979
AthlonSold​ier
Feel the power
Posté le 04-09-2004 à 02:37:05  profilanswer
 

Microsoft Visual C++ 6.0 et pas en mode DEBUG or whatever  :pt1cable:

n°841980
prorel
Posté le 04-09-2004 à 02:37:51  profilanswer
 

:D
 
ils le font plusieurs fois pour etre sur que l'instruction s'execute bien

n°841983
prorel
Posté le 04-09-2004 à 02:39:49  profilanswer
 

serieux, tu es dans une zone de données, c'est pour ca que ca fait n'importe quoi

n°841986
AthlonSold​ier
Feel the power
Posté le 04-09-2004 à 02:41:46  profilanswer
 

C'est à dire ?  :??:

n°841987
bjone
Insert booze to continue
Posté le 04-09-2004 à 02:41:50  profilanswer
 

c'est ce que je me disais, mais le .text c'est le segment de code non ? (et non de données initialisés)
 
ou je suis super fatigué et il faut que j'ailles me coucher ?

n°841988
bjone
Insert booze to continue
Posté le 04-09-2004 à 02:43:10  profilanswer
 

AthlonSoldier >> c'est partout pareil ? (si tu désassemnble depuis un point d'entrée de fonction)
ou c'est uniquement à cet endroit ?

mood
Publicité
Posté le 04-09-2004 à 02:43:10  profilanswer
 

n°841989
AthlonSold​ier
Feel the power
Posté le 04-09-2004 à 02:44:05  profilanswer
 

C'est que a cet endroit  :lol:

n°841990
prorel
Posté le 04-09-2004 à 02:45:06  profilanswer
 

ben si le desassembleur ne retrouve pas ses petits, il referencera l'adresse par rapport a la derniere zone connue
et rien ne t'empeche de mettre des datas en plein milieu de ton code (si tu ne le declare pas en .data)

n°841991
AthlonSold​ier
Feel the power
Posté le 04-09-2004 à 02:45:50  profilanswer
 

prorel a écrit :

serieux, tu es dans une zone de données, c'est pour ca que ca fait n'importe quoi


Ah tu veux dire que j'ai deasm les data et interprete les "opcodes" en tant que code assembleur ?  [:sygus]  
Non ca je peux te l'assurer, c'est bien un extrait du code généré par le compilo  [:ddr555]

n°841992
prorel
Posté le 04-09-2004 à 02:48:16  profilanswer
 

moi je sais que quand je desassemble un prog, je regarde d'abord le fichier binaire avec un editeur hexa, ca me permet de situer les zones code et les zones data
dans les zones codes, y a n'importe quoi, alors que les zones data, on a soit des zero, soit des ensembles repetitifs

n°841993
AthlonSold​ier
Feel the power
Posté le 04-09-2004 à 02:48:19  profilanswer
 

C'est l'extrait d'une fonction qui prends en entrée 1 char + 1 pointeur sur une string, et en sortie qui renvoit 1 char  :whistle:

n°841994
bjone
Insert booze to continue
Posté le 04-09-2004 à 02:49:18  profilanswer
 

c'est vrai que le désassembleur peut se paumer en chemin, et se décaler au niveau des octets. (d'autant plus que les points d'entrée de fonctions sont ptet alignées sur des para, et qu'il fout des conneries entre).
 
ché pas compile la DLL en générant le listing ASM pour voir à quel code C++ le truc fait du n'imp.

n°841995
prorel
Posté le 04-09-2004 à 02:49:35  profilanswer
 

AthlonSoldier a écrit :

Ah tu veux dire que j'ai deasm les data et interprete les "opcodes" en tant que code assembleur ?  [:sygus]  
Non ca je peux te l'assurer, c'est bien un extrait du code généré par le compilo  [:ddr555]


 
si c'est vrai tu dois avoir une sequence de pop suivie d'un "ret"

n°841996
AthlonSold​ier
Feel the power
Posté le 04-09-2004 à 02:50:37  profilanswer
 

prorel a écrit :

si c'est vrai tu dois avoir une sequence de pop suivie d'un "ret"


 [:sygus]  
Si ca peut te rassurer j'utilise tous les jours des désassembleurs, je sais où je me trouve t'inquiete  [:ddr555]
EDIT : C'est juste que ca m'a bien fait marrer le code trop optimisé  :lol:


Message édité par AthlonSoldier le 04-09-2004 à 02:51:19
n°841997
prorel
Posté le 04-09-2004 à 02:53:28  profilanswer
 

tu as le bout en "c" correspondant??

n°841999
AthlonSold​ier
Feel the power
Posté le 04-09-2004 à 02:54:41  profilanswer
 

prorel a écrit :

tu as le bout en "c" correspondant??


Pour des raisons personnelles, je ne peux pas le diffuser  :jap:

n°842001
Dion
Acceuil
Posté le 04-09-2004 à 02:56:23  profilanswer
 

meme le tout petit bout correspondant ?

n°842002
AthlonSold​ier
Feel the power
Posté le 04-09-2004 à 02:57:59  profilanswer
 

Non, désolé.  :p  
Peu importe le code C++ (et c'est pas un fake avec un __asm__{ })...
Le truc qu'il faut retenir c'est qu'un compilateur il compile, on est pas encore arriver a des compilateurs intelligent qui relise le code et font "putain c'est con de faire ca, je change"  :whistle:

n°842004
prorel
Posté le 04-09-2004 à 03:00:22  profilanswer
 

AthlonSoldier a écrit :

Pour des raisons personnelles, je ne peux pas le diffuser  :jap:


 
dommage, ceci dit ca me rappel qq chose, une simple operation sur des integer qui partait en couille comme ca, alors qu'en flottant c'etait impec
 
remarque quand on voit
 

mov eax, [ebp+arg_0]
add eax,1
mov [ebp+arg_0],eax


 
on touche au sommet de la prog optimisée
ca doit correspondre a une boucle "for i++" :)

n°842009
bjone
Insert booze to continue
Posté le 04-09-2004 à 03:07:11  profilanswer
 

AthlonSoldier a écrit :

Non, désolé.  :p  
Peu importe le code C++ (et c'est pas un fake avec un __asm__{ })...
Le truc qu'il faut retenir c'est qu'un compilateur il compile, on est pas encore arriver a des compilateurs intelligent qui relise le code et font "putain c'est con de faire ca, je change"  :whistle:


 
tu l'as servce packé ton VS 6.0 ?

n°842010
AthlonSold​ier
Feel the power
Posté le 04-09-2004 à 03:07:15  profilanswer
 

Ou des trucs de ce genre (deja vu aussi) :

Code :
  1. xor eax, eax
  2. [...beaucoup d'instructions mais qui utilise pas eax...]
  3. xor eax, eax
  4. [...d'autres instructions...]


 
Or eax etait forcement deja à 0, pas besoin de le remettre a 0  :p  
Simplement le compilateur est con et fonctionne par "bloc" a traduire sans tenir compte des autres precedants (et des etat des registres)  [:spamafote]

n°842012
AthlonSold​ier
Feel the power
Posté le 04-09-2004 à 03:08:04  profilanswer
 

bjone a écrit :

tu l'as servce packé ton VS 6.0 ?


C'est pas un probleme de VS patché ou pas, c'est commun a tous les compilateurs, c'est du code vraiment de compilateur quoi  :lol:

n°842017
prorel
Posté le 04-09-2004 à 03:11:14  profilanswer
 

tu as essayé d'autres options d'optimisation??
là t'es ptet en priorité a la vitesse??

n°842019
AthlonSold​ier
Feel the power
Posté le 04-09-2004 à 03:19:18  profilanswer
 

Peu importe  [:spamafote]  
Le but n'etait pas d'optimiser mon code  [:yopyop-]

n°842020
prorel
Posté le 04-09-2004 à 03:21:35  profilanswer
 

ah ben là t'as reussi :) :)

n°842028
bjone
Insert booze to continue
Posté le 04-09-2004 à 03:29:57  profilanswer
 

AthlonSoldier a écrit :

C'est pas un probleme de VS patché ou pas, c'est commun a tous les compilateurs, c'est du code vraiment de compilateur quoi  :lol:


 
pour VS 6.0 si clairement.
 
ensuite, les compilos font généralement bien leur boulot.
là c'est encore VS 6.0 was here.
 
le watcom de 1996 faisait mieux que ça, donc ton VS il a un problème quand même ;) fo pas déconner non plus.

n°842033
AthlonSold​ier
Feel the power
Posté le 04-09-2004 à 03:36:37  profilanswer
 

Ok si tu le dis  [:spamafote]

n°842046
bjone
Insert booze to continue
Posté le 04-09-2004 à 04:14:15  profilanswer
 

sérieusement, ton VS 6.0 il est à quel service pack ?
 
parce que, que l'on trouve des défauts de génération de code, ouais, mais 3 fois le même masquage de bits, fo le vouloir :D

n°842134
christophe​_d13
L'efficacité à tout prix.
Posté le 04-09-2004 à 11:53:32  profilanswer
 

à ce jour c'est SP5 et PP5

n°842135
chrisbk
-
Posté le 04-09-2004 à 11:58:25  profilanswer
 

prorel a écrit :

dommage, ceci dit ca me rappel qq chose, une simple operation sur des integer qui partait en couille comme ca, alors qu'en flottant c'etait impec
 
remarque quand on voit
 

mov eax, [ebp+arg_0]
add eax,1
mov [ebp+arg_0],eax


 
on touche au sommet de la prog optimisée
ca doit correspondre a une boucle "for i++" :)


 
ca a pour moi une superbe tronche de code debug, ou la variable 'destination' d'une expression est obligatoirement spillé a la fin de ladite expression  .Generalement le compilo fout quand meme le compteur dans ecx


Message édité par chrisbk le 04-09-2004 à 12:03:18
n°842380
jesus_chri​st
votre nouveau dieu
Posté le 04-09-2004 à 21:59:19  profilanswer
 

attention les instructions bidons avant une boucle c'est pour aligner sur 16 octets. et plutôt que de faire 16 nop, il écrivent des instructions longues.
Celà dit j'ai souvent désassemblé du code compilé pour voir si une optim ASM valait le coup et j'ai souvent été impressionné par la quantité d'instructions inutiles insérées. Il y a par exemple beaucoup de pop et push pour récupérer des registres alors que l'algo se satisafait de 2 registres sans pb.

n°842384
AthlonSold​ier
Feel the power
Posté le 04-09-2004 à 22:02:38  profilanswer
 

jesus_christ a écrit :

attention les instructions bidons avant une boucle c'est pour aligner sur 16 octets. et plutôt que de faire 16 nop, il écrivent des instructions longues.
Celà dit j'ai souvent désassemblé du code compilé pour voir si une optim ASM valait le coup et j'ai souvent été impressionné par la quantité d'instructions inutiles insérées. Il y a par exemple beaucoup de pop et push pour récupérer des registres alors que l'algo se satisafait de 2 registres sans pb.


Aligner sur 16 octets ?  :??:  
Pourquoi ?

n°842392
chrisbk
-
Posté le 04-09-2004 à 22:10:10  profilanswer
 

jesus_christ a écrit :

attention les instructions bidons avant une boucle c'est pour aligner sur 16 octets. et plutôt que de faire 16 nop, il écrivent des instructions longues.
Celà dit j'ai souvent désassemblé du code compilé pour voir si une optim ASM valait le coup et j'ai souvent été impressionné par la quantité d'instructions inutiles insérées. Il y a par exemple beaucoup de pop et push pour récupérer des registres alors que l'algo se satisafait de 2 registres sans pb.


 
fo faire gaffe au convention de preservation de reg lors de l'appel d'une fonction

n°842486
Taz
bisounours-codeur
Posté le 05-09-2004 à 00:08:30  profilanswer
 

AthlonSoldier a écrit :

Salut,
 
Je me suis amusé à déassembler le code d'une dll que j'avais codé en C++ et voilà ce que j'obtiens :
http://90plan.ovh.net/~phlos/compilateur.jpg
 
On comprends pourquoi le code est de plus en plus lent  :whistle:

putain c'est vrai que faut en vouloir pour faire une capture comme ça en jpg. avant de vouloir optimiser le code de ton voisin, commence  la poutre qui est dans ton oeil :o

n°842511
bjone
Insert booze to continue
Posté le 05-09-2004 à 00:59:46  profilanswer
 

AthlonSoldier a écrit :

Aligner sur 16 octets ?  :??:  
Pourquoi ?


 
ché pas, avoir le début de la boucle qui tombe facilement sur le début d'une ligne de cache par exemple (je veux dire peut être).


Message édité par bjone le 05-09-2004 à 01:00:09
n°842929
jesus_chri​st
votre nouveau dieu
Posté le 05-09-2004 à 22:20:39  profilanswer
 

le code dans des boucles c'est comme les données : c'est mieux quand c'est aligné. Et sur les proc récents, le top c'est aligné sur 16 octets. Un pentium se contente de 4 octets mais 16 ça satisfait tt le monde.
Quand à la présevation ça se fait entre l'appel et le retour. Là je parle de pop et push dans le corps d'une fonction. En pushant esi, edi, ebp et ebx au début on peut bosser sur 7 registres tranquilement. Faut juste les poper avant le ret. En assembleur MASM c'est automatisable (directive USES). Les compilo ont tendance à faire des pop et des push plusieurs fois sur le même registre.
La baisse de perfs est masquée par le goulot d'étranglement mémoire. Perso qd je bench je le fait sur un vieux proc où le bus mémoire sature le bus procésseur : un pmmx avec de la PC100 en 2-2-2. Là on voit la diff entre c compilé et assembleur manuel !

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  6
Page Précédente

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

  Fantastique les compilateurs d'aujourd'hui

 

Sujets relatifs
Compilateurs, librairies, projets... comment organiser ses dossiers?Compilateurs...
Livres sur la conception des compilateurs / cours / ouvrage en ligneles Compilateurs, Editeurs, IDE pour le Java [listing inside]
Comment recuperer la date d'aujourd'hui et la foutre en CString ?Commencez en c++ Réferences ? compilateurs ?
[MA VIE] tin aujourd'hui j'ai pris une leçon d'humilité !!!phpBB 2 final sort aujourd'hui
Compilateurs inside[C++] Anomalies compilateurs
Plus de sujets relatifs à : Fantastique les compilateurs d'aujourd'hui


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)