Метки в GCC встраиваемой сборки

В ходе моих текущих экспериментов со встроенной сборкой GCC я столкнулся с новой проблемой, связанной с метками и встроенным кодом.

Рассмотрим следующий простой прыжок:

__asm__
(
    "jmp out;"
    "out:;"
    :
    :
);

Это ничего не делает, кроме как перейти кout этикетка. Этот код компилируется нормально. Но если вы поместите его в функцию, а затем скомпилируете с флагами оптимизации, компилятор скажет: «Ошибка: символ« out »уже определен».

Кажется, что происходит то, что компилятор повторяет этот ассемблерный код каждый раз, когда он указывает на функцию. Это вызывает меткуout дублироваться, что приводит к множественномуout этикетки.

Итак, как мне обойти это? Неужели нельзя использовать метки во встроенной сборке? этоучебник по встроенной сборке GCC упоминает, что:

Таким образом, вы можете поместить свою сборку в макросы CPP и встроенные функции C, чтобы любой мог использовать ее как любую функцию / макрос C. Встроенные функции очень похожи на макросы, но иногда их удобнее использовать. Помните, что во всех этих случаях код будет дублироваться, поэтому толькоместные лейблы (из 1: стиль) должны быть определены в этом коде asm.

Я пытался найти больше информации об этих «локальных метках», но, похоже, не могу найти ничего, касающегося встроенной сборки. Похоже, что в учебнике говорится, что локальная метка - это число, за которым следует двоеточие (например,1:), поэтому я попытался использовать такую ​​метку. Интересно, что код скомпилирован, но во время выполнения он просто вызвал ошибку сегментации. Хм ...

Так какие-нибудь предложения, намеки, ответы ...?

Ответы на вопрос(2)

Ваш ответ на вопрос