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

C++ Discussion :

Mixing ASM/C++


Sujet :

C++

  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Par défaut Mixing ASM/C++
    Bonjour,

    Je cherche a compiler et a executer un programme ecrit en ASM/C++.
    Il s'agit d'un Loader qui est chargé par mon boot. Celui ci est en 16-bit car il se charge a passer en PMode.

    Le probleme est que je n'arrive pas a lui donner la main.

    Je travaille sous Windows/Bochs/Nasm/DJGPP/CygWin

    Merci,

  2. #2
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Que je sache DJGPP c'est un compilo 32 bits. Il te faut un compilo 16 bits.
    Et normalement un loader est développé entièrement en assembleur, parce qu'il doit peser 512 octets...

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Par défaut
    Merci,

    Mais c'est le boot qui doit faire 512o pas le Loader.

  4. #4
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Par défaut
    Donc ce que tu suggeres c'est que mon Loader soit en ASM 16-bits passe en PMode et donne la main au Kernel en ASM/C++ 32-bits?

  5. #5
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    le boot = le boot loader = le loader
    la configuration simple veut que le boot loader (512 octets) charge le noyau, commute en pmode et lui passe la main. Peut être que ton boot loader charge un autre loader qui va charger et initialiser le noyau (equivalent de lilo/grub, ou NTLDR). Faudrait préciser dans ton cas.
    Mais à priori le code qui switche rmode / pmode devrait être écrit en asm, car il va contenir un mélange d'asm 16 et 32 bits. Le noyau peut être en C 32 bits.
    http://inferno.cs.univ-paris8.fr/~am/tutorial/os/tutorial00.html

  6. #6
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Par défaut
    En effet mon projet se decompose en trois modules
    Boot - Verifie la presence du Loader, le charge et lui passe la main.
    Loader - Verification simple du systeme passage en PMode et donne la main au Kernel
    Kernel - PMode 32-Bits (ASM/C++)

  7. #7
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Je dirais que boot et loader devraient être développés en asm (il doit être possible de les fusionner d'après ce que tu dis...).
    Le kernel utilise de l'asm depuis le code C/C++ ? C'est spécifique à chaque compilo, chez DJGPP si je me souviens bien c'est la syntaxe AT&T.
    http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.html

  8. #8
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Par défaut
    Le code du Loader est actuellement trop gros pour le fusionner avec le boot.
    Et le Kernel ne va pas utiliser d'ASM inline, mais de vrai fichier assembleur linker avec les sources C++.

  9. #9
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Ah ok. Mais... quelle est la question ?
    Le kernel doit être linké de manière spécifique, voir le lien sur boso kernel.

  10. #10
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Par défaut
    Boso Kernel est fait pour Unix, pas pour Windows
    Le probleme que j'ai c'est:
    De linker un fichier ASM avec un fichier CPP, sachant que le point d'entrée est dans le fichier ASM. De le charger et lui donner la main, et que cela fonctionne.

  11. #11
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par KnightsOfTheRound
    Boso Kernel est fait pour Unix, pas pour Windows
    Le probleme que j'ai c'est:
    De linker un fichier ASM avec un fichier CPP, sachant que le point d'entrée est dans le fichier ASM. De le charger et lui donner la main, et que cela fonctionne.
    Pourquoi prendre un fichier .cpp ???
    Au risque de dire des aneries ce n'est pas recommandé voire impossible parce que les conventions d'appels ne sont pas les mêmes qu'en C.
    A l'édition des liens les noms de fonctions sont 'édulcorés' ( 'mangled' en anglais ) en C++.
    Donc je recommande vivement de prendre un fichier source avec extension .C et non .cpp ( le préprocesseur et compilateur sont différents selon les cas )
    Tout ce qui touche au système bas-niveau c'est en C et non C++

  12. #12
    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, attention, j'ai lu plusieurs fois ici qu'un fichier .C (en majuscule) était un fichier C++...

    (mais ce doit être faux pour les compilateurs DOS où tous les noms sont en majuscules...) :
    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.

  13. #13
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par KnightsOfTheRound
    Boso Kernel est fait pour Unix, pas pour Windows
    boso kernel est un noyau, il n'est donc destiné à aucun OS. En revanche il est conçu pour être compilé avec GCC, et... c'est ce que tu utilises. Je l'avais compilé avec succès sous Windows avec MingW.
    Le probleme que j'ai c'est:
    De linker un fichier ASM avec un fichier CPP, sachant que le point d'entrée est dans le fichier ASM. De le charger et lui donner la main, et que cela fonctionne.
    Faut déclarer en C++ les fonctions asm codées,et ensuite c'est l'éditeur de liens qui fait tout. Ou alors tu fais de l'asm inline...
    Note que ça doit pas être linké n'importe comment. Tu dois spécifier une adresse de base, et sortir une image binaire brute. Ton loader doit être codé pour charger le noyau à cette adresse de base. Tout est expliqué dans le lien sur boso kernel.
    Pour ce qui est du C++, tout ce qui dépend du runtime n'est pas utilisable : lib standard (fichiers, allocation new/delete,...), RTTI/dynamic_cast, exceptions, ...

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

Discussions similaires

  1. [mode svga][Voir asm et devc++]
    Par Gonath dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 16/06/2003, 08h58
  2. Coloration syntaxique ASM dans un RichEdit
    Par Crick dans le forum Composants VCL
    Réponses: 5
    Dernier message: 20/12/2002, 01h53
  3. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31
  4. Reboot en asm ou C++
    Par Juke dans le forum x86 16-bits
    Réponses: 6
    Dernier message: 17/10/2002, 09h11
  5. [TP]code asm dans une procedure
    Par M.Dlb dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 17/08/2002, 20h43

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