Ярлыки в GCC inline assembly

Продолжая экспериментировать с GCC inline assembly, я столкнулся с новой проблемой, касающейся меток и инлайн-кода.

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

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

Это не делает ничего, кроме перехода к метке out. В таком виде этот код компилируется нормально. Но если поместить его внутрь функции, а затем скомпилировать с флагами оптимизации, компилятор сообщит: "Ошибка: символ 'out' уже определен".

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

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

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

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

Итак, любые предложения, подсказки, ответы...?

38
задан Channel72 10 October 2010 в 00:17
поделиться