gpt4 book ai didi

c++ - __cdecl、__stdcall 和 __fastcall 的调用方式完全相同?

转载 作者:可可西里 更新时间:2023-11-01 18:17:29 25 4
gpt4 key购买 nike

我正在使用 Visual C++ 2010 和 MASM 作为我的 x64 汇编程序。
这是我的 C++ 代码:

// include directive
#include "stdafx.h"
// functions
extern "C" int Asm();
extern "C" int (convention) sum(int x, int y) { return x + y; }
// main function
int main()
{
// print asm
printf("Asm returned %d.\n", Asm());
// get char, return
_getch();
return EXIT_SUCCESS;
}

还有我的汇编代码:

; external functions
extern sum : proc
; code segment
.code
Asm proc
; create shadow space
sub rsp, 20o
; setup parameters
mov ecx, 10
mov edx, 15
; call
call sum
; clean-up shadow space
add rsp, 20o
; return
ret
Asm endp
end

我这样做的原因是为了学习不同的调用约定。我将使 sum 的调用约定成为 stdcall,并修改 asm 代码,使其以“stdcall”方式调用 sum。一旦我让它工作,我就会让它,比如说,fastcall,然后在 asm 中以“fastcall”的方式调用它。

但是现在看看我的汇编代码。当我使用该代码时,无论 sum 是 stdcall、fastcall 还是 cdecl,它都会编译、执行得很好,并打印 25 作为我的总和。

我的问题:__cdecl、__stdcall 和 __fastcall 如何以及为什么可以完全相同的方式调用?

最佳答案

问题是您正在针对 x64 目标进行编译。来自 MSDN

Given the expanded register set, x64 just uses the __fastcall calling convention and a RISC-based exception-handling model. The __fastcall model uses registers for the first four arguments and the stack frame to pass the other parameters.

切换到针对 x86 目标进行编译,您应该能够看到各种调用约定在起作用。

关于c++ - __cdecl、__stdcall 和 __fastcall 的调用方式完全相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15047758/

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