被叫清除堆栈的代码在哪里?

时间:2014-04-05 03:17:55

标签: c++ c compiler-construction disassembly calling-convention

我有简单的代码。 StdCall__stdcallCdeclCall__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的一部分(主要 为CdeclCall清除堆栈)

push    20                  ; 00000014H
push    10                  ; 0000000aH
call    ?CdeclCall@@YAHHH@Z         ; CdeclCall
add esp, 8   ; Stack cleared here

现在,StdCall负责清除堆栈,但反汇编不显示任何代码,这表明StdCall已清除堆栈。

反汇编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生成清算堆栈代码的运行时活动还是错误地采用了概念?

感谢。

1 个答案:

答案 0 :(得分:3)

它是ret指令的一部分--8是要添加到堆栈指针的字节数。