Komut kümesi mimarisi: Revizyonlar arasındaki fark

[kontrol edilmiş revizyon][kontrol edilmiş revizyon]
İçerik silindi İçerik eklendi
Addbot (mesaj | katkılar)
k Bot: Migrating 30 interwiki links, now provided by Wikidata on d:q272683 (translate me)
Peykbot (mesaj | katkılar)
k düzen
13. satır:
Bir makine buyruğunun bir [[işlem kodu]] ve bir veya daha fazla işlenenden oluştuğunu biliyoruz. Buyruk kümesini kodlamak çok değişik yollarla yapılabilir. Mimariler; buyruk başına içerilen bit sayısından (genellikle 16,32 ve 64 bit), buyruk başına içerilen işlenen sayısından,buyruk türlerinden ve her birinin işleyebileceği verilerden dolayı birbirlerinden farklılık gösterirler.Daha ayrıntılı olarak mimariler birbirlerinden şu özelliklerden dolayı farklılık gösterirler;
 
* Merkezi işlem Birimi içinde işlenenleri saklayacak hafıza(depo)<br />
İşlenenler bellek dışında nerede saklanacaklar?<br />
Veriler yığın (stack) yapısı içinde veya yazmaç içinde saklanabilirler.
 
* Buyruk başına belirgin işlenen(operand) sayısı<br />
Tipik bir buyrukta kaç işlenen isimlendirilecek?,<br />
0, 1, 2, 3 en yaygın işlenen sayılarıdır.
 
* İşlenen konumu<br />
Herhangi bir AMB buyruk işleneni bellekte konumlanabilirmi? Yoksa bütün işlenenler MİB içerisindemi tutulacak?<br />
Buyruklar yazmaçtan-yazmaca,yazmaçtan-belleğe ya da bellekleten-belleğe gibi buyruk başına işlenenlerin kombinasyonu şeklinde sınıflandırılabilir.
 
* İşlemler (Operasyonlar)<br />
BKM(Buyruk Kümesi Mimarisi) ne gibi işlemleri destekleyecek?<br />
Ayrıca hangi buyruklar belleğe erişecek ve hangileri erişmeyecek?
 
* İşlenenlerin türü ve boyutu<br />
İşlenenlerin türü ve boyutu ne ve nasıl belirtilecekler?<br />
İşlenenler adresler,numaralar ve hatta karakterler olabilirler.
80. satır:
Taban Adresi + 1 = Bayt1<br />
Taban Adresi + 2 = Bayt2<br />
Taban Adresi + 3 = Bayt3<br />
 
Soldan anlamlı bir makinede ise şu şekilde dizilirler;<br />
86. satır:
Taban Adresi + 1 = Bayt2<br />
Taban Adresi + 2 = Bayt1<br />
Taban Adresi + 3 = Bayt0<br />
 
Bayt adreslenebilir bir makinede 32-bit onaltılı 12345678 değerinin 0 adresinde depolandığını varsayalım. Her bir rakam yarım bayt’a ihtiyaç duymaktadır, böylece bir bayt iki rakam tutabilir. Bu onaltılı değer aşağıdaki şekilde gösterildiği gibi hafızada depolanır (rakamsal hücreler hafızanın güncel içeriğini belirtmektedir).
102. satır:
 
=== MİB (Merkezi İşlem Birimi) İçerisinde Dahili Depolama Birimleri: Yığınlar (Stacks) ve Yazmaçlar (Registers) ===
Bir kez hafızadaki bayt düzeni belirlendiğinde donanım tasarımcısı CPU’nun veriyi nasıl depolayacağına dair bazı kararlar vermek zorundadır. Bu, en basit anlamda buyruk kümesi mimarisine karar vermektir. Üç seçenek vardır:
 
# ) Bir yığın tabanlı mimari
# ) Bir biriktirici tabanlı mimari
# ) Bir genel amaçlı yazmaç (GPR - general purpose register) mimarisi
 
Yığın mimarisinin komutlarını işletmek için bir yığın kullanır ve işlenenler yığının en üstüne aşağıdan yukarı doğru dizilirler. Yığın yapılı makineler iyi bir kod yoğunluğuna ve ifadelerin değerlendirilmesi için sade bir modele sahip olmalarına rağmen, istenilen bir yığına rastgele erişilemez, bu sebepten dolayı yığınlı yapılarda etkili kod oluşturulması zordur.
112. satır:
Bir işlenenin tamamı biriktiricinin içinde olan biriktirici mimarileri, makinenin karmaşıklığını en aza indirir ve çok kısa komutlara izin verir. Ancak biriktirici yalnız geçici depolama yaptığından dolayı hafıza trafiği (erişimi) oldukça yüksektir.
Genel amaçlı yazmaç kullanan mimariler, günümüzün makine mimarileri içerisinde en çok tercih edilen modelidir. Bu yazmaç kümeleri bellekten çok daha hızlıdır, derleyici tarafından kullanılması çok kolay, çok etkin ve çok verimlidir. Ayrıca son yıllarda donanım fiyatları önemli ölçüde düştü ve böylece en az maliyetle çok sayıda yazmaç eklenebilir oldu. Eğer bellek erişimi hızlı ise, yığın tabanlı tasarım iyi bir seçenek olabilir. Eğer bellek erişimi yavaşsa, yazmaçları kullanmak çok daha iyidir. Bu sebepten dolayı son 15 yılda çıkan pek çok bilgisayar sistemleri genel yazmaç tabanlıdır. Uzun buyruklarda tüm işlenenler yazmaçların sonuçları kullanılarak isimlendirilmelidir, bu sebeple daha uzun getirme, yakalama ve çözme zamanları ve döngüleri oluşur. (Kısa buruklar BKM tasarımcıları için çok önemli bir amaçtır.). Tasarımın BKM seçimi aşamasında tasarımcılar belirli bir ortamda en iyi hangi mimarinin çalışacağına karar vermelidirler ve vazgeçilecek (ödün verilecek) şeyleri dikkatle tetkik etmelidirler. (İyi tasarım fedakarlık gerektirir).
 
Genel amaçlı mimari, işlenenlerin bulundukları yerlere göre üçe ayrılabilir. Bellek-bellek mimarilerinde bellekte iki ya da üç işlenen birlikte bulunur. Böylece bir yazmaçta herhangi bir işlenene ihtiyaç duyulmadan buyruğun işlem yapmasına izin verilir. Yazmaç-bellek mimarileri en az bir işlenenin yazmaçta, bir işlenenin de bellekte olmasını gerektiren bir yapıya ihtiyaç duyar. Yükle-depola mimarileri veri üzerinde herhangi bir işlem yapılmadan önce verinin yazmaçlara gönderilmesini sağlar. Intel ve Motorola yazmaç-bellek mimarilerine örnektir; Digital Equipment'in VAX mimarisi bellek-bellek işlemlerine izin verir; MIPS, SPARC, PowerPC ve ALPHA yükle-depola makinelerine örneklerdir.
119. satır:
 
=== İşlenen Sayıları ve Buyruk Uzunluğu ===
Bir bilgisayar mimarisini tanımlamak için en bilindik yöntem her bir buyrukta yer alan en fazla işlenen sayısını ya da adresini belirlemektir. Bu tek başına buyruğun uzunluğuna doğrudan etki etmektedir. Güncel mimarilerdeki buyruklar iki şekilde biçimlendirilebilir:
 
* Sabit Uzunluk- Alanı boş yere israf eder, ancak buyruk-seviyesi boru hattı kullanıldığında hızlıdır ve daha iyi performans oluşur.
* Değişken Uzunluk- Şifre çözmesi daha karmaşıktır fakat depolama alanını en iyi şekilde kullanılır.
 
Çoğu zaman, gerçek hayatta uzlaşma, kolay görülebilen ve kod çözümü daha kolay olan bit kalıplarını sağlayan iki-üç buyruk uzunluğunu kullanmayı gerektirir. Buyruk uzunluğunu makinedeki sözcük uzunluğuyla karşılaştırmamak lazım. Eğer buyruk uzunluğu sözcük uzunluğuna eşitse,buyruklar ana bellekte saklandıklarında mükemmel bir şekilde hizalanırlar. Buyruklar, adreslemeden dolayı daima hizalanmalıdır. Bundan dolayı, bir sözcüğün iki katı, üç katı, yarısı ya da çeyreği büyüklüğündeki buyruklar boşa alan israf edebilir. Değişken uzunluktaki buyruklar aynı boyutta olmadıklarından hizalanmaları gerekir, bu da yine alan israfına yol açar.
En yaygın buyruk biçimleri sıfır, bir, iki ya da üç işlenene sahip olanlardır. Mantık ve aritmetik işlemleri genellikle iki işlenene sahiptir, ancak eğer biriktirici (accumulator) varsa işlemler yalnızca bir işlenenle yürütülebilir. Bu yaklaşımı üç işlenene genişletirsek son hedef üçüncü işlenen olacaktır. Ayrıca yığın yapısı kullanılarak sıfır işlenenli buyruklar oluşturulabilir. Aşağıdakiler en genel buyruk biçimleridir;
 
* Sadece İşlem kodu (adres yok)
* İşlem kodu + 1 Adres (genellikle bir bellek adresi)
* İşlem kodu + 2 Adres (genellikle iki yazmaç ya da bir yazmaç bir bellek adresi)
* İşlem kodu + 3 Adres (genellikle üç yazmaç ya da yazmaç ve belleğin bileşimi)
 
Örneğin MIPS mimarisinde aşağıdaki buyruk biçimleri kullanılır;
145. satır:
İki işlenene ihtiyaç duyulan işlemlerde, yığının en üstteki iki elemanı kullanılır. Örneğin, bir ADD komutu çalıştırırsak, MİB yığının en üstteki iki elemanını alır, ikisini de yığından atar ve yığının en üstüne toplama işleminin sonucunu yerleştirir. Çıkarma işlemi gibi değişmeli olmayan işlemlerde, en üstteki öğe bir altındaki öğeden çıkarılır,ikisi de yığından atılır ve yığının en üstüne çıkarma işleminin sonucu yerleştirilir.
Bu yığın organizasyonu uzun aritmetik ifadeler için çok etkili ve verimlidir(RPN).Diğer bir adı Postfix gösterimi olan bu gösterime göre işleç işlenenlerden sonra yer alır (infix gösteriminde işleç işlenenlerin arasında yer alır,prefix gösteriminde ise işleç işlenenlerden önce gelir.).
 
Örnek olarak;<br />
X + Y infix gösterimidir <br />
+ X Y prefix gösterimidir <br />
X Y + postfix gösterimidir <br />
 
Bütün aritmetik ifadelerin bu gösterimleri kullanarak yazılması mümkündür. Fakat, bir yazmaç yığını ile birleştirilmiş postfix gösterimi, aritmetik ifadelerin hesaplanmasında en etkili yoldur. Aslında bazı elektronik hesap makineleri kullanıcıdan öğeleri postfix gösteriminde girmesini ister. Bu hesap makinelerinde biraz alıştırma yapıldığında, içiçe dizilmiş birçok parantez içeren uzun ifadeleri, terimlerin nasıl gruplandığını bile düşünmeden,daha hızlı bir şekilde hesaplamak mümkündür.
156. satır:
(X + Y) x (W - Z) + 2 <br />
Denklemi RPN’de yazılırsa aşağıdaki gibi olur; <br />
XY + WZ - x2+ <br />
 
Dikkat edilecek olursa, RPN’de öncelikleri korumak amacıyla kullanılan parantezlere ihtiyaç duyulmaz.
163. satır:
Örnek;<br />
Aşağıdaki ifadeyi hesaplayalım,<br />
Z = (X x Y) + (W x U)<br />
 
Genelde, üç işlenene izin verildiğinde, en az bir işlenen yazmaç olur ve ilk işlenen genellikle hedef olur. Üç adresli buyrukları kullanırken, Z’nin hesaplanması için gereken kodu aşağıdaki gibi yazabiliriz;
169. satır:
Mult R1, X, Y <br />
Mult R2, W, U <br />
Add Z, R2, R1 <br />
 
Eğer iki adresli buyruklar kullanılıyorsa,bir adres genellikle bir yazmacı ifade eder (iki adresli buyruklar iki işlenenin de bellek adresi olmasına pek izin vermez). Diğer işlenen, bir yazmaç ya da bir bellek adresi olabilir. İki adresli buyruklar kullanırsak kodumuz aşağıdaki gibi olur;
190. satır:
Mult U <br />
Add Temp <br />
Store Z<br />
 
Buyruk başına izin verilen işlenen sayısı azaldı, fakat kodu çalıştırmak için gerekli olan buyruk sayısı arttı. Bu durum, mimari tasarımında tipik bir boşluk ya da zamandan ödün verme örneğidir. Daha kısa buyruklar oluşur,fakat programlar uzar.
220. satır:
* 2 adresli 14 buyruk
* 1 adresli 31 buyruk
* 0 adresli 16 buyruk
 
Bu buyruk kümesini 16 bitle şifreleyebilir miyiz? İşlem kodlarını genişletme işlemini kullandığımız sürece cevap “evet” olur. Şifreleme aşağıdaki gibi yapılır;<br />
237. satır:
 
== Buyruk türleri ==
Birçok bilgisayar buyruğu veri üzerinde yürütülür, ancak yürütülmeyen buyruklar da vardır. Bilgisayar üreticileri buyrukları aşağıdaki kategorilere ayırır; <br />
* Veri aktarımları
* Aritmetik işlemler
257. satır:
Örneğin belleğin bir konumundaki veri alınarak başka bir konumuna atılma işlemi için basit bir program yapılırsa;<br />
LDA $0200 ; A «— [0200]<br />
STA $2025 ; [2025] «— A<br />
 
Burada [0200] adres konumundaki veri (verinin değerinin ne olduğu önemli değil) biriktiriciye alınarak tekrar başka bir yere, [2025] adres konumuna gönderilmektedir. [2025] adresinde bulunan daha önceki veri yeni değer aktarılırken silinir,fakat [0200] adresindeki veri aynen kalır.
266. satır:
Burada komutun ortasındaki harf daima kaynak kaydedicisini, sondaki harf ise hedef kaydedicisini gösteririr. TXS'nin dışında diğer komutlar N ve Z bayraklarını etkiler.
Programcılar TXS komutunu program başlangıcında yığın işaretçisini(SP) hazırlamada kullanılırlar.SP yığındaki bir sonra kullanılabilecek bellek konumunu gösterir.
 
LDX #$FF ;Yığının dibini gösterecek veriyi hazırla<br />
TXS ;ve yığın işaretçisine aktar.<br />
 
=== Veri Aktarımları ===
282. satır:
0202 PHA ; A'yı yığına at<br />
0203 LDA#$67 ; A=67H<br />
0205 PHA ; A'yı yığına at<br />
 
=== Aritmetik İşlem Komutları ===
Aritmetik işlemler tamsayıları ve kayan nokta sayılarını kullanan komutlara sahiptir. Buyruk kümelerinde çeşitli veri boyutları olduğundan farklı aritmetik komutlar bulunur.Veri aktarım komutlarıyla,değişik adresleme biçimlerinde yazmaç ve bellek erişiminin çeşitli kombinasyonlarını sağlamaya yarayan farklı komutlar olabilir.
 
==== Toplama İşlemi ====
296. satır:
CLC ; C=0<br />
LDA#$25 ; [A]=25H<br />
ADC$40 ; [A] «— [A] + [0040] +C<br />
 
Yukarıdaki programda ilk satırda CLC bir önceki programdan kalan ve şu anki programa etki edebilecek eldelerden kurtulmak için C bayrağını temizlenir. Daha sonra A'ya 25H verisi yüklenir. Bir altındaki adımda A'daki veri [0040] no' lu bellek konumundaki veri ve elde toplanarak sonuç yine A'ya yazılıyor.
317. satır:
Bit işleme komutları, verilen bir veri sözcüğün içindeki bitleri veya bit gruplarını 1(set) veya 0(reset) yapmada kullanılır.Bunlar sola veya sağa aritmetik ve mantıksal kaydırma ve döndürme komutlarını içerir. Mantıksal kaydırma komutları, bitleri belirtilen miktarda sola ya da sağa kaydırırmada kullanılır (left shift and right shift).
Genellikle ikiyle çarpma ya da bölme işlemleri için kullanılan aritmetik kaydırma komutları en soldaki bit sayının işaretini gösterdiğinden bu biti kaydırma.Sağa doğru yapılan aritmetik kaydırmada, işaret biti yanındaki bite kopyalanır. Sola doğru yapılan aritmetik kaydırmada bitler sola kaydırılır, sağdan sıfırlar içeriye girerler,ancak işaret biti sabit kalır,hareket ettirilmez. Döndürme komutları kaydırılmış bitlere kaydırma yapan komutlardır. Örneğin, sola 1 bit döndürmede en soldaki bit dışarı kaydırılır ve en sağdaki bit haline getirmek için de döndürme yapılır.
 
=== Giriş/Çıkış Komutları ===
Giriş/Çıkış komutları, mimariden mimariye pekçokpek çok değişiklik gösterir.G/Ç’ı kontrol etmek için bazı temel düzenler kullanılır.Bunlar programlanmış G/Ç, kesinti sürümlü (interrupt-driven) G/Ç ve DMA aygıtlarıdır.
 
=== Denetim Aktarım Komutları ===
Kontrol komutları dallanmalardan, atlamalardan ve yordam çağırmalarından oluşur. Dallanmalar koşullu ya da koşulsuz olabilir. Atlama komutları dallanma komutlarına benzer.Dallanma komutlarının adres içeren bir şeklidir. Atlama komutları farklı durumları belirtmek için genellikle bellek adres konumunun bitlerini kullanır, çünkü işlenene ihtiyaç duymaz.Yordam çağırmaları dönüş adresini otomatik olarak saklayan özel dallanma komutlarıdır.Geri dönüş adresini kaydetmek için farklı makineler farklı uygulamalar kullanırlar.Bazı makineler adresi bellekte belirli bir yere kaydeder, bazıları bir yazmaca kaydeder, bazıları da adresi yığına bir veri gibi kaydeder.Yığınların farklı amaçlar için kullanılabildiğini daha önce de söylemiştik.Genellikle en çok kullanılan yöntem de yığına atmaktır (PUSH ve PULL komutlarıyla atılır ve alınır).
 
==== Şartsız Dallanma Komutu ====
Şartsız herhangi bir adrese gitme işlemini JUMP komutu gerçekleştirir. Eğer bu komutunun devamındaki komut veya komutlar işlenmeyecekse bu komut kullanılır. JUMP komutu, mutlak adresleme veya dolaylı adresleme modlarından birisini kullanır.
JUMP komutu işleneniyle birlikte bellekle üç baytlık yer tutar,mutlak adres kullandığında üç çevrim, dolaylı adresleme kullandığında ise beş çevrim tutar.Yerine göre ikisinden birisi tercih edilir.
 
==== Şartlı Dallanma Komutu ====
Şartlı dalmada gerekli şart sağlandığı anda program belirlenen hedefe sapar.Şartlı dalma komutlarını, dalma komutundan ayırt edebilmek için sapma adını aldı. Eğer şart sağlanmazsa program bir sonraki komuttan işlemeye devam eder. Şartlı dalma komutları aşağıdaki sıra ile çalışırlar;<br />
* MİB İşlem kodunu alıp getirir ve durumun ne olduğunu kontrol eder.
* MİB öne sürülen şarta bakar. Bu şartlar şunlardır;
** sonuç negatif mi?
** sonuç sıfıra eşit mi?
** elde (C) bayrağı 1 &nbsp;mi?
 
* Eğer koşulan şart sağlanırsa,program sayıcının içeriği o anki adresle yüklenir.
343. satır:
JUMP komutu kontrolü bellekte belirli bir adrese aktarır,sapma komutları kontrolü, komut işlendikten sonra bir sonraki komutun bulunduğu yerden ilerideki veya gerideki belirli bir bellek konumuna aktarır.Dalma komutu ile sapma komutu arasındaki diğer bir fark ise , sapma komutları karar verme komutlarıdır.
Sapma şartları mikroişlemci durum bayraklarından C (elde), N (negatif veya işaret), Z (sıfır) ve V (aritmetik taşma) bayraklarına göre gerçekleşir.
 
=== Özel Amaçlı Yazmaçlar ===
350. satır:
== Buyrukların Geçtiği Temel Aşamalar ==
 
Makine buyruklarını işleten ve diğer birimlerin faaliyetlerini düzenleyen işlem birimi genellikle Buyruk Kümesi Mimarisi ya da kısca işlemci olarak adlandırıldığını daha önce de belirtmiştik.Bu mimariye göre bir buyruğun işlenirken geçtiği belirli aşamalar vardır.Bunlar: dahili yapısını ve bir programın buyruklarını alıp getirme (fecthing), çözme (decoding) , işletme (execution),sonucun saklanması ve bir sonraki buyruğun yakalanması.
 
İşlemcilerin organizasyonu,son yıllarda teknolojide yaşanan gelişmeler ve diğer taraftan başarıma olan ihtiyaçtan dolayı oldukça gelişti.Yüksek başarımlı işlemcilerin geliştirilmesindeki yaygın bir yönteme göre çeşitli fonksiyonları yerine getiren birimler mümkün olduğunca paralel bir şekilde çalışmalıdır(Boru hattında olduğu gibi).Yüksek başarımlı işlemciler ardışık (pipelined) bir organizasyona ve yapıya sahiptir.Bir buyruğun işletilmesine önceki buyruğun işletilmesi bitmeden önce başlanır ve bir süre sonra her bir saat vuruşunda mükemmel bellek varsa bir buyruk içeriye alınır ve bir buyruğun işletilmesi sonuçlandırılır. Süper skalar işletim adı verilen bir başka yaklaşımda da aynı anda birçok sayıda buyruk getirilip işletilir.
 
Bir program işletmek için, işlemci birim zamanda bir buyruk getirir ve belirtilen işlemi uygular.Buyruklar, bir dallanma veya bir atlama buyruğuna rastlayana kadar ardışık bellek konumlarından getirilir.İşlemci,program sayacını kullanarak, getirilecek bir sonraki buyruğu içeren bellek konumunun adresini saklar. Bir buyruğu getirdikten sonra,program sayacının içeriği dizideki bir sonraki buyruğu gösterecek şekilde güncellenir. Bir dallanma buyruğu program sayacına farklı bir değer yükleyebilir.
 
İşlemcideki bir başka kilit yazmaç ise buyruk yazmacıdır (Instruction Register - IR). Her bir buyruğun 4 bayttan(1 sözcük) meydana geldiğini ve tek bellek sözcüğünde depolandığını varsayalım. Bir buyruğu işletebilmek için, işlemci aşağıda belirtilen adımları sırasıyla izler;
* Program sayacı tarafından gösterilen bellek konumunun içeriği getirilir.Bu bellek konumunun içeriği işletilecek bir buyruk olarak yorumlanır. Bu nedenle bu içerik buyruk yazmacına yüklenir. Bu durum sembolik olarak aşağıdaki gibi ifade edilir:
IR ← [[PC]]
 
* Belleğin bayt adreslenebilir olduğunu varsayarak, PC’nin içeriği 4 arttırılır.
PC ← [PC] + 4
 
* Buyruk yazmacındaki buyruk tarafından belirtilen faaliyetler yerine getirilir.
 
Eğer bir buyruk bir sözcükten fazla yer kaplıyorsa 1. ve 2. adımlar tüm buyruk getirilene kadar tekrarlanmalıdır. Bu iki adım genellikle getirme evresi,3. adım ise işletme evresi olarak adlandırılır.<br />
Bazı istisnai durumlarda, bir buyruğun aşağıdaki işlemleri belirli bir düzende 1 ya da daha fazla sayıda uygulaması gerekir;
 
* Bir işlemci yazmacından diğer bir yazmaca ya da AMB’ye 1 sözcük büyüklüğünde veri aktar.
* Bir aritmetik veya mantık işlemi uygula ve işlemin sonucunu işlemci yazmacına yaz.
* Verilen bir bellek konumunun içeriğini getir ve işlemci yazmacına yaz.
* Bir işlemci yazmacındaki 1 sözcük büyüklüğündeki veriyi verilen bir bellek konumuna yaz.
 
== Bazı Gerçek Dünya ISA Örnekleri ==