Quel est l'assembleur le plus rapide ? [Résolu]

Messages postés
83
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
22 mars 2011
- - Dernière réponse :  cs_ghuysmans99 - 16 août 2008 à 00:24
Salut à tous !
Une nouvelle question , suite à quelques infos trouvées sur le net ...
J'utilise MASM32 , mais de nombreux sites dises qu'il produit un code moins rapide que d'autre (comme NASM ou TASM) , du coup je pense sérieusement changer , mais je croyais tout les assembleurs produisait le même code ? un mov eax,eax ne donnera pas le même éxécutable suivant le compilateur qu'on utilise ? les opcodes sont pourtant fixés non ?
Si il y a des différences , savez vous lequel , de NASM ou de TASM (ou un autre) , est le plus rapide ?
Merci ...

<hr size="2" width="100%" />Visitez le site de ma librairie graphique :  http://hydrargyrum.ifrance.com  http://hydrargyrum.ifrance.com !
Afficher la suite 

20/27 réponses

Meilleure réponse
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
3
Merci
C'est du nimporte quoi, en ASM on obtient le binaire qu'on a codé et rien de plus.

ciao...
BruNews, MVP VC++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 218 internautes nous ont dit merci ce mois-ci

Commenter la réponse de BruNews
Messages postés
83
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
22 mars 2011
0
Merci
OK , c'est ce que je pensait , mais comme j'arrête pas de voir des "MASM32 c'est nul" , "c'est lent" , "c'est pas un vrai assembleur" ... je me posais la question .
Merci !

<hr size="2" width="100%" />Visitez le site de ma librairie graphique :  http://hydrargyrum.ifrance.com  http://hydrargyrum.ifrance.com !
Commenter la réponse de epineurien
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
Faut bien préciser aussi qu'avec MASM32 on peut y mettre du pseudo code avec lequel on n'obtient surement pas ce qu'il y a de plus performant.
Il suffit de vraiment coder et là il n'y aura plus aucune différence avec un autre assembleur.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
69
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
22 mars 2010
1
0
Merci
pas vrai.
certains assembleurs optimisent les instrucions, pour rendre le code plus petit, et donc plus rapide.

exemple: fasm.

me:
nop
ret
Commenter la réponse de edfed
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
exemple d'optimisation ?

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
83
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
22 mars 2011
0
Merci
Oui ca m'intéresse beaucoup aussi edfed .
Parceque si c'est juste une optimisation style ; remplacer des Mov/Add par des Rep (et autre optimisations du même style), je le fait déjà tout seul comme un grand sous masm .
Par contre si c'est un truc que le codeur peut pas faidre lui-même , là ca m'intérèsse . (mais j'ai des doutes , l'asm c'est quand même fait pour ... pouvoir tout faire).
<hr size="2" width="100%" />Visitez le site de ma librairie graphique :  http://hydrargyrum.ifrance.com  http://hydrargyrum.ifrance.com .
Commenter la réponse de epineurien
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
ouh la....
remplacer des Mov/Add par des Rep EST UNE DEGRADATION des perfs, pas du tout une optimisation.
Ces vieilles instructions de chaine sont à mettre aux oubliettes.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
83
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
22 mars 2011
0
Merci
Ahhhhh m------.
Pourtant dans la doc. d'intel ils disent que pour des grands blocs de données elles sont plus rapides ?
Ils disent bien que si c'est juste pour deux trois transfert ca ne vaut pas la peine , donc je les utilise que quand j'ai des buffer entiers à déplacer...
Cela dit la doc. est un peu vieille , donc  d'aprés toi désromais même pour des grand blocs c'est plus rapide de faire mov/ add edi,esi ?
A tout hazard , tu n'aurais pas une adresse avec les cycles d'horloge/parallélisation et co. qui  soit à jours , puisqu'apparement la mienne est obsolète (est donc pas follement utile) ...
Merci pour l'info , je vire de ce pas tout les 'Rep movsd' de mes codes .

<hr size="2" width="100%" />Visitez le site de ma librairie graphique :  http://hydrargyrum.ifrance.com  http://hydrargyrum.ifrance.com .
Commenter la réponse de epineurien
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
Grands ou petits blocs, à virer définitivement.


mov esi, offset m_SRC
mov edx, offset m_DST
mov ecx, 500
goSRC:
mov eax, [esi]
mov [edx], eax
mov eax, [esi+4]
mov [edx+4], eax
add esi, 8
add edx, 8
sub ecx, 1
jne short goSRC


Avec les instruction simples, on peut dérouler, utiliser les registres qu'on veut (surtout ceux libres à un certain moment), etc.


Tu peux prendre cela que j'avais récupéré je ne sais plus où:
lien: www.brunews.com/P4fr.pdf
mais ne pas trop se fier aux cycles indiqués, il faut toujours mesurer son code.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
69
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
22 mars 2010
1
0
Merci
fasm va faire ceci:
si on entre un
lea eax,[eax*5]
ce qui sort:
lea eax,[eax*4+eax]
idem::
lea eax,[eax*9]
lea eax,[eax*8+eax]

encore d'autres exemples, comme mov eax,[esi+0]
ça devien un mov eax,[esi]
le zero disparait, il sert à rien, utile dans le code source, mais c'est tout.

puis, il y a aussi les perf du compilo, surtout les perf du compilo, celles qui font que c'est aussi rapide de compiler et executer que d'executer.
donc, facilité de developpement.
fasmw, la version windows avec une ide integrée est de loin la meilleure maniere de coder en asm-x86, que ce soit 16, 32 ou 64 bits.

mias ça reste un avis, à comparer, mais comme la comparaison à deja eté faite, cherecher les resultats sur le net.

me:
nop
ret
Commenter la réponse de edfed
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
0
Merci
Pour la rapidité d'un programme il faut aussi tenir compte aussi de la possibilité de tourner en mode 64 bits (avec l'OS ad-hoc) et des temps de chargement des tables d'adresses.
Deux types d'adressage:

1er mode

Call FonctionX
...
...
;************
FonctionX:  jmp [Adresse FonctionX]
FonctionY:  jmp [Adresse FonctionY]

2ème mode

Call [AdresseFonctionX]

Au lancement du programme l'adresse est insérée juste après le Call
Commenter la réponse de cs_Nasman
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
edfed >
lea  eax, [eax*9]
j'obtiens "illegal scale" et je suis bon pour recoder correctement.

mov eax, [esi+0] : quand on met cela on va faire du VB....

J'utilise VC++ comme IDE et c'est parfait.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
0
Merci
Avec Nasm l'instruction lea eax,[eax*9] fonctionne. Les opcodes générés sont:
8D04C0
Commenter la réponse de cs_Nasman
Messages postés
69
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
22 mars 2010
1
0
Merci
au fait, la question, ça porte sur la vitesse du compilo ou la vitesse du code generé?
pasque dans le premier cas, ça depend du systeme d'exploitation et du language utilisé pour coder le compilo.
et dans le deuxieme cas, ça depend de la becane utilisé pour tester le programme.
un prog pour 386+ tournera moins vite sur un
PI que sur un PIV ou un core2duo.

sinon, le compilo le plus rapide, c'est fasmw.
rapide car il permet d'editer et compiler avec la meme interface.
les temps de compilation sont negligeables. le plus long, c'est les manip à coté.( genre masm: make .bat, etc...)
un code pour DOS ira plus vite qu'un code pour windoze car windoze est multitask et donc, il vat couper le temps en petites parts pour que le programme ne se sente jamais seul au monde.
Commenter la réponse de edfed
Messages postés
69
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
22 mars 2010
1
0
Merci
ps: desolé pour le double post, mais c'est un peu la faute au site, pas moyen d'editer ou effacer un post.

"mov eax,[esi+0]" en fait, c'est surtout pour des probleme de liaison et de modularité, le 0 est remplacé par un symbole qui peut etre different de zero. donc, non, pas besoin de VB, pourquoi VB alors que ASM peu le faire?
item:
.call = 0
mov eax,[esi+item.call]

pour ce qui est de "lea eax,[eax*9]" , si le compilo dit que c'est pas valide, c'est parce que le compilo n'est pas valide.

me:
nop
ret
Commenter la réponse de edfed
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
LEA est donné pour s'exécuter en 1 cycle parallélisable, encore faut-il que 'scale' soir 2, 4 ou 8.

lea eax,[eax*9]
avec cette horreur c'est absolument impossible car doit être substitué par un MUL.

C'est du choix de chacun de préférer un assembleur qui tolère nimporte quoi mais ce n'est pas à conseiller.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
69
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
22 mars 2010
1
0
Merci
lea eax,[eax*9] == lea eax,[eax*8+eax]
donc, non, ce n'est pas interpreté comme un imul eax,9
donc, non, je ne vois pas l'interet de changer de compilo.
fasmw definitivement fasmw.;D






me:
nop
ret
Commenter la réponse de edfed
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
D'accord que si c'est remplacé, ça roule mais bof bof, je suis d'une ancienne école où celui qui codait en ASM était respnsable de ce qu'il écrivait sans rien attendre de l'IDE.


Depuis on a inventé le C à cet effet.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
83
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
22 mars 2011
0
Merci
>>edfed : la question portait pour savoir si le code généré par certain assembleur était plus rapide que d'autre (pas mal de site disant qu'on pouvait faire que des trucs lent avec MASM).
Autre petite question :
je vous voit utiliser lea mais ça pas l'air d'être pour obtenir une adresse ... C'est quoi cette histoire de correspondance lea/imul ? je connais pas cette utilisation-là de cette instruction ...

<hr size="2" width="100%" />Visitez le site de ma librairie graphique par RayTracing : 
http://hydrargyrum.ifrance.com.
Commenter la réponse de epineurien
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
LEA fait du calcul, que soit pour de l'arithmétique ou pour une adresse mémoire, c'est toujours un calcul.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews