Hakkında Künye

Assembly

Yeni sayımızda hepinize merhabalar sevgili okurlarımız,

 

Garip bir soruyla başlayalım :) Hiç evinizdeki bir nesneyi parçalarına ayırıp iç dünyasını keşfetmeyi düşündünüz mü? Eğer gözlemci bir kişiliğe sahipseniz, size verilenle yetinmeyip maddenin temeline inmeye çalışıyor, sorguluyorsanız hayatı ve yaptığınız sorgulamalar size öğrettiyse zihninizde yarattığınız ilk görüntü ile inceledikten sonra oluşan görüntünün tamamen farklı olacağını Assembly dili tam size göre.

 

IBM’in düzenlediği “Connected 2012 İstanbul” etkinliği için ülkemize gelen IBM bilim adamı Dr. John Cohn, 2020'ye gelindiğinde insan gibi hareket edebilen ve karmaşıklıkları algılama açısından insan beynine çok yaklaşan bilgisayarların hayatımızın bir parçası olacağını söylüyor.

Bir an için, şu an önünüzde bulunan bu makinayı her gün iletişim kurduğunuz insanlardan biri olarak düşünün. Tahmin ediyorum ki onunla iletişim kurmak için, aranızda en az engelin bulunduğu ve ona en yakın olabileceğiniz dili tercih edersiniz. İşte makina diline en yakın olacağınız, program yazarken programcıya doğrudan bilgisayarın işlemcisine ve hafızasına erişim imkanı sunması, yani hafızadaki (RAM’deki) değerleri doğrudan değiştirme olanağı tanıması ile Assembly'dir. Sizler de programlarımızı yazdığımız ortamların nasıl oluşturulduğu, ilk programlama dilinin nasıl yazıldığı ve ne gibi süreçlerden geçtiği gibi konuları merak ediyor, Assembly dilinin heyecan verici dünyasına ilgi duyuyorsanız gelin bu dünyayı beraber keşfedelim ;)

Öncelikle Assembly dili nedir? Bilgisayarımızda çalıştırılan tüm programlar önce bilgisayarımızın RAM’ine yüklenir. Daha sonra RAM üzerinde çalıştırma işlemi gerçekleştirilir. RAM’e yüklenen bilgi programımızın makina dili (CPU’ya has özel bir alfabe) karşılığından başka bir şey değildir. Makina dili 16'lık sayı sistemindeki değerlerden oluşur. Bu kodlar sadece sayı kümelerinden oluştukları için bir insanın bunları anlaması hele hele bu sayılar üzerinden programlarını yazması neredeyse imkansızdır. Peki karmaşık sayılar yerine kendi konuşma dilimizdeki kelimelerden oluşan bir komut kütüphanesi ile çalışma imkanımız olsa, hayat çok daha kolay olmaz mıydı? İşte bu arayış komut setindeki makina dili kodlarının insanların biraz daha kolay anlayabileceği harfler üzerinden gösterimi olan Assembly dilini doğurmuştur. Bu dil tamamen semboliktir ve her Assembly komutu yazıldığında birebir makina diline çevrilir. Yani makina dilinin ingilizce kısaltmalara dönüştürülerek  kullanıcı tarafından anlaşılabilir şekle sokulmuş haline Assembly dili dememiz yanlış olmaz. Assembly dili, "mnemonic" (nemonik) adı verilen, kısa yazılımlı komutlardan oluşur. Mnemoic'ler komutların kısaltılmışı olduğundan, hatırlanması ve program yazımı kolaydır. En belirleyici özellikleri ise bilgisayar birimleri arasındaki işlemleri tanımlayıcı niteliğe sahip olmalarıdır. Bu özellik doğrudan makinayı etkilemesi ile hızlı çalışma olanağı sunması ve kullanıcıya bilgisayar yapısı ve çalışma prensibi hakkında fikir vermesi açısından önemlidir.


Peki Assembly diline neden ihtiyaç duyuldu, oluşumu nasıl gerçekleşti? diye soracak olursanız yukarıda kısaca değindiğim gibi temel neden  bilgisayarların 1'ler ve 0'lardan oluşan ikilik sayı sistemindeki "makina dili" ve programcıya yaşattığı zorluklar. Tahmin edeceğiniz gibi makina dilini meydana getiren bu sayıların yan yana gelmesi, programcı için anlaşılmayan bir dizi oluşturduğu gibi bu programın hata yüzdesi de çok fazla olacaktır. Bu yüzden makina dilinde yazılmış bir program elverişli değildir. Ayrıca böyle yazılmış olan bir programın başka bir kimse tarafından gözden geçirilmesinde de pratik zorluklar vardır. Bu noktada daha kolaylıkla yazabileceğimiz ve okuyabileceğimiz bir dile gereksinim duyulmuş ve 1950’li yıllarda Assembly doğmuştur. Bu sayede programcı 1'ler ve 0'lar ile program yazmak yerine “Assembly” dilini kullanmıştır. Fakat bilgisayarın bu yazınlanlarla ilgili hiçbir fikrinin olmaması, insanların anladığı dili bilgisayarın anladığı dile çevirme, yani yazılmış olan bir kaynak programı, bir amaç programa dönüştürme ihtiyacını beraberinde getirmiş ve bu ihtiyaç için özel bir program yazılmıştır. FORTRAN ve COBOL için yazılmış olan dil dönüştürücü programa COMPILER, BASIC için yazılmış olana INTERPRETER, ASSEMBLY için yazılmış olan programa ise ASSEMBLER denir. Diğer bir söyleyişle; Assembly derleyicisine Assembler denir. Assembly diliyle yazılmış bir program(.asm) assembler derleyicisi ile makine diline (.hex) çevrilir.

Biraz da Assembly dilini bilmenin ne gibi avantajları olduğundan söz edeyim. Öncelikle Assembly, donanım hakkında daha fazla detay bilmeyi gerektirir. Bu dezavantaj gibi görülse de aslında kullanıcıya önemli bilgi birikimi sağlar, özellikle yeni başlayanlar için bilgisayar donanımının ve çalışma prensibinin daha yakından tanınmasına yardımcı olur. Özel donanım ihtiyaçları üzerinde daha fazla kontrol sağlar. Programcılar ekran, yazıcı, disket, harddisk kontrollerini direkt olarak yapabilirler. Yüksek seviyeli dillere göre daha küçük, daha az yer kaplayan ve daha hızlı icra edilebilir kodlar üretilmesine yardımcı olur. Bunu açacak olursak yazdığımız her satır kod 1'le 4 byte civarında olup çok az yer kaplar. Diğer dillerde yazılan kodlar aynı işi yapsa dahi sizinle aranızda derleyici bulunmaktadır ve programın işleyişini sağlama almak amacıyla komutlar arasında ek bilgiler girilmekte ve programınızın boyutu büyümektedir.

Ayrıca diğer dillerdeki komutlar işlemci üzerindeki komutlarla uyuşmaz ise derleyici bunu dolambaçlı yollardan işlemciye anlatır ve yazılan bir tek komut makina dilinde yüzlerce komuta karşılık gelebilir. Herhangi bir dildeki basit komut assembly ile yazılsa 2'yle 6 kat daha az yer kaplar. Tüm bunlar zaman ve para tutumluluğunu beraberinde getirir. Başka bir avantajı ise herhangi bir programlama dilinde kodlar arasında kullanılabilmesidir. Bunun dışında aygıt sürücülerini geliştirmek, chiplere program yüklemek(PIC, microcontroller gibi), işletim sistemlerini geliştirmek, şifre kırma ve hacking işlemleri, virüs programlarının geliştirilmesi, elektronik tablolama (Excel gibi) programları geliştirilmesi gibi sayısız daha bir çok alana Assembly dili ile erişim sağlanabilir. Assembly'nin programcıya sunduğu avantajlara küçük bir örnek vereyim. Girilen fonksiyonun grafiğini çizen bir program yazalım, argüman olarak bir string alsın. Doğal olarak yazdığımız fonksiyonun önce verilen stringi parçalayıp, ne yapması gerektiğine karar vermesini bekleriz. Bunu C++ ile yazdığımızda ve fonksiyonu her çağırdığımızda verilen string'i tekrar ayrıştırmak zorunda kalacağız ve ya buna benzer bir işlem yapmamız gerekecek. Oysa Assembly kullanarak aynı programı yazsaydık, programımız verilen fonksiyonun işlemlerini yapan yeni bir program parçası oluşturabilir ve kat kat daha hızlı çalışan bir program elde etmiş olabilirdik.

 

Assembly'nin avantajları kadar dezavantajları da var elbette. Biraz da onlardan bahsedelim. Makine diline en yakın dil olması Assembly dilini oldukça güçlü kılar. Ancak Assembly alt seviye bir dil olmasından dolayı istenilen işlemi oldukça uzun kodlamalar sonunda yapmaktadır. Örneğin C'de ekrana karakter yazmak için kullandığımız bir printf komutu için Assembly'de 5-6 satırlık bir kodlamaya ihtiyaç duyulur. Assembly dili ile yola çıktığımızda bahsedilen proje birkaç kişilik deneyimli bir programcı grubu ile birkaç yıl alırken, C ile iki programcı aynı işi 3-4 ayda, Visual Basic veya Delphi ile bir programcı bahsedilen işi 1-2 aya yakın bir sürede yapabilir. Ayrıca Assembly'de yazdığınız programın hangi satırlarının ne iş yaptığını bir süre sonra anlamayabilirsiniz. Çünkü anlaşılması zor ve karmaşık bir dildir. Bu nedenle kodların sonuna açıklama bölümleri eklemek iyi bir çözüm olacaktır. Assembly'nin bir başka dezavantajı ise ağırlıklı olarak bilgisayar içi kaydediciler ve bellekler arası işlemler için hazırlanması, yani çevre birimleri ile bağlantısının sınırlı olmasıdır. Ayrıca her mikroişlemci ve bunun kullanılacağı bilgisayar için farklı Assembly dili kullanılması, mikroişlemciye ait komut seti ve adresleme türlerinin iyi bilinmesini gerektirdiğinden büyük bir dezavantaj oluşturmaktadır. Burada bahsettiğim Assembly'nin işlemciye birebir bağımlı olması. Yani Intel ve uyumlu (AMD, Cyrix, Via) işlemcilerde geçerli olan bir kod, Motorola işlemcileri kullanan Macintosh bilgisayarlarda hem komut setinin hem de işlemci mimarisindeki büyük farklılıklardan dolayı geçersizdir.Fakat tabi ki onlarda da bir assembly dili bulunmaktadır, komutlar daha farklı olsa da.

Bir programlama diline giriş yapıp da "Hello world" yazdırmazsak olur mu, olmaz. Gelin bunu önce C'de daha sonra ise Assembly'de yapıp yukarıda bahsettiğim dezavantajın somut örneğini görelim.

  #include <stdio.h>
  int main(int argc, char *argv[])
  {  
       printf("Hello, world! ");   
       return 0;
  }


  ORG    100h
  LEA    SI, msg                                ; Mesajın adresini SI’ya yükler
  CALL   print_me
  RET                                                ; işletim sistemine döner
  print_me     PROC
  next_char:
  CMP  b.[SI], 0                                ; durmak için sıfır olup olmadığını kontrol eder.
  JE   stop                                         ;  
  MOV  AL, [SI]                                 ; bir sonraki ASCII karakteri alır.
  MOV  AH, 0Eh                               ; uzakyazıcı fonksiyon numarası
  INT  10h                                          ;  AL’de bir karakter bastırmak için iş kesme işaretçisi kullanma
  ADD  SI, 1                                      ; string diziliminin indexini ilerletir.
  JMP  next_char                             ; geriye dön ve başka bir karakter yaz.
  stop:
  RET                                                ; çağırana döner.
  print_me     ENDP
  msg    DB  'Hello World!', 0          ; sıfırla biten string
  END


         

Gördüğünüz gibi C'de son derece açık, anlaşılır ve kısacık olan kodumuzu Assembly'de yazarken yanına açıklayıcı cümleler koymak zorunda kaldık. Bu, Assembly öğrenmek isteyen okurlarımız için caydırıcı nitelikte olmamalı tabi ki, ama önünüze çıkacak zorluğun farkında olarak bu işe kalkışmanız en doğrusu olacaktır.

Bu yazımda sizlere Assembly dili ile ilgili genel olarak bilgi vermeye çalıştım, umarım açıklayıcı olmuştur. Sona yaklaşırken heyecan verici Assembly dünyasına girmeye kararlı olan okuyucularımızın karşılaşacakları açılması zor kapıların ilkinin Boolean Cebiri olduğunu söylemeliyim. Mikroişlemcilerin nasıl çalıştığını öğrenmek için öncelikle boolean matematiği hakkında ciddi şeyler bilmeniz şarttır. Boolean matematiğini biraz olsun çözdükten sonra bilgisayarınızın ve çiplerin nasıl çalıştığı hakkında ciddi anlamda fikir sahibi olabilir, Assembly dünyasını keşfetmeye biraz daha yaklaşabilirsiniz. Unutmayın, yapabileceklerinizin sınırı sadece hayal gücünüz. Ve asla hata yapmaktan korkmayın, ilerlemenin tek yolu hata yapmaktır ;)  Bir sonraki sayımızda görüşmek üzere;)

 

KAYNAKLAR

Merve Bozo
- 6 -