c语言裸函数,裸函数的规则和限制
裸函數的規則和限制
11/04/2016
本文內容
Microsoft 專用
以下規則和限制適用于裸函數:
return 不允許使用該語句。
不允許結構化異常處理和 C++ 異常處理構造,因為它們必須在堆棧幀中展開。
出于同一原因,禁止任何形式的 setjmp。
禁止使用 _alloca 函數。
若要確保局部變量的初始化代碼不在 prolog 序列之前出現,函數范圍中不允許存在初始化的局部變量。 具體而言,函數范圍中不允許有 C++ 對象的聲明。 但是,嵌套的范圍中可能有初始化的數據。
不建議使用幀指針優化(/Oy 編譯器選項),但會自動為裸函數將其取消。
不能在函數詞法范圍中聲明 C++ 類對象。 但是,可以在嵌套的塊中聲明對象。
naked 當用 /clr編譯時,將忽略關鍵字。
對于 __fastcall 裸函數,只要 C/c + + 代碼中存在對某個寄存器參數的引用,prolog 代碼就應將該寄存器的值存儲到該變量的堆棧位置中。 例如:
// 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
}
}
結束 Microsoft 專用
請參閱
總結
以上是生活随笔為你收集整理的c语言裸函数,裸函数的规则和限制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 护理转专业计算机,我好像是护理系唯一一个
- 下一篇: S32K144(1)新建裸机项目以及烧录