2017-01-25 79 views
5

Czytam System V Application Binary Interface i jest jedna część, której nie mogę zrozumieć.Dlaczego istnieje konwencja wywoływania dla tablic?

pierwsze, dokument stwierdza, że ​​

Nie starano się określić ABI dla języków innych niż C

(strona 10).

Później, na stronie 20, tablice są klasyfikowane jako pamięć, wskaźnik etc .:

Klasyfikacja kruszyw (struktury i tablic) i typów związków działa następująco:
...

Klasyfikacja jest następnie używana do definiowania konwencji wywoływania - w jaki sposób wartości i ograniczenia na nich są przekazywane i zwracane z funkcji. Jeśli poprawnie odczytuję algorytm, tablicę można zaklasyfikować jako INTEGER, MEMORY lub SSE.

Ale w języku C tablice są zawsze przekazywane i zwracane jako wskaźniki. Dlaczego więc warto klasyfikować tablice iw jakiej sytuacji ma znaczenie klasa tablicy?

+1

Pierwszy cytując samo przez się jest zrozumiałe, ponieważ C oznacza [językiem] (https: // pl .wikipedia.org/wiki/Lingua_franca) ze świata uniksowego. Jeśli chodzi o drugi cytat, to że C przekazuje tablice jako wskaźniki (lub rater niech tablica zanika do wskaźnika do jego pierwszego elementu), to dlatego, że C działało od początku i tak powinna być określona specyfikacja C. –

+1

[Powiązane pytanie] (http://stackoverflow.com/questions/38800044/what-kind-of-c11-data-type-is-an-array- recording- to- the-amd64-abi). –

Odpowiedz

1

Wyjaśniłem: jeśli tablica jest częścią struktury lub związku, może zostać przekazana do rejestru.

Kod C

#include <stdint.h> 

struct somebytes { 
    uint8_t bytes[8]; 
}; 

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

przekłada się to montaż:

mov %rdi,%rax 
shr $0x28,%rdi 
shr $0x18,%rax 
add %edi,%eax 
retq