Accueil > Forum > > > > Optimisation de code assembleur inclus dans du code C
Optimisation de code assembleur inclus dans du code C
mercredi 26 mars 2008 à 15:12:07 |
Optimisation de code assembleur inclus dans du code C

fred_82
|
Bonjour,
Alors j'explique le problème, j'aimerais faire une petite fonction en assembleur que j'inclus dans du code C, le probleme est que cette fonction n'est absolument pas optimisé par le compilateur. Exemple : je creer une fonction asm qui fait une addition :
int add(int a,int b){ int c; _asm{ mov eax,a; mov ebx,b; add eax,ebx; mov c,eax; } return(c); }
puis dans ma fonction principale j'utilise les deux manière de faire l'addition ( + et ma fonction add) :
void main(){ int a; int b; int c; int d; scanf("%d",&a); scanf("%d",&b); scanf("%d",&c); scanf("%d",&d); a=a+b+c+d; a=add(add(a,b),add(c,d)); }
Je compile tout ca en release et j'obtient le code asm suivant : pour le + : mov ecx,dword ptr [esp+2Ch] mov edx,dword ptr [esp+30h] add edx,ecx add edx,dword ptr [esp+34h] add esp,20h add dword ptr [esp+8],edx
soit 6 instructions, on voit bien que le code a été optimisé ici
Par contre avec ma fonction add j'obtiens: mov eax,dword ptr [esp+0Ch] mov ebx,dword ptr [esp+10h] add eax,ebx mov dword ptr [esp+18h],eax mov eax,dword ptr [esp+18h] mov dword ptr [esp+20h],eax mov eax,dword ptr [esp+8] mov ebx,dword ptr [esp+14h] add eax,ebx mov dword ptr [esp+1Ch],eax mov ecx,dword ptr [esp+1Ch] mov dword ptr [esp+24h],ecx mov eax,dword ptr [esp+24h] mov ebx,dword ptr [esp+20h] add eax,ebx mov dword ptr [esp+28h],eax
Soit 16 instructions, le compilateur se contente de réécrire le code que j'ai mis dans ma fonction.
Donc ma question est : serait il possible d'écrire une fonction en assembleur et que celle ci soit optimisé par le compilateur? Si oui , comment fait on?
Merci
|
|
mercredi 26 mars 2008 à 15:30:45 |
Re : Optimisation de code assembleur inclus dans du code C

BruNews
|
NON direct et définitif à ta question.
De l'ASM "dans" du C ne fera que empêcher toute optimisation du compilo. Bien entendu que le compilo reporte ce qui est mis en ASM, il ne peut rien faire de plus.
On met une fonction FULL ASM ou FULL C mais jamais de mixage.
ciao... BruNews, MVP VC++
|
|
mercredi 26 mars 2008 à 15:34:28 |
Re : Optimisation de code assembleur inclus dans du code C

BruNews
|
ah oui un exemple de ADD:
__declspec(naked) int __fastcall bnADD(int a, int b) { __asm { lea eax, [ecx+edx] ret 0 } }
Voila une vraie ADD en 2 lignes.
ciao... BruNews, MVP VC++
|
|
mercredi 26 mars 2008 à 16:08:25 |
Re : Optimisation de code assembleur inclus dans du code C

Neo_Fr
|
Comment sais-tu que tel parametre est dans tel registre?
et puis normalement avec __fastcall on doit pas faire un ret 4?
Neo_Fr
|
|
mercredi 26 mars 2008 à 16:57:22 |
Re : Optimisation de code assembleur inclus dans du code C

BruNews
|
Elles ne sont pas cohérentes tes 2 questions. Puisque les params sont en registre, il n'y a rien à dépiler donc 'ret 0'.
C'est le proto d'appel (ici __fastcall) qui dit à l'appelant où mettre les params et qui dépilera si besoin.
ciao... BruNews, MVP VC++
|
|
mercredi 26 mars 2008 à 17:55:53 |
Re : Optimisation de code assembleur inclus dans du code C

Neo_Fr
|
Ok merci, pour ceux qu'ont pas comprit tt est expliquer ici:
http://msdn2.microsoft.com/en-us/library/25687bhx.aspx
Neo_Fr
|
|
mercredi 26 mars 2008 à 18:56:20 |
Re : Optimisation de code assembleur inclus dans du code C

fred_82
|
Merci a tous d'avoir repondu aussi rapidement, en faite je m'explique, j'ai un programme dans lequel j'utilise des instruction SIMD (SSE,SSE2 et autre) le probleme est que certaine intrinsic ne sont pas reconnnu par le compilo de visual , mais aller savoir pourquoi, elles sont reconnu en assembleur. De plus, j'aimerais pouvoir manipuler mes vecteur de la meme façon que je le ferais sous GCC, c'est pourquoi j'aimerais creer ma propre bibliotheque xmmintrin, emmintrin.h et pmmintrin.h. J'ai donc pensé à les codé moi meme en assembleur. Voila
Je vais tout de meme essayer la solution de brunews pour voir ce que ca donne.
Merci
|
|
mercredi 26 mars 2008 à 19:33:09 |
Re : Optimisation de code assembleur inclus dans du code C

BruNews
|
VC++ 2008 reconnait les instructions jusqu'au SSE3. Je ne sais pas ce que tu fais sous GCC mais attention qu'on ne joue pas avec l'ASM, il faut une extrême rigueur et une longue pratique avant de faire mieux qu'un compilo moderne. Au vu de ce qui est plus haut, il va falloir t'entrainer encore longuement et surtout bien comparer les perfs d'une fonction C et ASM. Pour ce qui est de SSE, il y a une option du compilo pour lui faire employer SSE au lieu de la FPU. Ceci dit SSE se code en ASM si on veut l'exploiter pleinement, un compilo C est incapable de faire des instructions packées. Jette un oeil ici: RECHERCHE MINI ET MAXI EN C ET SSE (WIN32) http://www.cppfrance.com/code.aspx?ID=44277COMPARAISON C ET SSE2/3 (WIN32) http://www.cppfrance.com/code.aspx?ID=41536ciao... BruNews, MVP VC++
|
|
jeudi 27 mars 2008 à 14:56:39 |
Re : Optimisation de code assembleur inclus dans du code C

fred_82
|
Le compilo de visual ne permet de cast de __m128 en __m128i (pour visual 2005), certes visual 2008 le permet via une intrinsic mais je possede une version complete de visual 2005 (grace a msdnaa) et cela m'ennui de passer à visual express 2008 surtout que certain utilitaire ne sont pas present.
|
|
jeudi 27 mars 2008 à 15:02:42 |
Re : Optimisation de code assembleur inclus dans du code C

fred_82
|
Les compilo optimise mal en SSE lorsque l'on code en scalaire, par contre lorsque l'on dirige le compilo en codant soit meme en scalaire, le resultat est tout a fait satisfaisant.
|
|
Cette discussion est classée dans : add, mov, ptr, dword, esp
Répondre à ce message
Sujets en rapport avec ce message
optimiser un codes asm [ par sajid_morad ]
salut tout le monde , j ai une parti du code en c++, que j ai voulu optimiser , le l ai reécri en asm , mai ça donne pas grand chose, si quelqu un pou
asm dans WinMain :) [ par Joky ]
Salut les gens ;) Donc voilà je comprend à moitié ce code __asm{ push 0 call dword ptr GetModuleHandle push &nb
Savoir la compilation (Décompilation si possible ^^) [ par Clad38 ]
Bonsoir à tous, Je sais pas si je poste dans la bonne catégorie mais j'ai chercher sans succès. J'ai plusieurs fichiers à décompilé, mais je sais pa
lecture d'une chaine au clavier :probléme d'execution! [ par infofst ]
Bonjour, je suis en train d'écrire un programme qui fait des opérations sur une date saisie au clavier. la lecture de date est en language assembleu
attrapper Attachment.SaveAsFile dans un add-in outlook [ par thmatew ]
Salut à tous. J'ai un petit problème avec un add-in outlook, il faut absolument que je puisse attrapper le moment où l'utilisateur enregistre une pi
Aider_ moi [ par yara89 ]
[[color=red]color=]Bonjour Je veux aider dans cet exercice Je veux en faire dans programme c++[/color][/color] ---------------------------------------
Changer son adresse IP (sans redémarrer et sous XP/Seven) [ par ledaziarn ]
Bonjour a tous, Mon problème parait simple mais je n’aie pas trouvé de réponse, en tout cas pas qui répondent a ma problématique Pour simplifier l
DnsQuery, hook et detours [ par wxccxw ]
Bonjour, j'ai ecrit une dll que j'injecte dans IE ou firefox pour savoir l'host qu'il demande a charger afin de filtrer. voici donc le code [code=cp
Probléme d'affichage avec c++ builder [ par anautilisateur ]
SAlut j'ai un probléme avec le bouton qui retourne un affichge sur une ListBox, si je fait l'affichage avant la boucle pas de probléme , mais aprés p
c++ builder l'aide stp [ par anautilisateur ]
[b]SAlut j'ai un probléme avec le bouton qui retourne un affichge sur une ListBox, si je fait l'affichage avant la boucle pas de probléme , mais apré
Livres en rapport
|
Derniers Blogs
COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE?COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE? par Matthieu MEZIL
Avec EF, les vues doivent être mappées sur des entity types. Le problème c'est que les entity types doivent avoir une clé. Avec EF, nous avons les complex type qui n'ont pas de clé mais les vues ne peuvent pas être mappées dessus. Avec EF4, il est possibl...
Cliquez pour lire la suite de l'article par Matthieu MEZIL [WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL?[WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL? par JeremyJeanson
Certain d'entre vous on peut être vécu cette situation embarrassante après quelques temps passer avec WF4 : Au début avec mon " ActivityDesigner" , tout allait bien. Et puis un jour j'ai au des problèmes de " Binding" . Alors nous sommes allé sur le site ...
Cliquez pour lire la suite de l'article par JeremyJeanson MYTIC - SHAREPOINT 2010 : DéJà UN MYTHE MICROSOFT ?MYTIC - SHAREPOINT 2010 : DéJà UN MYTHE MICROSOFT ? par junarnoalg
La prochaine session de MyTIC aura lieu à Namur, le 23 mars prochain. Pendant presque une heure, nous parlerons de SharePoint 2010. Voici un aperçu du programme.
Accueil : 17h30 Début de la session : 18h00 - Les nouvelles int...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
ERREUR DE POINTEURERREUR DE POINTEUR par africanwinners
Cliquez pour lire la suite par africanwinners
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|