Komut kümesi

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 tam sayı 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 tam sayı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 tam sayı adresinden 16 bit tam sayı 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 tam sayı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.

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.

Aritmetik işlem komutları

Aritmetik işlemler tam sayı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

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

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

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.