2010-11-26 55 views
14

我正試圖潛入我的Mac上的一些x86彙編編程,但在生成可執行文件時遇到問題。問題似乎在連接階段。在Mac上使用x86彙編程序的Hello World 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 2011-08-12 21:40:02

回答

18

您可能會發現使用gcc構建起來更容易,而不是試圖微管理彙編器和鏈接器。

$ gcc helloWorld.s -o helloWorld 

(您可能會想改變_start_main如果你走這條路線。)

順便說一句,它可以啓發與運行的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應用它們 - 有AR e重要的區別!

+1

它就像一個魅力! :D – 2014-01-03 17:35:50

+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 2014-02-15 09:28:21

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的彙編