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.

Especificar un desplazamiento inmediato con GCC Extended ASM

Estoy utilizando GCC 10.3.0 y tengo este código fuente:

__asm__ volatile
(
    "movl %%gs:%0, %%eax\n\t"
    : "=a"(some_output) 
    : "i"(immediate_value)
);

Quiero que GCC traduzca esta instrucción a:

movl %gs:immediate_value, %eax

pero debido a que estoy utilizando la sintaxis AT&T y un valor inmediato, obtengo un “$” adicional:

movl %gs:$immediate_value, %eax

y esta es una sintaxis AT&T incorrecta.

Sé que puedo usar la restricción “r” en lugar de “i”, lo cual sería correcto, pero necesito obtener exactamente esta instrucción con valor inmediato.

La segunda solución es reescribir el código asm utilizando la sintaxis Intel y pasar “-masm=intel” al compilador. Pero luego obtengo errores con la función “htons”: con la bandera de optimización “-O3”, GCC sustituye parte del código asm AT&T en lugar de la llamada directa.

Por favor, aconsejadme algunas soluciones.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una solución es utilizar el carácter de acento invertido (`) para escapar el valor inmediato y evitar la adición del carácter ‘$’. Por ejemplo:

    __asm__ volatile
    (
        "movl %%gs:%0, %%eax\n\t"
        : "=a"(some_output) 
        : "i"( `valor_inmediato` )
    );
    

    Esto debería resultar en el opcode deseado movl %gs:valor_inmediato, %eax sin ningún carácter adicional.

    Otra solución es utilizar una macro para generar el código asm con la sintaxis deseada. Por ejemplo:

    #define MY_ASM(valor_inmediato, output) \
    __asm__ volatile \
    ( \
        "movl %%gs:%1, %0\n\t" \
        : "=a"(output) \
        : "i"(valor_inmediato) \
    )
    

    Luego, en tu código, simplemente puedes llamar a MY_ASM(valor_inmediato, some_output) para generar el opcode deseado con el valor inmediato. De esta manera, no tienes que preocuparte por la sintaxis AT&T y el carácter ‘$’.

Comments are closed.