c呼び出し関数に対応するアセンブリ言語の基本フォーマット
次のコードを例に挙げます.
このコードに対応するアセンブリコードは次のとおりです.
外平桟と内平桟のいくつかの状況
呼び出し規則
パラメータスタック順序
へいこうスタック
__cdecl
右から左へスタック
呼び出し元パージスタック(外平スタック)
__stdcall
右から左へスタック
セルフクリーンアップスタック(インナフラットスタック)
__fastcall
ECX/EDX転送の最初の2つの残り:右から左へスタックに入る
スタックの自己クリーンアップ
最後にfastcallという約束の内平スタックも外平スタックも可能です
#include
void plus()
{
}
int main()
{
plus();
return 0;
}
このコードに対応するアセンブリコードは次のとおりです.
// , , , ,
push
//call ,
call plus(012F10D2h)
//jmp ,
jmp plus(012F16F0h)
// , ,
push ebp
mov ebp, esp
sub esp, 0C0h
//
push ebx
push esi
push edi
//
lea edi, [ebp - 0C0h]
mov ecx, 30h
mov eax, 0CCCCCCCCh
rep stos dword ptr es : [edi]
//
//
pop edi
pop esi
pop ebx
//
add esp, 0C0h
mov esp, ebp
pop ebp
// call
ret
// ,
add esp, ( *4)
外平桟と内平桟のいくつかの状況
呼び出し規則
パラメータスタック順序
へいこうスタック
__cdecl
右から左へスタック
呼び出し元パージスタック(外平スタック)
__stdcall
右から左へスタック
セルフクリーンアップスタック(インナフラットスタック)
__fastcall
ECX/EDX転送の最初の2つの残り:右から左へスタックに入る
スタックの自己クリーンアップ
最後にfastcallという約束の内平スタックも外平スタックも可能です