【发布时间】:2021-07-09 10:09:52
【问题描述】:
Windows 和 Unix 有自己的calling-conventions for x86-64。但是,如果一种语言需要/从中受益,它是否可以有自己的调用约定供内部使用?例如,Swift / Python(已编译)可能会受益于拥有多个寄存器以从函数返回多个结果(因为这些语言支持)。因此,保留 3 个寄存器(rax、rcx、rdx)作为其语言调用约定中的返回值,是否会破坏任何内容?导致任何未被注意到的错误,或在任何情况下导致未定义的行为?
另外,如果不需要遵循那个约定,那他们为什么要为用户空间定义调用约定?
【问题讨论】:
-
当然。例如,Go 有自己的调用约定。
-
处理器没有呼叫约定警察。
-
这就像问您是否可以制造奇数尺寸(5.23mm、8.712mm 等)的螺钉和螺栓,而不是使用标准的。当然可以,而且对于某些项目可能有充分的理由这样做,但如果您想与五金店的现成零件进行互操作,则需要构建额外的适配器和配件。
-
即使是 C 或 C++ 中的内部函数也可以有自定义调用约定。编译器将在调用这些函数时进行调整以最大限度地减少寄存器溢出。只要不从外面叫,就没有问题
-
更常见的是实现语言有自己的调用约定,至少在过去网络使共享代码(包括二进制文件)变得容易之前。例如同一语言的不同编译器/链接器可能使用不同的约定,至少在默认情况下是这样,因此要进行互操作,您可能需要在 32 位 Windows C 环境中声明具有
__stdcall或__fastcall属性/declspec 的原型。跨度>
标签: assembly x86-64 calling-convention