0

我在汇编文件 math.nasm 中编写了一个函数 nabs,如下所示

%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

我正在从文件 myfunc.c 中的 c 函数 func1 调用此函数
我正在使用 nasm 汇编程序来处理汇编文件 我正在使用 X-code 3.1 版本和 gcc 4.0 编译器 我已经定义了 USE_x86_ASM

在 Xcode 设置 Project Settings/Build/NASM BUILD OPTIONs/OTHER FLAGS AS -DUSE_X86_ASM
我还在头文件 myfunc.h 中定义了这个预处理器,
我也在 myfunc.h 中声明了 nABS

#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: push ebx ...... ...... pop ebx
ret 仍然出现相同的链接错误,文件已编译,但出现相同的链接错误。我检查了生成的 .o 是否包含 app.LinkFileList。

4

2 回答 2

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
于 2009-04-26T14:32:56.687 回答
1

一些 C 编译器会在 C 符号前添加下划线。只需将下划线添加到程序集文件中的标签(globl当然还有指令)。

于 2009-04-26T09:58:56.800 回答