2009-04-26 100 views
0

我寫了一個功能組件文件math.nasm 哥們如下調用匯編程序

%ifdef USE_x86_ASM 
SECTION .text 

    cglobal nABS 
;*------------------------* 
;* int nABS(int a)  * 
;* return value in eax * 
;*------------------------* 
ALIGN 16 
    nABS: 
     push ebx 
     ...... 
       ...... 
       pop ebx   
     ret 
%endif 

我打電話從C函數FUNC1文件myfunc.c此功能
我使用我使用NASM彙編程序的彙編文件的Xcode 3.1版本和GCC 4.0編譯器我已經定義USE_x86_ASM

在Xcode中設置項目設置

/建設/ NASM構建選項/其他標誌AS -DUSE_X86_ASM
此外,我已經定義了這種預-proces SOR在頭文件myfunc.h也
我已經宣佈在myfunc.h哥們爲

#define USE_x86_ASM 
int nABS(int a); 

,並列入myfunc.c
myfunc.h兩個myfunc.c和math.nasm被sussessfuly編譯和生成math.o和myfunc.o,但我得到一個鏈接錯誤

Undefined symbols: 
    "_nABS", referenced from: 
     _func1 in myFunc.o 

誰能告訴我爲什麼我得到鏈接錯誤?


我沒有除了所建議的修改我刪除%IFDEF調節所述修改後的代碼如下所示

.text 
.align 2 
.globl _nABS 
.private_extern _nABS 

_nABS: 推EBX ...... ..... 。 pop ebx
ret 仍然我得到相同的鏈接錯誤的文件編譯,但我得到相同的鏈接錯誤。 我檢查了.o生成包含app.LinkFileList。

回答

1

一些C編譯器爲C符號添加了一個前面的下劃線。只需在彙編文件中將下劃線添加到您的標籤中(當然還有globl指令)。

1

Mehrad是正確 這應該工作

%ifdef USE_x86_ASM 
SECTION .text 

;*------------------------* 
;* int nABS(int a)  *  
;* return value in eax *  
;*------------------------* 
ALIGN 16 
global _nABS 
    nABS: 
     push ebx 
     ...... 
       ...... 
       pop ebx   
     ret 
%endif