Temel Assembler Bilgisi
İlgili etiketler: assembler assembly binary bundan burada dosyasi isletim kaynak makine program programlama sistemi sisteminin uzantili width=%100 X86 Assembly Eren Erener
Yayınlanma Tarihi : 14.2.2005
Okunma Sayısı : 62276
Ana Sayfa / Makaleler / X86 Assembly / Temel Assembler Bilgisi
Assembly programlama dili, kullanılan bilgisayar sisteminin yapısına ve işletim sistemi gibi platformlara sıkı-sıkıya bağımlı bir dildir. Bu yüzden biri gelirde "ben assembly dilini biliyorum" derse sakın inanmayın :) Çünkü çok fazla şey bilmiş oluyor.
Ama o kişi X86 PC Assembly dili, Power PC Assembly dili veya 8051 Assembly dili biliyorum deseydi o zaman iş değişirdi. X86 PC Assembly dili, Power PC Assembly dili gibi bir sınıflandırma bile tam olarak her şeyi ifade etmez. Örneğin X86 PC Assembly dili donanım platformunu tanımlar ve bu donanımı çalıştıracak işletim sistemi Windows, Linux, Solaris olabilir, her bir işletim sisteminin hafızayı ele alış şekli başka olduğundan programcılar işletim sisteminin hafıza organizasyonunu göz önüne almak mecburiyetindedirler. Ayrıca kodlarınızı derlerken kullandığınız program olan Assembler'da işe ayrı bir sınırlama koyar. Örneğin donanım X86 bir PC, işletim sistemi Windows olsun, bu durumda assembler olarak Netwide kullanırsanız farklı Turbo assembler kullanırsanız farklı talimatlarla program kodu yazmak zorunda kalırsınız ve bu kodlar adı geçen assembler programları tarafından makine koduna çevrilirler. Sonuç olarak assembly dilinin programcılık açısından en büyük dezavatajı budur. Fakat assembly'yi hızlı ve özelliklede sağlam bir dil yapan unsurlarda bu dezavantajın sonucudur.
Bunca donanım ve işletim sistemi içinde acaba hangisi en çok kullanılıyor? Intel'in işlemcileri ve Microsoft'un işletim sistemleri tabi ki. İşte bizde Intel uyumlu ve Microsoft'un MSDOS ve Windows işletim sistemlerine uygun bir assembly dili üzerine makalelerimizi yazıyoruz. Yani, "Bu programa dilini zor mudur?" sorusuna, programa dilini bırak adı bile zor diyebilirsiniz. Bu yüzden assembly denildikten sonra genelde "hangi assembly?" kelimesi de konuşulur. Konuların içinde boğulup kalmamak için biz bu programlama dilinin neresindeyiz ve bundan sonra hangi rotayı izlememiz gerekiyor gibi soruları sanırım yukarıdaki paragrafta açıklamış olduk.
Umarım bundan sonra makalelerimizde assembly dili kelimesini geçtiğinde neyi anlamanız gerektiğini anlamışsınızdır. Bundan sonraki makalelerde izleyeceğimiz assembly dilinin tek bir eksik yanı kaldı işte o da hangi assembler'ı kullanacağımız.
Şekil 1 - Assembly dilinden Makine diline
X86 uyumlu (eski tabiri ile IBM uyumlu) PC'ler için en popüler assembler'lar TASM, MASM ve NASM dır.
MASM Microsoft Macro Assembler Microsoft
NASM Netwide Assembler LGPL
Tablo 1 : En Popüler Assemblerler X86 ailesi için daha başka assemblerlarda mevcut fakat en çok kullanılanlar yukarıda saydıklarımızdır. MASM ve TASM .asm uzantılı bir dosyanın içindeki assembly ifadelerini ve direktiflerini okur ve bunları makine kodlarına dönüştürür. NASM ise TASM ile MASM'ın bu yaptığına ek olarak Linux ve Unix ortamlarında da çalışır. TASM ve MASM kardeş assemblerlardır. Yazım kuralları hemen hemen aynıdır. Peki hangi assemblerı seçmeli? Aslında bu yapacağınız projeye bağlı tabiki, örneğin Visual Studio IDE'si ile C++ uygulamaları geliştiriyorsanız MASM kullanmanız daha akıllıca olur, en azından MSDN'de desteği mevcut. Biz makalelerimizde hem TASM hemde MASM'ı kullanacağız.
Sadece Assembly dili için geliştirilmiş Visual Studio.NET gibi çok kullanışlı IDE'ler yoktur. Eskiden edit.com (DOS zamanından kalma) programını kullanırdık ve bu program hala windows'un tüm versiyonlarında mevcuttur.
Şekil 2 - Edit programını çalıştırmak için BAŞLAT/ÇALIŞTIR'dan edit.com yazıp tamama tıklayın.
Şekil 3 - İşte en ilkel editörlerden EDIT.
Yine Windows'un klasik programlarından notepad (not defteri) assembly dili için başka bir seçenektir. Ama dosyalarınızı ANSI olarak kaydetmeniz gerekiyor.
Şekil 4 - Her derde deva Notepad ile programlarınızı ANSI olarak kaydetmeniz gerekiyor.
Peki bu yazıyı yazan editörün editör seçimi nedir? :) Ben sizlere GVIM'i tavsiye ediyorum. GVIM hemen hemen tüm popüler assembler söz dizimini (syntax) desteklediği gibi tüm popüler programlama dillerinin de söz dizimini destekleyen süper bir editör. TASM, MASM ve GVIM'ı bu makalenin sonundaki download kısmından edebilirsiniz.
Şimdi geçen makalemizde yazdığımız programı tekrar yazacağız ama bu sefer kaynak kodlarımız .asm uzantılı bir dosyada olacak. GVIM'i çalıştırdıktan sonra klavyeden i tuşuna basıp aşağıdaki kodları yazınız yada kaynak kod dosyasını buradan download ediniz.
MOV AH,4CH ;DOS'a
Assembly dili yazım kuralları ile program bu şekilde yazılıyor, nasıl daha önce yazdıklarımızdan biraz farklı değil mi? Tüm bu farklılıklar sadece assembler için. Assembler bu dosyayı satır satır okuyacak ve makine koduna çevrilecek kısımları algılayıp bunları 1 ve 0'lara çevirecek. Vakit kaybetmeden bu kodları program dosyası haline getirelim. Bunun için ilk önce assembler programına sahip olmamız gerekiyor. Assembler programlarından dilediğinizi buradan download ettikten sonra aşağıdaki adımları sırayla takip ediniz.
5- Program dosyası oluşturmak için .obj uzantılı dosyayı link16 merhaba.obj komutu ile link etmeniz gerekiyor. Bundan sonraki adımları enter'ı tuşlayarak geçin.
Şekil 8 - Programı çalıştırmak için dosya adını yazıp enter tuşuna basmalısınız :)
Şekil 12 - 1'ler ve 0'lar anahtarın açık yada kapalı olmasını temsil ederler
Elektrik akımlarının göremeyeceğimizden dolayı bizler bu tür olayları sembolize ederek anlayabiliriz. Elektrik akımının olmayışını 0 var olmasını ise 1 olarak kabul edince ortaya doğal olarak 2 tane rakamı olan bir sayı sistemi çıkar. Bizler 10 rakamlı sayı sistemini kullanıyoruz bilgisayar ise 2 rakamlı sayı sistemini. Bu yüzden bilgisayarda işleme sokacağımız her veriyi ikilik (binary) olarak göstermemiz gerekir. Binary sayı sistemi hacim olarak kağıt üzerinde veya ekranda fazla yer kaplar bu yüzden binary sayı sisteminin bir türevi olan 16'lık sayı sistemi daha çok kullanılır. Burada sayı sistemleri arasında nasıl dönüşüm yapıldığını anlatmayacağım çünkü az çok programlama ile uğraşanlar bunları zaten bilirler yada bu dönüşümleri hesap makinesi kullanarak yaparlar :) Yinede çok isteyen olursa anlatabilirim bunun için bu makaleye yazacağınız yorumlarda bunu belirtin.
Aşağıdaki tablo 1'den 15'e kadar decimal (onluk tabandaki) sayıların hex. ve binary karşılıklarını veriyor. Rakamlara bakacak olursanız assemblerin bunları nasıl ayırt edeceği problemini anlarsınız. Bütün rakamlar benzer sembolleri kullanıyorlar bu yüzden assembly dilinde program yazarken sayı binary ise sonuna b hexadecimal ise h ve decimal ise d (yada hiçbirşey) getirilir. Aşağıdaki tabloda binary kısım 8 haneli gösterilmiştir çünkü x86 hafızası byte adreslenebilir yapıdadır yani hafızada en küçük rakamları depolamak için bile 8 hane (digit) kullanılır. Hexadecimal değerler de binary değerlerin sanki sıkıştırılmış halidir. Herhangi bir hex. değerin 1 basamağı 4 bit'e denk gelir (nibble).
Tablo 2 : Rakam karşılık tablosu Kaynak kodumuzda sayılardan sonra kullanılan h harfleri sayıların hex. olduğunu assemblera bildirmek için kullanılmıştır. Ama isterseniz siz örneğin 21h sayısını 33 olarak doğrudan yada 0010 0001b olarak yazabilirsiniz. Nasıl yazarsanız yazın Assembler bu değerleri son olarak binary'ye dönüştürecektir, işte .exe ve .com gibi işlemci tarafından çalıştırılabilir program dosyalarına binary file denmesinin nedeni de budur. Aynı binary file sözcüğü diğer işletim sistemlerindeki işlemci tarafından doğrudan çalıştırılabilecek dosyalar içinde kullanılır. Hatta linux, unix gibi işletim sistemlerinde bin klasörü de içinde binary file'lar olan klasör anlamına gelir buna bazı ftp sitelerinde rastlayabilirsiniz.
Bir sonraki makalede en kilit konu olan hafıza ve işlemciyi anlatacağız. O vakte kadar hoşçakalın.
Assembler ve Linker
masm.zip Assembler ve Linker Download
gvim63.exe Editör Link
Tablo 3 : Download
Temel Assembler Bilgisi Assembly ve X86 Programlama Eren Erener
Okan Kaya / üye hakkında
Hocam sayı sistemlerini ve dönüşümlerini kapsamlıca bir anlatsanız.. çok müteşekkir oluruz.. nereye el atsak herkes bilindiğini varsayıyor..
Fatih Necdet Kasapoğlu / üye hakkında
bu merhaba.asm programı benim win64 bit sisteminde çalışmıyor. çalışması için ne yapmak lazım?
Ahmet MERT / üye hakkında
makale harika olmuş. eğer masm32 ve MAsmEd i kullanarak asm derleme hakkında makaleniz varsa paylaşırsanız sevinirim.
a86 assembler sadece bir assembler, yani bizim anlattığımız konularla ancak derleme düzeyinde ilişkisi var. Bu assemblerı yazan Eric Isaacson ile 2 yıl kada önce bu assemblerin full versiyonunu okulumuza bedava verebilirmisin diye sormuştum ve olumsuz yanıt almıştım. Kendisinin dediğine göre masm ve tasm dan daha optimal kod üretiyormuş, ama ayrıntılı bir şekilde demene fırsatım olmadı. Çok çok da iyi olsa ancak makine koduna çevirme sürecinde performans sağlar.
Güneş Kahraman / üye hakkında
Makaleleriniz çok güzel ve öğretici olmuş ancak ben A86 assembler ile ilgili bir yazı göremedim. Eğer sizin için zahmet olmazsa bu assembler hakkında da bilgi verebilir misiniz? Elinize sağlık. Teşekkürler
SELÇUK HAN / üye hakkında
Sana nekedar teşekkür etsem azdır valla..... allah razı olsun......
sdc sdc / üye hakkında
Helal olsun valla. Bir makale ancak bu kadar acik,net ve eglenceli yazilabilir.
Bahattin Kayı / üye hakkında
Ustam öncelikle emeğine ve bileğine sağlık. Bu dili öğrenmek istiyorum ve hiç bir programlama dili bilmiyorum. siz neler tavsiye edersiniz. hangi kitap vs.. gibi. maille bildirirsen sevinirim. şimdiden teşekkür ederim. Allah ne muradın varsa versin :) bkysys@hotmail.com
emre kanca / üye hakkında
eren harbi diom asm derslerin güzel olmuş ellerine sağlık dostum
serkan bediz / üye hakkında
asemmly benim hayatımı değiştirdi. yeni bir dünyanın kapısı araladım.birler ve sıfır okadar hoş dizilmişki adeta lirik bir şiir. vurgu ton hiç bişe gerekmiyor. birler ve sıfırlar şimdi bir aşkı anlar gibi.makina dili benim ana dilim değil ama yabancı dil olarak öğrenmek istiyorum b
selda özçınar / üye hakkında
Merhaba eren bey makalelerinizi büyük bir dikkatle takip ediyorum.Anlaşılır bir şekilde bizi aydınlattığınız için teşekkür ederim.başarılarınızın devamını dilerim.
adem arslan / üye hakkında
Hocam teşekkür ederiz.Gerçekten elinize sağlık.Her şey üniversitede öğreniliyor ama programlama sanatını dışarda öğrenen insanlar için bu anlattığınız bilgiler üniversitede kalıyor.Ama sizin gibi mütevazi ve bilgi paylaşımına değer veren insanlar sayesinde bizlerde bu akademilerde kalan bilgileri öğrenmiş oluyoruz.Tekrar teşekkür ederiz başarı ve mutluluklar dileriz
Neyin nasıl çalıştığını bilmek açısından her programcının aslında bilmesi gereken konular bunlar. Çoğu zaman üniversite sıralarında öğreneileceğimiz bu değerli bilgileri buradan bizimle paylaştığınız için teşekkür ederim. Assembly dilini merak edip te bir türlü öğrenemeyen kişiler için çok güzel bir yazı dizisi sunuyorsunuz. Elinize ve klavyenize sağlık.