【问题标题】:How does the __cdecl calling convention returns a struct?__cdecl 调用约定如何返回结构?
【发布时间】:2017-07-21 15:31:49
【问题描述】:

我想调用一个返回struct的函数,这个函数有__cdecl的调用约定。

__cdecl 调用约定如何返回struct

【问题讨论】:

  • 取决于结构大小和环境(例如 windows 或 linux/mac)。它可能适合寄存器,也可能通过隐藏的指针参数传回内存。阅读相应的文档。你也可以只编译一些测试代码。
  • 取决于平台。 Microsoft 32 位 ABI 按 EDX:EAX 中的值返回 64 位结构。 Linux ABI 不这样做。如果它适合 EAX,它只会按值返回结构。否则,它通过指针传递,使用隐式隐藏参数。除非您可以缩小范围,否则完整的答案将过于宽泛。
  • @Cody Gray 因此__cdecl 调用约定没有单一实现,每个操作系统都指定不同的实现!很高兴知道。
  • 是的,调用约定是特定于平台的。 The Wikipedia page on this非常好。你读过吗?它完全涵盖了 Jester 和我在谈论的内容。

标签: assembly x86 nasm


【解决方案1】:

这取决于。

没有统一的方法。

简单的函数返回,例如 ints 在寄存器中返回,但没有任何调用约定,__cdecl__stdcall 等描述了 struct 的确切返回方式。

  • 有些返回的简单结构适合这些提到的寄存器中的一个(EAX、RAX)或两个寄存器(EDX:EAX 或 RDX:RAX)。
  • 其他人通过引用返回此类structs,即函数结果被编译为void 函数,该函数采用一个额外的指针参数指向此类struct
  • 其他人混合使用这些策略。

我遇到了很大的问题(DLL 函数返回 structs)。不同的编译器使用不同的策略来返回 structs,即使在同一平台上并使用相同的调用约定,这一事实使我发出警告,即永远不应该从以下位置返回 structs ,比如 DLL 函数。

更多信息:

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多