问题标签 [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.
c - 在 cdecl 和 pascal 中传递参数时出现异常
错误: :12: 错误:在 âfun1â 之前需要 â=â、â,â、â;â、âasmâ 或 __attribute__â
assembly - 使用间接递归的 _cdecl 问题
我编写了一个阶乘计算程序,可以一直工作到最终计算。当它计算 中的阶乘值时_multiply_fact
,基指针最终指向一个随机值。我究竟做错了什么?
打电话
程序
c++ - 使用“不同”调用约定作为参数的 64 位 C++ 传递函数会产生模棱两可的错误
__cdecl
我的目标是使用 the和__stdcall
调用约定轻松提取任意函数的原型。它在 32 位下运行良好。唯一改变的是我的模板函数参数中的调用约定。
根据维基百科:
在 Windows 上下文中为 x64 架构编译时(无论是使用 Microsoft 还是非 Microsoft 工具),只有一种调用约定 — 此处描述的一种,因此 ,
stdcall
,thiscall
,cdecl
等fastcall
现在都是相同的。
这会破坏我的 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 位架构中的调用约定是相同的,为什么我不能将一个调用约定传递给需要另一个调用约定的函数?我该如何解决?
c - 程序没有在 asm 中正确返回 C?
我有一个用汇编语言编写的简单 findAverage 过程,我试图从 C 主程序中调用它。我让它工作了一段时间,但是当程序运行时突然它给了我这个错误ret
:
我已经在互联网上寻找答案,但我似乎找不到答案。这是我的 C 文件:
这是我的 .asm 文件:
如何正确地将控制权返回给调用程序,以便它可以执行下一条语句?
我对汇编语言很陌生,所以如果有任何非常规/奇怪的做事方式,我深表歉意。也请随时纠正我。
gcc - 在 CDECL 调用约定中,我可以重用我压入堆栈的参数吗?
在 GCCcdecl
调用约定中,我可以依靠我压入堆栈的参数在调用返回后保持不变吗?即使在混合 ASM 和 C 并-O2
启用优化 ( ) 时?
c++ - 更改调用约定
我有一个需要回调函数的第 3 方 C API 。
我的代码有一个外部提供的回调函数。__stdcall
__cdecl
我无法将函数指针传递给 C-API,因为它们被认为是不同的类型。
绕过类型系统并使用reinterpret_cast<>
自然会导致运行时错误。
这是这里的一个例子:
有没有一种方法可以安全地将具有一个调用约定的函数转换和/或包装到另一个?
我确实找到了一种方法,方法是传递一个调用第二个捕获 lambda 的强制转换的无捕获 lambda。第一个作为回调传递,第二个通过void* user_data
. 这有效并且是类型安全的。但是对于看起来如此简单的事情来说,它是相当令人费解的。
windows - 需要帮助了解堆栈框架布局
在为我正在处理的调试器实现堆栈遍历器时,我达到了将参数提取到函数调用并显示它们的目的。为了简单起见,我从纯 32 位(调试器和调试器)中的 cdecl 约定和一个接受 3 个参数的函数开始。但是,我无法理解为什么堆栈跟踪中的参数与 cdecl 定义的参数相比是无序的(从右到左,寄存器中没有任何内容),尽管现在已经尝试了几天。
这是我试图堆栈跟踪的函数调用的表示:
这是功能(不出所料)打印到控制台的内容:
这是在断点处生成的堆栈跟踪(调试器捕获断点,然后我尝试遍历堆栈):
负责转储堆栈帧的代码(使用 DIA SDK 实现,但我认为这与我的问题无关)如下所示:
我正在编译测试程序,在 vs2015 更新 3 中没有任何优化。
dia2dump
我已经通过使用示例应用程序查看 pdb 来验证我确实将其编译为 cdecl 。我不明白是什么导致堆栈看起来像这样,它与我学到的任何东西都不匹配,也不匹配Microsoft 提供的文档。
我还查了很多谷歌(包括 osdev wiki 页面、msdn 博客文章等),并查了我(现在可能已经过时的)关于 32 位 x86 汇编编程的书(在 64 位 CPU 存在之前发布) .
非常感谢您提前提供任何解释或链接!
c - 在 StdCall 约定中调用 MASM 函数
我在 Visual Studio 2015 中用 C 语言编写了一个程序,里面有一个 masm 模块。我想将一些函数定义为 stdcall 而不是默认的 cdecl。有没有办法做到这一点?我的目标是跳过调用函数中的堆栈清理。
我有一个功能myModule.h
但是通过__stdcall
以下方式添加到函数签名:
产生链接错误:
LNK2019 未解析的外部符号 _MyFunc@8
函数的定义在 中myModule.asm
,去掉__stdcall
子句后,代码编译链接正确。
有谁知道如何以正确的方式做到这一点?
我还尝试通过更改来更改整个.asm
文件以使用 stdcall 约定:
属性->配置属性->微软宏汇编器->高级->调用约定
但是当调用者清理堆栈时,这些函数仍然被称为 cdecl。
谢谢!
c - 如何使用 asm 获取指向输出缓冲区的指针?
我必须在 asm 中编写函数,并且我在 C 中有原型
在哪里:
in
: 指向传入数据缓冲区的指针out
: 指向输出数据缓冲区的指针n
:数据矩阵的数量。
函数不返回任何内容,但适用于输出数据数组,并且必须根据结果进行更改。
据我了解,在 cdecl 堆栈中将如下所示:
我知道了,如何在 asm 中使用传入缓冲区,但我不明白如何返回传出缓冲区的新地址 - 只是将新地址放入esp+8
不会产生结果,它不会改变*out
. 我该如何处理这个问题?