2009-12-13 51 views
0

試圖瞭解如何鏈接在結構中定義的函數,該函數在彙編代碼中,並試圖從c調用它。我覺得我缺少一個步驟,因爲當我調用該函數,我得到一個未解決的外部符號...鏈接彙編和c問題

;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

你想向C++公開一個asm函數嗎? – 2009-12-13 16:02:46

回答

3

彙編代碼定義了其修飾名解碼爲

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

通過得到的函數undname.exe實用程序。 Foo :: InitializeCurrentCpu()不會匹配Foo :: Initialize(),名稱不匹配。調用約定也是如此。

先用C++編寫這段代碼,然後看看.map文件中正確的裝飾名稱。或者用extern「C」聲明該函數來抑制C++裝飾。

+0

只是意識到我犯了一個錯字嗎?Initialize @ Foo @@ SIXPAUFee @@@ Z proc而不是嗎?InitializeCurrentCpu @ Foo @@ SIXPAUFee @@@ Z proc – Fredrick 2009-12-13 15:58:14

+0

您仍然在調用約定時不匹配。 – 2009-12-13 16:00:07

+0

我在哪裏做改變?在Foo結構中?格式應該和你寫的樣本完全一樣...我得到了類似於public的東西:static void __cdecl Foo :: Initialize(struct Fee *) – Fredrick 2009-12-13 16:10:03