Intel 8087 kayan nokta çipinin içindeki mikro kod: kayıt değişimi
1980 yılında Intel, kayan nokta işlemlerini gerçekleştiren bir ortak işlemci olan 8087 kayan nokta çipini piyasaya sürdü. 100 kata kadar daha hızlı. Bu çip son derece etkiliydi ve bugün çoğu işlemci 8087'nin getirdiği kayan nokta standardını kullanıyor.
8087, karekökler, teğetler ve üstel sayılar gibi fonksiyonları doğru bir şekilde hesaplamak için karmaşık algoritmalar kullanır.
Bu algoritmalar çipin içine mikro kod adı verilen düşük seviyeli kodla uygulanır.
Bu mikro kodun tersine mühendisliğini yapan Opcode Collective adlı bir grubun parçasıyım.
Bu yazıda 8087'nin talimatlarından birinin mikro koduna yakından bakacağım.FXCH—ve mikro kodun nasıl çalıştığını açıklayın.
FXCH(Kayan Nokta Değişimi) talimatı iki kayan nokta kaydını değiştirir. Bu talimatın önemsiz olmasını bekleyebilirsiniz,
ama beklediğinizden daha fazlası oluyor; mikro kod, değişim talimatını uygulamak için 14 mikro talimat kullanır.
Mikro kodu keşfetmek için 8087 çipini açtım ve mikroskopla yüksek çözünürlüklü bir görüntü oluşturdum. Büyük mikro kod ROM, çipi kontrol eden mikro talimatları barındıran merkezi bir konuma sahiptir. Soldaki mikro kod motoru, mikro kodun içinden geçerek atlamaları ve alt program çağrılarını yönetir. Çipin alt yarısı kayan nokta hesaplamalarını gerçekleştiren devre olan "veri yolu"dur; için 16 bitlik bir veri yoluna bölünmüştür. sayının üssü ve sayının kesirli kısmı için 64 bitlik bir veri yolu (aynı zamanda anlamlı olarak da bilinir).
Bu gönderi, kırmızıyla vurgulanan geçici kayıtlara ve yığın kayıtlarına odaklanmaktadır. Çipin iki geçici kaydı ve her biri bir sayının üssünü ve kesirini tutan sekiz yığın kaydı vardır. Her kayıtta ayrıca kayıttaki değerin türünü etiketleyen iki etiket biti bulunur. yığın kontrol devresisağ tarafta yığını yönetir, değerler yığına aktarılırken veya yığından çıkarılırken yığının en üst konumunu takip etmek.
8087'nin mikro kodu
Arctan gibi bir 8087 talimatını yürütmek, sonucu hesaplamak için yüzlerce dahili adım gerektirir. Bu adımlar, algoritmanın her adımını belirten mikro talimatlarla mikro kodda uygulanır. (İki düzeydeki talimatları aklınızda bulundurun: programcı tarafından kullanılan montaj dili talimatları ve Çipin içindeki belgelenmemiş düşük seviyeli mikro talimatlar.) Mikrokod ROM, 8087'nin talimat setini uygulayan 1648 mikro talimat içerir. Her bir mikro talimat 16 bit uzunluğundadır ve verileri çip içinde taşımak, iki değer eklemek veya gibi basit bir işlemi gerçekleştirir.değişenveri. Mikro talimatlara tersine mühendislik uygulamak ve mikro kodu tam olarak anlamak için Opcode Collective ile birlikte çalışıyorum (link).
8087'nin mikro talimatları, birçok köşe durumu ve özel işlevler nedeniyle karmaşıktır, ancak basitleştirilmiş bir genel bakış sunacağım. Her mikro talimat aşağıda gösterildiği gibi 16 bitten oluşur. İlk üç bit, geri kalan bitlerin anlamını kontrol eden mikro talimatın türünü belirtir. İlk tür, verileri bir dahili kayıttan diğerine aktaran bir aktarım işlemini belirtir. İki alan, verilerin kaynağını ve hedefini belirtir. Belirtilmemiş üç bit, çeşitli özel durumlar için kullanılır. Sonraki, bir değeri sola veya sağa kaydırmak için namlu değiştiriciyi kullanan bir kaydırma işlemidir. Üçüncü tür mikro talimat, toplayıcı/çıkarıcıyı kullanır. Çarpma veya bölme için bir döngüde de kullanılabilir. Dördüncüsü, toplayıcıyı yapılandıran, yuvarlama modlarını ayarlayan vb. çeşitli aritmetik kontrol mikro talimatlarıdır. Uzak atlama ve uzak çağrı mikro talimatları, sabit bir listedeki hedef mikro adrese bir atlama veya alt program çağrısı gerçekleştirir. Koşul alanı, çok sayıda koşula bağlı olarak koşullu atlamalara/çağrılara izin verir.koşullar, son bit ise koşulu tersine çevirir. Yerel atlama, yakındaki bir mikro talimata koşullu atlamaya izin verir. Son olarak, çeşitli mikro talimatlar, bir alt programdan geri dönmeye veya bir istisnayı yükseltmeye kadar uzanır. mikrokod yürütmeyi sonlandırmak.
Değerler 8087 yongasının içinde nasıl saklanır?
8087 çeşitli veri türlerini destekler: çeşitli boyutlarda kayan noktalı sayılar, tam sayılar ve ikili kodlu ondalık sayı. Ancak dahili olarak her şey 80 bitlik kayan noktalı sayı olarak depolanır. Bir sayının üç bölümü vardır: 64 bitlik bir anlamlılık (kesirli kısım), 15 bitlik bir üs ve bir işaret biti. Çipin iki ayrı veri yolu vardır: biri anlamlılık için, diğeri ise üs ve işaret için.
Çipin, hesaplamalar sırasında sayıları saklamak için sekiz kaydı vardır; en üstteki kayıtlar aşağıdaki şemada yer almaktadır.
Ancak kayıtlar alışılmadık bir şekilde düzenlenmiştir: yığın halinde,
sayılar yığına itildi ve yığından fırladı.
Örneğin 3 numaralı kayda erişmek yerine, yığının en üstünde belirtilen üçüncü kayda erişebilirsiniz.ST(3); değerler itildiğinde veya çıkarıldığında,ST(3)değişiklikler.
Yığın tabanlı mimarinin amacı, talimat setini geliştirmek, derleyici tasarımını basitleştirmek ve işlev çağrılarını daha verimli hale getirmekti, ancak umulduğu kadar işe yaramadı.
Birçok 8087 talimatı yığının en üstünde yer alır.
Örneğin, karekök komutu yığının en üstündeki değeri kareköküyle değiştirir.
Peki ya yığının ortasındaki bir değerin karekökünü almak isterseniz?
Çözüm şu:FXCHöğretim, bu makalenin odak noktası.
Bu komut, yığının tepesindeki değeri belirli bir yığın konumuyla değiştirir ve aşağıdakileri sağlar:
yığının içindeki değerlere erişim.
8087'nin bir özelliği daha bu tartışma için önemlidir: kayıt yığınındaki her değerin, onu geçerli, özel, sıfır veya boş olarak etiketleyen ilişkili bir "etiket" değeri vardır. "Normal" bir kayan nokta değeri şu şekilde etiketlenir:geçerli. Kayan nokta değeri sonsuzsa, Sayı Değilse veya normalleştirilmemiş bir değerse, daha sonra şu şekilde etiketlenir:özel. Sıfır değeri şu şekilde etiketlenir:zero. Son olarak, eğer bir kayıt boşsa (örneğin değeri yığından çıkarılmışsa), kayıt şu şekilde etiketlenir:boş. 8087, performansı optimize etmek ve hataları tespit etmek için etiketleri kullanır.Örneğin, bir programcı yığından çok fazla değer çıkarırsa ve boş olarak etiketlenmiş bir yığın kaydını okumaya çalışırsa, 8087 bir "geçersiz işlem" istisnası oluşturur.
Sekiz yığın kaydı programcı tarafından görülebilir, ancak 8087'nin dahili olarak kullandığı geçici kayıtlar da vardır.
Bu geçici kayıtlardan ikisi bu makale için önemlidir:tmpA and tmpB.
Yığın kayıtları gibi, her geçici kayıt da 80 bitlik bir kayıttır.
iki etiket biti ile.
The FXCHmikro kod
Bu bölümde mikro kodun nasıl yazıldığını anlatacağım.FXCHdeğişim talimatı çalışır.
Bu komut, yığının en üstündeki yazmacı, yığında belirli bir konumdaki yazmaçla değiştirir.
Kayıtlardan herhangi biri boşsa, talimat bir "geçersiz işlem" istisnası oluşturacak ve eksik değer(ler)i "Sayı Değil" (NaN) özel değeriyle değiştirecektir.
Talimatın 14 mikro talimattan oluşan mikro kodu aşağıdadır.2İlk mikro talimat, kaynağın yığın değerinin en üstünde olduğu bir aktarımdırST(0)ve varış noktası
geçici A kaydı.
Kaynak belirtimi, 64 anlamlının kesir veriyoluna (16 bitlik) yerleştirilmesine neden olur.
üs veriyoluna yerleştirilecek üs ve işaret ve etiket devresine gönderilecek iki etiket biti.
HedeftmpAveri yolu değerlerinin geçici kayıt defterinde saklanmasına neden olur.
Böylece mikro talimattaki bitler istenilen aktarımın gerçekleşmesine neden olur.
Üçüncü mikro talimat benzerdir ancak yığının içinde bir kayıt kullanır.ST(i), makine talimatında belirtilen indeksle.
FXCH giriş noktası: #0200 ST(0) -> tmpA yığının üst kısmını oku #0201 nop Bir döngü bekle #0202 ST(i) -> tmpB Belirtilen yığın kaydını oku #0203 if !(tmpA or tmpB empty) jmp #0210 Her iki kayıt da mevcutsa atla #0204 set invalid exception Geçersiz bir istisna oluştur #0205 if (unmasked) jmp #0213 Kesilirse bitir #0206 if !(tmpA empty) jmp #0208 TmpA'nın boş olup olmadığını kontrol edin #0207 NaN -> tmpA Eğer öyleyse, NaN'yi tmpA'ya taşıyın #0208 if !(tmpB empty) jmp #0210 TmpB'nin boş olup olmadığını kontrol edin #0209 NaN -> tmpB Eğer öyleyse, NaN'yi tmpB'ye taşıyın Mutlu yol ve hata yolu burada devam ediyor: #0210 tmpB -> ST(0) TmpB'yi yığının en üstüne kaydedin #0211 nop Bir döngü bekle #0212 tmpA -> ST(i) TmpA'yı belirtilen yığın kaydına kaydet #0213 RNI Rutinin sonu: Sonraki Talimatı Çalıştır #0214 nop Kullanılmayan #0215 nop Kullanılmayan #0216 nop Kullanılmayan
Daha sonra, mikro adresteki göreceli sıçrama#0203farklı bir mikro talimat türünü göstermektedir: koşullu atlama.
Mikro talimat, bu durumda, geçici kayıtlardan herhangi birinin boş olup olmadığını test eden bir koşulu belirtir.
(Yani donanım, geçici kayıtlarla ilişkili etiket bitlerini test ederek her ikisinin de "boş" etiket olup olmadığını kontrol eder.)
Mikro talimat, durumu tersine çevirecek bir bit ayarına sahiptir.
Son olarak, mikro talimatın +6 ofseti vardır ve bu da atlama hedefini sağlar#0210.
Tam bir mikro adresin belirtilmesine göre göreceli bir uzaklığın avantajı, uzaklığın yalnızca altı bit gerektirmesidir.
(Koşulların nasıl değerlendirildiği hakkında daha fazla bilgi için makaleme bakın.Intel 8087 kayan nokta çipinin mikro kodundaki koşullar.)
Kayıtlardan herhangi biri boşsa, sonraki mikro talimat "geçersiz" bir istisna oluşturur. Bir sonraki bölümde açıklayacağım gibi, 8087'yi bir istisna halinde kesme oluşturacak veya işleme devam edecek şekilde programlayabilirsiniz. Bir sonraki talimat, istisnanın "maskesinin kaldırılıp kaldırılmadığını" test eden koşullu bir atlamadır. kesinti oluşturuldu. Bu durumda, ana 8086 işlemci kesmeyi yönetirken mikro kod sona erer.
Kesintinin maskelendiğini varsayarsak, mikro kod artık boş değerleri özel Sayı Değil değeriyle değiştiriyor, ilk önce kontrol ediliyortmpAve daha sonratmpB.
KaynakNaNdevrenin üst iki bit hariç üs veriyolunu tüm 1'lere ve kesir veriyolunu tüm 0'lara çekmesine neden olur.
Bu özel bit modeli bir Sayı Değil'i temsil eder.3
Mikro adreste#0210, boş kayıt yolu ve normal yol, geçici kayıtları yığın kayıtlarında saklamak için birleşir.
Gerçek değişim işleminin gerçekleştiği yer burasıdır, çünkütmpA and tmpBkarşı yığın konumlarına yazılır
nerede okundular.
Nihayet,RNI(Sonraki Talimatı Çalıştır) mikrokod rutininin sonunu belirtir. Bu mikrokodu durdurur
motoru çalıştırır ve 8087'yi bir sonraki talimata hazır hale getirir.
The nop(işlem yok) mikro kod talimatları ilginçtir. Her yığın okuma veya yazma çiftinin birnoportada muhtemelen
kayıtlardaki zamanlama kısıtlamaları nedeniyle.
Mikrokod rutininin sonunda üç tane varnopBir sonraki mikrokod rutini başlamadan önce talimatlar.
Bu talimatlar mikro kodda boşa harcanmış alan gibi görünüyor; belkiFXCHmikrokod şu şekilde kısaltılmıştır:
Geliştirme sırasında üç kelime bu boşluğa neden oluyor.
İstisnalar
8087, çeşitli sorunları çözebilecek karmaşık bir istisna sistemine sahiptir. İstisnalar altı kategoriye ayrılır: geçersiz işlem, normalleştirilmemiş işlem, sıfıra bölme, taşma, yetersiz akış veya hassasiyet. Örneğin geçersiz bir işlem gerçekleşirse...
⚠️ Bu konu righto.com botu tarafindan otomatik olarak ice aktarilmistir.
🔗 Kaynak Baglantisi: http://www.righto.com/2026/05/microcode-inside-intel-8087-floating.html



