X64 kayıt adlarındaki 'R' ne anlama geliyor?


27

32 bit yazmaçların, genişletilmiş demek için 'E' ön ekine sahip 16 bitlik yazmaçlara benzendiğini biliyorum. Açıkça belirtilmiş olduğunu hiç görmemiş olmama rağmen, bunun 16'dan 32 bit'e kadar uzadığı anlamına geldiğini her zaman varsaydım.

'R' nin ne anlama geldiğini bulmaya çalışıyordum, ancak google becerilerim başarısız oldu. Bilen var mı?


Yanıtlar:


32

Kayıt olmak demektir ve hepsi tarihsel nedenlerden ötürü değildir.

Tarihsel bölüm, Intel’in 8008 (A - E artı H ve L) harfleriyle harfleri sayma alışkanlığına kavuşması. Mikroişlemciler çok az sayıda sicile sahip olduğundan ve daha fazlasını elde etme olasılıklarının bulunmadığı ve çoğu tasarımın yaptığı bu plan o dönemde yeterli değildi. O zamanki hakim düşünce, yeni CPU'lar için yazılımın göründüğü gibi yeniden yazılmasıydı, bu nedenle modeller arasındaki sicil adlandırma düzenini değiştirmek büyük bir sorun olmayacaktı. 8088’in IBM PC’ye dahil edildikten sonra bir “aileye” dönüşmesini hiç kimse öngörmemişti ve geriye dönük uyumluluk boyunduruğu, Intel’i 32 bitlik kayıtlardaki “E” gibi programları benimsemeye zorlamak zorunda kalmaya zorladı.

Tarihsel olmayan kısmı pratiktir. Genel amaçlı kayıtlar için harflerin kullanılması, program sayacı, bayraklar veya yığın işaretçisi gibi özel amaçlı kayıtların adlarıyla karışıklığa neden olabilecekleri ayıklamanız durumunda, sizi 26 ile sınırlandırır.

Bunu onaylayacak bir kaynağım yok, ancak Rönek seçiminden ve 64 bitlik işlemcilere R8'den R15'e kadar giriş yapıldığından şüpheleniyorum, 32-bit ve 8008'den neredeyse yarım yüzyıl boyunca çıkmayan büyük mimariler. IBM, 1960'larda 360'la yaptı ve bunu PowerPC, DEC Alpha, MIPS, SPARC, ARM, Intel'in i860 ve i960 ve uzun zaman önce unutulan bir grup kişi izledi.

Var olan kayıtların, eğer varlarsa, R0 ile R7 arasında iyi bir şekilde uyduğunu ve dahili olarak bu şekilde muamele edilmeleri beni şaşırtmayacağını not edersiniz. Mevcut uzun kayıtlar (RAX / EAX / AX / AL, RBX / EBX / BX / BL, vb.) Muhtemelen güneş yanana kadar burada kalacaktır.


1
Biraz antiklimaktik ama sanırım çok şaşırmamalıyım. Teşekkürler.
Matt

3
Toplayabildiğim tek şey bu kadardı. :-)
Blrfl

Çok ilginç okuma için +1. Fakat sadece bir satırda özetlenecek olsaydı, verdiğim cevap olurdu. Tüm bu zengin ve ilginç bilgiler, özetlendiğinde “tarihsel nedenlere” katlanır.
Mike Nakis

6
AMD vermedi yeniden adlandırma veya düşük 8 register aliasing düşünün r0- r7veya kullanma UAXyerine r8, vb . “Kayıtların en iyi nasıl adlandırılacağına karar vermek aslında kayıt uzantısını yapmanın en zor kısımlarından biriydi.” ( Diğer temiz x86-64 tarihçeleri için bkz. Stackoverflow.com/a/35619528/224132 .) Ayrıca, sıralı kodlamada RAX / RBX / ... değil, AX, CX, DX, BX
Peter Cordes

9

Daha önceki işlemcilerde, tüm kayıtlar eşit değildi:

  • Çiplerde her kayıt için bir toplayıcı birime sahip olacak kadar alan yoktu.
  • 8 bit ile, kaynak ve hedefin tüm olası kombinasyonları için yeterli sayıda opcode mevcut değildi.

Dolayısıyla, toplayıcı dahil edildiğinde belirli bir sicilin her zaman geçerli olduğunu varsayarsak, çipi daha az karmaşık hale getirir ve opokları kısaltır.

Örneğin, 6510 (Commodore 64'te kullanılır) yalnızca A kaydı kullanarak ve X ya da Y'de kullanılan indekslemeyi ekleyebilir. INC X ve INC Y talimatları vardır, ancak INC A yoktur.

Kayıtların farklı kullanımları olduğundan, kullanımlarını yansıtan anımsatıcılar seçildi. 6510'daki A, X ve Y (A, B ve C yerine).

8086'daki isimler, kullanımlarını da yansıtacak şekilde seçilmiştir. 4 genel amaçlı yazmaçla, bunları AX, BX, CX ve DX olarak adlandırmak mantıklıydı. Ek indeksleme kayıtlarına BP ve SP adı verildi (anımsatıcı: Temel İşaretçi, Yığın İşaretçi).

Birçok opcod 16 bite uzatıldığı için, dört kayıttan birinin hangisinin kullanıldığını gösteren bir boşluk vardı. Bununla birlikte, CX biraz özel olduğu için hala uygulanmış olan tarihsel nedenlerden bazıları: REP ve 8 bitlik kod olan beğeniler, daima sayaç olarak CX kullanır. Basit bir hatırlatıcı, CX = Counter, hangisinin kullanıldığını hatırlamaya yardımcı olur.

Halefler için 8086'nın kodları geriye dönük olarak uyumlu olmak zorundaydı ve değişken uzunluktaki kodların bir sonucu olarak karışıklık vardı. 32 bit veri yolu daha yaygın hale geldiğinde, sabit opcode uzunluğuna sahip işlemciler denendi. Bu, örneğin daha fazla yazmaç için kullanılabilecek alanı boşaltan CPU'nun kod çözme kısmını basitleştirir.

Bu düşünce hattını izleyen işlemcilere, CISC (Karmaşık Komut Seti) CPU'su ile kontrast oluşturmak için RISC işlemciler (Azaltılmış Komut Seti) CPU denir.

Daha fazla kayıt, belleğe daha az sıçramaya neden olur. Temel olarak, kayıtlar mevcut olan en hızlı önbellektir, bu nedenle kayıt sayısını artırmak günümüzde bile iyi bir fikirdir. Özel talimatların eksikliği (umarım daha fazla) basit talimatların daha hızlı verilmesiyle telafi edilmiştir.

Sabit uzunluklu 32 bitlik işlem kodları bir kaynağı, bir ikinci kaynağı, bir işlemi ve bir hedefi içerecek kadar yeterli alana sahiptir. SPARC kaynak, ikinci kaynak ve hedefin her biri için 5 bit sıkmayı başardı ve bunun için aynı anda 32 kayıt görüldü.

32 yazmaç harf kullanmak için çok fazla ve zaten yine de eşitti, bu yüzden numaralandırmak açık bir seçimdi. 'R', onları 0..3 sabitlerinden ayırmak için kullanıldı ve 'R' Kayıt için kolay bir anımsatıcıydı. Bu nedenle: R0..R31.

Yıllar boyunca, Pentium ve halefleri geriye dönük uyumluluğu korudu. Bununla birlikte, daha başarılı RISC fikirlerinin birçoğu da yanlış kullanıldı. Sıklıkla, bu yeni, RISC benzeri talimatlar geriye dönük uyumlu sürümlerden daha hızlı çalışır.

Kayıt sayısı, bellek erişim sayısını azaltmak için Intel tarafından da artırıldı.

Ve görünüşe göre, Intel nihayet R-notasyonu kullanmaya başladı. Geriye dönük uyumluluk, AX, BX, ... 'un devam etmesini sağlar, ancak AX’in örneğin R0 ile eşanlamlı olduğuna bahse girerim.


Feragatname : Yukarıdaki, tarih hakkındaki görüşüm. İlk elden tarihin ilk kısımlarına tanıklık etmek için ortalıkta olmadığım için eksik kalacak. Yine de, bazılarına yararlı olacağını umuyorum.


1
6500 ailesinin, akümülatörü artırmak için özel bir talimat alması gerekmiyordu, çünkü bir anlık mod eki, kodun ek bir baytı işgal etmesine rağmen, bir INXya da aynı iki çevrimi aldı INY. Bu yonga için çok fazla montaj yazdım ve pratikte, ihtiyaç duyulan matematiğin dışında bu tür bir artış nadirdi.
Blrfl

@Blrfl Haklısınız: ADD 1çalışır, bu nedenle özel bir 'A' artışına ihtiyaç duyulmazdı. Ve ona ihtiyacım olduğunu hatırlamıyorum.
Sjoerd

1
X64'teki yazmaç sayısını artıran ve adlandıran Intel olmadığı, ancak x86'ya 64-bit uzantıların AMD tarafından oluşturulduğu için AMD'nin belirtilmesi gerekir . Intel'in 64 bit tasarım oldu Itanium onlar içinde kayıtları bir sürü (128 genel amaçlı tamsayı, artı diğerleri) koymak gerçi, o kadar iyi yapmadı.
8,

5

Bu sadece 'kayıt' anlamına gelir. Tarihsel nedenlerden dolayı.


Şu anda bir sicile atıfta bulunuyorsa, o kadar tarihsel değil, değil mi? Kayıtlar için diğer isimlerin (AX, EAX, vb.) Tarihsel nedenlerden ötürü daha fazla olduğunu söyleyebilirim. Ancak RAX'taki "R" aslında şu anda çok uygulanabilir.
Carl G,

1
(+1) meme: "Uzun süre açıklarsan, kısa açıklayabilirsin."
kullanıcı7813604
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.