2017-01-25 6 views
5

私はSystem V Application Binary Interfaceを読んでいます。私は理解できない部分があります。配列の呼び出し規約があるのはなぜですか?

まず、文書は

ませ試みはC

(10ページ)以外の言語用のABIを指定するためになされていないと述べています。

その後、20ページの、配列はメモリとして分類され、POINTER等:

集計(構造体や配列)の分類と労働組合の種類は次のよう に動作します:
を...

分類は、呼び出し規約を定義するために使用されます。呼び出し規約は、値と境界がどのように関数に渡され、関数から返されるかを定義します。私がアルゴリズムを正しく読んでいれば、配列はINTEGER、MEMORY、またはSSEとして分類できます。

しかし、C言語では、配列は常に渡され、ポインタとして返されます。では、なぜ配列を分類するのが有益で、どのような状況で配列クラスが重要なのでしょうか?

+1

最初の引用は、理解しやすい[共通語(HTTPS:// EN .wikipedia.org/wiki/Lingua_franca)を参照してください。 2番目の見積もりに関しては、Cがポインタをポインタとして渡す(または、最初の要素へのポインタに配列の崩壊をさせる)のは、Cが最初からどのように動作したかということであり、それがCの仕様であると言えます。 –

+1

[関連質問](http://stackoverflow.com/questions/38800044/what-kind-of-c11-data-type-is-an-array-according-to-the-amd64-abi)。 –

答えて

1

私はそれを理解しました:配列が構造体または共用体の一部であれば、レジスタに渡すことができます。

#include <stdint.h> 

struct somebytes { 
    uint8_t bytes[8]; 
}; 

uint8_t plus(struct somebytes p) { 
    return p.bytes[3]+p.bytes[5]; 
} 

このアセンブリに変換これCコード:Cであるため、それ自体で

mov %rdi,%rax 
shr $0x28,%rdi 
shr $0x18,%rax 
add %edi,%eax 
retq 
関連する問題