问题标签 [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 回答
22354 浏览

assembly - 堆栈中如何指定返回地址?

这是我通过反汇编语句看到的function(1,2,3);

似乎ret地址根本没有压入堆栈,那么它是如何ret工作的?

0 投票
6 回答
3018 浏览

c++ - 将 Delphi 类传递给需要具有 __thiscall 方法的类的 C++ 函数/方法

我有一些 MSVC++ 编译的 DLL,为此我创建了类似 COM(lite)的接口(抽象 Delphi 类)。其中一些类具有需要指向对象的指针的方法。这些 C++ 方法使用__thiscall调用约定(我无法更改)声明,这就像 __stdcall 一样,除了this指针在 ECX 寄存器上传递。

我在 Delphi 中创建类实例,然后将其传递给 C++ 方法。我可以在 Delphi 中设置断点并看到它在我的 Delphi 类中遇到暴露的 __stdcall 方法,但很快我得到一个 STATUS_STACK_BUFFER_OVERRUN 并且应用程序必须退出。是否可以在 Delphi 方面模拟/处理 __thiscall?如果我传递一个由 C++ 系统实例化的对象,那么一切都很好,并且该对象的方法被调用(正如预期的那样),但这没用 - 我需要传递 Delphi 对象。

编辑 2010-04-19 18:12这是更详细的情况:第一个名为 (setLabel) 的方法退出时没有错误(尽管它是一个存根方法)。第二种方法称为 (init),当它尝试读取 vol参数时进入然后死掉。

C++ 端

德尔福侧

我有一半期望单独使用 stdcall 来工作,但是有些事情搞砸了,不确定是什么,也许与正在使用的 ECX 寄存器有关?帮助将不胜感激。

编辑 2010-04-19 17:42是否需要在输入时保留 ECX 寄存器并在函数退出后恢复? C++ 需要this指针吗?我现在可能只是根据一些激烈的谷歌搜索到达。我发现了一些相关的东西,但它似乎正在处理这个问题的反面。

0 投票
3 回答
2199 浏览

visual-studio-2010 - 如何使用 __cdecl 调用约定编译 boost?

我有一个使用__cdecl调用约定(msvc2010)编译的项目,我使用默认设置使用相同的编译器编译了 boost。

该项目与 boost 相关联,但我在运行时收到如下断言消息: File: ...\boost\boost\program_options\detail\parsers.hpp Line: 79

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

有以下问题:

  • 在 Windows 上默认使用什么调用约定来提升构建(msvc2010)
  • 如何使用 __cdecl 调用约定编译 boost
  • 为什么 boost 无法阻止与具有不同调用约定的代码链接?我知道 boost 具有非常智能的库自动包含代码。

更新#1

看起来 boost 确实使用正确的调用约定进行编译和链接,但在运行时我仍然遇到上述问题。我使用相同的代码做了一个示例应用程序,它可以工作,但在我的应用程序中它失败了。唯一的区别可能来自项目配置或包含/stdafx.h

0 投票
2 回答
614 浏览

macos - 经典 MacOS 进入程序时,68000 堆栈上有什么?

我试图了解一个旧的经典 Mac 应用程序的入口点。我已经反汇编了第一个 CODE 资源(不是 CODE#0,它是跳转表)。代码引用堆栈外的一些变量:0004(A7) 处的一个字,从 000C(A7) 开始的长字数组,其长度是 0004(A7) 处的值,以及该数组之外的最后一个长字似乎是指向字符串的指针。

长词数组乍一看像字符串,所以表面上看起来就像我们在处理 (int argc, char ** argv) 情况,除了“argv”数组在堆栈帧中是内联的。

当一个程序第一次被 Mac OS 调用时,它的堆栈/寄存器应该期待什么?

0 投票
2 回答
1036 浏览

iphone - iPhone/ARM 调用约定

在 iPhone/ARM 上,如果有的话,哪些 CPU 寄存器是应该保留的功能?

0 投票
1 回答
1387 浏览

c++ - 在未命名的命名空间中定义的 C 回调函数?

我有一个使用 C 野牛解析器的 C++ 项目。C 解析器使用函数指针结构来调用函数,这些函数在产生式被野牛减少时创建适当的 AST 节点:

现在,在项目的 C++ 部分,我填写了这些指针

现在我将它们放入其中的唯一原因extern "C"是因为我希望它们具有 C 调用约定。但最理想的是,我希望他们的名字仍然被破坏。它们永远不会从 C 代码中按名称调用,因此名称修改不是问题。将它们弄乱可以避免名称冲突,因为某些操作被称为error,并且 C++ 回调函数具有如下丑陋的名称,以避免与其他模块发生名称冲突。

我想知道是否可以仅通过提供函数类型 C 链接来实现

有任何想法吗?我正在寻找标准 C++ 解决方案。

0 投票
1 回答
129 浏览

visual-c++ - 如何从类型库中获取函数的调用约定?

无论是使用 stdcall、cdecl、winapi 还是其他任何类型的库,如何在运行时获取调用约定?

0 投票
3 回答
1202 浏览

c++ - 使用调用约定 fastcall 的任何实际用例?

你有任何使用调用约定 fastcall 的真实用例吗?

谢谢。

0 投票
2 回答
9915 浏览

c - 有人可以解释一下 __declspec(naked) 吗?

我正在考虑将一个为 Windows 编写的脚本引擎移植到 Linux;它用于Winamp的可视化平台AVS。我不确定目前是否有可能。据我所知,代码正在获取 C 函数的地址nseel_asm_atan并将nseel_asm_atan_end它们存储在一个表中,它可以在代码执行期间引用该表。

我查看了 MS 的文档,但我不确定__declspec(naked)真正的作用。文档中提到的 prolog 和 epilog 代码是什么?这与 Windows 调用约定有关吗?这是便携的吗?知道任何使用类似技术的基于 Linux 的示例吗?

0 投票
3 回答
2903 浏览

assembly - 在 Linux 上从汇编代码调用 SDL/OpenGL

我正在Assembly中编写一个简单的基于图形的程序用于学习目的;为此,我打算使用 OpenGL 或 SDL。我正在尝试从程序集中调用 OpenGL/SDL 的函数。

问题是,与我在互联网上找到的许多汇编和 OpenGL/SDL 教程不同,我机器中的 OpenGL/SDL 显然不使用 C 调用约定。我用 C 编写了一个简单的程序,将其编译为汇编(使用 -S 开关),显然由 GCC 生成的汇编代码通过在寄存器中传递参数而不是被推送到堆栈来调用 OpenGL/SDL 函数。

现在,问题是,我如何确定如何将参数传递给这些 OpenGL/SDL 函数?也就是说,我如何确定哪个参数对应于哪个寄存器?

显然由于GCC可以编译C代码来调用OpenGL/SDL,所以必须有办法弄清楚函数参数和寄存器的对应关系。在 C 调用约定中,规则很简单,向后推参数并在 eax/rax 中返回值,我可以简单地阅读他们的 C 文档,我可以很容易地弄清楚如何传递参数。但是这些呢?

有没有办法使用 C 调用约定来调用 OpenGL/SDL?

顺便说一句,我使用的是 yasm,gcc/ld 作为 Gentoo Linux amd64 上的链接器。