2010-11-26 5 views
14

Ich versuche, in einige X86 Assembly-Programmierung auf meinem Mac zu tauchen, habe aber Probleme beim Erstellen einer ausführbaren Datei. Das Problem scheint in der Verknüpfungsphase zu liegen.Hallo Welt mit x86 Assembler auf Mac 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 

das Programm zusammenbauen:

as -o helloWorld.o helloWorld.s 

Verknüpfen Sie die Objektdatei:

ld -o helloWorld helloWorld.o 

Der Fehler, den ich an dieser Stelle zu bekommen ist:

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

Jeder Ratschlag, was ich falsch mache/vermisse, wäre sehr hilfreich. Danke

+3

Ich weiß, ich bin ein bisschen spät, aber Sie müssen '_start' zu' Starten' ändern. – sidyll

Antwort

18

Sie werden es wahrscheinlich einfacher finden, mit gcc zu bauen, anstatt zu versuchen, den Assembler und den Linker, z.

$ gcc helloWorld.s -o helloWorld 

(Sie werden wahrscheinlich wollen _start zu _main ändern, wenn Sie diesen Weg gehen.)

Im übrigen kann es hilfreich sein, mit einem Arbeits C-Programm zu starten, und studiert die erzeugte asm aus diesem . Z.B.

#include <stdio.h> 

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

    return 0; 
} 

, wenn sie mit gcc -Wall -O3 -m32 -fno-PIC hello.c -S -o hello.S zusammengestellt erzeugt:

.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 

Sie könnten mit diesem als Vorlage für Ihre eigene „Hallo Welt“ oder andere experimentelle asm Programme berücksichtigen wollen, zumal es bereits erstellt und Läufe:

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

Eine letzte Bemerkung: passen sie von Beispielen aus der Linux-orientierte asm Bücher oder Tutorials zu nehmen und zu versuchen, sie unter OS X gelten - es ar Die wichtigen Unterschiede!

+1

Es funktioniert wie ein Charme! : D –

+0

Irgendeine Idee, warum ich diesen Fehler beim 'gcc -m32 hallo.S -o hallo' bekommen würde? ld: warning: PIE deaktiviert.Absolute Adressierung (vielleicht -mdynamic-no-pic) ist in Code-signierten PIE nicht erlaubt, wird aber in _main von /var/folders/9b/n3lsk87513d57pzh0qvxjmz00000gn/T/hello-r4fQK2.o verwendet. Um diese Warnung zu beheben, kompilieren Sie nicht mit -mdynamic-no-pic oder verknüpfen Sie mit -Wl, -no_pie – michaelsnowden

+0

Verwenden Sie eine ungewöhnliche Plattform? –

3

Versuchen:

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

dann:

./HelloWorld 

Info:

-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 

Dann r un:

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

Dies ist eine Arbeitslösung für Mac OS X Mach-0 GNU-basierten Montierer

+0

Dies funktionierte für mich, musste aber den kommentierten Code in der .asm-Datei entfernen. Die Übergabe von '-macosx_version_min 10.6' an den Linker-Befehl vermeidet eine Warnung, obwohl sie trotzdem kompiliert wird. – lacostenycoder