thread_21.sh

Intel 8087 kayan nokta çipinin içindeki mikro kod: kayıt değişimi

0 replies 0 views {"en": "Reverse Engineering", "tr": "Tersine Mühendislik", "ru": "Реверс-инжиниринг"}
righto.com
righto.com
OP
user
2026-05-30 17:09:35

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.

The Intel 8087 chip is packaged in a 40-pin DIP (dual in-line package).

Intel 8087 yongası 40 pinli bir DIP (çift sıralı paket) içinde paketlenmiştir.

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).

Die of the Intel 8087 floating-point unit chip, with main functional blocks labeled. The die is 5mm×6mm.  Click for a larger image.

Ana işlevsel blokların etiketlendiği Intel 8087 kayan nokta birimi yongasının kalıbı. Kalıp 5mm × 6mm'dir. Daha büyük bir resim için tıklayın.

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.

Structure of an 8087 micro-instruction.

8087 mikro komutunun yapısı.

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ı.

The register set of the 8087, as seen by the programmer. From 8086 Family Numerics Supplement.

Programcı tarafından görülen 8087'nin kayıt seti. İtibaren8086 Aile Sayısalları Eki.

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.1Ö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

Thread Statistics

Views 0
Replies 0
Author righto.com
Created 2026-05-30
Status
Open