2017-01-25 54 views
5

System V Application Binary Interface'u okuyorum ve anlamamış bir bölüm var.Diziler neden arama çağrısı var?

Birincisi, belge

hiçbir girişimde C

(sayfa 10) dışındaki diller için ABI belirtmek için yapıldığını belirtiyor.

Daha sonra sayfa 20, diziler BELLEK, POINTER vb .: olarak sınıflandırılır

aşağıdaki gibi agrega (yapıları ve diziler) ve sendika türleri sınıflandırması işleri

:
...

Sınıflandırma daha sonra çağrı kurallarını tanımlamak için kullanılır - bunlar üzerindeki değerler ve sınırlar nasıl iletilir ve işlevlerden döndürülür. Algoritmayı doğru okuyorsam, bir dizi INTEGER, MEMORY veya SSE olarak sınıflandırılabilir.

Ancak C dilinde, diziler her zaman geçirilir ve işaretçi olarak döndürülür. Öyleyse dizileri sınıflandırmak ve dizi sınıfının hangi durumda önemli olduğu niçin yararlıdır?

+1

ilk alıntı, kolay anlaşılır [ortak dil] (https: // tr Unix dünyasının .wikipedia.org/wiki/Lingua_franca). İkinci alıntıya gelince, bu C dizileri işaretçi olarak geçirir (ya da dizinin ilk elemanına işaret eden bir dizgecin bozulmasına izin verir) çünkü C'nin başından beri nasıl çalıştığı ve C şartnamesinin böyle olması gerektiği söylenir. –

+1

[İlgili soru] (http://stackoverflow.com/questions/38800044/what-kind-of-c11-data-type-is-an-array-according-to-the-amd64-abi). –

cevap

1

Bunu çözdüm: eğer bir dizi bir yapının veya kaynağın parçasıysa, bir kayıt defterine geçirilebilir.

#include <stdint.h> 

struct somebytes { 
    uint8_t bytes[8]; 
}; 

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

bu montaja çevirir Bu C kodu: C, çünkü tek başına

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