2009-12-13 10 views
0

En essayant de comprendre comment lier une fonction qui est définie dans une structure, la fonction est dans le code d'assembly, et j'essaie de l'appeler de c. Je pense que je manque une cause pas quand je l'appelle la fonction, je reçois un symbole externe non résolu ...lier l'assembly et c le problème

;Assembly.asm 
.686p 
.mmx 
.xmm 
.model flat 

include Definitions.inc 

.code 

[email protected]@@[email protected]@@Z proc 
    jmp $ 
[email protected]@@[email protected]@@Z endp 

end 



//CFile.c 
struct Fee 
{ 
    signed long id; 
} 

struct Foo 
{ 
    static void Initialize(Fee *); 
} 


int startup(Fee * init) 
{ 
    Foo::Initialize(init); //<-- This is unresolved 
    return 0; 
} 
+0

essayez-vous d'exposer une fonction asm à C++? –

Répondre

3

Votre code assembleur définit une fonction dont le nom décoré décode à

public: static void __fastcall Foo::InitializeCurrentCpu(struct Fee *) 

Comme obtenu par l'utilitaire undname.exe. Foo :: InitializeCurrentCpu() ne correspondra pas à Foo :: Initialize(), le nom ne correspond pas. Ni la convention d'appel.

Écrivez d'abord ce code en C++ et regardez le fichier .map pour le nom décoré correct. Ou déclarez la fonction avec extern "C" pour supprimer la décoration C++.

+0

juste réaliser que j'ai fait une faute de frappe? Initialize @ Foo @@ SIXPAUFee @@@ Z proc et non? InitializeCurrentCpu @ Foo @@ SIXPAUFee @@@ Z proc – Fredrick

+0

Vous avez toujours une incompatibilité sur la convention d'appel. –

+0

Où exactement dois-je effectuer le changement? Dans la structure Foo? Si le format est exactement comme l'échantillon que vous avez écrit ... Je reçois quelque chose comme public: static void __cdecl Foo :: Initialize (struct Fee *) – Fredrick