2009-09-04 6 views
0

Frappant ma tête aujourd'hui;)Accéder aux fonctions d'un fichier ASM à partir d'un programme C++?

Over here j'ai demandé la traduction d'un fichier ASM à C, et des réponses qu'il semblait qu'il n'y avait aucun moyen raisonnable de le faire. Bien. Donc, l'une des réponses suggérait de simplement utiliser les fonctions telles quelles et de les utiliser. Ça m'a l'air bien.

Mais comment?

Sacré merde J'ai tout essayé! J'utilise un microcontrôleur de marque Microchip (PIC18F4480) et un IDE de marque Microchip (MPLAB IDE) et les fichiers ASM sont créés par Microchip ... donc vous penseriez que je trouverais un moyen de les utiliser! Jusqu'à présent, pas de chance du tout.

Je ne sais rien à propos de l'ASM (Assembly). Je code en C++ et franchement cela ne va pas changer. Il doit y avoir un moyen d'accéder aux fonctions dans les fichiers Microchip ASM sans réécrire tout mon code dans une nouvelle langue.

Si quelqu'un veut jeter un coup d'œil, les fichiers ASM et les notes d'application sont here.

Répondre

6

En regardant PIDInt.asm, il devrait être assez simple d'appeler les fonctions de C/C++. Tout d'abord, vous déclarez les variables externat pour tous les éléments énumérés dans les définitions VARIABLE:

extern unsigned char error0, error1; /* etc */ 

Ensuite, vous déclarez fonctions externat pour toutes les choses qui ont une « fonction: » comment, en aucun argument et retournant aucun résultat:

extern void Proportional(); // extern "C" for C++ 

Pour appeler l'un d'entre eux, vous devez remplir les variables d'entrée, appeler la fonction et lire les variables de sortie.

+0

Pour C++, il aura aussi besoin de 'extern 'C" 'sur les déclarations de fonction. –

+0

@Pavel: merci, ajouté. –

+0

Et comme indiqué dans l'autre réponse lier les fichiers obj ensemble. – simon

5

Je suppose que vous devez créer un fichier objet (.o) à partir du code de l'assembly, puis lier votre fichier C++ avec ce fichier objet. Vous devrez probablement déclarer ces fonctions comme extern "C" pour les appeler à partir de C++.

Je ne suis pas sûr des détails ici, il pourrait y avoir des problèmes avec les conventions d'appel entre C++ et l'assemblage, en particulier pour un microcontrôleur tel que le PIC.

Êtes-vous vraiment en utilisant un ensemble complet de fonctionnalités C++, c'est-à-dire des objets, des fonctions virtuelles, une surcharge, et ainsi de suite, pour un microcontrôleur? C'est ... pas mal, mais je pensais que la plupart du développement de PIC était toujours en C (et en montage, bien sûr).

+0

utilisation négligente des avantages. C'est juste c – Steven

2

La méthode habituelle consiste à utiliser un environnement de construction et des outils qui ont un assembleur ainsi qu'un compilateur C/C++. Les compilateurs (et les assembleurs) prennent les fichiers source et produisent un format de fichier d'objet intermédiaire. Sur Microsoft Windows, avec Microsoft Tools, il s'agirait de fichiers .obj. Un éditeur de liens est ensuite utilisé pour lier les fichiers .obj - qui étaient potentiellement produits par une grande variété de langages - fortran, cobol, C++, c, objectif-c, assemblage, etc., dans un seul binaire d'application.

Les fichiers objets sont essentiellement une collection de symboles exportés, étiquetant de petits blocs d'octets et des symboles non résolus, étiquetant des fragments d'octets qui doivent être corrigés pendant la liaison pour pointer vers quelque chose dans un fichier objet différent.Maintenant, le problème habituel - sur les plates-formes que j'ai vécues qui ne sont pas proches des vôtres, est, les compilateurs C++ ne sont pas faits avec aucune sorte de compatibilité binaire en langage croisé à l'esprit. C compilateurs, d'autre part, sont. Les compilateurs C++ fabriquent donc des symboles fortement altérés qui incorporent toutes sortes d'informations sur les types de paramètres et de retours dans les noms de symboles. Ce mécanisme est ce qui rend la surcharge de l'opérateur possible.

Quoi qu'il en soit, le point crucial est,

  • Vous devez construire les fichiers asm. Si vous n'avez pas d'assembleur, vous avez de la chance. Et il doit probablement provenir du même fournisseur que votre jeu d'outils c/C++
  • Vous devez indiquer à votre programme C++ les noms des symboles externes. D'une manière compatible avec c. C'est pour cela que les fichiers d'en-tête sont généralement utilisés.

donc créer un fichier d'en-tête pour maintenir les déclarations de fonction pour le code pid et placez quelque chose comme ça dans les:

extern "C" PidMain (void); Maintenant, # incluez ce fichier d'en-tête dans votre programme C++, et assurez-vous que les fichiers objets produits par l'assembleur sont inclus dans l'étape de liaison de votre environnement et que vous devriez être en or.

Il peut y avoir un type de convention d'appel impliqué. Certains environnements ont des normes différentes quant à l'ordre dans lequel les éléments sont placés sur la pile, et/ou qui est responsable du nettoyage de la pile. La plupart des jeux d'outils MS Windows prennent en charge au moins une convention d'appel __pascal et __cdecl, de sorte que la désincarnation ressemble à

extern "C" void __pascal PidMain (void);

Je n'ai aucune connaissance spécifique s'il existe plusieurs conventions d'appel dans votre environnement spécifique. Donc, je ne sais pas à quel point cela a été utile. Bonne chance je suppose.

Questions connexes