TL; DR;
"FS" / "GS" yazmacının amacı nedir?
Varsayılan veri segmentinin (DS) ötesindeki verilere erişmek için. Tıpkı ES gibi.
Uzun Okuma:
Bu nedenle, aşağıdaki kayıtların ve kullanımlarının ne olması gerektiğini biliyorum:
[...]
Neredeyse, ancak DS 'bazı' Veri Segmenti değil, varsayılan olanıdır. Tüm işlemler varsayılan olarak gerçekleşti mi (* 1). Bu, tüm varsayılan değişkenlerin bulunduğu - esasen data
ve bss
. Bir şekilde x86 kodunun oldukça kompakt olmasının bir nedeni de budur. En sık erişilen (artı kod ve yığın) tüm temel veriler 16 bitlik kısa mesafe içindedir.
ES, diğer her şeye (* 2), 64 KiB DS'nin ötesindeki her şeye erişmek için kullanılır. Bir kelime işlemcinin metni, bir hesap tablosunun hücreleri veya bir grafik programının resim verileri vb. Gibi. Çoğu zaman varsayıldığından farklı olarak, bu verilere çok fazla erişilemez, bu nedenle bir öneke ihtiyaç duymak, daha uzun adres alanları kullanmaktan daha az zarar verir.
Benzer şekilde, dize işlemlerini yaparken DS ve ES'nin yüklenmesi (ve yeniden yüklenmesi) gerekmesi yalnızca küçük bir rahatsızlıktır - bu, en azından zamanının en iyi karakter işleme komut setlerinden biri tarafından dengelenir.
Gerçekten acı veren, kullanıcı verilerinin 64 KiB'yi aşması ve işlemlerin başlatılması gerektiğidir. Bazı işlemler bir seferde tek bir veri öğesi üzerinde yapılırken (düşünün A=A*2
), çoğu iki ( A=A*B
) veya üç veri öğesi gerektirir ( A=B*C
). Bu öğeler farklı segmentlerde bulunuyorsa, ES işlem başına birkaç kez yeniden yüklenecek ve bu da biraz ek yük getirecektir.
Başlangıçta, 8 bitlik dünyadan (* 3) küçük programlarla ve eşit derecede küçük veri kümeleriyle, bu büyük bir mesele değildi, ancak kısa süre sonra büyük bir performans dar boğazına dönüştü ve daha da fazlası için gerçek bir baş belası haline geldi. programcılar (ve derleyiciler). 386 Intel ile nihayet iki segment daha ekleyerek rahatlama sağladı, böylece öğelerin hafızaya yayılmış olduğu tekli , ikili veya üçlü işlemler, ES'yi her zaman yeniden yüklemeden gerçekleşebilirdi.
Programlama (en azından montajda) ve derleyici tasarımı için bu oldukça büyük bir kazançtı. Tabii ki, daha da fazlası olabilirdi, ancak üç ile şişe boynu temelde gitmişti, bu yüzden aşırıya kaçmaya gerek yok.
Bilge bir şekilde adlandırmak gerekirse, F / G harfleri E'den sonraki alfabetik devamlardır. En azından CPU tasarımı açısından hiçbir şey ilişkili değildir.
* 1 - Dizi hedefi için ES kullanımı bir istisnadır, çünkü sadece iki segment kaydı gereklidir. Onlar olmasaydı çok yararlı olmazdı - veya her zaman bir segment önekine ihtiyaç duyarlardı. Şaşırtıcı özelliklerden birini öldürebilir, (tekrar etmeyen) dize komutlarının kullanılması, tek bayt kodlamaları nedeniyle aşırı performansla sonuçlanır.
* 2 - Dolayısıyla, geriye dönüp baktığımızda 'Diğer Her Şey Segmenti', 'Ekstra Segment'ten çok daha iyi bir adlandırma olurdu.
* 3 - 8086'nın yalnızca 8800 bitene kadar bir durdurma boşluğu önlemi olarak tasarlandığını ve esas olarak 8080/85 müşterilerini gemide tutmak için gömülü dünya için tasarlandığını unutmamak önemlidir .