问题标签 [cdecl]

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 投票
0 回答
84 浏览

c - 在 cdecl 和 pascal 中传递参数时出现异常

错误: :12: 错误:在 âfun1â 之前需要 â=â、â,â、â;â、âasmâ 或 __attribute__â

0 投票
2 回答
101 浏览

assembly - 使用间接递归的 _cdecl 问题

我编写了一个阶乘计算程序,可以一直工作到最终计算。当它计算 中的阶乘值时_multiply_fact,基指针最终指向一个随机值。我究竟做错了什么?

打电话

程序

0 投票
2 回答
1555 浏览

c++ - 使用“不同”调用约定作为参数的 64 位 C++ 传递函数会产生模棱两可的错误

__cdecl我的目标是使用 the和__stdcall调用约定轻松提取任意函数的原型。它在 32 位下运行良好。唯一改变的是我的模板函数参数中的调用约定。

根据维基百科

在 Windows 上下文中为 x64 架构编译时(无论是使用 Microsoft 还是非 Microsoft 工具),只有一种调用约定 — 此处描述的一种,因此 , stdcall, thiscall,cdeclfastcall现在都是相同的。

这会破坏我的 64 位代码。即使调用约定相同,将函数作为参数传递仍然需要您使用正确的命名法。IE 如果函数定义为__stdcall,则必须将其传递到接受 的包装器中__stdcall。即使__cdecl相同,您仍然必须将定义为__cdecl的函数传递给接受__cdecl.

适用于 32 位的示例:

我的目标是能够运行,例如:

这对于 32 位来说很好。但是,由于__stdcall__cdecl在 x64 中显然是相同的,因此它在 64 位中不起作用并引发错误,指出调用是不明确的。它还告诉我模板已经定义。直观地说,我似乎可以将函数传递__cdecl给这个__stdcall函数,因为编译器认为它们是相同的。但是,这不起作用:

错误 C2995 'WrapperFC<T,Args...> wrap(T (__cdecl *)(Args...))':已定义函数模板

如果我只保留其中一个,我不能同时包装这两个函数:

如果编译器认为它们是相同的,为什么需要我有不同的模板来接受不同的调用约定?当我这样做时,为什么它会完全崩溃并说它是模棱两可的并且已经定义了?

TL;博士:

如果 64 位架构中的调用约定是相同的,为什么我不能将一个调用约定传递给需要另一个调用约定的函数?我该如何解决?

0 投票
0 回答
97 浏览

c - 程序没有在 asm 中正确返回 C?

我有一个用汇编语言编写的简单 findAverage 过程,我试图从 C 主程序中调用它。我让它工作了一段时间,但是当程序运行时突然它给了我这个错误ret

我已经在互联网上寻找答案,但我似乎找不到答案。这是我的 C 文件:

这是我的 .asm 文件:

如何正确地将控制权返回给调用程序,以便它可以执行下一条语句?

我对汇编语言很陌生,所以如果有任何非常规/奇怪的做事方式,我深表歉意。也请随时纠正我。

0 投票
1 回答
71 浏览

c++ - 需要 cdecl 澄清:什么是“数组 5?”

去这里:http ://cdecl.org/

输入:

输出:

将 arr 声明为指向 char 数组 5 的指针

什么是“数组 5”?这是否仅仅意味着一个包含 5 个元素的数组?

0 投票
1 回答
125 浏览

gcc - 在 CDECL 调用约定中,我可以重用我压入堆栈的参数吗?

在 GCCcdecl调用约定中,我可以依靠我压入堆栈的参数在调用返回后保持不变吗?即使在混合 ASM 和 C 并-O2启用优化 ( ) 时?

0 投票
4 回答
2552 浏览

c++ - 更改调用约定

我有一个需要回调函数的第 3 方 C API 。 我的代码有一个外部提供的回调函数。__stdcall
__cdecl

我无法将函数指针传递给 C-API,因为它们被认为是不同的类型。
绕过类型系统并使用reinterpret_cast<>自然会导致运行时错误。

这是这里的一个例子:

有没有一种方法可以安全地将具有一个调用约定的函数转换和/或包装到另一个?

我确实找到了一种方法,方法是传递一个调用第二个捕获 lambda 的强制转换的无捕获 lambda。第一个作为回调传递,第二个通过void* user_data. 这有效并且是类型安全的。但是对于看起来如此简单的事情来说,它是相当令人费解的。

0 投票
1 回答
209 浏览

windows - 需要帮助了解堆栈框架布局

在为我正在处理的调试器实现堆栈遍历器时,我达到了将参数提取到函数调用并显示它们的目的。为了简单起见,我从纯 32 位(调试器和调试器)中的 cdecl 约定和一个接受 3 个参数的函数开始。但是,我无法理解为什么堆栈跟踪中的参数与 cdecl 定义的参数相比是无序的(从右到左,寄存器中没有任何内容),尽管现在已经尝试了几天。

这是我试图堆栈跟踪的函数调用的表示:

这是功能(不出所料)打印到控制台的内容:

这是在断点处生成的堆栈跟踪(调试器捕获断点,然后我尝试遍历堆栈):

负责转储堆栈帧的代码(使用 DIA SDK 实现,但我认为这与我的问题无关)如下所示:

我正在编译测试程序,在 vs2015 更新 3 中没有任何优化。

dia2dump我已经通过使用示例应用程序查看 pdb 来验证我确实将其编译为 cdecl 。我不明白是什么导致堆栈看起来像这样,它与我学到的任何东西都不匹配,也不匹配Microsoft 提供的文档
我还查了很多谷歌(包括 osdev wiki 页面、msdn 博客文章等),并查了我(现在可能已经过时的)关于 32 位 x86 汇编编程的书(在 64 位 CPU 存在之前发布) .

非常感谢您提前提供任何解释或链接!

0 投票
0 回答
905 浏览

c - 在 StdCall 约定中调用 MASM 函数

我在 Visual Studio 2015 中用 C 语言编写了一个程序,里面有一个 masm 模块。我想将一些函数定义为 stdcall 而不是默认的 cdecl。有没有办法做到这一点?我的目标是跳过调用函数中的堆栈清理。

我有一个功能myModule.h

但是通过__stdcall以下方式添加到函数签名:

产生链接错误:

LNK2019 未解析的外部符号 _MyFunc@8

函数的定义在 中myModule.asm,去掉__stdcall子句后,代码编译链接正确。

有谁知道如何以正确的方式做到这一点?

我还尝试通过更改来更改整个.asm文件以使用 stdcall 约定:

属性->配置属性->微软宏汇编器->高级->调用约定

但是当调用者清理堆栈时,这些函数仍然被称为 cdecl。

谢谢!

0 投票
1 回答
131 浏览

c - 如何使用 asm 获取指向输出缓冲区的指针?

我必须在 asm 中编写函数,并且我在 C 中有原型

在哪里:

  • in: 指向传入数据缓冲区的指针
  • out: 指向输出数据缓冲区的指针
  • n:数据矩阵的数量。

函数不返回任何内容,但适用于输出数据数组,并且必须根据结果进行更改。

据我了解,在 cdecl 堆栈中将如下所示:

我知道了,如何在 asm 中使用传入缓冲区,但我不明白如何返回传出缓冲区的新地址 - 只是将新地址放入esp+8不会产生结果,它不会改变*out. 我该如何处理这个问题?