为什么数组有调用约定?
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
我正在阅读 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