Правила и ограничения при использовании функций Naked
Блок, относящийся только к системам Microsoft
Для функций с атрибутом naked действуют следующие правила и ограничения:
Оператор return не допускается.
Конструкции структурированной обработки исключений и обработки исключений C++ не допускаются, потому что они должны выполнять очистку в кадре стека.
По этой же причине запрещена любая форма setjmp.
Использование функции _alloca запрещено.
Чтобы перед последовательностью пролога гарантировано не было никакого кода инициализации локальных переменных, инициализируемые локальные переменные в области функции не допускаются. В частности, в области функции не допускается объявление объектов C++. Однако допускаются инициализируемые данные во вложенной области.
Оптимизация указателя кадра (параметр компилятора /Oy) не рекомендуется, но для функций с атрибутом naked она автоматически подавляется.
Не допускается объявление объектов класса C++ в лексической области функции. Однако можно объявлять объекты во вложенном блоке.
При компилировании с параметром /clr ключевое слово naked игнорируется.
В случае функций с атрибутами naked и __fastcall при наличии в коде C или C++ ссылки на один из регистровых аргументов код пролога должен сохранять значения этого регистра в расположении стека для этой переменной. Например:
// nkdfastcl.cpp
// compile with: /c
// processor: x86
__declspec(naked) int __fastcall power(int i, int j) {
// calculates i^j, assumes that j >= 0
// prolog
__asm {
push ebp
mov ebp, esp
sub esp, __LOCAL_SIZE
// store ECX and EDX into stack locations allocated for i and j
mov i, ecx
mov j, edx
}
{
int k = 1; // return value
while (j-- > 0)
k *= i;
__asm {
mov eax, k
};
}
// epilog
__asm {
mov esp, ebp
pop ebp
ret
}
}