Fantastique les compilateurs d'aujourd'hui

Fantastique les compilateurs d'aujourd'hui - ASM - Programmation

Marsh Posté le 04-09-2004 à 02:07:12    

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
Reply

Marsh Posté le 04-09-2004 à 02:07:12   

Reply

Marsh Posté le 04-09-2004 à 02:21:06    

:D
 
c'est une blague :D

Reply

Marsh Posté le 04-09-2004 à 02:27:26    

Et non  [:spamafote]


Message édité par AthlonSoldier le 04-09-2004 à 02:27:34
Reply

Marsh Posté le 04-09-2004 à 02:35:46    

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

Reply

Marsh Posté le 04-09-2004 à 02:37:05    

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

Reply

Marsh Posté le 04-09-2004 à 02:37:51    

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

Reply

Marsh Posté le 04-09-2004 à 02:39:49    

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

Reply

Marsh Posté le 04-09-2004 à 02:41:46    

C'est à dire ?  :??:

Reply

Marsh Posté le 04-09-2004 à 02:41:50    

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 ?

Reply

Marsh Posté le 04-09-2004 à 02:43:10    

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

Reply

Marsh Posté le 04-09-2004 à 02:43:10   

Reply

Marsh Posté le 04-09-2004 à 02:44:05    

C'est que a cet endroit  :lol:

Reply

Marsh Posté le 04-09-2004 à 02:45:06    

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)

Reply

Marsh Posté le 04-09-2004 à 02:45:50    

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]

Reply

Marsh Posté le 04-09-2004 à 02:48:16    

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

Reply

Marsh Posté le 04-09-2004 à 02:48:19    

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:

Reply

Marsh Posté le 04-09-2004 à 02:49:18    

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.

Reply

Marsh Posté le 04-09-2004 à 02:49:35    

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"

Reply

Marsh Posté le 04-09-2004 à 02:50:37    

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
Reply

Marsh Posté le 04-09-2004 à 02:53:28    

tu as le bout en "c" correspondant??

Reply

Marsh Posté le 04-09-2004 à 02:54:41    

prorel a écrit :

tu as le bout en "c" correspondant??


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

Reply

Marsh Posté le 04-09-2004 à 02:56:23    

meme le tout petit bout correspondant ?

Reply

Marsh Posté le 04-09-2004 à 02:57:59    

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:

Reply

Marsh Posté le 04-09-2004 à 03:00:22    

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++" :)

Reply

Marsh Posté le 04-09-2004 à 03:07:11    

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 ?

Reply

Marsh Posté le 04-09-2004 à 03:07:15    

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]

Reply

Marsh Posté le 04-09-2004 à 03:08:04    

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:

Reply

Marsh Posté le 04-09-2004 à 03:11:14    

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

Reply

Marsh Posté le 04-09-2004 à 03:19:18    

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

Reply

Marsh Posté le 04-09-2004 à 03:21:35    

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

Reply

Marsh Posté le 04-09-2004 à 03:29:57    

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.

Reply

Marsh Posté le 04-09-2004 à 03:36:37    

Ok si tu le dis  [:spamafote]

Reply

Marsh Posté le 04-09-2004 à 04:14:15    

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

Reply

Marsh Posté le 04-09-2004 à 11:53:32    

à ce jour c'est SP5 et PP5

Reply

Marsh Posté le 04-09-2004 à 11:58:25    

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
Reply

Marsh Posté le 04-09-2004 à 21:59:19    

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.

Reply

Marsh Posté le 04-09-2004 à 22:02:38    

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 ?

Reply

Marsh Posté le 04-09-2004 à 22:10:10    

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

Reply

Marsh Posté le 05-09-2004 à 00:08:30    

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

Reply

Marsh Posté le 05-09-2004 à 00:59:46    

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
Reply

Marsh Posté le 05-09-2004 à 22:20:39    

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 !

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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