Bu sayfadaki yazılar
Sayfanın metni
Sayfa 48
5. A registerindeki değer Data Tamponuna kopyalanır.
6. Adres Tamponuna 100 yazılır. Yazma modu seçilir. Değer belleğe yazılmış olur.
Komutlar (Instructions)
Şu ana kadar bellekten bahsederken hep data saklamak amacı ile bahsettik. Ama bellekte saklanabilen bir diğer veri de komutlardır. Komutlar da aslında sayısal değerlerdir diye düşünebilirsiniz. Sadece onları komut gibi yorumladığımızı düşünelim. Mesela 20 sayısını topla komutu diye yorumlayabiliriz. Komutlar çoğu zaman bir komut ve arkasından gelen komutla ilgili argümanlar olarak gelirler. Mesela "(A registerini yükle)(30)" gibi bir komut düşünülebilir. Eğer bu komutun numarası diyelim ki 25 ise biz belleğe arka arkaya 25 ve 30 sayılarını saklarsak bu komutu belleğe saklamış oluruz.
Program sayacı (Program Counter)
Bellekte ardarda duran komutların işletilmesi işini çözmek üzere CPU'muza bir register daha ekliyoruz. Bu register içinde saklanan sayı bellekten okunacak olan komutun adresini gösteriyor. Bellekten her komut okuyuşumuzda, komutu işledikten sonra program sayacı bellekte bir sonraki komutun olduğu yeri gösteriyor.
Kontrol Devresi
Şimdi kafanız karışmış olabilir. Program sayacının değerini kim artırıyor? Ya da bellek erişimlerinde Adres ve Data Tamponlarına kim değerleri koyuyor? Ya da ALU'ya hangi işlemin yapılacağını kim söylüyor? İşte bütün bu işleri CPU içinde yöneten bir bölüm var ki buna Kontrol Devresi deniyor (Control Logic). Bu devre bellekte program sayacının gösterdiği yerdeki komuta göre registerların arasındaki dijital anahtarları açıp kapatarak CPU içinde datanın nereden nereye gideceğini yönlendirmekle kalmaz, ALU'nun yönetimini, belleğe giden okuma/yazma pininin durumunu vs. kontrol eder. Bir komutu tamamladıktan sonra program sayacını değiştirip bir sonraki komuta bakmasını sağlar. Bir CPU'nun mimarisindeki en önemli ögelerden biridir.
Jump komutu
Bu komut ile program sayacı bellekteki bambaşka bir noktaya bakacak şekilde set edilerek program akışının oradan devam etmesi sağlanabilir.
Durum Registeri
Şimdi CPU'muza bir register daha ekliyoruz. ALU ile yaptığımız işlemlerin sonucunda ortaya çıkan durumlarla ilgili bazı faydalı bilgileri kontrol devresi buraya da yansıtır. Bu iş şöyle yapılır. Bu registerdaki bitlere özel anlamlar yüklenir. Örneğin bir tanesine Zero-flag denir. Bu bit ALU'daki işlemin sonucu sıfır çıkarsa 1 olur. Bir diğer bite Carry-flag denir. Bu da ALU'daki toplama işleminde sonuç 255'i geçerse 1 olur. Bir diğer bite Negative-flag'dir. Bu da ALU'daki işlemin sonucu negatif çıkarsa (mesela 2 - 30) 1 olur.
Bu bayraklar bizim için çok önemlidir. Çünkü bu bayrakların durumuna bakarak hareket eden komutlar vardır. Bunlara Koşullu Dallanma (Conditional Branching) komutları denir. Bu komutlar sayesinde programlara karar mekanizmaları eklenebilir. Örneğin şöyle kodlar yazılabilir:
1. bellekte N adresindeki değeri A'ya yükle
2. Adaki değer ile 30'u karşılaştır (ALU ile A'dan 30'u çıkar)
3. Sonuç 0 ise 6. basamağa atla (işte burası koşullu dallanma komutu. Eğer koşul sağlanmazsa program bir sonraki komuttan devam edecek)
4. N adresindeki değer 30 olmadığında neler yapacaksan onu yap
5. Programdan çık
6. N adresindeki değer 30 olduğu zaman neler yapacaksan onu yap.
7. Programdan çık
Şekil 3.
Komutlara özet bakış
Şu ana kadar incelediğimiz makine dili komutları dikkat ederseniz sadece aşağıdakilerden birini yapabilir. 1. Bellekten bir registera değer kopyalama 2. Bir registerdan belleğe değer kopyalama 3. Jump ile bellekte herhangi bir yerdeki bir komuta atlama
4. İki register arasında değer kopyalama
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 49
5. Register ve bellek arasında aritmetik/mantıksal bir işlem yapıp sonucu tekrar bir registera kopyalama 6. ALU'daki işlem sonucuna göre dallanma veya bir sonraki komuta devam etme.
Gerçek CPU'larda da komutların %75'i bu saydıklarımızdan birini veya birkaçını yapar ama bunların dışında bir şey yapmaz. Yani herbiri küçük ama faydalı işler yapar. En karmaşık programlar bu küçük işlerin bir araya gelmesiyle oluşur. Bu yüzden makine dili komutlarını öğrenmek kolay bir iştir. Makine dili ile program yazmak ise problemleri en küçük parçalarına kadar bölerek tasarım yapmayı öğrenene kadar size zor gelebilir.
Makine Dili Komutlarından Assembler'a geçiş
İnsanlar ilk yaptıkları bilgisayarları programlamaya çalışırken bellekteki her değeri rakam rakam hazırlarlarmış. Hatta rivayetlere göre en eski bilgisayarlardan olan ENIAC'ta bu rakamları belleğe girerken binlerce elektrik anahtarı (yani bildiğimiz ampul yakan cinsten) çat çut teknisyenlerce açılır kapanırmış. Tabii fazla geçmeden insanlar program yazarken ince ince sayılarla uğraşmasın diye makine dili komutlarını genelde 3 harfli kısaltmalarla ifade eden assembler dillerini oluşturmuşlar. Böylece mesela 24,125,34,55,98,12,90 diye program yazmaya çalışmak yerine insanlar
lda 24 (yani A registerine 24 adresindeki degeri yukle) ele (yani Carry Flag'i sifirla) adc 98 (98 adresindeki deger ile Carry Flag degerini toplayip A registerine ekle) sta 90 (sonucu 90 adresine yolla)
diye kod yazabilmeye başlamış. Daha sonra assembler'lar daha da gelişmiş ve insanlar çeşitli rakamların yerine isimler (bunlara etiketler de diyoruz) kullanabilmeye başlamış. Böylece yukarıdaki kod yerine
mevcut param - 24 maas 98 ev sahibi
90
lda ele adc sta
mevcut param
maas ev sahibi
yazabilmeye başlamışlar.
İşte günümüzde makine dili kullanarak kod yazan hemen herkes bu tip assembler araçları kullanır. Bu araçları kullanırken yazılan kod nasıl düzenli tutulur? Aradan 5 ay geçtikten sonra eski kodlarınıza döndüğünüzde onlardan bir şeyler anlayabileceğinizi nasıl garanti edersiniz? Bütün bunlar cevaplanması gereken önemli sorulardır. Bunlarla ilgili yazılım mühendisliğinde kullanılan bir ton teknik vardır. Bunlar da başka bir yazının konusu.
"Eee biz şimdi hiçbir assembler komutu öğrenmedik" diyebilirsiniz. Panik yapmayın onun da zamanı gelecek. Hali hazırda bu konuda bulabileceğiniz kaynaklar var internette. Şimdi gidin ve onlara bir daha bakın. Pek çok şeyi daha kafanızda pekiştirerek anladığınızı göreceksiniz. Ayrıca ben de er geç o konuda bir şeyler yazacağım.
Sonuç
Bu yazı aslında giriş seviyesinde bir yazı olmakla beraber içerdiği bazı elektronik detayları yüzünden orta seviye gibi gelebilir. Eğer yazının içinde anlamadığınız yerler varsa bize yazarak sorabilirsiniz. Sonuçta anlamadığınız yerler kalsa bile anladığınız yerler size bayağı fayda sağlayacaktır. Ayrıca sizinle bire bir çalışan bir hocanız olmadıkça her konuda yeni bir şeyler öğrenirken, bazı yerleri anlamayabilirsiniz. Daha sonra başka bir yerde bir şey okurken anlamadığınız şeyle alakalı olduğunu anlar ve gereken ilişkilendirmeyi kafanızda yaparsınız. Zaten öğrenme böyle bir deneyimdir.
Önümüzdeki sayıda Giriş/Çıkış sistemlerinin CPU ve bellek ile nasıl entegre edildiğini inceleyeceğiz.