En mi constante experimentación con el ensamblado en línea de GCC, me encontré con un nuevo problema relacionado con las etiquetas y el código en línea.Etiquetas en ensamblaje en línea de GCC
Considérese el siguiente salto simple:
__asm__
(
"jmp out;"
"out:;"
:
:
);
Esto no hace nada excepto salto a la etiqueta out
. Como es, este código compila bien. Pero si lo coloca dentro de una función y luego compila con indicadores de optimización, el compilador se queja: "Error: el símbolo 'out' ya está definido".
Lo que parece estar sucediendo es que el compilador repite este código de ensamblaje cada vez que indica la función. Esto hace que la etiqueta out
se duplique, lo que genera varias etiquetas out
.
Entonces, ¿cómo puedo solucionar esto? ¿Realmente no es posible usar etiquetas en el ensamblaje en línea? Este tutorial on GCC inline assembly menciona que:
Thus, you can make put your assembly into CPP macros, and inline C functions, so anyone can use it in as any C function/macro. Inline functions resemble macros very much, but are sometimes cleaner to use. Beware that in all those cases, code will be duplicated, so only local labels (of 1: style) should be defined in that asm code.
He intentado encontrar más información acerca de estas "etiquetas" locales, pero parece que no puede encontrar todo lo relacionado con el montaje inline. Parece que el tutorial dice que una etiqueta local es un número seguido de dos puntos (como 1:
), así que traté de usar una etiqueta como esa. Curiosamente, el código compilado, pero en tiempo de ejecución simplemente desencadenó una falla de segmentación. Hmm ...
¿Alguna sugerencia, consejos, respuestas ...?
@MichaelGraczyk Las etiquetas locales no son una característica específica de x86. GAS los admite independientemente del formato de archivo de CPU o objeto, y lo mismo ocurre con casi todos los demás ensambladores de Unixy (como en, nunca he visto uno que no lo haya hecho, incluso en 1995). – zwol
De hecho, y 'jmp 1' se consideraría un salto a la ubicación 1, por lo tanto, la segfault. – greggo