インラインアセンブリを使用した関数呼び出しの実装
731 ワード
実装する前にアセンブリとスタックの知識を熟知する必要があります.そうしないと理解できない可能性があります.
まず、関数のいくつかの呼び出し方法について説明します.一般的な3つは次のとおりです.
1.__cdeclパラメータは右から左へスタック呼び出し者がスタック(外平スタック)をクリーンアップする.
2.__stdcallパラメータは右から左へスタック自体をクリーンアップします(内平スタック).
3.__fastcall ecxとedxは前の2つのパラメータを転送し、残りのパラメータは右から左へスタック自体でスタックをクリーンアップし、パラメータ<=2つの場合
パラメータがレジスタにあるため、バランススタックは必要ありません.
理解してからコードを書くことができます
まず、関数のいくつかの呼び出し方法について説明します.一般的な3つは次のとおりです.
1.__cdeclパラメータは右から左へスタック呼び出し者がスタック(外平スタック)をクリーンアップする.
2.__stdcallパラメータは右から左へスタック自体をクリーンアップします(内平スタック).
3.__fastcall ecxとedxは前の2つのパラメータを転送し、残りのパラメータは右から左へスタック自体でスタックをクリーンアップし、パラメータ<=2つの場合
パラメータがレジスタにあるため、バランススタックは必要ありません.
理解してからコードを書くことができます
//
int __fastcall add(int a,int b) {
__asm {
mov eax,ecx; ecx
add eax,edx; edx
}
}
void main()
{
int res;
__asm {
mov ecx, 11;
mov edx, 22;
call add; add
mov dword ptr[res], eax; eax
}
printf("res=%d
",res);
}