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

Programmation d'OS Assembleur Discussion :

[boso kernel] Assembleur inline GCC - Undefined Reference


Sujet :

Programmation d'OS Assembleur

  1. #1
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut [boso kernel] Assembleur inline GCC - Undefined Reference
    Bonjour à tous !
    J'ai repris le code de Boso Kernel trés légèrement modifié d'un point de vue de la structure.

    Vous trouverez mon code ci joint : http://kishrem.free.fr/BesOS.rar , il y a le makefile bien sur...
    C'est pas bien compliqué, il y a peu de fichier.

    Mon soucis : dans le fichier x86_gdt.c qui se charge d'initialiser la GDT, lorsque je link, LD me renvoit dans la gueule un undefined reference pour la variable kgdtr.

    Pour ceux qui regarderont le code, cette variable est définit dans un .h et utilisé dans la fonction d'initialisation de la GDT : init_gdt(void).

    Le problème en fait c est quand elle est utilisé dans l'assembleur inline :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /* chargement du registre GDTR */
    	asm("lgdtl kgdtr");
    Si je met cette ligne en commentaire, le code se link.

    Cette variable kgdtr est utilisé ailleur dans cette meme fonction, mais ne pose pas de soucis ! Il semblerait donc que ce soit quand elle est utilisé dans de l'assembleur inline. Je ne sais pas comment règler ce problème de linkage

    Merci d'avance à ceux qui auront une idée !

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    peut-être plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    asm("lgdtl %0": "=m" (kgdtr):);
    A bientôt.

  3. #3
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Merci, j'essairai demain au boulot, mais c'est quoi cette syntaxe ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    C'est la syntaxe att.

    En fait, c'est l'adresse qu'il faut passer donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    asm("lgdtl %0": :"p" (kgdtr));
    Et j'y pense, il y a mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    asm (
    	" .intel_syntax noprefix\n" ; debut syntaxe intel
    	"lgdt	_kgdtr\n" ; on utilise la syntaxe de nasm
                                    ; avec des '_' devant les noms
                                    ; de variables, fonctions etc
    	" .att_syntax noprefix\n" ; fin syntaxe intel

  5. #5
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Merci !!! Cela fonctionne.

  6. #6
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    En fait ça compile oui, mais j'enleve le tag résolu parce que dans ma tete c'est pas clair :/

    D'aprés ton post précédent tu me dis qu'il faut passer l'adresse à l'instruction lgdt, mais cette instruction n'est pas censé remplir le registre gdt d'une structure de 48 bits (32 bits pour l'adresse de la table et 16 pour sa taille) ? Donc ce n'est pas l'adresse de ma structure, mais bien ma structure qu'il faut que je lui donne non ?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 96
    Points : 116
    Points
    116
    Par défaut
    L'instruction lgdt init la gdt à partir d'une structure dans la mémoire qui se présente sous cette forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struc GDT_PointerS
      .size: resw 1    ; la taille
      .base: resd 1   ; l'adresse
    endstruc
    L'argument de lgdt est donc bien une adresse linéaire ....
    Responsable du projet SKAN (OS à but didactique)
    Contactez moi pour toutes questions ou remarques sur le projet.

  8. #8
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Ok merci beaucoup

  9. #9
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Le portage des bin utils c'est pas encore ça :/ Le même code compilé sous Linux fonctionne alors que sous Cygwin j'obtient une émulation vraiment différente dans Bochs
    Faut t il vraiment passer sous Linux pour utiliser vraiment les bin utils ?

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    Salut,

    j'ai eu le meme probleme que toi sur windows par rapport a linux au niveau des bin de gcc. j'ai trouvé plus ou moins la solution.

    (la synthese ici en bas de la page: http://www.hexanium.com/hexatronic/o..._c_compile.htm )

    J'arrive a compiler sans probleme sous windows pour le moment, apres le tous est dans le fichier script du linker ld a toi de bien positionner tes segments.

    bon courage

    (le bozo est une bonne base pour démarrer l'apprentissage, jete un oeil du coté sos aussi de linux mag, tres tres tres tres instructif !)

    A++

    Au fait, MERCI Zoso_ pour le ".intel_syntax noprefix" UN TUERIE je ne connaissais pas, je suis adepte de nasm je suis aux anges !

    Hexanium

  11. #11
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Meric mais j'ai abandonne depuis longtemps et resorti ma distrib Linux !

  12. #12
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Au passage oui, Boso est une excellente base mais avec le recul et tout ce que j'ai pu voir à droite à gauche, pas vraiment parfait, j'avais meme trouvé quelques contradictions dans les sources et des erreurs.
    Le problème c'est qu'aprés la gestion des interruptions, bah c'est finis on a fait le tour sur Boso
    Le projet SOS est trés bon mais demande quand meme de sacrés notions, j'essaye de m'en inspirer et de coder ma propre gestion de la mémoire physique, mais j'ai quelques plantages d'ou l'origine me reste encore mysterieuse

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    Salut,

    chtit question tiens pendant que t'es la

    dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    asm (
       " .intel_syntax noprefix\n" ; debut syntaxe intel
       "mov ax, _myvar\n" 
       " .att_syntax noprefix\n" ; fin syntaxe intel
    il faut que "myvar" soit déclarer en global, comment faire pour la déclarer dans une fonction par exemple, ou dans 1 define avec cette syntaxe ?

    exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #define mymacro( val )  asm (                                       \
                                                 " .intel_syntax noprefix\n" \
                                                 "mov ax, _val\n"         \ 
                                                 " .att_syntax noprefix\n" );
    comment faire pour eviter le fameux:
    undefined reference to `val' ?????????

    merci

    a++

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    Salut,

    Bah j'ai trouvé ma reponce tous seul, il faut utiliser les "Extended inline assembly". Voici la source ces infos:
    http://www.delorie.com/djgpp/doc/bre...ine_djgpp.html

    Pour passer des variables locales dans de l'assembleur inline de gcc en syntaxe intel on rajoute en fin de code.

    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    asm volatile(".intel_syntax noprefix\n \
    mov dx,al\n \
    mov cx,bl\n \
    jmp  next\n \
    next:\n \
    .att_syntax noprefix\n" \
    : \ //Sortie (aucune)
    :"b" (myvar), "a" (toto)); \ //Entrée associé a des registres.
    myvar et toto sont des variables c locales ou globales !

    ca parait lourd comme ca, en fait c tous bete, on utilise les 3 dernieres qui qui indique les entrées, les sorties, et la derniere ligne je ne sais pas.
    Le plus bizard c'est les lettres, mais en fait cela correspond a des registres.

    Ici par exemple on met myvar dans ebx et toto dans eax puis on execute l'asm !

    voici les differents parametres:

    a eax
    b ebx
    c ecx
    d edx
    S esi
    D edi
    I constant value (0 to 31)
    q,r dynamically allocated register (see below)
    g eax, ebx, ecx, edx or variable in memory
    A eax and edx combined into a 64-bit integer (use long longs)
    Pour spécifier une variables en sortie on indique un '='devant.

    Voila, je n'est pas trouvé d'autre solution pour indiquer une variable autrement que la methode du nom de la variable prefixé du underscore "_myvar" ou "_toto" mais cela impose que myvar ou toto soit globales !

    Voila

    A++

    Hexanium

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

Discussions similaires

  1. winsock.h : undefined reference...
    Par abraxas dans le forum Dev-C++
    Réponses: 14
    Dernier message: 06/08/2012, 13h42
  2. Réponses: 13
    Dernier message: 26/11/2010, 14h14
  3. [GCC] Assembleur inline et instructions SSE2
    Par progfou dans le forum Linux
    Réponses: 3
    Dernier message: 27/06/2007, 20h44
  4. g++ : undefined reference to ...
    Par le_barbu dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 14/05/2004, 07h23
  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