Windows和Unix有自己的x86-64调用约定。但是,如果一种语言需要它/从中受益,它能有自己的内部使用调用约定吗?例如,Swift/Python(已编译(可能会受益于拥有多个寄存器,用于从一个函数返回多个结果(因为这些语言支持这一点(。因此,在语言调用约定中保留3个寄存器(rax
、rcx
、rdx
(作为返回值,这会破坏什么吗?导致任何未被注意的错误,或者在任何情况下导致未定义的行为?
此外,如果没有必要遵循该约定,那么他们为什么要为用户空间定义调用约定呢?
当然可以。剩余的问题将是与API/操作系统的交互,您必须遵守操作系统的工作方式。
总的来说,重点可能是成本/效益关系。
但出于特殊目的,这是可能的,甚至可能更优越(否则你为什么要这么做?(
此外,还应考虑对操作系统特定事物(如红色区域(可能产生的副作用。
调用约定完全由编译器的作者决定。它们没有任何理由符合任何ISA供应商记录的惯例或任何其他规定。对于创建了约定的ISA供应商来说,它们经常被使用。但没有要求。看看过去的x86就知道了。标准的概念是一个相对较新的东西(在编译语言的时间框架内(。
如果你想创建二进制文件,那么你可以随心所欲。如果你想制作可以与其他工具链中的二进制文件一起使用的对象/库,那么双方(相互竞争,可能相处不好(都需要使用相同的约定。这通常意味着有一个占主导地位的工具链,而其他工具链则试图顺应并跟上变化。
共享运行库(.dll、.so等(将使用约定编译二进制文件,如果你想让你的应用程序能够使用它们,你需要使用该约定调用其中的函数,无论是用来使用不同约定的填充程序,还是你的编译器本机使用相同约定。