在目标C中调用汇编例程

时间:2009-04-26 09:44:50

标签: objective-c xcode assembly nasm

我在汇编文件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设置项目设置/构建/ NASM构建选项/其他标记中--DUSE_X86_ASM
我也在头文件myfunc.h中定义了这个预处理器 我在myfunc.h中将nABS声明为

#define USE_x86_ASM 
int nABS(int a);

并将myfunc.h包含在myfunc.c中 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。

2 个答案:

答案 0 :(得分:1)

某些C编译器在C符号中添加了前面的下划线。只需将下划线添加到汇编文件中的标签(当然还有globl指令)。

答案 1 :(得分:1)

迈克拉德是对的 这应该工作

%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