Вы можете безопасно вызывать функции из обнаженной функции, при условии, что вызываемые функции имеют полный пролог и эпилог.
Обратите внимание, что утверждать, что вы можете «безопасно» использовать язык ассемблера в «голой» функции, - это немного глупо. Вы несете полную ответственность за все, что делаете с использованием ассемблера, так же как и за любые вызовы, которые вы делаете для «безопасных» функций.
Чтобы убедиться, что ваша общая вызываемая функция не является статической или встроенной, она должна находиться в отдельном модуле компиляции.
«Голые» функции не включают пролог или эпилог - они голые. В частности, они не включают операции со стеком для локальных переменных, для сохранения или восстановления регистров или для возврата к вызывающей функции.
Это не означает, что стек не существует - стек инициализируется при инициализации программы, а не при какой-либо инициализации функции. Поскольку стек существует, прологи и эпилоги с именем функции работают правильно. Вызов функции может безопасно передать ее адрес возврата, любые используемые регистры и место для любых локальных переменных. По возвращении (используя адрес возврата) регистры восстанавливаются и пространство стека освобождается.
Статические или встроенные функции могут не иметь полного пролога и эпилога. Они могут и могут зависеть от вызывающей функции для управления стеком и восстановления поврежденных регистров.
Это приводит к следующему пункту: пролог и эпилог нужны только для инкапсуляции операций вызываемой функции. Если вызываемая функция также безопасна (без явных или неявных локальных переменных, без изменений в регистрах состояния), она может быть безопасно статической и / или встроенной. Как и в случае с asm, вы должны убедиться, что это правда.