2010-11-26 4 views
14

J'essaie de plonger dans une programmation d'assemblage x86 sur mon Mac, mais j'ai du mal à produire un exécutable. Le problème semble être au stade de la liaison.Hello World utilisant l'assembleur x86 sur 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 

Assemblez le programme:

as -o helloWorld.o helloWorld.s 

Lien le fichier objet:

ld -o helloWorld helloWorld.o 

L'erreur que je reçois à ce moment est:

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

Tout conseil sur ce que je fais mal/manquant serait très utile. merci

+3

Je sais que je suis un peu en retard, mais vous devez changer '' _start' à start'. – sidyll

Répondre

18

Vous trouverez probablement plus facile de construire avec gcc plutôt que d'essayer de micro-gérer l'assembleur et l'éditeur de liens, par ex.

$ gcc helloWorld.s -o helloWorld 

(Vous aurez probablement envie de changer _start à _main si vous allez dans cette voie.)

Soit dit en passant, il peut être intéressant de commencer par un programme C de travail, et étudier la asm produite à partir de cette . Par exemple.

#include <stdio.h> 

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

    return 0; 
} 

lorsqu'il est compilé avec gcc -Wall -O3 -m32 -fno-PIC hello.c -S -o hello.S génère:

.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 

Vous voudrez peut-être envisager d'utiliser comme modèle pour votre propre « Bonjour tout le monde » ou d'autres programmes asm expérimentaux, en particulier étant donné qu'il construit déjà et runs:

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

Un dernier commentaire: méfiez-vous de prendre des exemples de livres ou des tutoriels asm orientés Linux et d'essayer de les appliquer sous OS X - il ar Les différences importantes!

+1

Cela fonctionne comme un charme! : D –

+0

Une idée de pourquoi j'obtiendrais cette erreur en faisant 'gcc -m32 hello.S -o hello'? ld: avertissement: PIE désactivé.L'adressage absolu (peut-être -mdynamic-no-pic) n'est pas autorisé dans le code PIE signé, mais utilisé dans _main à partir de /var/folders/9b/n3lsk87513d57pzh0qvxjmz00000gn/T/hello-r4fQK2.o. Pour corriger cet avertissement, ne compilez pas avec -mdynamic-no-pic ou avec -Wl, -no_pie – michaelsnowden

+0

Utilisez-vous une plate-forme inhabituelle? –

3

Essayez:

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

alors:

./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 

Puis r un:

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

Ceci est une solution de travail pour Mac OS X Mach-0 assembleurs GNU

+0

Cela a fonctionné pour moi mais a dû enlever le code commenté dans le fichier .asm. Le passage de la commande '-macosx_version_min 10.6' à l'éditeur de liens évite l'avertissement, même s'il est quand même compilé. – lacostenycoder