2010-11-26 16 views
14

Estoy intentando sumergirme en la programación de ensamblaje x86 en mi Mac, pero tengo problemas para producir un ejecutable. El problema parece estar en la etapa de vinculación.Hello World utilizando el ensamblador x86 en 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 

ensamblar el programa:

as -o helloWorld.o helloWorld.s 

Enlace el archivo de objeto:

ld -o helloWorld helloWorld.o 

El error que consigo en este punto es:

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

Cualquier consejo sobre lo que estoy haciendo mal/faltando sería muy útil. gracias

+3

Yo sé que soy un poco tarde, pero hay que cambiar '' _start' a start'. – sidyll

Respuesta

18

Probablemente le resulte más fácil compilar con gcc en lugar de intentar microgestionar el ensamblador y el enlazador, p. ej.

$ gcc helloWorld.s -o helloWorld 

(es probable que desee cambiar _start a _main si usted va esta ruta.)

Por cierto, puede ser instructivo comenzar con un programa de trabajo C, y estudiar el asm generado a partir de este . P.ej.

#include <stdio.h> 

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

    return 0; 
} 

cuando se compila con gcc -Wall -O3 -m32 -fno-PIC hello.c -S -o hello.S genera:

.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 

Es posible que desee considerar el uso de esto como una plantilla para su propia "Hola mundo" u otros programas asm experimentales, sobre todo teniendo en cuenta que ya se construye y carreras:

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

Un comentario final: cuidado de tomar ejemplos de los libros o tutoriales orientados asm-Linux y tratar de aplicarlas en OS X - Ar existe ¡diferencias importantes!

+1

¡Funciona como un encanto! : D –

+0

Alguna idea de por qué me sale este error mientras hago 'gcc -m32 hello.S -o hello'? ld: advertencia: PIE inhabilitado.El direccionamiento absoluto (quizás -dinámico-no-pic) no se permite en PIE con código firmado, pero se usa en _main de /var/folders/9b/n3lsk87513d57pzh0qvxjmz00000gn/T/hello-r4fQK2.o. Para arreglar esta advertencia, no compile con -dinámica-no-pic o enlace con -WL, -no_pie – michaelsnowden

+0

¿Está utilizando una plataforma inusual? –

3

Probar:

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

a continuación:

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

Entonces r ONU:

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

Ésta es una solución de trabajo para Mac OS X Mach-0 ensambladores basados ​​en GNU

+0

Esto funcionó para mí, pero tuve que eliminar el código comentado en el archivo .asm. Al pasar en '-macosx_version_min 10.6' al comando del enlazador se evita la advertencia, aunque se compila de todos modos. – lacostenycoder