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