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

c - 除了不能在任何程序中使用的变量名之外,还有哪些在 cdecl 中不允许使用的变量名?

我一直在玩cdecl,我注意到有些名称不允许作为标识符,尽管 GCC 可以完美地编译它们。

例如,如果我写

整数点;

或者

整数指针;

或者

整数数组;

cdecl 给出“语法错误”,但是当我在程序中使用它时,GCC 编译它们没有任何问题。所以,有些标识符在 cdecl 中是不允许的。

哪些标识符不能在 cdecl 中使用,但可以在程序中使用(即程序编译)?为什么他们不被允许?

0 投票
1 回答
2140 浏览

io - 如何在带有 NASM 汇编器的 x86 中使用 Syscall 从 stdin/stdout 读取和写入字节?

我正在尝试从标准输入读取字符串并使用 x86、NASM 和系统调用将其打印出来。读入一个字节将是一个函数,而写出一个字节将是一个函数。我正在从标准输入读取字符串并将每个字符放入一个数组中。这是我最初的想法:

样本输入:

样本输出:

这些函数应该与 cdecl 一起使用,我认为我做得不对。我也意识到我没有将字符放入 arr。

0 投票
0 回答
269 浏览

assembly - 在 ASM x86 中实现 C++ 调用约定

我编写了一个使用 ASM x86 混淆字符串的简单程序。用户必须输入他们想要的字符串,然后Ekey为要混淆的字符串选择一个键 ( )。(我知道您可以使用移位运算符或表格查找来模拟左右位旋转,我只是想让自己熟悉 ASM)

我正在尝试更改程序,以便它采用可接受的 C++ 标准调用过程,例如Cdecl将参数 ( EKey& tempChar) 传递到子例程obfuscate中。

尽管进行了数小时的研究,但我一直没有成功,所以我来到这里希望有更多经验的人能够提供一些指导。

这是相关的功能:

obfuscate子程序:

提前感谢您花时间阅读。

0 投票
1 回答
1333 浏览

visual-studio-2012 - 混合 cdecl 和 stdcall 调用约定

我已经在 Windows VS2012 (.lib) 上构建了一个静态库,使用 stdcall 约定编译。当我说“已经构建”时,我的意思是不幸的是我无法使用我选择的调用约定来重建它。

是否可以从使用 cdecl 约定编译的代码中调用该库中的函数?或者至少做某种包装?

我不确定这是否可能(在浏览了 SO 之后,我实际上几乎确信这是完全不可能的)但是这里有些人含糊地提到可能有一个 kludge。任何想法 ?

0 投票
3 回答
4965 浏览

assembly - 结构如何在程序集中作为参数传递

结构体如何在汇编中作为参数传递?

由于结构的大小比正常大,各个字段是否按顺序传递?

如果是这样,它们是否像正常参数一样以相反的顺序排列?

cdecl 和 stdcall 之间有什么区别吗?

0 投票
1 回答
314 浏览

c++ - 显式链接 DLL 中的 CDecl 清理代码

我在非托管 Win32 DLL 中有一个函数,它接受可变数量的参数,因此需要使用__cdecl而不是__stdcall任何其他调用约定。目前我正在显式链接到 DLL(也就是说,我正在使用LoadLibraryGetProcAddress不是链接到 DLL 的.lib文件)。

我可以很好地调用该函数,但是因为cdecl我需要在每次调用后添加以下内联汇编指令:

如果我不包含内联程序集,那么程序在调用 addVecs 后会崩溃。

有什么方法可以编写 EXE 或 DLL,从而不需要内联汇编指令?例如,printf它也是一个__cdecl函数,但我不需要编写内联汇编来确保在每次调用后清理堆栈。

0 投票
0 回答
162 浏览

c++ - cdecl 和 std 调用 - 如何使我的代码常规化

我有在此代码中实现标准调用的任务 - 是 cdecl 或 std 调用

'mov eax, [ebp+8] // 获取第一个被推送的参数'

我理解推动指针位置的想法,但我不确定我会告诉指针在哪里看。

是那个 mov eax, [ebp+4/8/12] 或者你有什么

任何帮助告诉我我将如何做到这一点将不胜感激,同样,如果你们中的一个人确实解决了这个问题,可以添加解释

谢谢

0 投票
0 回答
625 浏览

c++ - X86 汇编 cdecl 混淆

早上,我在下面的“加密”例程中实现了一个 cdecl 调用方法。然而,虽然我的方法有效,但它并没有完全遵循推荐的(uni 和其他来源)。

建议赞赏(某些评论可能是“错误”的 cdecl 相关功能已标记为)

我的困惑是,我被告知对于每个推送的参数(在本例中为 2)我必须在调用之前推送,在函数内部再次推送,然后为每次额外推送执行 mov [ebp+n] - 在主体之前.

但是,如果我遵循以下逻辑:为每次推送执行 mov ebp 移位 - 不添加额外的推送,一切正常。但这很可能是一个错误。

如果需要,我可以发布一些参考文档。

代码提取:

0 投票
2 回答
866 浏览

c++ - 这里有必要保存FPU状态吗?

我写了一个简单的协作多线程库。目前,我总是在切换到新上下文时使用fxsave/保存和恢复 fpu 状态。fxrstor但这在 cdecl 调用约定中是必要的吗?

举个简单的例子:

编译器可以在调用后对 FPU 状态做出任何假设yield()吗?

0 投票
0 回答
116 浏览

recursion - x8086 程序集中的逆向过程

我想要得到的序列的明确定义是 1*2 + 2*3 + 3*4 ... + i(i+1)。

我已经把它的数学记下来了,我发现这个系列的递归定义是 a_n = a_(n-1) + 2(n-1) ,其中 a_1 = 0 作为基本情况。我试图弄清楚为什么这段代码一直给我偶数系列:{2,4,6,8,10 ...} 而不是我要计算的系列