Bilgisayar Bilimleri -16- Alt Seviye Programlama Dilleri (Assembly)

Daha öncesinde algoritmalardan ve bilgisayar mantığından sizlere bahsetmiştik. Ayrıca bilgisayar yazılımının tarihini anlatmamız bu konuya sizi hazırlar nitelikte oldu. Artık makineden bağımsız halde yazılan yalancı kodları ve algoritma diyagramlarını bir kenera bırakıp gerçek dillere giriş yapıyoruz. Bu gerçek dillerin temel özelliklerini öğrenmeniz o dilleri öğrenmeden önce o dilin iskeletini kafanızda kurgulamanıza sebep olup hangi dil olursa olsun öğrenmekte size yardımcı olacaktır. Buna dilbiliminden örnek verirsek İngilizce, Almanca, İsveççe, Danca gibi dilleri ayrı ayrı öğrenmek yerine Hint-Avrupa Dil ailesinin Avrupa dalının Germanik diller (Alman dilleri) koluna ait özellikleri öğrenmek gibi diyebiliriz. Böylelikle aynı alt aileye sahip tüm dillerin ortak özelliklerini ve mantığını başta öğrenmekle o dilleri habersiz bir şekilde ayrı ayrı öğrenmenin zorluğunu çekmezsiniz. Bunun gibi dil ailelerine ait benzer özellikleri bilmek o aileye mensup dilleri daha rahat anlayıp öğrenmenizi sağlar. Aynı zamanda farklı üst ailelere ait dilleri de birbirine karıştırmanızın önüne geçer. Pek çok yabancı Türkçe’yi öğrenirken kendi dillerine ait gramer ögelerini kullanmaya kalkmakta ve söz dizimini kendi dillerine benzetmeye çalışmaktadır. Benzerliği bilmek kadar farklılığı bilmek de önemlidir. Biz de burada aynı doğal dillerde olduğu gibi türetilmiş programlama dillerinde de farklılıkları ve benzerlikleri göz önüne getireceğiz ve dilin mantığının kavranmasının yanı sıra “dili öğrenmeden bilmek” gibi bir niteliği de size kazandırmaya çalışacağız.

 Assembly Dilleri

Daha öncesinde bilgisayarın veriyi kaydeden, okuyan ve işleyebilen programlanabilir elektronik bir aygıt olduğundan bahsettiğimizi hatırlıyoruz. Bu noktada bilgisayarın üç ayrı temel işi yaptığını söyleyebiliriz; veriyi okumak, veriyi işlemek ve veriyi yazmak. Bilgisayar bir makine olarak bu işleri kendi keyfine göre asla yapmamaktadır. Bu işleri yapmak için bir programa ihtiyaç duymaktadır. Bu programın içeriği bilgisayarın yapabildiği işleri kapsamaktadır. Hiçbir program bilgisayara 5 metre sağa git veya ocağın altını kapat diyemez. Çünkü bilgisayarın bunları yapabilmesi mümkün değildir. O halde program bilgisayarın veriyi okuması, işlemesi ve yazması yönündeki talimatlar bütünüdür diyebiliriz. Program talimatlar ve veriden meydana gelmektedir. Çünkü veri olmadan veri işleme talimatlarının bir anlamı olmamaktadır. Daha önce bilgisayar bilimlerinin en ortasında verinin yer aldığını söylemiştik. Biz bu noktada konuşabiliyorsak verinin varlığı sayesinde konuşabiliyoruz. Veri olmadıkça ne programlama ne de bilgisayar programından söz etmemiz mümkün değildir.

Daha öncesinde makine kodunun zorluğundan bahsetmiştik. Bu zorluk bilgisayar programcılarını programlama dilleri geliştirmeye itmişti. Makine dilinden sonra üretilen ve ilk programlama dili diyeceğimiz dillere Assembly dilleri adı verilmektedir. Assembly dili tek bir dil olmayıp mimari ve komut kümesi sayısınca Assembly dili bulunmaktadır. Örneğin ARM Assembly, AVR Assembly, PIC Assembly, x86 Assembly, Z80 Assembly diye saymaya devam edersek yazıyı bitiremeyiz. Bunlar birbirinden farklı olmakta ve her birinin kodu diğerinde çalışmamaktadır. Ama yukarıda dediğimiz gibi bilgisayar bilgiyi okuyan, işleyen ve yazan programlanabilir bir makine olduğu için komutlar esasta birbirinin aynısıdır. Bilgi okuma komutları, bilgi işleme komutları ve bilgi yazma komutları olarak bunları sınıflandırabiliriz. Assembly dili makine dilinin alfanümerik olarak sembolize edilmesiyle ortaya çıksa da önce Assembly dilinin ortaya çıkmasını gerektiren en önemli nedenleri maddeler halinde verelim.

  • Makine dili hiçbir şekilde doğal dile yakınlık göstermez. Hatta doğal dili bırakalım matematik veya mantık diline de hiç yakın değildir. Her ne kadar matematik ve mantık tabanlı aygıtlar olsa da insanların anladığı ve ifade ettiği matematik ve mantık dili onlar için hiçbir şey ifade etmemektedir. O halde yazılacak bütün programlar sadece rakamlardan ibaret olacak ve hiçbir şeye benzemeyecektir. Programcının elinde sayısal değerlerin karşılıklarının yazdığı bir kılavuz bulunsa da programcı şu örnekte vereceğimiz kodu okuyarak bunu çözümlemek ve anlamak zorundadır. Örnek: :10246200464C5549442050524F46494C4500464C33
  • Komutların sadece sayısal değerlerden oluşması aslında çok da zor olmasa gerektir. Örneğin 86 toplama, 65 çıkarma, 99 okuma, 88 yazma komutu ise biz bu sayıları gördüğümüz yerde komutun ne anlama geldiğini anlayabiliriz. Fakat sadece komutlar tek başına sayı ile ifade edilmezler. Hem komutlar hem adresler hem de veriler sayı ile ifade edilmektedir. O halde 65 değerinin adres mi değer mi çıkarma mı olduğu sıralamasına göre anlaşılmaktadır. Elbette burada insan bunları birbirine kolaylıkla karıştırabilir. 
  • En zor noktalardan biri de adreslerdedir. Biz program üzerinde en ufak bir değişiklik yapmak istesek bile programın adreslerinde kayma olacak ve bütün programı buna göre düzenlememiz gerekecektir. Örneğin 503 numaralı adres programın 503. satırına geliyor diyelim. Biz 100 ile 101 arasına bir kod eklediğimizde 503’de yer alan kod 504’e kayacaktır. Eğer bir atlama komutu 503’ü başka bir yerde çağırırsa program çok yanlış bir yeri çalıştıracaktır. Assembly dilinde bu etiketler vasıtasıyla önlense de makine dilinde böyle bir şey yoktur. O halde iki satır ilave ettik diye iki gün programı baştan sonra inceleyip düzenlememiz gerekecektir. 
  • Veri tipleri diye bir şey söz konusu değildir. Harfler de, sayılar da , diziler de hep sayısal şekilde ifade edilir. O halde programcı bunların temsil işini de kendi yüklenmelidir. Biz veri tiplerini Assembly dilinde özel işaretler vasıtasıyla rahatça yazabiliriz. 

Günümüzde çağın gerisinde kaldığı iddia edilen Assembly dilleri ilk ortaya çıktıkları 1950’li yıllarda o dönem bilgisayar teknolojisinde yaşanan en büyük gelişme olarak kabul ediliyordu. Assembly dilleri makine diline göre daha verimli, insan diline yakın dillerdi. Assembly dili daha önce anlattığımız gibi makine dilinin alfanümerik olarak sembolize edilmesi üzerine kurulmuştur. Örneğin elimizde toplama işlemini yapan 86 değeri var diyelim. Burada biz bir numaralı adrese 20 değerini toplamak istediğimizde şöyle bir komut yazmamız gerekecektir.

86 01 20 

Görüldüğü gibi burada neyin ne olduğunu çok iyi bilmemiz anlamak için şarttır. Bunun dışında anlamak için hiçbir ipucu bulunmamaktadır. Üstelik bazen opcode adı verilen dizilimler her zaman yukarıda anlattığımız gibi temiz bir görüntü vermemektedir. Bir program kelimesi 16 bitten meydana geliyorsa bunun ilk dört biti komut sonraki dört biti verinin üst kısmı sonraki dört bit adres ve sonraki dört bit ise verinin alt kısmı olabilir. O halde program kodu, adres, veri şeklinde sıralı halde bile kod yazma imkanımız olmayabilir. Yukarıdaki kodu çözmek zor iken bazı durumlarda iyice zor olmaktadır. Tek bir satır kodun bu kadar zorluğunun yanında yüzlerce komutun birbiri içine girmesini hiç anlatmaya gerek yoktur. Şimdi ise yukarıda verdiğimiz makine kodundaki programın Assembly dilindeki karşılığını yazalım.

ADD R1 20 

Yukarıda bahsettiğimiz makine dilinde olan opcode karmaşıklığı Assembly dilinde bulunmamaktadır. Assembly dilinde her zaman mnemonik (kodun temsik edildiği kısaltma) başta gelmekte sonrasında adres ve operand veya tek başına operand gelmektedir. Operand üzerinde işlem yapılacak veri anlamı taşımaktadır. Bazen de Assembly komutları tek bir komut olmakta ve herhangi bir değer almamaktadır. Bunlar makinenin mimarisine göre değişmektedir. Ama yukarıda baktığımızda “ADD” ifadesinin “EKLE” anlamı taşıdığını Assembly diline oldukça uzak olanlar bile tahmin edebilmektedir. R1 olarak (Register 1) yani bir adresi belirttik. Böylelikle 20 değeri de değer olarak sayısal ifade ile tek başına karşımıza çıktı. Burada komut, adres ve veri ne kadar ayırt edilebiliyor değil mi?

Ben şu an sadece AVR Assembly bilmemden dolayı bir sonraki yazıda AVR Assembly üzerinden örnek vermeye devam edeceğim. AVR Assembly bilen birisinin diğer Assembly dillerini öğrenmesi de kolay olacağından herkese AVR Assembly dilini öğrenmeyi tavsiye ederim. AVR Assembly bilen birisi örneğin PIC Assembly’in kılavuzunu ve örneklerini bir saat incelese mantığını anlayacaktır. Çünkü prensipte komutlar ve söz dizimi birbirine oldukça benzer.

Bizi Facebook grubumuzda takip etmeyi unutmayın. Bilgili ve öğrenmeye hevesli bir topluluk oluşturmak istiyoruz.

https://www.facebook.com/groups/1233336523490761/

 

Gökhan Dökmetaş

"Arduino Eğitim Kitabı" ve "Arduino ve Raspberry PI ile Nesnelerin İnterneti" kitaplarının yazarı. Başkent Teknoloji ve Dedektör Merkezi'nde Ar-ge Sorumlusu. Araştırmacı-Yazar.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.