В GCC вы можете использовать вычисленный goto, беря адрес метки (как в void *addr = &&label
), а затем прыгаете на нее (jump *addr
). руководство GCC говорит, что вы можете перейти на этот адрес от любого & shy, где в функции это только то, что перескакивает к нему из другой функции, это undefined.
Когда вы переходите к коду, он ничего не может предположить о значениях регистров, поэтому, по-видимому, он перезагружает их из памяти. Однако значение указателя стека также необязательно определяется, например, вы можете перескакивать из вложенной области, которая объявляет дополнительные переменные.
Вопрос в том, как GCC может установить значение указателя стека на правильное значение (оно может быть слишком высоким или слишком низким)? И как это взаимодействует с -fomit-frame-pointer
(если это так)?
Наконец, для дополнительных очков, каковы реальные ограничения на то, где вы можете перейти на ярлык? Для ex & shy: am & shy, вы могли бы сделать это с помощью обработчика прерываний.