为什么数组有调用约定?

Why is there a calling convention for arrays?

我正在阅读 System V Application Binary Interface,其中有一部分我无法理解。

首先,文档指出

No attempt has been made to specify an ABI for languages other than C

(第 10 页)。

稍后,在第 20 页,数组 class 化为 MEMORY、POINTER 等:

The classification of aggregate (structures and arrays) and union types works as follows:
...

然后使用 classification 定义调用约定——它们的值和边界如何传递给函数并从函数返回。如果我正确阅读算法,数组可以 class 化为 INTEGER、MEMORY 或 SSE。

但是在C语言中,数组总是作为指针传递和返回的。那么为什么 class 化数组有用,在什么情况下数组 class 很重要?

我想通了:如果数组是结构或联合的一部分,它可能会在寄存器中传递。

这个C代码

#include <stdint.h>

struct somebytes {
  uint8_t bytes[8];
};

uint8_t plus(struct somebytes p) {
  return p.bytes[3]+p.bytes[5];
}

翻译成这个程序集:

mov    %rdi,%rax
shr    [=11=]x28,%rdi
shr    [=11=]x18,%rax
add    %edi,%eax
retq