私は簡単なコードを持っています。StdCall
です。__stdcall
_ CdeclCall
___cdecl
#include <stdio.h>
int __stdcall StdCall(int a,int b)
{
return a + b;
}
int __cdecl CdeclCall(int a,int b)
{
return a + b;
}
int main(int argc, char **argv) {
StdCall(10,20);
CdeclCall(10,20);
printf("Done");
return 0;
}
StdCall の main() の Disassabmbly の一部 (MainはStdCall のスタックをクリアしません)
push 20 ; 00000014H
push 10 ; 0000000aH
call ?StdCall@@YGHHH@Z ; StdCall
CdeclCall の main() の Disassabmbly の一部 (MainはCdeclCall のスタックをクリアします)
push 20 ; 00000014H
push 10 ; 0000000aH
call ?CdeclCall@@YAHHH@Z ; CdeclCall
add esp, 8 ; Stack cleared here
現在、スタックから引数を削除するのは StdCall の責任ですが、逆アセンブルでは ags をポップしてスタックをクリア/クリーンするコードは表示されません。
StdCall の逆アセンブル
push ebp
mov ebp, esp
sub esp, 192 ; 000000c0H
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-192]
mov ecx, 48 ; 00000030H
mov eax, -858993460 ; ccccccccH
rep stosd
mov eax, DWORD PTR _a$[ebp]
add eax, DWORD PTR _b$[ebp]
pop edi
pop esi
pop ebx
mov esp, ebp
pop ebp
ret 8
クリア スタック コードを生成するのはランタイム アクティビティですか、__stdcall
それとも概念が間違っていますか?