gpt4 book ai didi

c - stdcall 函数的这个 asm 如何从堆栈中清除参数?

转载 作者:搜寻专家 更新时间:2023-10-31 01:44:55 26 4
gpt4 key购买 nike

我有简单的代码。 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() 的部分分解(Main 清除 StdCall 的堆栈)

push    20                  ; 00000014H
push 10 ; 0000000aH
call ?StdCall@@YGHHH@Z ; StdCall

CdeclCall 的 main() 的部分分解(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 生成清除堆栈代码的运行时事件还是我理解错误的概念?

最佳答案

它是 ret 8 指令的一部分 - 8 是弹出返回地址后要添加到堆栈指针的字节数。

https://www.felixcloutier.com/x86/ret

另见 What is the meaning and usage of __stdcall?有关 Windows 中 C 函数名称上的 @ 装饰的更多信息。

关于c - stdcall 函数的这个 asm 如何从堆栈中清除参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22876147/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com