Interfacer C et ASM

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

  1. Bonjour,

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

    Ritchi
    1. 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.
    2. 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
    3. 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
  2. Contributeur
    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.
    1. Et pourtant ça fonctionne. (j'ai modifié .model flat, stdcall)
    2. Contributeur
      le code de _fonction ? NON.