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