【问题标题】:Why is there a calling convention for arrays? [duplicate]为什么有数组的调用约定? [复制]
【发布时间】:2023-03-29 23:39:01
【问题描述】:

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

首先,文件指出

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

(第 10 页)。

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

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

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

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

【问题讨论】:

  • 第一个引号本身很容易理解,因为 C 是 Unix 世界的 lingua franca。至于第二个引用,C 将数组作为指针传递(或评估者让数组衰减到指向其第一个元素的指针)是因为这就是 C 从一开始就是这样工作的,这就是 C 规范所说的应该发生的事情。

标签: c arrays x86-64 calling-convention


【解决方案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   

【讨论】:

    猜你喜欢
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    相关资源
    最近更新 更多