【发布时间】:2014-05-17 13:19:18
【问题描述】:
我有简单的代码。 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 有责任从堆栈中删除其 args,但反汇编不会显示任何弹出 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生成清除堆栈代码是运行时活动还是我错误地理解了概念?
【问题讨论】:
-
被调用方恢复堆栈指针的旧术语是 pacscal 调用约定,但在您的情况下,它现在是 __stdcall。
标签: c assembly x86 calling-convention stdcall