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

x86 32-bits / 64-bits Assembleur Discussion :

[Assembleur inline C++] Récupérer l'offset d'un label


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut [Assembleur inline C++] Récupérer l'offset d'un label
    Bonjour a tous,

    J'ai un léger problème avec l'assembleur inline dans un programme en C++, n'étant pas un expert en asm j'espère que vous pourrez m'éclairer un peu.

    J'essaye désespérément de récupérer l'offset d'un label... sans résultalt... la compilation bloque

    Voici la portion de code qui pose problème :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void fnct() {
    	_asm {
    	  ...
        Label:
              ...
            mov eax, OFFSET Label 
    	  ...  
    	}
    }

    et le résultat :
    E029: col(1) symbol 'Label' has not been declared
    Je compile avec open watcom... je sais pas si la syntaxe est bonne ou même permise sous ce compilateur...

    Merci d'avance pour vos réponses

  2. #2
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 12
    Points : 17
    Points
    17
    Par défaut
    Ton compilateur signale que Label, en tant que variable, n'est pas déclarée. Et c'est bel et bien le cas vu que tu utilises ce nom comme label .
    Un label représente une adresse/position. Même utilisation qu'avec les goto etc que tu dois surement déjà connaitre si tu fais du C++.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Neutral Voir le message
    Ton compilateur signale que Label, en tant que variable, n'est pas déclarée. Et c'est bel et bien le cas vu que tu utilises ce nom comme label .
    Un label représente une adresse/position. Même utilisation qu'avec les goto etc que tu dois surement déjà connaitre si tu fais du C++.
    Je comprend bien ou est fondamentalement l'erreur... du moins comment le compilateur l'interprète mais justement étant très amateur dans l'assembleur, j'ai déjà pu voir ce genre de code dans des sources qui n'avaient pas l'air de poser problème... donc est ce que l'opérateur OFFSET peut d'une manière ou d'une autre récupérer l'offset d'un label? ou sinon... comment pouvoir récupérer cet offset?

  4. #4
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 12
    Points : 17
    Points
    17
    Par défaut
    Ha ok, je vois maintenant ce que tu voulais faire. Je croyais que tu étais partis par mégarde sur autres chose.

    Je n'ai jamais toucher à Open Watcom, mais un :
    Ca devrait passer?

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Malheureusement non toujours la même erreur...

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Essaie tout simplement :


    Une étiquette (label en anglais) est en elle-même un symbole, qui représente une valeur. Étant donné que celle-ci ne correspond à rien de plus compliqué qu'une position en mémoire, il n'y a pas d'ambigüité, et le symbole sera directement substitué par ce à quoi il correspond.

  7. #7
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 12
    Points : 17
    Points
    17
    Par défaut
    Ça ne fonctionnera pas non plus.

    Malheureusement même dans les exemples de code fournis par le compilo j'ai vu qu'ils utilisent surtout pragma pour l'asm.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Effectivement ca ne fonctionne pas non plus
    Je commence a désespérer... j'ai déjà un peu tout fouillé et testé pour trouver une solution à ce problème et rien de concluant pour l'insant.

  9. #9
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 12
    Points : 17
    Points
    17
    Par défaut
    C'est que la documentation semble cruellement manquer du côté de l'asm inline sous watcom. Car sinon au niveau syntaxique, ce que l'on t'a présenté ci-dessus fonctionne. J'ai testé sur main qui est déjà définie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
         _asm
         {
           lea eax, [main]
         }
    Et ca passe comme une lettre à la poste.
    Si trouves ne serait-ce qu'un exemple je pense qu'il pourrait s'avérer utile.

    J'ai fais un peu d'asm inline avec gcc mais l'analogie avec watcom n'est pas réellement possible ici on dirait. Si tu stagnes toujours essaye de dénicher quelques utilisateurs de watcom sur les news groups/mailing lists ou sur leur chan IRC.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Oui effectivement ca marche... car tu reprends l'adresse de la fonction main() mais je cherche a récupérer l'adresse d'un label défini dans l'asm lui même comme dans le code présenté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void fnct() {
    	_asm {
    	  ...
        Label:
              ...
            mov eax, OFFSET Label 
    	  ...  
    	}
    }
    Récupérer l'offset de l'étiquette (ici nommée Label) et non pas l'adresse d'une variable ou d'une fonction définie en C++ et c'est la que ca bloque.

    Je pense que je vais suivre ton conseil et essayer de trouver des utilisateurs de watcom ou p-e tout simplement change de compilateur...

  11. #11
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 12
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par ShivX Voir le message
    Oui effectivement ca marche... car tu reprends l'adresse de la fonction main() mais je cherche a récupérer l'adresse d'un label défini dans l'asm lui même comme dans le code présenté.
    Oui j'avais saisis ce que tu recherchais, je confirmais juste le fait que le seul problème qu'il y a actuellement concerne la déclaration des labels. Et que donc les syntaxes que l'on a proposé étaient loin d'être les vraies solutions à ton problème.

    Si tu la trouves tiens nous au courant

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    C'est bien la le problème, étrangement les labels sont bien déclarés et ne causent aucun problème pour les instructions de type jump, call, loop... mais impossible de récupérer l'offset dans une autre instruction et c'est la que j'ai du mal a comprendre

  13. #13
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 12
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par ShivX Voir le message
    C'est bien la le problème, étrangement les labels sont bien déclarés et ne causent aucun problème pour les instructions de type jump, call, loop... mais impossible de récupérer l'offset dans une autre instruction et c'est la que j'ai du mal a comprendre
    Oui c'est la grande zone d'ombre. Le traitement avec mov/lea/etc fait passer le label en non-déclaré ...

  14. #14
    Membre actif

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Points : 235
    Points
    235
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Essaie tout simplement :


    Code ASM :
    mov eax,Label


    Une étiquette (label en anglais) est en elle-même un symbole, qui représente une valeur. Étant donné que celle-ci ne correspond à rien de plus compliqué qu'une position en mémoire, il n'y a pas d'ambigüité, et le symbole sera directement substitué par ce à quoi il correspond.
    +1: Tu confirmes que watcom "fonctionne" quand tu lui demandes un jump label. Ce n'est pas un lea ou un mov qui peuvent "faire passer en non-déclaré" (même si je comprends bien l'intention de Neutral).
    Le problème est forcément lié à une spécificité de watcom.

    J'essaye désespérément de récupérer l'offset d'un label... sans résultalt... la compilation bloque
    Désolé de te demander de préciser: Où désires-tu récupérer l'adresse

    1: En mode debugg dans eax dans la partie inline ?
    2: Dans le C++ attribué à une varible ?

    Est-ce qu'eax, en mode step, contient le LP -> Label ?

  15. #15
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Moi j'ai une autre question :
    pourquoi?

    Si c'est pour essayer de battre le compilo parce que c'est une partie critique tu peux oublier déjà...
    (le compilo est vraiment fort à ce jeu là :p)
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  16. #16
    Membre actif

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Points : 235
    Points
    235
    Par défaut
    Je me vois mal aller sur la partie du forum ou tu discutes de ton super compilateur pour ballancer ce genre de propos incongrus.
    Si tu veux aborder la question (enfin le troll) pourquoi ne pas le faire directement aux bons endroits ?

  17. #17
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Je savais que pas que sur dvlp c'était cloisonné. (soit dit en passant jvois pas en quoi mon message concerne le compilateur, si peut être le : "il est fort à ce jeu là", bah si c'est que ça je l'enlève).
    En gros non c'était pas un troll c'est au contraire une des choses qu'on apprends quand on commence à parler d'optimisation : il est rare de pouvoir battre le compilateur, et à ce petit jeu là c'est plus une perte de temps qu'autre chose.
    Note bien la nuance (sinon on v'a m' accuser de troll) : "rare". Donc si je me suis permis de dire ça c'est que en l'occurrence le PO n'est pas ultra qualifié en asm (il le dit lui même) donc je vois pas l'intérêt.


    ps (et pour ton information) : je supporte aucun compilo et ça m'est un peu égal d'ailleurs, ce qui m'intéresse c'est le code stout.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  18. #18
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 12
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Rémi Coquet Voir le message
    Ce n'est pas un lea ou un mov qui peuvent "faire passer en non-déclaré" (même si je comprends bien l'intention de Neutral). Le problème est forcément lié à une spécificité de watcom.
    Oui je faisais référence à son comportement, et donc à sa spécificité.
    Tu l'avais compris.

    Désolé de te demander de préciser: Où désires-tu récupérer l'adresse

    1: En mode debugg dans eax dans la partie inline ?
    2: Dans le C++ attribué à une varible ?
    Il semblerait qu'il souhaite juste récupérer, pour le moment, l'adresse du label dans eax, et pas encore dans la partie C++ dans une variable précise.

    Ce qui m'inquiète plutôt c'est le manque de doc de leur part sur le sujet
    Si on se réfère à l'expérience d'un des utilisateurs de ton compilo :

    [10:56] <MichalN> You can't do that.
    [10:57] <MichalN> But if you don't absolutely positively have to, don't use _asm at all. Either use #pragma aux, which integrates with the code generation much better, or use external assembler modules.
    [11:03] <MichalN> It's not impossible to do, but it's not implemented. It can be considered a feature do discourage people from writing inline assembly.
    [11:04] <MichalN> Because believe me, inline assembly is bad. I've written enough of it to know
    Cela confirme bien que _asm() est vraiment délaissé au profit de l'utilisation des pragma. Après je ne vois pas personnellement où se cache le troll que tu suspectes Rémi.

  19. #19
    Membre actif

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Points : 235
    Points
    235
    Par défaut
    Citation Envoyé par Neutral Voir le message
    ..je ne vois pas personnellement où se cache le troll que tu suspectes...
    La question posée n'a rien à voir avec un question d'optimisation et ce post n'apporte aucune aide à notre ami dans son problème.

    Maintenant si tu veux répondre aux affirmations désespérement communes sur les rapports de perfs. compilateur vs codeur (le codeur assembleur est-il plus performant qu'un programme générique écrit par un autre codeur). Je t'en prie: Fais-toi plaisir

  20. #20
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Non justement on ne sait pas pourquoi il veut le faire, d'où ma question, et si la réponse est performance (si j'ai dis ça c'est parce que c'est pas la première fois que je le vois) alors il vaut peut être mieux qu'il abandonne.

    (mon premier post était dans cette optique, c'était pas le souhait de balancé une banalité trollesque, sinon j'irais sur #emacs et j'irais balancer vim ftw)
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Intégrer de l'assembleur inline
    Par jackoboss dans le forum Dev-C++
    Réponses: 2
    Dernier message: 08/12/2007, 13h19
  2. [GCC] Assembleur inline et instructions SSE2
    Par progfou dans le forum Linux
    Réponses: 3
    Dernier message: 27/06/2007, 20h44
  3. [boso kernel] Assembleur inline GCC - Undefined Reference
    Par Edouard Kaiser dans le forum Programmation d'OS
    Réponses: 13
    Dernier message: 29/07/2005, 09h24
  4. Assembleur inline & FPO - VC++ 6.0
    Par rigobert dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 19/06/2005, 00h23
  5. [DevC++]Assembleur inline
    Par Lung dans le forum Dev-C++
    Réponses: 6
    Dernier message: 21/08/2003, 16h45

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