问题标签 [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 投票
2 回答
266 浏览

c - c中的调用约定

有人请告诉我如何更改c中的默认调用约定?

0 投票
1 回答
4083 浏览

c - 自定义 X86_64 调用约定到 C 函数调用

我必须做一个接口(比如,一个包装器),它允许使用他的调用约定从 X86_64 汇编代码调用 C 函数,以及其他调用约定。最好的事情是非常“独立于编译器”(只是修改包装器),所以我正在寻找将寄存器/堆栈的东西放在编译器上的东西。我已经看过这里:P/Invoke 和 C# 的自定义调用约定,它与我要做的很接近。目前,我正在使用 GCC,但欢迎来自其他编译器的提示!

所以,这就是问题的最佳视图(自定义编码约定很奇怪):

我需要能够调用“特殊”(包装器)C 函数;这里的工作将是在其他 C 函数之间调度调用。所以这个包装器需要找到 %r11,保存所有寄存器并准备堆栈以供进一步调用。在 C 中是否有适当的方法来执行此操作(使用一些内联 asm)?

非常感谢

0 投票
5 回答
7876 浏览

c - C 编译器如何实现返回大型结构的函数?

函数的返回值通常存储在堆栈或寄存器中。但是对于大型结构,它必须在堆栈上。这段代码在真正的编译器中必须进行多少复制?还是优化了?

例如:

(假设函数不能内联..)

0 投票
4 回答
12108 浏览

c++ - fastcall真的更快吗?

fastcall 调用约定真的比 cdecl 等其他调用约定快吗?是否有任何基准可以显示调用约定如何影响性能?

0 投票
9 回答
498 浏览

c++ - 将函数的当前状态传递给 C/C++ 中的另一个函数

有没有办法将函数的当前状态传递给 C/C++ 中的另一个函数?我的意思是当前状态的所有参数和局部变量。例如:

funcB()如果需要某种功能,则代码状态不佳。但能实现吗?

如果有人开始重构具有多个参数的长方法,这会有所帮助。

0 投票
5 回答
2868 浏览

c++ - 我可以以编程方式推断 C++ dll 使用的调用约定吗?

想象一下,您想编写一个程序来测试 c++ dll 文件中的函数。您应该允许用户选择一个 dll(我们假设我们谈论的是 c++ dll)。他应该能够获得 dll 导出的所有函数的列表。然后,用户应该能够从列表中选择一个函数名称,手动输入参数列表(参数都是基本类型,如 int、double、bool 或 char 数组(例如 c 类型字符串))并尝试使用指定的参数运行选定的函数。他想知道函数是否使用指定的参数运行,或者它们是否会导致它崩溃(例如,因为它们与签名不匹配)。

主要问题是 C++ 作为一种强类型语言,要求您在编译时知道函数调用的参数的数量和类型。就我而言,我根本不知道这些参数是什么,直到用户在运行时选择它们。

我想出的唯一解决方案是使用程序集手动将参数推送到调用堆栈上。

但是,我已经明白,如果我想弄乱汇编,我最好确保我知道 dll 中的函数使用哪个调用约定。

所以(最后:)这是我的问题:我可以以编程方式推断调用约定吗?Dependency Walker 对我没有帮助,而且我不知道如何手动读取 PE 格式。

0 投票
4 回答
1889 浏览

c++ - 什么是自定义调用约定?

这些是什么?作为开发人员,我如何受到这些影响?

相关:
C/C++ 中有哪些不同的调用约定,它们各自的含义是什么?

0 投票
1 回答
2525 浏览

iphone - 关于 ARM 上的 Objective C 调用约定和参数传递的问题

我想知道当我调用像这样的目标 C 方法时,目标 C 运行时如何处理参数

这个目标 C 调用有三个参数,与 ARM 系统上的典型方式相比,它是如何工作的。我知道寄存器 r0, r1, r2, r3 将保存前 4 个参数,那么还有其他参数怎么样?它如何将它们放在堆栈上并稍后弹出它们?

0 投票
2 回答
1196 浏览

c++ - nasm/yasm 参数,与 C++ 的链接

我有一个关于 nasm 及其与 C++ 的联系的问题。我将一个小测试函数声明为

extern "C" void __cdecl myTest( byte i1, byte i2, int stride, int *width );

我这样称呼它:

该方法仅用于调试程序集并查看堆栈指针如何用于获取参数。除此之外,指针参数值应设置为 7,以了解其工作原理。这是这样实现的:

并通过编译

,然后链接到 c++ 应用程序。在调试模式下,一切正常。该函数被调用了几次并按预期工作,而在发布模式下该函数工作一次,但随后的程序操作失败。在我看来,近/远的堆栈/帧指针有问题,但我对这个主题很陌生,需要一点帮助。提前致谢!一个。

0 投票
4 回答
140448 浏览

linux - i386 和 x86-64 上 UNIX 和 Linux 系统调用(和用户空间函数)的调用约定是什么

以下链接解释了 UNIX(BSD 风格)和 Linux 的 x86-32 系统调用约定:

但是 UNIX 和 Linux 上的 x86-64 系统调用约定是什么?