es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se puede compilar el programa: el formato CMach-O de 64 bits no admite direcciones absolutas de 32 bits.

Quiero estudiar lenguaje ensamblador NASM x86 en mi macOS Monterey 12.1.

Mi código es el siguiente:

SECTION .data
msg     db      'Hola Mundo!', 0Ah     ; asigna la variable msg con tu cadena de mensaje

SECTION .text
global  _start

_start:

mov     edx, 13     ; número de bytes a escribir - uno por cada letra más 0Ah (carácter de salto de línea)
mov     ecx, msg    ; mueve la dirección de memoria de nuestra cadena de mensaje a ecx
mov     ebx, 1      ; escribir en el archivo STDOUT
mov     eax, 4      ; invocar a SYS_WRITE (código de operación del kernel 4)
int     80h

Después de ingresar el comando:

nasm -f macho64 -o helloworld.o helloworld.asm

Obtendré:

helloworld.asm:15: error: El formato Mach-O de 64 bits no admite direcciones absolutas de 32 bits

¿Hay alguna solución para resolverlo?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, hay soluciones para resolver el error “El formato Mach-O de 64 bits no admite direcciones absolutas de 32 bits” al usar el lenguaje de ensamblaje x86 NASM en macOS Monterey 12.1.

    Este error ocurre porque el comando NASM especifica el formato macho64 que es un formato de 64 bits, pero el código está usando una dirección absoluta de 32 bits en la línea 15. Para resolver este error, necesitamos usar una dirección absoluta de 64 bits en lugar de una dirección absoluta de 32 bits.

    Podemos cambiar la línea 15 de:

    mov     ecx, msg    ; mueve la dirección de memoria de nuestra cadena de mensaje a ecx
    

    a:

    lea     rcx, [rel msg]    ; carga la dirección de msg en rcx usando una dirección absoluta de 64 bits
    

    Esto utiliza la instrucción lea (cargar dirección efectiva) en lugar de la instrucción mov (mover) y especifica la dirección absoluta de 64 bits usando [rel msg].

    Después de realizar este cambio, podemos ejecutar el mismo comando nasm como antes:

    nasm -f macho64 -o helloworld.o helloworld.asm
    

    Esto creará el archivo objeto helloworld.o sin errores.

Comments are closed.