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

Autres architectures Assembleur Discussion :

[8051] Appeler du C en Assembleur


Sujet :

Autres architectures Assembleur

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 27
    Points : 19
    Points
    19
    Par défaut [8051] Appeler du C en Assembleur
    Bonsoir à tous,
    C'est la première fois que je viens sur ce site donc je ne sais pas trop si je suis au bon endroit pour poser ma question ?

    Tout d'abord je me présente en deux mots :
    Je m'appelle Robin, j'ai 21 ans et je suis étudiant en électronique.

    J'ai une question depuis quelques jours à laquelle je n'arrive pas à trouver de réponse.
    Je programme un microprocesseur ADuC832 (famille du 8051).
    Mon programme principal est écrit en C ANSI via le compilateur de RAISONNANCE.
    Dans ce programme j'utilise une interruption écrite en assembleur et je voudrais tout simplement (mais pas aussi simple que je le pensais..) appeler une fonction écrite en C depuis ma routine d'interruption écrite en assembleur.

    Je pensais donc mettre ma fonction C en EXTERN dans le programme ASM mais le problème c'est que le compilateur ne parvient pas à résoudre le symbole externe et pour cause, je ne parviens pas à rendre public cette fonction écrite en C (le mot clé public est inexistant et je ne trouve pas son équivalent, s’il existe, dans la doc.).

    Il est vrai que je peux, pour résoudre le problème, écrire mon interruption en C également.
    Mais d'une part j'essaie d'utiliser l'assembleur le plus possible dans mon interruption pour gérer parfaitement les timings,
    d'autre part, ce problème a suscité en moi une certaine curiosité que j'aimerais satisfaire .

    Je me permets donc de vous demander si l'un ou l'autre d'entre vous n'aurait pas la solution à mon problème et, si non, ou pourrais je la trouver ?
    (Donc en gros, rendre une fonction écrite en C ANSI PUBLIC afin de la rendre utilisable par une routine ASM).

    Merci beaucoup.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    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 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Bonjour,

    Par défaut, les symboles correspondant aux noms de fonctions sont exportés en C, sauf si ces fonctions sont marquées static (rien à voir avec les variables statiques, même si elles utilisent le même mot-clé).

    Vérifie dans un premier temps que ton compilateur C ne soit pas également un compilateur C++, lequel « décore » les noms de fonctions pour gérer la surcharge et la hiérarchie des classes.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 27
    Points : 19
    Points
    19
    Par défaut RESOLU
    Merci de ta réponse.

    En effet, ma procédure ecrite en C est, par défaut, exportée dans mon porjet.

    Mon linker n'arrivait pas à résoudre mon symbole car ma procédure utilise des paramètres données.
    Et, avec mon compilateur, pour appeler ou écrire une fonction qui utilise des paramètres données en assembleur, il faut utiliser le préfixe "_".

    EX:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    unsigned int TEST(unsigned int variable)
    {
    code..
    }

    doit s'appeler en assembleur, avec mon compilateur, de la manière suivante :

    Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    extern CODE _TEST
    ..
    lcall _TEST

    Et inversemment, une fonction ASM utilisant des paramètres données doit s'écrire :

    Code ASM : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public _fctasm:
                             code..

    Et être appelée en C :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    extern unsigned int fctasm(unsigned int);

    dans le code :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    variable = fctasm(500);

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

Discussions similaires

  1. [8051] Comparaison de variables
    Par zsoufianz dans le forum Autres architectures
    Réponses: 1
    Dernier message: 02/04/2014, 15h46
  2. Tutoriels, F.A.Q : la rubrique Assembleur de Developpez.com
    Par Alcatîz dans le forum Assembleur
    Réponses: 3
    Dernier message: 07/06/2007, 19h14
  3. Appel fonction assembleur en C
    Par grandjouff dans le forum C
    Réponses: 6
    Dernier message: 07/12/2003, 20h43
  4. ecrire son OS (assembleur ??)
    Par Anonymous dans le forum Programmation d'OS
    Réponses: 9
    Dernier message: 25/11/2002, 19h25
  5. Quel désassembleur/assembleur pour un exe Windows ?
    Par Anonymous dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 17/04/2002, 10h59

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