IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[inline asm] erreur...


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    WaM
    WaM est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10
    Par défaut [Résolu] [inline asm] erreur...
    Bonjour
    Je sais pas exactement si mon pb vient de VC++ ou d'autre chose...enfin on va voir
    Pour une raison d'optimisation, je veux écrire une fonction d'effacage d'un tampon en asm (inline).
    Voici ce que j'ai pondu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void __fastcall ClearBuffer2(void* buffer, int size)
    {
    	_asm {
    			mov	eax,buffer
    			mov	ecx,size
    loop_:
    			mov	[eax],0
    			inc	eax
    			dec	ecx
    			jecxz	loop_
    			ret
    	}
    }
    Alors plusieurs trucs :
    1. j'ai une erreur à la compilation : "error C2400: inline assembler syntax error in 'second operand'; found 'newline'"
    2. j'ai trouvé ca sur le net (pas la routine, mais comment faire de l'inline), et j'ai pas trouvé la signjification de '__fastcall' ni la différence entre '_asm' et '__asm'
    3. je dois préciser que je ne connais pas le x86, j'ai choppé une table de référence des instructions, et, connaissant le principe de l'asm (je connais le z80), j'ai pondu ce truc.

    Pourriez vous me dire d'où vient le pb ? de ma routine ? de la facon dont c'est identé ? d'une instruction illégale ?

    merci

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    asm c'est avec 2 _

    donc : __asm

    si tu double-cliques sur l'erreur, il t'amene à quelle ligne ?

  3. #3
    WaM
    WaM est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10
    Par défaut
    G:\wam\C\tinyPTC\3d\cube\main.c(239) : error C2400: inline assembler syntax error in 'second operand'; found 'newline'
    et ca pointe sur
    loop_:

    et, bizarre, _asm est aussi mis en bleu, donc reconnu (?)

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    size est un mot reservé, tu dois le changer

  5. #5
    WaM
    WaM est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10
    Par défaut
    ok ! merci, ca compile maintenant...par contre ca plante :d
    je vais ptet faire un tour du côté du forum x86, non ?

  6. #6
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    je pense en effet que tu auras de meilleures réponses qu'ici ...

  7. #7
    Membre émérite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    Par défaut
    En assembleur, on peut mettre à zéro une zone mémoire en une seule instruction (ne me demande pas comment, je suis pas assez calé pour ça). Mais le compilateur les connaît, et je serais prêt à parier qu'un "memset(buffer, 0, size)" est plus rapide que la fonction que tu as laborieusement écrite.

  8. #8
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    je suis d'accord
    il faut etre un expert en assembleur pour faire mieux que ce que le compilateur génère

  9. #9
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par WaM
    ok ! merci, ca compile maintenant...par contre ca plante :d
    je vais ptet faire un tour du côté du forum x86, non ?
    Si jecxz que je ne connais pas a le même role que DJNZ , à ma connaissance ecx est décrémenté automatiquement.
    Pour cela que ça plante.
    Faire un test avec TASM par exemple.
    Sinon c'est vrai que memset peut être autant performante...

  10. #10
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Bonjour,

    le plus rapide sur P4 et supérieur est la fonction RtlZeroMemory (bien plus rapide que memset avec '0' en argument).

    En voici un 'rip' réécrit pour de l'inline asm :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    void __fastcall FastZeroBuff (void * Buff, size_t  Size)
    {
    	__asm{
    		PUSH    EDI
    		MOV     EDI, Buff
    		MOV     ECX, Size
    		XOR     EAX,EAX
    		CLD
    		MOV     EDX,ECX
    		AND     EDX,3
    		SHR     ECX,2
    		REP     STOS DWORD PTR ES:[EDI]
    		OR      ECX,EDX
    		JNZ     cont
    		POP     EDI
    		RETN    8
    	cont:
    		REP     STOS BYTE PTR ES:[EDI]
    		POP     EDI
    		RETN    8
    	}
    }

    C'est l'instruction STOS (ici dans sa forme STOSD) et son préfixe de répetition qui sont reponsable de la mise à zéro du buffer.

    On ne peut pas faire plus rapide... (plus court oui, mais ca ne sera pas aussi efficace).

    Tant qu'à utiliser de "l'inlining", pourquoi ne pas utiliser "__inline", encore plus rapide que "__fastcall" (bien sur, tout dépend si le compilo inline par défaut ou non) [dans ce cas, enlever les RETN et laisser faire le compilo pour les stack frames].

    Finalement, j'ajouterais qu'on ne gagne pas grand chose par rapport à un appel à la fonction, tout au plus le temps d'un CALL et d'un JMP ce qui est réellement très, très minime...

  11. #11
    WaM
    WaM est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10
    Par défaut
    merci à tous, je vais examiner vos réponses
    j'avais jamais entendu parlerde memset
    et sinon, oui ma fonction etait une lourdingue boucle for()...


    edit : memset me semble parfait...merci !

  12. #12
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    résolu, c'est avec le bouton résolu en bas à gauche , je le fais pour toi cette fois ci

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Euh, pour le RtlZeroMemory(), ça dépend des architectures et des versions du Compilo et/ou du SDK...

    Dans le PlatformSDK de Février 2003, on avait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #if defined(_M_AMD64)
     
    /* ... */
     
    NTSYSAPI
    VOID
    NTAPI
    RtlZeroMemory (
        VOID UNALIGNED *Destination,
        SIZE_T Length
        );
     
    #else
     
    /* ... */
     
    #define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))
     
    #endif
    En clair, à moins d'être sur un AMD64, RtlZeroMemory() faisait un simple memset()

    Pour Visual 2005, pas moyen de trouver sa déclaration...
    Le #define ZeroMemory RtlZeroMemory est toujours là, mais RtlZeroMemory semble n'être déclaré nulle part...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    WaM
    WaM est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10
    Par défaut
    Citation Envoyé par nico-pyright(c)
    résolu, c'est avec le bouton résolu en bas à gauche , je le fais pour toi cette fois ci
    désolé ! je l'ai fait manuellement, j'avais pas vu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 21/04/2011, 10h58
  2. Réponses: 3
    Dernier message: 04/05/2010, 13h18
  3. inline asm - jmp absolute ?
    Par - Robby - dans le forum Visual C++
    Réponses: 0
    Dernier message: 26/04/2008, 09h52
  4. VC++ , "Sysenter" refusé en inline asm !!
    Par - Robby - dans le forum MFC
    Réponses: 14
    Dernier message: 19/03/2006, 02h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo