ARM64调用约定:当有少于8个参数时,调用者或被调用者被保存?



这是关于ARM 64位的Unix/Linux ABI。

如果一个函数使用寄存器x0-x7,因为它已经接收了8个参数,然后它调用另一个函数,也计划使用我们说x6-x7,是预期调用者将保存这些还是被调用者将保存它们?

Unix的aarch64 ABI是不清楚的。

函数签名不影响调用约定。

所有可能的参数传递寄存器总是被调用的,不管函数是否实际使用了那么多,所以调用者应该保留任何"珍贵的"寄存器。

其他寄存器或内存中的值。这通常是一个很好的设计。例如,一个接受2个参数的函数可能想要调用另一个接受更多参数的函数,并且不想浪费保存/恢复调用者的x2的指令,以便它可以使用它传递一个参数。

同样,在您假设的设计中,像printf这样的可变函数必须恢复它们可能接触过的所有传递参数的寄存器,以防它们被更少的寄存器调用。(这样做比计数参数并只恢复超过参数列表末尾的那些更容易。只有8个寄存器,只有4条ldp负载对指令。)

另外,浮点寄存器呢?大多数函数不接受FP参数,但如果它们想在内部调用数学函数,您也不希望它们浪费保存/恢复这些参数的指令。

最新更新