2010-11-26 6 views
14

私はMacでいくつかのx86アセンブリプログラミングを試してみたいと思っていますが、実行可能ファイルの作成には問題があります。問題はリンク段階にあるようです。Hello WorldでMacでx86アセンブラを使用する0SX

helloWorld.s:

.data 

    HelloWorldString: 
    .ascii "Hello World\n" 

.text 

.globl _start 

_start: 
    # load all the arguments for write() 
    movl $4, %eax 
    movl $1, %ebx 
    movl $HelloWorldString, %ecx 
    movl $12, %edx 
    # raises software interrupt to call write() 
    int $0x80 

    # call exit() 
    movl $1, %eax 
    movl $0, %ebx 
    int $0x80 

は、プログラムを組み立て:

as -o helloWorld.o helloWorld.s 

リンクオブジェクトファイル:

ld -o helloWorld helloWorld.o 

私はこの時点で取得するエラーは次のとおりです。

ld: could not find entry point "start" (perhaps missing crt1.o) for inferred architecture x86_64 

私が間違っている/紛失していることに関する助言は非常に役に立ちます。ありがとう

+3

のための実用的なソリューションである私は、私は少し遅れだけど、あなたはstart' 'に' _start'を変更する必要があります。 – sidyll

答えて

18

アセンブラとリンカをマイクロ管理するのではなく、gccでビルドするほうが簡単でしょう。

$ gcc helloWorld.s -o helloWorld 

(あなたはおそらく、あなたはこのルートを行けば_main_startを変更することをお勧めします。)

ところで、働いてCプログラムを開始することが有益であり、このことから生成されたASMを学ぶことができます。例えば。

#include <stdio.h> 

int main(void) 
{ 
    puts("Hello world!\n"); 

    return 0; 
} 

gcc -Wall -O3 -m32 -fno-PIC hello.c -S -o hello.Sしてコンパイル生成します

.cstring 
LC0: 
    .ascii "Hello world!\12\0" 
    .text 
    .align 4,0x90 
.globl _main 
_main: 
    pushl %ebp 
    movl %esp, %ebp 
    subl $24, %esp 
    movl $LC0, (%esp) 
    call _puts 
    xorl %eax, %eax 
    leave 
    ret 
    .subsections_via_symbols 

あなたは特にそれがすでに構築することを考えると、自分自身の「Hello World」のためのテンプレートや他の実験のASMプログラムとしてこれを使用して検討する必要がありますし、実行:

$ gcc -m32 hello.S -o hello 
$ ./hello 
Hello world! 

一つの最終コメント:Linuxの指向ASMの本やチュートリアルから例を取って、OS Xの下でそれらを適用しようとしているの用心 - そこアーカンソー重要な違い!

+1

それは魅力のように動作します! :D –

+0

'gcc -m32 hello.S -o hello'を実行しているときにこのエラーが出る理由は何ですか? ld:警告:PIEが無効です。絶対アドレス指定(おそらく-mdynamic-no-pic)は、コードで署名されたPIEでは使用できませんが、/var/folders/9b/n3lsk87513d57pzh0qvxjmz00000gn/T/hello-r4fQK2.oから_mainで使用されます。この警告を修正するには、-mdynamic-no-picまたは-Wl、-no_pieでコンパイルしないでください。 – michaelsnowden

+0

珍しいプラットフォームを使用していますか? –

3

試してみてください。そして、

ld -e _start -arch x86_64 -o HelloWorld HelloWorld.S 

./HelloWorld 

情報:

-e <entry point> 
-arch <architecture>, You can check your architecture by uname -a 
-o <output file> 
2

hello.asmその後

.data 

    HelloWorldString: 
    .ascii "Hello World!\n" 

.text 

.globl start 

start: 
    ; load all the arguments for write() 
    movl $0x2000004, %eax 
    movl $1, %ebx 
    movq [email protected](%rip), %rsi 
    movq $100, %rdx 
    ; raises software interrupt to call write() 
    syscall 

    ; call exit() 
    movl $0x2000001, %eax 
    movl $0, %ebx 
    syscall 

R国連:

$ as -arch x86_64 -o hello.o hello.asm 
$ ld -o hello hello.o 
$ ./hello 

これは、Mac OS XのMach-0 GNUベースのアセンブラ

+0

これは私にとっては役に立ちましたが、.asmファイル内のコメント付きコードを削除する必要がありました。 '-macosx_version_min 10.6'をリンカコマンドに渡すと、警告が出ません。とにかくコンパイルされます。 – lacostenycoder