Вызов процедуры сборки в задаче C - PullRequest
0 голосов
/ 26 апреля 2009

Я написал функцию nabs в файле сборки 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 для файла сборки. Я использую версию X-code 3.1 и компилятор gcc 4.0, которые я определил USE_x86_ASM

в настройках XCode Настройки проекта / Build / NASM Опции сборки / другие флаги AS -DUSE_X86_ASM
Также я определил этот препроцессор в заголовочном файле myfunc.h также
Я объявил nABS в myfunc.h как

#define USE_x86_ASM 
int nABS(int a);

и включил myfunc.h в myfunc.c
И myfunc.c, и math.nasm скомпилированы неожиданно и генерируют math.o и myfunc.o, но я получаю ошибку компоновки

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

Может кто-нибудь сказать мне, почему я получаю ошибку ссылки?


Я сделал предложенную модификацию, кроме того, я удалил% ifdef, если измененный код выглядит следующим образом

.text
.align 2
.globl _nABS   
.private_extern _nABS  

_nABS: толкать ...... ...... pop ebx
RET Тем не менее я получаю ту же ошибку компоновки, файл скомпилирован, но я получаю ту же ошибку компоновки. Я проверил, что сгенерированный .o включен app.LinkFileList.

Ответы [ 2 ]

1 голос
/ 26 апреля 2009

Мехрад прав Это должно работать

%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
1 голос
/ 26 апреля 2009

Некоторые компиляторы Си добавляют предшествующее подчеркивание к символам Си. Просто добавьте подчеркивание к метке в файле сборки (и, конечно, директиву globl).

...