问题标签 [calling-convention]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
11231 浏览

delphi - 什么是安全呼叫?

我正在使用 VB6 创建一个 ActiveX EXE,我得到的唯一示例都是用 Delphi 编写的。

阅读示例代码,我注意到有一些函数的签名后跟safecall关键字。这是一个例子:

这个关键字的目的是什么?

0 投票
19 回答
70673 浏览

c++ - 奇怪的 MSC 8.0 错误:“ESP 的值未在函数调用中正确保存......”

我们最近尝试将我们的一些 Visual Studio 项目分解为库,并且在一个测试项目中,一切似乎都可以很好地编译和构建,其中一个库项目作为依赖项。但是,尝试运行该应用程序给了我们以下令人讨厌的运行时错误消息:

运行时检查失败 #0 - ESP 的值未在函数调用中正确保存。这通常是调用使用不同调用约定声明的函数指针的结果。

我们甚至从未为我们的函数指定调用约定(__cdecl 等),将所有编译器开关保留为默认值。我检查了项目设置对于跨库和测试项目的调用约定是一致的。

更新:我们的一位开发人员将“Basic Runtime Checks”项目设置从“Both (/RTC1, equiv. to /RTCsu)”更改为“Default”,运行时消失了,程序显然运行正常。我完全不相信这一点。这是一个适当的解决方案,还是一个危险的黑客攻击?

0 投票
1 回答
1426 浏览

com - x64 上的 COM 调用约定

我试图获得关于 COM 在 x64 机器上的行为方式的明确答案。在向 x64 机器上的 COM 接口调度调用时,Windows 是否使用正常的 x64 调用约定(假设 COM 实现是 64 位)?具体来说,我动态生成我的 vtbl 条目以指向在运行时动态加载的程序集块。这个程序集需要知道如何正确地从调用它的人那里获取参数。因此,我想知道 COM 是否使用标准 x64 调用约定(几乎是 fastcall)设置对我的程序集的调用。

0 投票
5 回答
81469 浏览

c - 在 ARM C 调用约定中要保存哪些寄存器?

自从我上次编写 arm assembler 以来已经有一段时间了,我对细节有点生疏了。如果我从 arm 调用 C 函数,我只需要担心保存 r0-r3 和 lr,对吗?

如果 C 函数使用任何其他寄存器,它是否负责将这些寄存器保存在堆栈上并恢复它们?换句话说,编译器会为 C 函数生成代码来执行此操作。

例如,如果我在汇编函数中使用 r10,我不必将其值压入堆栈或内存,并在 C 调用后弹出/恢复它,对吗?

这适用于 arm-eabi-gcc 4.3.0。

0 投票
8 回答
122045 浏览

c - 什么是__stdcall?

我正在学习 Win32 编程,WinMain原型如下:

我对这个WINAPI标识符的用途感到困惑并发现:

这是做什么的?我对在返回类型之后有什么东西感到困惑。是__stdcall为了什么?当返回类型和函数名之间存在某些东西时,这意味着什么?

0 投票
3 回答
1598 浏览

c# - P/Invoke 和 C# 的自定义调用约定

我有一个商业案例,我需要能够在使用 P/Invoke 时指定我自己的调用约定。具体来说,我有一个使用非标准 ABI 的旧版 dll,我需要能够为每个函数指定调用约定。

例如,此 dll 中的一个函数通过 EAX 和 EBX 接受其前两个参数,其余通过堆栈接受。另一个函数通过 ECX 接受一个参数,其余的在堆栈中。我有几百个这样的函数,并且想避免编写我自己的中间桥 DLL 来访问这些函数。

我的另一个选择是手动滚动我自己的自定义 P/Invoke,这显然是不可取的。

任何帮助表示赞赏,谢谢,

0 投票
2 回答
1016 浏览

calling-convention - 将 __arglist 与一组不同的命名参数一起使用

在我的应用程序中,我有 2 层。第一层是 C 遗留的公开 cdecl 函数,它使用“...”语法来处理不同的参数列表。我发现从我的 .Net 层(第二个)调用这些函数的唯一方法是使用 DllImport 技术。例如下面的 C 函数:

在 C# 中看起来像这样:

我的问题是,有时我想用 2 个额外参数调用此函数,但如果其中一个为 NULL,则它不会包含在参数列表中(我的旧代码在 NULL 值上失败)。例如我想要这个电话:

被 C 解释为

不幸的是做这样的事情:

被 C 解释为:

并不是:

有人知道吗?

0 投票
9 回答
370 浏览

.net - inout 参数有没有用处?

.NET 中的 inout(C# 中的 ref,vb.net 中的 byref(如 out 参数))参数有很好的用途吗?
我觉得一个参数既作为输入又作为返回值造成的混乱,比out参数的参数数量增加,或者返回数组或者返回自定义类更糟糕。

0 投票
10 回答
7397 浏览

macos - 为什么 Mac ABI 要求 x86-32 的 16 字节堆栈对齐?

我可以理解旧 PPC RISC 系统甚至 x86-64 的这一要求,但对于久经考验的旧 x86?在这种情况下,堆栈只需要在 4 字节边界上对齐。是的,一些 MMX/SSE 指令需要 16 字节对齐,但如果这是被调用者的要求,那么它应该确保对齐正确。为什么要让每个调用者都负担这个额外的要求?这实际上会导致性能下降,因为每个呼叫站点都必须管理此要求。我错过了什么吗?

更新:在对此进行了更多调查并咨询了一些内部同事之后,我对此有一些理论:

  1. 操作系统的 PPC、x86 和 x64 版本之间的一致性
  2. 似乎 GCC 代码生成器现在始终执行 sub esp,xxx 然后将数据“移动”到堆栈上,而不是简单地执行“推送”指令。这实际上在某些硬件上可能更快。
  3. 虽然这确实使调用站点有点复杂,但在使用调用者清理堆栈的默认“cdecl”约定时几乎没有额外的开销。

我对最后一项的问题是,对于依赖于被调用方清理堆栈的调用约定,上述要求确实“丑化”了代码生成。例如,某些编译器决定实现更快的基于寄存器的调用样式以供其内部使用(即任何不打算从其他语言或源调用的代码)?这种堆栈对齐的事情可能会抵消通过在寄存器中传递一些参数所获得的一些性能提升。

更新:到目前为止,唯一真正的答案是一致性,但对我来说,这有点太容易了。我在 x86 架构方面拥有超过 20 年的经验,如果一致性,而不是性能或其他具体的东西,真的是原因,那么我恭敬地建议开发人员要求它有点天真。他们忽略了近三年的工具和支持。特别是如果他们希望工具供应商能够快速轻松地为他们的平台调整他们的工具(也许不是......它苹果......),而不必跳过几个看似不必要的障碍。

我会在另一天左右给出这个话题然后关闭它......

有关的

0 投票
7 回答
79873 浏览

c# - 从方法中检索调用方法名称

我在对象中有一个方法,该方法从对象中的多个位置调用。有没有一种快速简便的方法来获取调用这个流行方法的方法的名称。

伪代码示例:

在里面PopularMethod()我想看看Mainif it was called from Main... 我想看看 " ButtonClick" if PopularMethod()was called fromButtonClick

我在看,System.Reflection.MethodBase.GetCurrentMethod()但这不会让我得到调用方法。我看过这个StackTrace类,但我真的不喜欢每次调用该方法时都运行整个堆栈跟踪。