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