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.
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:
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:
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 ‘$’.