Quel est l'assembleur le plus rapide ?

Résolu
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011 - 25 mars 2008 à 08:58
 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 !

27 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 mars 2008 à 10:42
C'est du nimporte quoi, en ASM on obtient le binaire qu'on a codé et rien de plus.

ciao...
BruNews, MVP VC++
3
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011
25 mars 2008 à 11:01
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 !
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 mars 2008 à 11:14
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++
0
edfed Messages postés 69 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 22 mars 2010 1
25 mars 2008 à 16:32
pas vrai.
certains assembleurs optimisent les instrucions, pour rendre le code plus petit, et donc plus rapide.

exemple: fasm.

me:
nop
ret
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 mars 2008 à 16:41
exemple d'optimisation ?

ciao...
BruNews, MVP VC++
0
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011
25 mars 2008 à 18:15
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 .
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 mars 2008 à 18:21
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++
0
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011
25 mars 2008 à 19:01
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 .
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 mars 2008 à 19:50
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++
0
edfed Messages postés 69 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 22 mars 2010 1
25 mars 2008 à 23:22
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
0
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
26 mars 2008 à 08:25
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
26 mars 2008 à 11:21
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++
0
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
26 mars 2008 à 13:26
Avec Nasm l'instruction lea eax,[eax*9] fonctionne. Les opcodes générés sont:
8D04C0
0
edfed Messages postés 69 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 22 mars 2010 1
27 mars 2008 à 03:32
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.
0
edfed Messages postés 69 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 22 mars 2010 1
27 mars 2008 à 03:40
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 mars 2008 à 18:40
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++
0
edfed Messages postés 69 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 22 mars 2010 1
28 mars 2008 à 02:42
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 mars 2008 à 13:10
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++
0
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011
28 mars 2008 à 16:29
>>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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 mars 2008 à 16:34
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++
0
Rejoignez-nous