SORU
13 Aralık 2010, PAZARTESİ


Neden Windows64 86-64 diğer tüm İşletim sistemleri farklı bir çağrı kuralı kullanıyor mu?

AMD x 86-64 üzerinde kullanmak için bir çağrı kuralı tanımlayan ABİ bir özellikleri vardır. İşletim sistemleri, takip, tüm, 86-64 kendi arama kuralı olan Windows dışında. Neden?

Herkes bu fark, teknik, tarihsel ya da politik nedenlerle biliyor mu, yoksa sadece NİHsyndrome meselesi değil mi?

Anladığım kadarıyla farklı İşletim sistemleri olabilir, farklı ihtiyaçları için daha yüksek seviyeli şeyler, ama açıklamıyor neden örneğin kayıt parametre geçirilmesi amacıyla Windows rcx - rdx - r8 - r9 - rest on stack olsa herkes kullanır rdi - rsi - rdx - rcx - r8 - r9 - rest on stack.

P. S. ben de farkındayımnasılbu kuralları çağrılıyor ayrılır ve eğer ihtiyacım olursa detayları nerede bulacağımı biliyorum. Ne bilmek istiyorumneden.

Edit: nasıl, oradan wikipedia entry ve bağlantılara bakın örneğin.

CEVAP
14 Aralık 2010, Salı


Seçmedört64 - *BM ortak tartışma kaydeder X / Win64

Şeylerden biri 86 hakkında akılda tutulması gereken kayıt adı "sayı" kodlama açık değildir; talimat kodlama açısından (. reg yani ^em>MOD R/Mbayt, http://www.c-jump.com/CIS77/CPU/x86/X77_0060_mod_reg_r_m_byte.htm), kayıt numaraları 0...7 - bu sırada - ?AX, ?CX, ?DX, ?BX, ?SP, ?BP, ?SI, ?DI.

Dolayısıyla geri dönmek için/C/D (kurallara 0..2) değeri ve ilk iki argüman "" 32 __fastcall Kongre) mantıklı bir seçim olur klasik. (hangi seçimi Şimdiye kadar 64 bit olacak ile ilgili olarak," kurallara göre sıralanır ve hem Microsoft hem de BM*X/LinuxR8 / R9 ilk olanlar için. "daha yüksek gibi

Tutmak zihin, Microsoft'un tercih RAX (dönüş değeri) ve RCX, RDX, R8, R9 (arg[0..3]) anlaşılabilir bir seçim seçersenizdörtbağımsız değişkenler için kaydeder.

AMD64 UN*X ABİ RCX daha önce RDX seçtim bilmiyorum.

Seçmealtıbağımsız değişken x 64 - X UN*belirli . kayıtlar konusunda

UN*X, RISC mimarisi, geleneksel olarak bağımsız değişken kayıtlarına geçen - özellikle de ilk yaptıaltıdeğişkenler (o kadar PPC, SPARC, en az CABASI). (*X BM) AMD64 ABİ tasarımcılar mimarlık on altı kayıtları olarak kullanmayı seçti önemli nedenlerinden biri olabilir.

Eğer istersenizaltıbaşka hangi dördü ve mantıklı seçim.RCX, , * RDX* 22 R9 bağımsız değişkenler geçirmek için kaydeder, iki almak gerekir ?

"Yüksek eğer seçenekler varsa" Yönetmeliği Ek Talimat bir önek gerektirir onları seçin ve bir seçim yapmak istemem, bu yüzden bu yüzden daha büyük öğretim boyutu bir ayak izi var, bayt. Nedeniyle klasik kayıtları,örtülüanlam RBP RSP bu değil mi kullanılabilir, ve RBX geleneksel bir özel kullanımda UN*X (global offset table) hangi görünüşte AMD64 ABİ tasarımcılar istemedim gereksiz hale uyumsuz.
Ergo,seçim sadeceedildi 27* / RDI*.

Eğer argüman olarak kaydederRSI / RDI almak varsa, bağımsız mı olmalı ?

Bunları yaparken arg[0] arg[1] bazı avantajları vardır. CHao yorum bakın.
?SI ?DI dize talimat Kaynak / Hedef işlenen ve cHao belirtildiği gibi, kendi kullanım olarak değişken kaydeder anlamı ile AMD64 UN*X arama kuralları, olabildiğince basit strcpy() işlev, örneğin, yalnızca oluşur bu iki İŞLEMCİ talimatları repz movsb; ret çünkü kaynak/hedef adresleri var. içine doğru kayıtları ile arayan. Orada, özellikle düşük seviyeli ve derleyici tarafından oluşturulan "tutkal" kod (düşünün, örneğin, bazı C yığın oran sıfır-dolum nesneler üzerinde yapı veya çekirdek sıfır-dolum yığın sayfaları sbrk() veya kopya üzerinde yazma pagefaults) muazzam bir miktar blok kopyala/dolgu, dolayısıyla faydalı olması için kod çok sık kullanılan kaydetmek için iki ya da üç CPU talimatları ... aksi takdirde yük gibi kaynak/hedef adres tartışmalar içine "doğru" kaydeder.

Yani bir bakıma, UN*X ve Win64 sadece farklı o UN*X "başa" iki ek argümanlar, kasıtlı seçilmiş RSI/RDI kaydeder, doğal seçim, dört bağımsız değişkenleri RCX, RDX, R8 ve R9.

... Ötesinde ..

Belirli kayıtları için bağımsız değişkenler sadece bir eşleme daha*X ve Windows UN 64 ABİs arasında daha fazla farklılıklar vardır. Win64, kontrol edin: genel bakış için

http://msdn.microsoft.com/en-us/library/7kcdt6fy.aspx

Win64 ve AMD64; örneğin Win64, arayangerekirargüman olarak 0...3 kayıtlarına geçirilir olsa da işlev bağımsız değişkenleri için stackspace ayrılamadı. BM*X diğer taraftan, bir yaprak fonksiyonu (örneğin bir haber bile vermiyor diğer fonksiyonlar) olsa dahi gerekli tahsis stackspace hiç değilse ihtiyacı en fazla 128 Bayt (Evet, kendi ve kullanabilir bir miktar yığını olmadan ayrılırken ... değilsen tabii çekirdek kod, kaynağı şık böcekler). Bu özel optimizasyon seçenekleri vardır, o mantığı en tam ABİ orijinal poster wikipedia referans noktaları başvuran açıkladı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Absolute Zero(Programming Tutorials)

    Absolute Zer

    22 Kasım 2012
  • boburnham

    boburnham

    11 Temmuz 2006
  • Menglong Tav

    Menglong Tav

    18 Temmuz 2010