assembly_logo

Assembly Eğitimi 1 Makinalara Yakın İnsanlara Uzak Dil Assembly

 

Assembly Dilinin Yeri

Assembly programlama dili diğer programlama dillerine göre donanıma en yakın olanıdır. Donanıma yakınlık programcıya sağladığı avantajların yanı sıra ek sorumluluklar da yüklemektedir. Zira yüksek seviyeli prograrrılama dilleri olarak kabul ettiğimiz Pascal, FORTRAN ve C gibi dillerde bir komut ile basit bir şekilde yerine getirilebilen bir işlem, birkaç assembly komutu, hatta bazı durumlarda başlı başına bir program ile yapılabilmektedir.

Bir programın çalıştırılabilmesi, yazılan kodun, kullanılan programlama dili için geliştirilmiş derleyici (compiler) programın süzgecinden hatasız olarak geçmesi ile mümkündür. Derleyici, yazılan programın o programlama dilinin yazım kurallarına (syntax) uygunluğunu, anlamlı (semantic) olup olmadığını kontrol eder. Bu kontrol sonucunda hiçbir hata oluşmaz ise hedef donanım (target platform) üzerinde çalıştırılabilir bir nesne kodunu (object code) üretir. Bazı kaynaklarda makine kodu (machine code) olarak da ifade edilen bu nesne kodu aslında bilgisayarın temellerini oluşturan transistörlerin hangi durumlarda açık, hangi durumlarda kapalı olacağını belirleyen ve 0 ile 1'lerden oluşmuş bir bit dizisinden ibarettir.

Kodlanan prograırnn doğru çalışıp çalışmadığını adım adım denetlemek, var ise işlem ve mantık hatalarını tespit edebilmek, kısaca programı analiz ederek istenenleri yerine getirip getirmediğini anlayabilmek için hata bulma ve analiz yapmayı sağlayan yazılımlardan yararlanılmaktadır. Hata bulucu yazılımlar, kullanıcılara, işlem kodları (operation code) ve bunlarla birlikte kullanılan işlenen(ler)in (operand) oluşturduğu bit dizilerini göstermenin yanı sıra, bu bit dizilişlerinin sembolik (mnemonic) karşılıklarını göstererek programın işleyişinin insan tarafından kolay takip edilebilmesini sağlarlar. Kısaca assembly dili, kullanıcı açısından bakıldığında makine kodundan çok daha basit, rahat okunabilen ve hızla anlaşılabilen sembolik bir dil olarak karşırrııza çıkar.

Programlama dilleri, donanıma (hardware) olan yakınlıkları açısından aşağıdaki gibi seviyelere ayrılabilirler. Üst seviyede yer alan diller insan için rahat okunur, anlaşılır ve takip edilebilir (human readable), alt seviyedekiler (yani donanıma yakın olanlar) ise makine için rahat okunabilir (machine readable) olarak sınıflandırılmaktadır.

20160707_122211_HDR (1)

Assembly dilinde program yazmak için kullanılacak işlemci ailesi için üretilmiş komut kümesinden (instruction set) yararlanılır. Komut kümesi, hangi işlem kodunun ne amaçla kullanıldığını, hangi durumlarda bu işlem kodunun ne tür işlenen(ler) ile kullanılabileceğini, komutun işletilmesini takiben sonucun nerede oluşacağını veya bu işlemin neleri etkileyeceğini belirleyen en temel kaynaktır.

Bu özellik göz önüne alındığında assembly dilinde program yazmak isteyenlerin assembly komutlarını ezberlemek yerine yerine, bu komutlar ile ilgili bilgileri içeren bir komut kümesinden yararlanması daha doğru olacaktır.

 

Assembly Dili Hakkındaki Yanlışlar ve Doğrular

Bilişim sektöründe assembly dili hakkındaki genel kanı pek olumlu değildir. Pek çok kişi ön yargılı veya yanlış bilgilenmiş olmaları nedeni ile assembly dilinde program yazmanın zor ve zaman alıcı olduğunu söyleyerek kendilerince kötülemeye çalışırlar. Oysa ortaya atılan sebepler aslında değil assembly dili, günlük hayatımızda karşımıza çıkabilecek pek çok problem için de geçerlidir. Bu nedenle bunlam sadece assembly diline mal etmeye çalışmak pek doğru bir davranış sayılmaz. Randall Hyde, 1996’da yazdığı “The Art of Assembly Language” eserinde bu dil hakkındaki yanlış ve doğruların neler olduğunu şu şekilde özetlemektedir.

 

Assembly Dili Hakkındaki Yanlışlar

. "Assembly dilini öğrenmek zordur”: Bilgi sahibi olmadığımız her şey aslında belirli bir zorluk içermektedir. Bu açıdan assembly dilini öğrenmek, ilk programlama dilini öğrenmekten daha zor sayılmaz.

. "Assembly dilini okumak ve anlamak güçtür”: Eğer okumayı bilmiyorsanız hangi programla dili olursa olsun okumak ve anlamakta zorluk çekersiniz. Hatta okunmasını ve anlaşılmasmı zorlaştıracak şekilde kodlama yapmak da mümkündür.

“ Assembly dilinde hatayı bulmak zordur”: Nasıl hata aranacağı hakkında deneyim sahibi olmayanlar için ister assembly dili olsun, ister başka bir programlama dili olsun aynı zorluklar geçerlidir.

“Assembly dilinde yazılmış programların bakımı zordur”: Aynı durum diğer programla dilleri, mesela C için de geçerlidir. Programcı bu kabiliyeti zaman içinde deneyim sahibi oldukça kazanacaktır.

“Assembly dilini kullanarak program yazmak zordur”: Assembly dilinde kod üreten programcılar önceleri ihtiyaç duydukları her parçayı kendileri yazdıkları için program geliştirme süresi uzun olmaktaydı. Ancak günümüzde yüksek seviyeli dillerde görmeye alıştığımız bazı standart program kütüphanelerinden assembly programcıları da yararlanmaktadır. Bu sayede her seferinde tekerleği yeniden icat etmek durumunda kalmayan assembly programcıları da hızlı kod üretebilmektedirler.

“Assembly dilinde programlama uzun zaman almaktadır”: Programcıların bir probleme çözüm getirmek için harcadıkları zamanın sadece %30'luk kısmı kodlama için kullanılmaktadır. Yüksek seviyeli diller ile kod üretmenin daha hızı olacağı doğru olmakla birlikte assembly dili ile kodlamanın getirilerini de göz önüne almak gereklidir.

“Gelişen derleyici teknolojileri assembly diline olan ihtiyacı ortadan kaldırmıştır”: En iyileştirici derleyicilerin (optimizing compilers) gelişmesi ile daha iyi kod parçaları üretilebilmektedir. Ancak unutulmamalıdır ki bu derleyici teknolojisinin arkasında halen assembly dili ile üretilen kodlar ve assembly dilinden elde edinilen deneyimlerin etkisi vardır.

“Günümüzde bilgisayarlar o kadar hızlanmıştır ki, hız için assembly diline olan ihtiyaç ortadan kalkmıştır.” En hızlı bilgisayarda çalışacak en hızlı programın assembly dilinde olacağı tartışılmaz bir gerçektir. Ayrıca bilgisayar biraz daha hızlı çalışsın diye ek harcama yaparak başarımını arttırmak veya bir üst modele çıkartmak yerine, programları biraz gayret ile düzenleyerek mevcut donanım üzerinde daha hızlı çalışacak şekle getirmek mümkündür.

. “Uygulamanın hızlanması için assembly dili kullanmak yerine daha iyi bir algoritma kullanılmalıdır”: Neden aynı algoritma assembly dili kullanılarak uygulanmasın?

“Günümüzde bilgisayarların bellekleri arttı ve ucuzladı. Bu nedenle yerden (bellekten) kazanmak için assembly dilini kullanmanın gereği kalmadı”: Günümüzde bir daktilo olarak kullanılan bilgisayarlarda dahi yüzlerce MB bellek kullanılmakta hatta bu bile uygulamaya göre yetersiz kalmaktadır. Bu sonu gelmeyecek bir yarış halini alacaktır.

“Assembly dili taşınabilir (portable) değildir”: Bu tamamen doğru bir tespittir. 80×86 mimarisi üzerinde çalışan bir assembly programını 68000 mimarisi üzerinde çalıştırmak mümkün değildir. Ancak taşınabilir olduğu iddia edilen C

programlama dilinde yazılmış olan bir programın bile farklı bir türde bilgisayar sistemi üzerinde ilk seferde tam olarak çalışacağının bir garantisi yoktur.

 

Assembly Dili Hakkındaki Doğrular

Hız: Assembly dilinde yazılmış programlar en hızlı programlardır. Deneyimli bir assembly programcısı, deneyimli bir C programcısının yazdığı programdan daha hızlı çalışacak kodu üretebilir. Bazı uygulamalarda bu oran 5-10 kat gibi ciddi farklara da ulaşabilmektedir.

Bellek üzerinde az yer tutma: Assembly programlar bellek üzerinde en az yer tutan programlardır. Yüksek seviyeli bir dil kullanılarak yazılmış kodun yaptığı işi yapan assembly program en az onun yarısı kadar yer kaplamaktadır. Assembly programlama yerden kazanmak, kaynakları tasarruflu kullanmak demektir. Elinizdeki program kodu 1.5 MB ise 1.44 MB diskete kopyalamazsınız veya bilgisayarınızın belleğine ne kadar büyük program yüklerseniz bellekte aynı anda o kadar az uygulama tutabilirsiniz. Sonuç olarak sisteminizin genel başarımı düşer.

. Yetenek: Assembly dili kullanılarak yüksek seviyeli diller ile yapılması çok zor hatta imkânsız olan işleri yapmak mümkündür.

. Bilgi birikimi: Assembly dili kullanımı ile elde edilecek deneyimle yüksek seviyeli programlama dilleri kullanarak daha iyi programlar yazma becerisi kazanılacaktır.

 

Neden 80×86 Assembly Dili?

Her ne kadar assembly dilinin genel mantığı her işlemci ailesinde benzer olsa

da, yazmaçlar (register), işlem yönü, adresleme teknikleri ve komut kümelerinde farklıklar vardır. Günümüzde gerek masaüstü gerek ise taşınabilir bilgisayar sistemleri incelendiğinde donanım olarak Intel firmasınca üretilmiş olan, 80×86 ailesi işlemcilerin veya bu aile ile kod uyumlu olarak çalışan AMD firmasının işlemcilerin yaygın olarak kullanıldığı görülmektedir. Assembly dilinin yaygın olarak bulunan/kullanılan platform üzerinde öğrenilmesinin ve kodlanmasının çok daha kolay olacağı dikkate alınarak, 80×86 ailesi işlemcilerin assembly dilinin  kullanılması uygun görülmüştür.

İbrahim Dursun

Facebook Sayfamizdan Bizleri Takip Edebilirsiniz
  • İbrahim Atiker

    çok güzel bir yazı dizisi olacağına inanıyorum, ellerine sağlık teşekkür ederim 🙂