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

时间:2017-01-25 14:46:15

标签: c arrays x86-64 calling-convention

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

首先,文件说明了

  

没有尝试为C

以外的语言指定ABI

(第10页)。

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

  

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

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

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

1 个答案:

答案 0 :(得分:1)

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

此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    $0x28,%rdi
shr    $0x18,%rax
add    %edi,%eax
retq