Komut kümesi

Bilgisayar mimarisi, Donanım Sistemi Mimarisi (HSA) ve Buyruk Kümesi Mimarisi (ISA) başlıkları altında iki farklı yaklaşımla tanımlanmaktadır.

Donanım Sistemi Mimarisi donanım aygıtlarının (G/Ç, Bellek, MİB v.s.) bağlı olduğu alt sistemi oluştutur. Buyruk Kümesi Mimarisi ise bu elemanlara yön verecek programlar yazılırken kabul edilecek öngörülerdir. Dolayısıyla Buyruk Kümesi Mimarisi (ISA) yazılım ile donanım arasında iş gören bir birimdir.

Merkezî işlem birimine yön verecek program bâzı adımlardan oluşur ve her adımda, MİB’ne yapması gereken işlem ve yapacağı işlemin hangi büyüklükler üzerinde olacağı belirtilmektedir. MİB’nin her bir program adımında yapması gereken işlemleri belirtmek amaçlı kullanılan açıklamaya buyruk denilir. Buyruk içinde yapılacak işlemi ve adresleme yöntemini belirten ise komuttur. İşlenen, üzerinde işlem yapılacak büyüklüğü ya da büyüklüğün yerini (bellek gözünü) belirtir.

Yüksek seviye dilleri bilgisayar mimarisinden bağımsızdır. Bu diller derleyici tarafından mimariye bağımlı olan makine diline çevrilir. Bir diğer çevirici (assembler) bu çevrilen makine dili buyruklarını işlenebilir ikili kodlara çevirir. Buyruk Kümesi Mimarisi (BKM) işlemcinin programcıya ve derleme yapan kişiye görünen yüzüdür. Yüksek seviye dilleri ise mimarinin detaylarını programcıdan saklar.

Buyruk yapıları

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;

İşlenenler bellek dışında nerede saklanacaklar?
Veriler yığın (stack) yapısı içinde veya yazmaç içinde saklanabilirler.

Tipik bir buyrukta kaç işlenen isimlendirilecek?, 0, 1, 2, 3 en yaygın işlenen sayılarıdır.

Herhangi bir AMB buyruk işleneni bellekte konumlanabilirmi? Yoksa bütün işlenenler MİB içerisindemi tutulacak?
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.

BKM(Buyruk Kümesi Mimarisi) ne gibi işlemleri destekleyecek?
Ayrıca hangi buyruklar belleğe erişecek ve hangileri erişmeyecek?

İşlenenlerin türü ve boyutu ne ve nasıl belirtilecekler?
İşlenenler adresler, numaralar ve hatta karakterler olabilirler.

Bütün bunların içerisinde en önemli farklılık MİB içerisinde işlenenleri saklayacak ara hafıza birimleridir. (Bu hafıza elemanları ileride detaylı olarak anlatılacaktır.)

Buyruklar; etiket alanı, işlem kodu alanı, işlenen alanı ve açıklama alanından oluşur. Bunlara Kaynak Program Alanları denir.

Etiket alanı bir sayısal değere veya bir bellek alanına karşılık gelir. Yazılması isteğe bağlıdır. Herhangi bir BRANCH, JUMP veya CALL komutunun altyordama dalış adresi olabilirler. İlk harfi kesinlikle bir harf ile başlar ve en fazla 6 karakter uzunluğunda olabilir. Etiketlerin kullanılma sebepleri;

İşlem kodu alanında mnemonic (hatırlatıcı) harflerle yazılan yapılacak işin komutları bulunur.

Mesela LoaD Accumulator with operand komutunu LDA, Branch on Carry Set komutunu BCS halinde hatırlatıcı olarak buyruğumuza koyuyoruz.

İşlenen alanı işlenene gerek duyan buyrukların veri veya adres tanımladıkları yerdir. İşlenenin başına veya sonuna konulan işaretlerden ne tür bir bilgi olduğu anlaşılır. Aşağıdaki tabloda bu işaretler anlamlarıyla birlikte gösterilmiştir.

Tablo: adres ve veri önünde-sonunda kullanılan işaretler ve anlamları

Açıklama alanı programcı tarafından bir başkası tarafından programın izlenmesi veya yürütülmesi maksadıyla konulmuştur. İsteğe bağlıdır. Program satırlarında buyrukların ne yaptığını anlatmak için kullanılır. Derleyici tarafından dikkate alınmaz.

Buyruk kümeleri için tasarım kararları

Bilgisayar mimarileri tasarım aşamasında oldukları zaman öncelikli olarak buyruk kümesi formatı belirlenmelidir. Bu formatı seçmek genellikle oldukça zordur çünkü buyruk kümesi mimariyle uyuşmalıdır ve mimari, eğer iyi tasarlanmışsa, yıllarca ömrünü sürdürebilmelidir. Tasarım aşamasında yapılan kararlar uzun süreli dallanmalara sahiptir.

Buyruk kümesi mimarisi bâzı değişik faktörlere göre ölçülür. Bunlar: (1) bir program için gereken alan; (2) bir buyruğu yürütmek için gereken çözümleme sayısı cinsinden buyruk kümesinin karışıklığı ve buyruk tarafından yürütülen görevlerin, işlerin karışıklığı; (3)buyrukların uzunlukları; (4) toplam buyruk sayısı. Bir buyruk kümesi tasarlanırken göz önünde bulundurulması gerekenler ise;

Küçüğü anlamlı ve büyüğü anlamlı

Bilgisayarın ve bilgisayar mimarisinin çok baytlı (katmanlı bayt) verileri nasıl sıralayacağıyla ilgili bir kavramdır. Soldan anlamlılık ve sağdan anlamlılık da denilmektedir. Bugünkü çoğu mimariler bayt-adreslenebilir olduklarından çok sayıda baytın bellekte nasıl sıralanacağıyla ilgili bir standarda sahip olmalılar. Eğer sıralanmış bir sözcükte en büyük baytın adresi sözcük adresi ise bu sıralamaya soldan anlamlı (big endian) denir. Eğer en küçük baytın adresi sözcük adresine eşitse bu sıralanmaya sağdan anlamlı (little endian) denir. UNIX makinelerinin çoğu soldan anlamlıdır (ayrıca IBM 360/370, Motorola 68k, MIPS, Sparc, HP PA da soldan anlamlıdır). PC lerin çoğu ise sağdan anlamlıdır. (ayrıca Intel 80x86, DEC Vax, DEC Alpha da sağdan anlamlıdır). İşlemci üreticileri de bu konuda iki gruba ayrılır. Örneği Motorola devamlı soldan anlamlılığı kullanırken İntel sağdan anlamlılığı kullanlır (Bâzı işlemciler ise hem soldan anlamlılığı hem de sağdan anlamlılığı birlikte kullanır).

Mesela 4 baytlık bir tamsayı düşünelim;
Bayt 3 Bayt2 Bayt1 Bayt0

Sağdan anlamlı bir makinede bu baytlar şu şekilde sıralanırlar;
Taban Adresi + 0 = Bayt0
Taban Adresi + 1 = Bayt1
Taban Adresi + 2 = Bayt2
Taban Adresi + 3 = Bayt3

Soldan anlamlı bir makinede ise şu şekilde dizilirler;
Taban Adresi + 0 = Bayt3
Taban Adresi + 1 = Bayt2
Taban Adresi + 2 = Bayt1
Taban Adresi + 3 = Bayt0

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

Şekil : 12345678 onaltılı değerinin küçüğü başta ve büyüğü başta şeklinde depolanması

İki metodunda avantajları ve dezavantajları vardır, fakat birini diğerinden daha iyi olması da gerekmez. Soldan anlamlı (big endian) insanlara alışıldık gelir, bu yüzden özellikle yığınları okuması daha kolaydır. Yüksek seviyedeki baytın önce gelmesi sebebiyle ofset sıfırdaki bayta bakarak her zaman sayının pozitif veya negatif olduğu bulunabilir (sağdan anlamlıda işareti belirlemek için sayının uzunluğu bilinmelidir ve işaret bilgisini içeren bayt bulunmalıdır). Soldan anlamlı makineler tamsayıları ve dizileri aynı şekilde sıralar ve dizi işlemlerinde daha hızlıdır. Çoğu bit eşli grafikler “en anlamlı bit soldaki” ilkesine göre eşlenmiştir. Bu sağdan anlamlı makineler için bir performans kısıtlaması getirir çünkü bir baytdan daha büyük grafik elemanlarıyla çalışırken sürekli baytların sırasını ters çevirmek zorundadır.

Ancak soldan anlamlılığın dezavantajları da vardır. 32 bit tamsayı adresinden 16 bit tamsayı adresine çeviride toplama yapmak için sağdan anlamlı bir makine gereklidir. Yüksek kesinlikte aritmetik işlemler sağdan anlamlılık kullanarak daha kolay ve hızlıdır. Soldan anlamlılığı kullanan çoğu mimarî sözcüklere adreslenemeyen alanlara sözcüklerin yazılmasına izin vermez (örneğin eğer sözcük 2 veya 4 baytsa adres her zaman çift sayı olmak zorundadır). Bu boşluk israfına sebep olur. Sağdan anlamlı mimariler, intel gibi, tek sayılı adreslerin okunup yazılmasına izin verir, bu yüzden bu makineler üzerinde programlama daha kolay olur.

Bilgisayar ağları soldan anlamlıdır. Sağdan anlamlı bilgisayarlar ağ üzerinden tamsayıları geçirecekleri zaman bunları ağ bayt sıralamasına çevirmek zorundadırlar. Aynı şekilde, tam sayıları alacakları zaman ise kendi ifadelerine çevirmek zorundadırlar.

Yazılım uygulamaları açısından soldan ve sağdan anlamlılık son derece önemlidir. Bir dosyadan veri okuyacak veya veri yazacak olan herhangi bir program makinenin bayt sıralamasına göre hareket etmelidir. Soldan anlamlı bir makinede sağdan anlamlılığı kullanan bir programı açmak için öncelikli olarak bayt sıralaması tersine çevrilmelidir. Mesela Adobe Photoshop, JPEG, MacPaint ve Sun raster dosyaları soldan anlamlı, GIF, PC Paint brush, RTF (Mikrosoft tarafından) sağdan anlamlıdırlar. Microsoft WAV ve AVI dosyaları, TIFF dosyaları, XWD ise her iki sıralamayı destekler.

MİB (Merkezî İş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 bâzı kararlar vermek zorundadır. Bu, en basit anlamda buyruk kümesi mimarisine karar vermektir. Üç seçenek vardır:

  1. ) Bir yığın tabanlı mimari
  2. ) Bir biriktirici tabanlı mimari
  3. ) 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.

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 (taviz verilecek) şeyleri dikkatle tetkik etmelidirler. (İyi tasarım fedakârlı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.

Günümüzde birçok mimarî GPR tabanlıdır. Şimdi GPR mimarilerini ikiye bölen ana buyruk kümesi karakteristiklerini inceleyelim. Bunlar adresleme biçimleri ve işlenenlerin sayıları olarak iki grupta incelenirler.

İş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:

Ç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;

Mesela MIPS mimarisinde aşağıdaki buyruk biçimleri kullanılır;

Bütün mimariler buyruk başına işlenen sayısında izin verilen bir sınıra sahiptir. Sıfır, bir, iki ve üç işlenenli buyrukların çok yaygın olduğunu söylemiştik. Bir, iki ve üç işlenenli buyrukları anlamak kolaydır, ancak tamamıyla sıfır işlenenli buyruklar üzerine yapılmış bir buyruk kümesi mimarisi bir hayli karmaşıktır.

Toplama gibi, mantık olarak bir ya da iki işlenene ihtiyaç duyan işlemlerin yapılabilmesi için işleneni olmayan makine buyrukları yığın kullanmaya ihtiyaç duyarlar. Yığın tabanlı mimarî genel amaçlı yazmaçları kullanmak yerine işlenenleri yığının en üstünde saklar ve en üstteki ögeye merkezî işlem biriminin ulaşmasını sağlar. (Makine mimarilerindeki en önemli veri yapılarından biri yığındır. Yığın yapısı karmaşık hesaplamalar sırasında ara değerleri verimli bir şekilde saklar, yordam çağırıldığı anda parametrelerin geçişini verimli bir şekilde sağlar, bununla birlikte yerel blok yapısının korunmasını da sağlar, değişkenlerin ve altyordamların kapsamlarını belirler.)

Yığın tabanlı mimarilerde, birçok buyruk yalnızca işlem kodlarından oluşur. Bununla birlikte sadece bir işleneni olan özel buyruklar da vardır (yığına eleman ekleyen veya yığından eleman çıkaran tipi buyruklar). Yığın mimarileri, her biri bir işlenene sahip olan push ve pop buyruklarına ihtiyaç duyarlar. Push X buyruğu, X bellek konumundaki veri değerini yığının üstüne yerleştirir. Pop X buyruğu, yığının en üstteki ögesini siler ve X bellek konumuna yazar. Belleğe erişme izni sadece bâzı buyruklara verilir; diğer bütün buyruklar yürütme esnasında herhangi bir işlenen için yığını kullanmak zorundadır.

İki işlenene ihtiyaç duyulan işlemlerde, yığının en üstteki iki elemanı kullanılır. Mesela 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 öge bir altındaki ögeden çı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; X + Y infix gösterimidir + X Y prefix gösterimidir X Y + postfix gösterimidir

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 bâzı elektronik hesap makineleri kullanıcıdan ögeleri 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.

(X + Y) x (W - Z) + 2

Denklemi RPN’de yazılırsa aşağıdaki gibi olur

XY + WZ - x2+

Dikkat edilecek olursa, RPN’de öncelikleri korumak amacıyla kullanılan parantezlere ihtiyaç duyulmaz.

Sıfır, bir, iki ve üç işlenen kavramlarıyla ilgili bir örnek verelim. Her bir kavramı kullanarak, bir aritmetik hesap yapan basit bir program yazalım.

Örnek

Aşağıdaki ifadeyi hesaplayalım;

Z = (X x Y) + (W x U)

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;

Mult R1, X, Y Mult R2, W, U Add Z, R2, R1

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;

Load R1, X Mult R1, Y Load R2, W Mult R2, U Add R1, R2 Store Z, R1

İlk işlenenin hedef mi yoksa kaynak mı olduğunu bilmek önemlidir, burada hedef olduğunu öngörüyoruz. (Bu noktada, Intel çevirici dili ile Motorola çevirici dili arasında geçiş yapmak zorunda kalan programcıların kafası karışabilir. Çünkü Intel çeviricisi ilk işleneni hedef alır, Motorola çeviricisi ise ilk işleneni kaynak alır.)

Tek adresli buyruklar kullanıldığında, bir yazmaç (genellikle biriktirici ) buyruğun sonucu için hedef olarak gösterilir. Z’nin hesaplanmasındaki kod aşağıdaki gibi olur;

Load X Mult Y Store Temp Load W Mult U Add Temp Store Z

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, mimarî tasarımında tipik bir boşluk ya da zamandan taviz verme örneğidir. Daha kısa buyruklar oluşur, fakat programlar uzar.

Sıfır adresli buyruklara sahip olan yığın tabanlı bir makinede bu programın ne yaptığını araştıralım şimdide. Yığın tabanlı mimariler Add, Subt, Mult veya Divide komutları için işlenen kullanmazlar. Bir yığına ve bu yığında pop ve push işlemlerine ihtiyaç duyulur. Yığına erişim gerçekleştiren işlemler, işlenenin yığına eklendiğini ya da yığından çıkarıldığını belirten bir adres alanına sahip olmalıdırlar (diğer bütün işlemler sıfır adreslidir). Push komutu işleneni yığının en üstüne iter. Pop komutu yığının en üstündeki elemanı yakalar ve işlenene yerleştirir. Bu mimari, Z’yi hesaplayacak olan programın çok uzun olmasına sebep olur. Aritmetik işlemlerin yığının en tepesindeki iki işleneni kullandığını, onları yığından çıkardığını ve daha sonra işlemin sonucunu yığının en tepesine eklediğini öngörelim, kodumuz aşağıdaki gibi oluşur;

Push X Push Y Mult Push W Push U Mult
Add Store Z

Buyruğun uzunluğu, işlem kodunun uzunluğundan ve izin verilen işlenen sayısından etkilendiğni yukarıda vurguladık. Eğer işlem kodunun uzunluğu sabit ise, çözme işlemi çok daha kolay olur. Fakat geriye dönük uyumluluk ve esneklik sağlayabilmek için, işlem kodunun uzunluğu değişken olabilir. Değişken uzunluktaki işlem kodlarında, değişken uzunluktaki buyruklarda görülen problemlere benzer sorunlar söz konusu olabilir. Birçok tasarımcı işlem kodlarını genişletme konusunda uzlaşmaya varmıştır.

İşlem Kodlarını Genişletme

İşlem kodlarını genişletme, işlem kodlarının geniş bir kümesini ve kısa işlem kodları, dolayısıyla kısa buyrukları elde etme amacıyla ortaya çıkmıştır. Amacı bâzı işlem kodlarını kısaltmak, ancak ihtiyaç olduğunda uzun işlem kodları da sağlamaktır. İşlem kodu kısa olduğunda, bitlerden birçoğu işlenenleri tutar (buyruk başına iki ya da üç işlenen bulunabilirdi). İşlenenler için alana ihtiyaç duyulmadığında (Halt gibi bir işlem sırasında ya da makine bir yığın kullandığında), tüm bitler işlem kodu için ayrılabilir, bu durum birçok benzersiz buyruğa izin verir. Az işleneni olan uzun işlem kodları olduğu gibi çok işleneni olan kısa işlem kodları da mevcuttur.

16-bit buyruklara ve 16 yazmaca sahip olan bir makine düşünelim. Bu kez basit bir ya da iki biriktirici yerine bir yazmaç kümesi bulunur, benzersiz bir yazmaç tanımlamak için 4 bit kullanırız. Her biri 3 yazmaç işlenenine sahip olan ya da işlem kodu için 4 bit, bellek adresi için 12 bit kullanan (4K boyutunda bir bellek olduğunu varsayıyoruz) 16 buyruğu şifreleyebiliriz. Bellek kaynağı 12 bite gereksinim duyar, diğer amaçlar için 4 bit kalır. Fakat, eğer bellekteki bütün veri ilk olarak bu yazmaç kümesindeki bir yazmaca yüklenirse, komut yalnızca 4 bit kullanarak (16 yazmaç olduğunu varsayarsak) gerekli veri ögesini seçebilir. Bu iki seçim aşağıdaki şekilde gösteriliyor;


Şekil : 16-bit buyruk biçimi için iki olasılık

Aşağıdaki buyrukları şifrelemek istediğimizi varsayalım;

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;

Genişleyen işlem kodu yapısı, çözme işlemini daha karmaşık hale getirir. Basit şekilde bir bit kalıbına bakıp hangi buyruk olduğuna karar vermek yerine, buyruğu aşağıda belirtildiği gibi çözmemiz gerekir;
if (leftmost four bits != 1111 ) { Execute appropriate three-address instruction} else if (leftmost seven bits != 1111 111 ) { Execute appropriate two-address instruction} else if (leftmost twelve bits != 1111 1111 1111 ) { Execute appropriate one-address instruction } else { Execute appropriate zero-address instruction } Her adımda, daha fazla bite bakmamız gerektiğini bildiren yedek bir kod bulunur. Bu durum, donanım tasarımcılarının sürekli karşılaştıkları taviz vermelerin (trade -off) diğer bir örneğidir. Burada biz işlem kodu alanını işlenen alanıyla yer değiştirmiş oluyoruz.

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;

Veri aktarım buyrukları

Veri hareket buyrukları en sık kullanılan buyruk türlerinden birisidir. Veri bellekten yazmaçlara, yazmaçlardan yazmaçlara ve yazmaçlardan belleğe taşınabilir, birçok makine kaynak ve hedefe bağlı olarak farklı buyruklar sağlar. Mesela bir MOVE komutu her zaman iki yazmaçlı işlenene ihtiyaç duyabilir, oysa MOVE komutu bir yazmaç ve bir bellek işlenine izin verir. RISC gibi bâzı mimariler, işletimi hızlandırmak için belleğe veya bellekten veri taşıyan buyrukları sınırlandırır. Birçok makine, farklı boyutlardaki veriyi işlemek için değişik load, store ve move komutlarına sahiptir. Mesela bayt işlemek için bir LOADB komutu, sözcük işlemek için de bir LOADW komutunun kullanılması gibi. Bellekten belleğe doğrudan veri aktarım komutu yoktur. Bu durumda MİB gibi aracı elemana ihtiyaç duyulur. Veri önce bellekten biriktiriciye alınır, daha sonra da diğer bellek alanlarına aktarılır.

Veri aktarım işlemleri kendi arasında üç alt gruba ayrılırlar: Aktarım bellekle yazmaç arasında, yazmaçtan yazmaca ve yığına veri atıp geri alma şeklinde yapılabilir.

Bellek-yazmaç aktarımı

Komutların sonunda bulunan harfler belirli kaydedicileri hedefler. Mesela A kaydedicisini, X indis kaydedicisini ve Y indis kaydedicisini hedefleyebilir. Verinin alındığı bellek konumları, buyruğun işlenen kısmında belirtilir. Bu adresler, indisli, mutlak ve veri tanımlı olabilirken, bayraklardan Z ve N bayrakları etkilenirler.

Kaydedicilerden belleğe depolama veya saklama yapmak için STA, STX ve STY komutları kullanılır. Bu kaydedicilerdeki bilgi işlenen üzerinden hedeflenen bellek konumuna aktarılır. Bu aktarım işlemleri sırasında bayraklarda bir değişme olmaz. Veri aktarım işlemlerinde kaynağın içeriği değişmez, fakat hedefin içeriği değişir.

Mesela belleğin bir konumundaki veri alınarak başka bir konumuna atılma işlemi için basit bir program yapılırsa;

LDA $0200; A «— [0200] STA $2025 ; [2025] «— A

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.

Yazmaçtan yazmaca aktarım

Bu komutlar bellekte bir baytlık yer kaplarlar. Komut yanında işlenene gerek duyulmaz. Kaydediciden kaydediciye veri aktarım komutları; TAX, TAY, TXA, TYA, TSX ve TXS'dir.

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 TXS ;ve yığın işaretçisine aktar.

Veri aktarımları

Veri, biriktiriciden yığına, yığından biriktiriciye ve durum (P) bilgileri yığına, yığından tekrar duruma aktarılır. Yığına atılan bir veri, yığın işaretçisinin değerini bir azaltır, yığından geri çekilen bir veriyle de yığın işaretçisi tekrar bir artar.

Yığın kullanımı iki sebeple gerçekleştirilir:

Mesela 6502 mimarisinde, PHA komutu, yığın işaretçisinin gösterdiği ilk yığın konumuna biriktiricinin içeriğini atarken, yığın işaretçisi bir sonraki boş konumu göstermek için değerini bir azaltır. Bu işlemi bir programla gösterelim; 0200 LDA#$A5; A=A5H
0202 PHA; A'yı yığına at
0203 LDA#$67; A=67H
0205 PHA; A'yı yığına at

Aritmetik iş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 işlemi

Sekiz adresleme biçimini kullanabilen ADC ve ADD komutları, işlenenin değerini, elde ile birlikle biriktiricideki sayıyla toplayarak yine sonucu biriktiriciye atar. Bu işlemin sembolik gösterimi şu şekildedir: (Farklı Mimarî türleri değişik komutlar ile iş görürler. ADC ve ADD sadece örnek olarak verilmiştir.)

[A] «— [A] + [M] + C

Buradaki [M], ADC ve ADD komutlarının işlenen kısımlarında bulunan veriyi veya bellekle bulunan bir veriyi göstermektedir. Toplama işlemi, durum bayrağındaki D'nin durumuna göre ikili sayı kodunda ya da BCD kodunda olabilir. Veriler toplama ve çıkarma işlemlerinde işaretli veya işaretsiz şekilde birlikte kullanılabilir. Programcının ne tür bir veri kullandığını bilmesi gerekir.

ADD komutu işlenirken bir önceki işlemden kalan elde varsa bu bi sonraki eldeye katılarak toplama işlemine sokulur. Toplama işlemine bir örnek verilirse:
CLC; C=0
LDA#$25; [A]=25H
ADC$40; [A] «— [A] + [0040] +C

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.

Çıkarma işlemi

Tekrardan hatırlatacak olursak değişik mimarî türlerinde değişik komutlar kullanılmaktadır, bunlar karıştırılmamalıdır. SUB, SUBI, SUBU, SBC değişik mimarilerdeki çıkarma komutlara örnektir. Mesela 6502’de SBC çıkarma komutu ile, A'daki değerden bellek konumunun değeri ve eldeki değer çıkarılır. Sonuç yine biriktiricide kalır. Borç, elde bayrağının(C bayrağı) ters dönmüş hali olarak düşünülebilir. Bu işlemi sembolik olarak şu şekilde gösteririz

A = A - M - C

Çıkarma işlemi, toplama işlemindeki gibi hem ikili sayılarla hem de BCD modunda yapılabilir. Burada c = (1 - C) ifadesi çok baytlı çıkarma işlemlerinde kullanılır. C = 0 ise sonuca etki edilmez. Çünkü C = 1 ise, tersi 0 olur.

Boolean mantık komutları

Boolean mantık komutları Boolean aritmetik işlemlerinde olduğu gibi aynen uygulanır. AND, NOT, OR ve XOR işlemlerini uygulamak için komutlar bulunur.

Bu komutlar, biriktiricideki değerle bellek konumundaki değeri bit bit mantık işlemine sokarlar ve daha sonra sonuç biriktiriciye yazılır. Bütün bu işlemler N (Negatif) ve Z (Sıfır) bayraklarını etkiler. Bu komutlardan en yaygın kullanılanları AND ve OR komutlarıdır.

AND komutu başka bitlere etki etmeden istenen bitin maskelenmesinde de kullanılır. Programcı bellek konumundaki temizlemek istadiği veriye göre A'ya değer atmalıdır.

OR komutları AND'in tersine istenen belirli bitleri 1 yapmada kullanılır.

Bit işleme komutları

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. Mesela 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 çok değişiklik gösterir. G/Ç’ı kontrol etmek için bâzı 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. Bâzı 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;

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

Özel amaçlı komutlar arasında dizi işleme, yüksek seviye dil desteği, koruma, bayrak kontrolü ve ön bellek yönetimi de vardır. Birçok mimarî dizi işlemek için özel komutlara sahiptir. Bu özel komutlar için mimarilerde özel yazmaçlar bulunabilir.

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;

IR ← PC

PC ← [PC] + 4

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.

Bâzı istisnai durumlarda, bir buyruğun aşağıdaki işlemleri belirli bir düzende 1 ya da daha fazla sayıda uygulaması gerekir;

Bâzı gerçek dünya ISA örnekleri

Intel

Intel sağdan anlamlılığı, iki adresli mimariyi değişik uzunluktaki buyruklarla kullanan bir mimaridir. İntel işlemcileri, bütün buyrukların bir bellek mahalinde işlem görebilme anlamına gelen yazmaç-bellek mimarisini kullanır, fakat diğer işlenen bir yazmaç olmalı. Bu ISA mimarisi değişik uzunluktaki buyrukların veri üzerinde işlem görmesine izin verir, örneğin 1, 2 veya 4 bayt uzunluğundaki buyruklar.

MIPS (Microprcessor without Interlocked Pipeline Stage)

MIPS sağdan anlamlılığı kullanan, bayt adreslenebilir, üç adresli, sabit buyruk ve hafıza uzunluklu bir mimaridir. Sadece load ve store komutlarının belleğe ulaşabildiği yükle ve sakla mimarisidir. Diğer bütün buyruklar işlenenler için yazmaç kullanmak zorundadırlar. Bu çok geniş bir yazmaç kullanımını gerektirir. MIPS aynı zamanda sabit uzunluklu işlemler kullanır.

JAVA Virtual Machine

JAVA platformdan bağımsız olması açısından son derece ilginç ve son zamanlarda popülerliği artan bir dildir. Yani, eğer bir mimarî üzerinde bir kod derlemişsek ve programımızı farklı bir mimaride çalıştırmak istiyorsak (Sun Workstation gibi) bunu kodumuzu modifiye etmeden ve yeniden derlemeden yapabiliriz.

JAVA derleyicisi program ilk çalıştırıldığında yazmaç sayısı, bellek boyutu, I/O girişleri gibi mimarî bağlanımları açısından bir kısıtlama getirmiyor. Fakat daha sonra programı çalıştırmak için bir JAVA Virtual Machine (JVM)’e ihtiyaç duyulur. JVM asıl olarak donanım mimarisine giden bir katlayıcı fonksiyonu görür ve platforma bağımlıdır. Fakat JVM belli bir mimarî üzerinde görüldüğü zaman herhangi bir ISA’de derlenmiş bir programı çalıştırabilir. Çalıştırma anında JVM’in görevi baytkodları yükleme, kontrol etme, bulma ve yürütmedir. JVM sanal olmasına rağmen iyi tasarlanmış bir buyruk kümesi mimarisidir.

Sonuç

Buyruk kümesi mimarileri değişik tasarım ilkelerini kullanırlar. Buyruk kümesi mimarisinde başlıca hedefler; daha güçlü işlemler sunmak, buyruk sayısını ve karmaşıklığını azaltmak, hızı arttırmaktır. Buna karşılık daha yavaş saat sıklığı ve yüksek BBÇ (buyruk başına çevrim) ise karşılaşılabilecek tehlikelerdir. Buyruk kümesi mimarisi için iyi bir soyutlama gerekir.

Kaynaklar

    This article is issued from Vikipedi - version of the 10/2/2016. The text is available under the Creative Commons Attribution/Share Alike but additional terms may apply for the media files.