标签: calling-convention

"cdecl"代表什么?

是的,我知道"cdecl"是一个突出的调用约定的名称,所以请不要向我解释调用约定.我要问的是缩写(?)"cdecl"实际上代表什么.我认为这是一个糟糕的命名选择,因为乍一看它提醒了一个"C声明者"(C的一个相当独特的句法方面).实际上,有一个名为cdecl的程序,其唯一目的是解密C声明.但据我所知,C声明符语法与调用约定完全无关.

简化版:"stdcall"代表"标准调用约定"."cdecl"代表什么?

c c++ cdecl calling-convention nomenclature

23
推荐指数
4
解决办法
1万
查看次数

为什么我可以通过带有太多参数的指针调用函数?

说我有这个功能:

int func2() {
    printf("func2\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在我声明一个指针:

int (*fp)(double);
Run Code Online (Sandbox Code Playgroud)

这应该指向一个接受double参数并返回一个的函数int.

func2 没有任何争论,但是当我写作时:

fp = func2;
fp(2);
Run Code Online (Sandbox Code Playgroud)

(2只是一个任意数字),func2`被正确调用.

这是为什么?我为函数指针声明的参数数量没有意义吗?

c function-pointers calling-convention

23
推荐指数
1
解决办法
2万
查看次数

如何"转到"c中的不同功能?

基本上我试图在C中模拟汇编代码.

这是C代码:

int main()
{
   test();
main_next:
   printf("Hello, World!");
}

void test()
{
     goto main_next;
}
Run Code Online (Sandbox Code Playgroud)

尝试编译此代码(Linux 32位,gcc 4.6.3),我收到此错误:

 error: label ‘main_randomtag_next’ used but not defined
Run Code Online (Sandbox Code Playgroud)

有谁知道如何在C中进行这种程序间的转换?

谢谢!

c assembly calling-convention

23
推荐指数
2
解决办法
6976
查看次数

C/C++中有哪些不同的调用约定,每个含义是什么?

有不同的调用约定在C/C++提供:stdcall,extern,pascal,等有多少这样的调用约定是可用的,什么分别意味着?有没有描述这些的链接?

c c++ winapi calling-convention visual-c++

22
推荐指数
3
解决办法
2万
查看次数

21
推荐指数
3
解决办法
9100
查看次数

将C#委托的调用约定更改为CDECL

当我使用DotNet1.1时,我遇到了C#的这个问题

问题是这个.我有一个非托管的DLL,它有一个函数,它接受一个函数指针(以及其他参数).当我在C#代码中声明DLLImport时,我传递了一个委托.但是C#中的委托具有stdcall调用约定,而非托管函数需要cdecl函数指针.因此,我天真的做法导致了崩溃.然后我找到了以下内容:http://www.codeproject.com/KB/cs/cdeclcallback.aspx有些人编写了一个优秀的库,可以根据我的理解改变代理的调用约定,MSIL-hacking.事情进展顺利,直到......

我迁移到VS2008和新版本的.NET.在此版本下,上述库不起作用.我不是真正的C#或.NET专家,说实话,我几乎不了解他的库做了什么(虽然它是开源的),所以我甚至不想尝试将它适应新的.NET.但是,我希望更新版本的C#可以为我的问题提供更好的解决方案.

那么,SO专家,请帮我解决臀部疼痛:)

c# c++ pinvoke interop calling-convention

21
推荐指数
1
解决办法
9697
查看次数

返回比std :: pair更低效的2元组?

考虑以下代码:

#include <utility>
#include <tuple>

std::pair<int, int> f1()
{
    return std::make_pair(0x111, 0x222);
}

std::tuple<int, int> f2()
{
    return std::make_tuple(0x111, 0x222);
}
Run Code Online (Sandbox Code Playgroud)

Clang 3和4在x86-64上生成类似的代码:

f1():
 movabs rax,0x22200000111
 ret    
f2():
 movabs rax,0x11100000222 ; opposite packing order, not important
 ret    
Run Code Online (Sandbox Code Playgroud)

但是Clang 5生成了不同的代码f2():

f2():
 movabs rax,0x11100000222
 mov    QWORD PTR [rdi],rax
 mov    rax,rdi
 ret    
Run Code Online (Sandbox Code Playgroud)

正如GCC 4至GCC 7一样:

f2():
 movabs rdx,0x11100000222
 mov    rax,rdi
 mov    QWORD PTR [rdi],rdx ; GCC 4-6 use 2 DWORD stores
 ret
Run Code Online (Sandbox Code Playgroud)

返回std::tuple适合单个寄存器的生成代码为什么会更糟std::pair?看起来特别奇怪,因为Clang 3和4似乎是最优的,而5则不是.

在这里试试:https: …

c++ gcc clang calling-convention stdtuple

21
推荐指数
1
解决办法
1474
查看次数

可以通过引用来调用Scala吗?

我知道Scala支持来自ALGOL的call-by-name,我想我明白这意味着什么,但Scala可以像C#,VB.NET和C++那样通过引用进行调用吗?我知道Java不能通过引用进行调用,但我不确定这种限制是否仅仅是由于语言还是JVM.

当您想要将大量数据结构传递给方法但是您不想复制它时,这将非常有用.在这种情况下,按引用调用似乎是完美的.

scala calling-convention evaluation-strategy

20
推荐指数
1
解决办法
2万
查看次数

x86-64上的红色区域究竟在哪里?

来自维基百科:

在计算中,红色区域是函数堆栈帧中超出返回地址的固定大小区域,该区域不被该函数保留.被调用函数可以使用红色区域来存储局部变量,而无需修改堆栈指针的额外开销.中断/异常/信号处理程序不会修改此内存区域.System V使用的x86-64 ABI要求一个128字节的红色区域,它直接在返回地址之后开始并包含函数的参数.OpenRISC工具链假设一个128字节的红色区域.

System V x86-64 ABI:

超出%rsp指向的位置的128字节区域被认为是保留的,不应被信号或中断处理程序修改.因此,函数可以将此区域用于函数调用不需要的临时数据.特别是,叶子函数可以将这个区域用于它们的整个堆栈帧,而不是调整序言和尾声中的堆栈指针.这个区域被称为红区.

  • 鉴于这两个引号,堆叠的返回地址上方或堆叠的返回地址下方红色区域 是?

  • 由于这个红色区域是相对的RSP,它是否向下push移动并且每个区域向上移动pop

assembly x86-64 abi calling-convention red-zone

20
推荐指数
2
解决办法
2331
查看次数

amd64 psABI在哪里?

AMD64 psABI过去曾在x86-64.org上托管.

我有一份pdf文件,它明确地说:

该体系结构规范可在网站 http://www.x86-64.org/documentation上获得.

但是http://www.x86-64.org已经很长时间了.至少几个月.

有谁知道最新的psABI可以从哪里拿走?

linux macos x86-64 abi calling-convention

18
推荐指数
1
解决办法
2752
查看次数