Cómo compilar usando nasm en MacOSX

Estoy tratando de compilar y vincular mi primer programa en Assembler. Intento compilar el siguiente código:

; %include "stud_io.inc"    
global _main     

section .text
_main: 
    xor eax, eax
again:
    ; PRINT "Hello"
    ; PUTCHAR 10
    inc eax     
    cmp eax, 5
    jl again

Debajo del comando de la consola para compilar y vincular un programa:

-bash-3.2$ nasm -f macho main.asm -o main.o  && ld -e _main -macosx_version_min 10.8 -arch x86_64 main.o

Pero el resultado es:

ld: warning: ignoring file main.o, file was built for i386 which is not the architecture being linked (x86_64): main.o
Undefined symbols for architecture x86_64:
  "_main", referenced from:
     -u command line option
ld: symbol(s) not found for architecture x86_64

Creo que es necesario compilar el archivo main.asm para x86_64. ¿Cómo compilar programas para mi sistema correctamente?

preguntado el 31 de diciembre de 12 a las 16:12

nasm no reconoce esta opción -

¿Qué versión de nasm estás ejecutando? -

-bash-3.2$ nasm -v NASM versión 0.98.40 (Apple Computer, Inc. build 11) compilado el 4 de agosto de 2012 -

Esa versión de nasm está muy desactualizada. Mirar nasm.us/pub/nasm/releasebuilds/2.10 -

3 Respuestas

Recomendaría primero actualizar su NASM.

Después de eso, intente ejecutar esto:

nasm -f macho64 main.asm -o main.o  && ld -e _main -macosx_version_min 10.8 -arch x86_64 main.o -lSystem

Tenga en cuenta que el nuevo comando agrega la sugerencia de JasonD anterior (macho64), pero también añade la -lSystem de las personas acusadas injustamente llamadas ld comando para evitar que ld arroje el siguiente error:

ld: dynamic main executables must link with libSystem.dylib for architecture x86_64

Respondido el 31 de diciembre de 12 a las 16:12

El segfault es un problema con la ejecución del código. Después de la jl instrucción, agregue un ret instrucción (ya que está utilizando un main). Tenga en cuenta que si está utilizando un ensamblaje x86 puro, debe salir utilizando la llamada al sistema de salida en int 0x80 (Pero no en este caso). Recuerde que el contador de la PC necesita saber a dónde ir para continuar con la ejecución cuando su código haya terminado. - RageD

ld -lSystem my.o -e _main -macosx_version_min 10.14 -o exit Resultado - > cannot execute binary file - Elshan

Me di cuenta de que la mayoría de los ejemplos muestran programas de ensamblaje independientes, pero quizás sea más común que el ensamblaje se llame desde C. Creé un programa C simple que usa una función mínima ensamblada con nasm como esta:

extern unsigned cpuid(unsigned n);

/* ... */
        unsigned n = cpuid(1);

El montaje se ve así:

section .text
    global _cpuid

_cpuid:
    push rbp
    mov rbp, rsp
    mov rax, rdi
    cpuid
    mov rax, rcx
    leave
    ret

Puede verlo todo, incluidas las opciones de la CLI de nasm en el archivo MAKE, aquí:

https://github.com/ecashin/low/tree/master/cpuid

Hace algo levemente útil al imprimir la disponibilidad de algunas funciones específicas de la CPU. (Pero lo hace mediante el uso de CPUID sin verificar si está disponible. Sin embargo, si la CPU es Intel y más nueva que un i486, está bien).

El ejemplo se prueba en Mac OS X Snow Leopard con el nasm de la colección de puertos. Eliminar el prefijo de subrayado es el único cambio necesario para migrar a Linux x86_64.

Respondido el 04 de Septiembre de 13 a las 02:09

Además, necesitaba actualizar NASM como dicen los otros comentarios aquí antes de poder usar -fmacho64. - ed cashin

tal vez intente vinculación estática?

ld -macosx_version_min 10.13 -e _main -static main.o

contestado el 25 de mayo de 20 a las 05:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.