Fantastique les compilateurs d'aujourd'hui - ASM - Programmation
Marsh Posté le 04-09-2004 à 02:27:26
Et non
Marsh Posté le 04-09-2004 à 02:35:46
c'est quoi comme compilo ?
il est en mode debug pas convaincu ?
Marsh Posté le 04-09-2004 à 02:37:05
Microsoft Visual C++ 6.0 et pas en mode DEBUG or whatever
Marsh Posté le 04-09-2004 à 02:37:51
ils le font plusieurs fois pour etre sur que l'instruction s'execute bien
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
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 ?
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 ?
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)
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 ?
Non ca je peux te l'assurer, c'est bien un extrait du code généré par le compilo
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
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
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.
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 ? |
si c'est vrai tu dois avoir une sequence de pop suivie d'un "ret"
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" |
Si ca peut te rassurer j'utilise tous les jours des désassembleurs, je sais où je me trouve t'inquiete
EDIT : C'est juste que ca m'a bien fait marrer le code trop optimisé
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
Marsh Posté le 04-09-2004 à 02:57:59
Non, désolé.
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"
Marsh Posté le 04-09-2004 à 03:00:22
AthlonSoldier a écrit : Pour des raisons personnelles, je ne peux pas le diffuser |
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] |
on touche au sommet de la prog optimisée
ca doit correspondre a une boucle "for i++"
Marsh Posté le 04-09-2004 à 03:07:11
AthlonSoldier a écrit : Non, désolé. |
tu l'as servce packé ton VS 6.0 ?
Marsh Posté le 04-09-2004 à 03:07:15
Ou des trucs de ce genre (deja vu aussi) :
Code :
|
Or eax etait forcement deja à 0, pas besoin de le remettre a 0
Simplement le compilateur est con et fonctionne par "bloc" a traduire sans tenir compte des autres precedants (et des etat des registres)
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
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??
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 |
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.
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
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
|
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
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.
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. |
Aligner sur 16 octets ?
Pourquoi ?
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. |
fo faire gaffe au convention de preservation de reg lors de l'appel d'une fonction
Marsh Posté le 05-09-2004 à 00:08:30
AthlonSoldier a écrit : Salut, |
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
Marsh Posté le 05-09-2004 à 00:59:46
AthlonSoldier a écrit : Aligner sur 16 octets ? |
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).
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 !
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 :
On comprends pourquoi le code est de plus en plus lent
Message édité par AthlonSoldier le 19-04-2007 à 22:38:21