Вы не можете безопасно переходить от одного оператора asm к другому.Вы можете использовать asm goto
, чтобы сообщить компилятору, что вы можете перейти к метке C вместо того, чтобы провалиться.
Но у вашей идеи смешивания asm и C есть фатальный недостатокчтобы использовать стек вызовов в качестве структуры данных стека: нельзя оставлять rsp
измененным в конце оператора asm .Вы нарушите сгенерированный компилятором код, который ссылается на стековую память относительно RSP, потому что -fomit-frame-pointer
включен по умолчанию (за исключением -O0
).И даже если нет, компилятор предполагает, что он знает, куда указывает RSP, даже в функциях, которые используют указатель кадра.
Кстати, pushl
недопустимо в 64-битном коде, только 16 и 64-битном операнде-размеры для push
доступны.
Кроме того, если вы собираетесь pop
в регистр, вы должны использовать выходной операнд для этого ограничения, а не вход.
Есть еще один фатальный недостаток: inline-asm не может JIT .Весь ассм должен быть там во время сборки.Как и шаблоны C ++, start_of_the_loop<number_of_brackets>
не может работать, если number_of_brackets
не является константой времени сборки.