为什么有数组的调用约定?

Rom*_*aka 5 c arrays x86-64 calling-convention

我正在阅读System V应用程序二进制接口,有一部分是我无法理解的.

首先,该文件指出

没有尝试为C以外的语言指定ABI

(第10页).

稍后,在第20页,数组分为MEMORY,POINTER等:

聚合(结构和数组)和联合类型的分类如下:
...

然后使用分类来定义调用约定 - 它们的值和边界如何传递给函数并从函数返回.如果我正确读取算法,则可以将数组分类为INTEGER,MEMORY或SSE.

但是在C语言中,数组总是作为指针传递和返回.那么为什么对数组进行分类以及在哪种情况下数组类很重要呢?

Rom*_*aka 1

我发现:如果数组是结构或联合的一部分,它可以在寄存器中传递。

这段C代码

#include <stdint.h>

struct somebytes {
  uint8_t bytes[8];
};

uint8_t plus(struct somebytes p) {
  return p.bytes[3]+p.bytes[5];
}
Run Code Online (Sandbox Code Playgroud)

翻译成这个程序集:

mov    %rdi,%rax
shr    $0x28,%rdi
shr    $0x18,%rax
add    %edi,%eax
retq   
Run Code Online (Sandbox Code Playgroud)