Метки в GCC встраиваемой сборки
В ходе моих текущих экспериментов со встроенной сборкой GCC я столкнулся с новой проблемой, связанной с метками и встроенным кодом.
Рассмотрим следующий простой прыжок:
__asm__
(
"jmp out;"
"out:;"
:
:
);
Это ничего не делает, кроме как перейти кout
этикетка. Этот код компилируется нормально. Но если вы поместите его в функцию, а затем скомпилируете с флагами оптимизации, компилятор скажет: «Ошибка: символ« out »уже определен».
Кажется, что происходит то, что компилятор повторяет этот ассемблерный код каждый раз, когда он указывает на функцию. Это вызывает меткуout
дублироваться, что приводит к множественномуout
этикетки.
Итак, как мне обойти это? Неужели нельзя использовать метки во встроенной сборке? этоучебник по встроенной сборке GCC упоминает, что:
Таким образом, вы можете поместить свою сборку в макросы CPP и встроенные функции C, чтобы любой мог использовать ее как любую функцию / макрос C. Встроенные функции очень похожи на макросы, но иногда их удобнее использовать. Помните, что во всех этих случаях код будет дублироваться, поэтому толькоместные лейблы (из 1: стиль) должны быть определены в этом коде asm.
Я пытался найти больше информации об этих «локальных метках», но, похоже, не могу найти ничего, касающегося встроенной сборки. Похоже, что в учебнике говорится, что локальная метка - это число, за которым следует двоеточие (например,1:
), поэтому я попытался использовать такую метку. Интересно, что код скомпилирован, но во время выполнения он просто вызвал ошибку сегментации. Хм ...
Так какие-нибудь предложения, намеки, ответы ...?