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