函数参数列表中的函数调用是否会加深堆栈?
调用 F(argument_expression) 时,是否在将 F 压入堆栈之前评估 argument_expression? 例如,当调用F(G(H(arg)))时,编译器是否首先将H压入堆栈,计…
为什么 Windows x64 调用约定不使用 XMM 寄存器来传递 4 个以上的整数参数?
(Microsoft) x64 调用约定状态: 参数在寄存器 RCX、RDX、R8 和 R9 中传递。如果参数是 float/double,则它们将在 XMM0L、XMM1L、XMM2L 和 XMM3L 中传…
为什么 %eax 在调用 printf 之前被清零?
我正在尝试使用一点 x86。我正在 64 位 mac 上使用 gcc -S -O0 进行编译。 C 中的代码: printf("%d", 1); 输出: movl $1, %esi leaq LC0(%rip), %rd…
在c中可以用不同的调用约定定义函数吗?
int _cdecl f (int x) { return 0; } int _stdcall f (int y) { return 0; } 名称修改后将是: _f _f@4 哪个不冲突,这在 c 中允许吗?如果不允许,为…
Win VS2008调用约定:来自c的Delphi dll
从 ac 应用程序(VS2008,Win)中,我调用 Borland 中用 Delphi 编写的 dll 中的函数。该函数可以工作,但每次调用后我都会收到此错误:“ESP 的值未…
我应该选择“默认”吗?当我并不真正关心调用约定时,通过 __fastcall 调用约定?
我们有一个巨大的 C++ 代码库,其中包含大量 COM 对象。每个暴露给 COM 的函数都必须有 __stdcall 调用约定(通常是 STDMETHODCALLTYPE 宏),因此我…
vararg 函数如何找出机器代码中的参数数量?
像 printf 这样的可变参数函数如何找出它们获得的参数数量? 参数的数量显然不会作为(隐藏)参数传递(请参阅 在此处的 asm 示例中调用 printf)。 …
C# 中的 __fastcall 约定
考虑到: 微软特定 __fastcall 调用约定 指定函数的参数 将在寄存器中传递,当 可能的。下面的列表显示了 这个调用的实现 约定。 而且寄存器中的读/写…
检查函数指针类型的调用约定
如何在编译时检查函数指针是否具有 __stdcall 调用约定? 类似 void foo() {} static_assert(is_stdcall::value, "foo() must be stdcall"); 或至少 m…