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 コード 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.c とmyfunc.c に myfunc.h を含めました myfunc.c と math.nasm の
両方が sussessful にコンパイルされ、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

一部の C コンパイラは、C シンボルの前にアンダースコアを追加します。globlアセンブリ ファイル (およびもちろんディレクティブ) のラベルにアンダースコアを追加するだけです。

于 2009-04-26T09:58:56.800 に答える
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 に答える