Aracılığıyla paylaş


Parametre Geçirme

İlk dört tamsayı bağımsız değişkeni kayıtlara geçirilir.Tamsayı değerleri rcx, rdx, R8 ve R9 (sırayla soldan sağa) geçirilir.Beş bağımsız değişkenler ve yığın üzerinde daha yüksek geçirilir.Sağa dayalı kayıtlara tüm bağımsız değişkenlerdir.Bu, arananın gerekirse kaydın üst bitlerini yok sayabilmesi ve yalnızca gerekli kayıt kısmına erişebilmesi için yapılır.

XMM0 – XMM3 (4'e kadar) üzerinde (RCX, RDX, R8 ve R9) tamsayı yuvasına sahip olarak geçen kayan nokta ve çift duyarlıklı bağımsız değişkenler normalde kardinal yuvası yok sayılarak (örneğe bakınız) ve bunun tam tersi uygulanarak kullanılır.

__m128türleri, dizileri ve dizeleri asla anlık değere göre geçirilir, ancak yerine çağırıcı tarafından ayrılan bellek için bir işaretçi geçirilir.Aynı boyutta tamsayılar sanki yapılar/birleşmeler boyutu 8, 16, 32 veya 64 bit ve __m64 geçirilir.Bu boyutlar yapılar/birleşmeler çağırıcı tarafından ayrılan bellek için bir işaretçi olarak geçirilir.(__M128 dahil) işaretçi olarak geçirilen bu toplama türleri için arayana ayrılan geçici bellek 16 bayt hizalı olacaktır.

Yığın yeri ayırmayan ve başka işlevleri çağırmayan dahili işlevler, derleyici ve dahili işlev uygulama arasında sıkı bir bağ olduğundan, ek kayıt oluşturucu bağımsız değişkenleri geçirmek için diğer geçici kayıt oluşturucuları kullanabilir.B,u performansı artırmak için ek bir fırsattır.

Gerekirse kayıt parametrelerini kendi gölge uzaylarına damping sorumluluğu çağrıyı yapana aittir.

Aşağıdaki tablo parametrelerin nasıl geçirildiğini özetler:

Parametre türü

Nasıl geçti

Kayan nokta

İlk 4 parametre-XMM0 ila XMM3.Diğerleri yığın olarak geçirilir.

Integer

İlk 4 parametre – RCX, RDX, R8, R9.Diğerleri yığın olarak geçirilir.

Toplamları (8, 16, 32 veya 64 bit) ve __m64

İlk 4 parametre – RCX, RDX, R8, R9.Diğerleri yığın olarak geçirilir.

Toplamları (diğer)

İşaretçi ile.İlk 4 parametre RCX, RDX, R8 ve R9 işaretçileri olarak geçer

__m128

İşaretçi ile.İlk 4 parametre RCX, RDX, R8 ve R9 işaretçileri olarak geçer

Bağımsız değişken geçirme örneği 1 - tüm tamsayılar

func1(int a, int b, int c, int d, int e);  
// a in RCX, b in RDX, c in R8, d in R9, e pushed on stack

Bağımsız değişken geçirme örneği 2 - tüm float değerleri

func2(float a, double b, float c, double d, float e);  
// a in XMM0, b in XMM1, c in XMM2, d in XMM3, e pushed on stack

Bağımsız değişken geçirme örneği 3 - karışım tamsayılar ve float değerleri

func3(int a, double b, int c, float d);  
// a in RCX, b in XMM1, c in R8, d in XMM3

4 –__m64, __m128 ve toplamları bağımsız değişken geçirme örneği

func4(__m64 a, _m128 b, struct c, float d);
// a in RCX, ptr to b in RDX, ptr to c in R8, d in XMM3

Ayrıca bkz.

Başvuru

Çağırma Kuralı