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.

La sintaxis GAS de Intel no ensamblará `mov rdi, offset:symbol`.

Soy nuevo en el ensamblador x86 y estoy siguiendo un trabajo práctico para los conceptos básicos.
Tengo 2 códigos de muestra equivalentes: Uno en sintaxis AT&T y el otro en sintaxis Intel.
Cuando compilo estos con GCC, todo funciona bien para la sintaxis AT&T, pero GCC me da errores para la versión Intel. Estos dos archivos se compilan correctamente en las computadoras de mi escuela, pero no en mi computadora personal.

Debe haber alguna configuración de gcc que me esté perdiendo, pero no puedo encontrar nada en internet.

Aquí está el código de muestra:

    .intel_syntax noprefix
    .global main

.text

main:
    mov     rdi, offset:message
    call    puts
    mov     rax, 0
    ret

message:
    .asciz "Hello, world!"

Y los mensajes de error:

$> gcc -o hello_intel hello_intel.S
hello_intel.S: Mensajes del ensamblador:
hello_intel.S:6: Error: expresión no válida
hello_intel.S:6: Error: basura 'message' después de la expresión
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Los mensajes de error indican que el problema radica en la sintaxis utilizada en la versión Intel del código. Parece que GCC no puede reconocer la palabra clave “offset” utilizada en la línea “mov rdi, offset:message”.

    Esto se debe a que “offset” no es compatible con la sintaxis Intel. En la sintaxis Intel, se debe usar “lea” en su lugar para cargar la dirección de la cadena en el registro. Aquí tienes el código corregido en sintaxis Intel:

        .intel_syntax noprefix
        .global main
    
        .text
    main:
        lea     rdi, [message]
        call    puts
        mov     rax, 0
        ret
    
    message:
        .asciz "Hola, mundo!"
    

    Con esta modificación, el código debería compilar sin errores.

Comments are closed.