2012-03-20 18 views
7

EAX 32 bitlik platformda fonksiyonun geri dönüş değerini saklamak için kullanılır, bir fonksiyonun dönüş büyüklüğünün 4 bayttan büyük olup olmadığını merak ediyorum, eax nasıl halleder? Bu durumda OS, yığında dönüş değerini kaydedebilir ve yığının adresini EAX'te saklayabilir, ancak OSX'de depolanan değerin dönüş değeri için bir adres mi, yoksa aslında geri dönüş değeri mi olduğunu nasıl anlatabilir?eax deposu, hangi boyutun 4 bayttan büyük olduğunu nasıl döndürür?

+0

Bu sorunun yanıtlarına bakın: http://stackoverflow.com/questions/2155730/how-do-c-compilers-implement-functions-that-return-large-structures –

cevap

12

Arayan ve arayan, kayıtların ve yığının neleri içerdiği konusunda hemfikir olmalıdır. Bu, application binary interface (ABI) olarak adlandırılan daha büyük bir kavramın parçası olan calling convention olarak adlandırılır. Arayan, nasıl çağırılmak istediğini tanımlar (yani . argümanların yığında, kayıtlarda, vs. olması gerekip gerekmediğini) ve derleyici, oluşturduğu kodun çağrı kuralına uygun olmasını sağlar.

Özel sorunuz için ABI'ye bağlıdır. Bazen dönüş değeri 4 bayttan büyükse ancak 8 bayttan büyük değilse, EAX ve EDX'e bölünebilir. Ancak çoğu zaman arama fonksiyonu sadece hafızayı (genellikle yığında) tahsis eder ve bu alana çağrılan işleve bir işaretçi gönderir.

Ayrıca, işletim sisteminin rolünün sizin düşündüğünüz gibi önemli olmadığını unutmayın. Farklı çağrı kurallarına sahip ikili dosyalar aynı sistemde bir arada bulunabilir ve ikili dosyalar da farklı çağrı kurallarını dahili olarak kullanabilir. İşletim sisteminin ABI'si, ikili sistem kütüphanelerini çağırdığında sadece önemlidir.

İlgili konular