Interfacer C et ASM

Antoine -  
ghuysmans99 Messages postés 2496 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

J'ai plusieurs fichier dans mon projet VC++ 2010, dont un en assembleur dans lequel je définie une fonction.

erreur_asm.asm : (MASM)
        .MODEL small, c

        .CODE
PUBLIC _fonction
; je met la fonction en public pour pouvoir y acceder depuis
;les autres sources en C.

_fonction:
        MOV    ah, 4ch    ; j'ai mis une instruction au hasard, juste pour tester
        int    21h
END     ; fin du fichier

erreur_asm.h :
extern void fonction(void);

main.c :
#include "erreur_asm.h"

int main() {
        fonction();
        return 0;
}


Lors de la compilation, j'obtient l'erreur LNK2019 : "Symbole externe non résolu _fonction dans la fonction main". Je pense que le fait d'avoir mis _fonction en PUBLIC devrait résoudre le problème mais non.

Quelqu'un sait-il pourquoi ça ne fonctionne pas svp? Je pense que ça doit venir d'un paramétrage du projet, non?

2 réponses

_Ritchi_ Messages postés 22355 Date d'inscription   Statut Contributeur Dernière intervention   6 107
 
Bonjour,

Je n'ai pas de réponse hormis cette lecture à te proposer:
interfacer du code assembleur et le C

Ritchi
1
Antoine
 
Merci mais cet exemple est fait avec NASM et non MASM. Personnelment, je préfère aussi NASM que je connais mieux mais je n'ai pas réussi à l'intégrer à Visual C++ donc je me suis rabatu sur MASM. Si tu sais comment faire pour installer NASM dans Visual, je suis preneur.
0
_Ritchi_ Messages postés 22355 Date d'inscription   Statut Contributeur Dernière intervention   6 107
 
Voici un truc en anglais entre MASM et le C (lire la partie nommée "The C/MASM Interface").

Sinon essaie sur ce forum sur lequel 'Faiseur' semble être un pro de la chose, à la différence de moi.

Ritchi
0
Antoine
 
Merci pour les liens. C'est bon grâce au lien que tu m'as envoyé j'ai navigué et trouvé un projet qui mélangeait C et ASM sous visual, après étude j'ai résolu mon problème. Je ne suis pas très familiarisé avec MASM mais il semblerait qu'il faille déclarer les fonctions à la façon MASM et sans le _ avant:
Code MASM :
fonction proc 
ret 
fonction endp 

Antoine
0
ghuysmans99 Messages postés 2496 Date d'inscription   Statut Contributeur Dernière intervention   340
 
Ca ne marchera de toute façon pas : tu mixes du 16 et du 32 bits. Ton code ASM doit être en 32 si tu veux que ça fonctionne.
0
Antoine
 
Et pourtant ça fonctionne. (j'ai modifié .model flat, stdcall)
0
ghuysmans99 Messages postés 2496 Date d'inscription   Statut Contributeur Dernière intervention   340
 
le code de _fonction ? NON.
0