MASM: Accès à la variable C globale à partir de l’assembly

J’écris un programme pour convertir une image et comparer la vitesse de traitement des données en C et en assemblage. J’ai 3 projets:

  • projet principal en C
  • DLL en C pour convertir l’image
  • DLL en ASM pour convertir l’image

Dans l’en-tête de la DLL C, j’ai simplement écrit:

#ifdef PROJEKTC_EXPORTS #define PROJEKTC_API __declspec(dllexport) #else #define PROJEKTC_API __declspec(dllimport) #endif ... extern PROJEKTC_API unsigned int ThreadID; PROJEKTC_API void __cdecl funkcjaC(void* Args); 

et après avoir inclus cet en-tête, je peux accéder à la variable ThreadID à la fois dans le projet principal et dans la DLL C.

Le problème commence lorsque j’essaie de faire la même chose en ASM. J’ai essayé des constructions comme extern ASMThreadID:dword dans un bloc .code, mais cela ne fonctionnera pas.

L’erreur que j’ai eu: error LNK2019: unresolved external symbol _ASMThreadID referenced in function _MyProc1

J’ai l’impression que c’est une question de 1-2 lignes de code, mais je ne peux pas comprendre quelle instruction dois-je utiliser.

Je lie les projets par fichier de définition de module dans ASM et en ajoutant le fichier ASM.lib dans l’éditeur de liens -> Entrée du projet principal.

Avez-vous des suggestions?

    Avec un peu d’aide d’anciennes publications de asmcommunity.net, j’ai réussi à la faire fonctionner:

    • Dans le fichier .asm, avant le segment .data:

    EXTERNDEF C ASMThreadID:DWORD

    • Dans le segment .data:

    ASMThreadID dd 0

    • Dans le fichier .def de la DLL ASM:

    LIBRARY "nameOfProject" EXPORTS ... ASMThreadID

    • Dans l’en-tête du programme C principal (comme la déclaration globale):

    extern __declspec(dllimport) unsigned int ASMThreadID;

    Maintenant cela fonctionne comme un charme.

    La déclaration “publique” m’a envoyé à la bonne façon de chercher. Merci pour votre aide mate!