2010-10-07 22 views
5
int main(void){ 

printf("Hello World"); 

return 0; 

} 

, derleme düzeyinde dönüş değeri olarak nasıl geçti? Bu iş için özel bir CPU kaydı var mı? İşte GÜNCELLEMEGeri dönüş değeri montaj seviyesinde nasıl uygulanır?

pdf/dönüş verilerinin geçirilmesi üzerine 2 tablolar, ama bir API çağrı kuralı nasıl belirlendiği ile ilgili kesin bilgi var gibi görünüyor değildir ve kendisi için kullanılmaktadır kayıt ol depolamak dönüş adresi: mimarlık bağlıdır

alt text

alt text

+1

Bu, aşağıdakileri içeren bir çok faktöre bağlıdır: Hangi derleyici, hangi CPU, hangi işletim kurallarını çağırıyor, hangi optimizasyonlar aktif, vs. Ve tabii ki, hangi dil. –

+0

x86'da bir syscall/API'nin dönüş değeri ** genellikle ** 'eax' register – jyz

cevap

8

. Sadece birkaç örnek için, x86'da EAX kaydı normalde geri dönüş değerleri için kullanılır. X86-64'te RAX. SPARC'de, normalde% o0 içinde görünür.

+0

Yani her zaman bunun için bir ** adanmış ** kayıt var, değil mi? – Alan

+1

Tam olarak ne demek istiyorsun? Hayır, EAX (örneğin), yalnızca bu amaç için ayrılmamıştır. Evet, bir değer döndürmeniz gerektiğinde, çoğu derleyici EAX'te olmasını bekler. Elle yazılmış derlemede, diğer kayıtların daha sık kullanıldığını (örneğin, dizeler için ESI veya EDI) görme olasılığınız yüksektir. 16-bit günlerde, 16 bitlik geri dönüşler tipik olarak AX'de ve DX: AX'te 32 bitlik geri dönüşlerdi. –

+0

Kayıt düzeltilmemişse, farklı API'ler nasıl iletişim kurar? – Alan

3

Bu, application binary interface'un bir parçasıdır.

Bu günlerde dönüş değeri ve işlev parametreleri genellikle yazmaçlara aktarılır, çünkü bu en verimli seçenektir. Sadece mevcut yazmaçlar için çok büyük olursa yığın kullanılır.

+0

"ABI" nin bir örneğini verebilir misiniz, böylece dünyanın nasıl olduğunu bilmem mümkün olabilir mi? – Alan

İlgili konular