2012-12-31 10 views
6

私は最初のプログラムをアセンブラでコンパイルしてリンクしようとしています。 私は次のコードをコンパイルしよう:MacOSXでnasmを使ってコンパイルする方法

-bash-3.2$ nasm -f macho main.asm -o main.o && ld -e _main -macosx_version_min 10.8 -arch x86_64 main.o 

しかし、結果は次のとおりです:プログラムをコンパイルしてリンクするためのコンソールコマンド以下

; %include "stud_io.inc"  
global _main  

section .text 
_main: 
    xor eax, eax 
again: 
    ; PRINT "Hello" 
    ; PUTCHAR 10 
    inc eax  
    cmp eax, 5 
    jl again 

ld: warning: ignoring file main.o, file was built for i386 which is not the architecture being linked (x86_64): main.o 
Undefined symbols for architecture x86_64: 
    "_main", referenced from: 
    -u command line option 
ld: symbol(s) not found for architecture x86_64 

私はその必要を考えますx86_64のmain.asmファイルをコンパイルするには 私のシステム用のプログラムを正しくコンパイルするには?

+0

'-f macho64'おそらく? – JasonD

+0

nasmはこのオプションを認識しません –

+0

あなたはどのバージョンのnasmを実行していますか? – JasonD

答えて

9

初めてNASMを更新することをおすすめします。

:新しいコマンドは( macho64)上JasonDの提案を追加するだけでなく、次のエラーを投げてからLDを停止する ldコマンドに -lSystemを追加すること

nasm -f macho64 main.asm -o main.o && ld -e _main -macosx_version_min 10.8 -arch x86_64 main.o -lSystem 

は予告:

その後

は、これを実行してみてください

ld: dynamic main executables must link with libSystem.dylib for architecture x86_64 
+0

はい、私は-lシステムを追加します。しかし、今私は "Segmentation fault:11"を持っています –

+0

segfaultはコード実行の問題です。 'jl'命令の後に' ret'命令を追加します(メインを使用しているので)。純粋なx86アセンブリを使用している場合は、 'int 0x80'のexitシステムコールを使用して終了する必要があることに注意してください(この場合ではありません)。あなたのコードが完了したら、PCカウンターは実行を続行する場所を知る必要があることに注意してください。 – RageD

1

ほとんどの例はスタンドアロンアセンブリプログラムを示していますが、おそらくCからアセンブリを呼び出す方が一般的です。最小限のアセンブル関数lを使用する単純なCプログラムを作成しました。 IKEこの:アセンブリは、このようになります

extern unsigned cpuid(unsigned n); 

/* ... */ 
     unsigned n = cpuid(1); 

section .text 
    global _cpuid 

_cpuid: 
    push rbp 
    mov rbp, rsp 
    mov rax, rdi 
    cpuid 
    mov rax, rcx 
    leave 
    ret 

あなたがここに、メイクファイル内のnasmのCLIオプションを含め、全体を見ることができます:

https://github.com/ecashin/low/tree/master/cpuid

それは、いくつかのCPU固有の機能の可用性をプリントアウトすることで、やや役に立っています。 (ただし、CPUがインテルで、i486よりも新しい場合は、それは問題ありません)。

この例は、Mac OS X Snow Leopard上でnasmを使ってテストされています。ポートコレクション。アンダースコアプレフィックスを削除することは、Linux x86_64への移植に必要な唯一の変更です。

+0

また、 '-fmacho64'を使う前にNASMを更新する必要がありました。 –

関連する問題