14

アセンブラーで最初のプログラムをコンパイルしてリンクしようとしています。次のコードをコンパイルしようとします。

; %include "stud_io.inc"    
global _main     

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

プログラムをコンパイルおよびリンクするためのコンソール コマンドの下:

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

しかし、結果は次のとおりです。

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 ファイルをコンパイルする必要があると思います。私のシステム用にプログラムを適切にコンパイルするにはどうすればよいですか?

4

3 に答える 3

17

最初にNASMを更新することをお勧めします。

その後、これを実行してみてください:

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

新しいコマンドは、上記の JasonD の提案 ( macho64) を追加するだけでなく-lSystemldコマンドに を追加して、ld が次のエラーをスローするのを停止することに注意してください。

ld: dynamic main executables must link with libSystem.dylib for architecture x86_64
于 2012-12-31T16:26:00.160 に答える
1

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

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

makefile の nasm CLI オプションを含め、すべてをここで確認できます。

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

いくつかの CPU 固有の機能の可用性を出力することで、少し便利なことを行います。(ただし、CPUID が使用可能かどうかを確認せずに CPUID を使用してそれを行います。ただし、CPU が Intel で i486 よりも新しい場合は問題ありません。)

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

于 2013-09-01T20:45:09.947 に答える