Этот код недопустим для GNU C. Начнем с того, что вычисленные gotos (&&label
) являются функцией, специфичной для GNU C, а не частью языка C, но это нормально, если вы используете GNU C. Однако, единственное место, где они действительны в GNU C, это оператор goto
. Вы не можете использовать указатель со встроенным asm в качестве косвенного пункта назначения перехода / вызова, потому что настройка фрейма стека зависит от компилятора, и текущее логическое представление фрейма стека с точки inline asm и назначения метки может не совпадать , С явным оператором goto
компилятор может исправить это, но с помощью asm он даже не может сказать, что это происходит.
Что касается общей картины, если вы пишете такой код, вам действительно следует переосмыслить некоторые свои предположения. Конечно, есть лучший способ выполнить то, что вы хотите.