为什么数组需要调用约定?

5
我正在阅读 System V Application Binary Interface,但有一部分我无法理解。
首先,该文档声明:
“没有尝试为C语言以外的语言指定ABI”(第10页)。
随后,在第20页上,数组被分类为MEMORY、POINTER等:
“聚合类型(结构和数组)和联合类型的分类如下:...”
然后使用这些分类来定义调用约定——传递值及其边界以及从函数返回。如果我正确理解算法,数组可以被分类为INTEGER、MEMORY或SSE。
但在C语言中,数组始终作为指针传递和返回。那么为什么对数组进行分类很有用?在哪种情况下,数组类别会起作用?

1
第一句话很容易理解,因为C语言是Unix世界的通用语言。至于第二句话,C将数组作为指针传递(或者说让数组退化为指向其第一个元素的指针)是因为这就是C从一开始就运行的方式,并且这也是C规范所规定的。 - Some programmer dude
1
相关问题 - Michael Foukarakis
1个回答

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   

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接