2009-04-26 22 views
0

J'ai écrit une fonction NABS dans le fichier d'assemblage math.nasm comme suitappel de routine d'assemblage dans l'objectif C

%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 

J'appelle cette fonction de fonction c func1 dans le fichier myfunc.c
J'utilise assembleur nasm pour le fichier de montage J'utilise Xcode version 3.1 et gcc 4.0 compilateur que je l'ai défini USE_x86_ASM

dans les paramètres Xcode paramètres du projet/Créer/MSNA/AUTRES OPTIONS dE CONSTRUCTION DRAPEAUX eN -DUSE_X86_ASM
aussi j'ai défini cette pré -proces sor dans le fichier en-tête myfunc.h également
je l'ai déclaré dans NABS myfunc.h comme

#define USE_x86_ASM 
int nABS(int a); 

et inclus dans myfunc.h myfunc.c
Les deux myfunc.c et math.nasm sont compilés sussessfuly et génèrent math.o et myfunc.o, mais je reçois une erreur reliant

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

quelqu'un peut me dire pourquoi j'obtiens l'erreur de lien?


Je ne la modification proposée en plus je l'ai enlevé% ifdef conditionner le code modifié comme suit

.text 
.align 2 
.globl _nABS 
.private_extern _nABS 

_nABS: pousser EBX ...... ..... pop ebx
ret toujours je reçois la même erreur de liaison le fichier est compilé mais je reçois la même erreur de liaison. J'ai vérifié que le .o généré est inclus app.LinkFileList.

Répondre

1

Certains compilateurs C ajoutent un trait de soulignement précédent aux symboles C. Ajoutez simplement le trait de soulignement à votre étiquette dans le fichier d'assemblage (et la directive globl, bien sûr).

1

Mehrad est juste Cela devrait fonctionner

%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