2010-11-26 3 views
14

Mac에서 일부 x86 어셈블리 프로그래밍을 배우려고하는데 실행 파일을 만드는 데 문제가 있습니다. 문제는 연결 단계에있는 것 같습니다.안녕하세요. 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! 
: 리눅스 중심의 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 

이 내가 조금 늦게 해요 알고 맥 OS X 마하-0 GNU 기반의 조립

+0

이것은 나를 위해 일했지만 .asm 파일에서 주석 처리 된 코드를 제거해야했습니다. 또한'-macosx_version_min 10.6'을 링커 명령에 전달하면 경고가 표시되지 않지만 컴파일됩니다. – lacostenycoder

관련 문제