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.



Assembly dili diye bir şey yok!



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.


Hangi ASSEMBLER?

Assembler bir çeşit programdır ve assembly kodlarını makine kodlarına çevirir.



Ş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.



Assembler Tam Adı



Üretici:Tasm





urbo Assembler

BorlandMASMMicrosoft Macro AssemblerMicrosoftNASMNetwide AssemblerLGPLTablo 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.



Artık Programlarımızı Assembly Dilinde Yazıyoruz!



Hangi Editörü Kullanmalı?



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 5 - Gvim ile assembly kodlarını yazmak daha kolay, programı çalıştırdıktan sanra yazma moduna geçmek için klavyeden i tuşuna basmanız gerekiyor.



Editör programlarını kısaca tanıttık dan sonra artık gvim ile örnek bir assembly program yazabiliriz.



Nihayet Assembly



Ş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.



TITLE Merhaba Assembly (merhaba.asm)

;########################################

;# Bu program ekranda Merhaba Assembly yazısını gösterir #

;# Son Güncelleme: 14/02/05 #

;# Yazan --> Eren ERENER #

;########################################



.MODEL SMALL

.STACK 32

.DATA



Dizi DB "Merhaba Assembly",0Ah,0Dh,24h



.CODE



ANA PROC



MOV AX, @DATA ;Data segment

MOV DS, AX ;ayarlanıyor.



MOV CX, 0Ah ;Sayaç=10.

ONDEFA: MOV AH, 9 ;Ekrana,

MOV DX, OFFSET Dizi ;string,

INT 21h ;yazdırılıyor.

LOOP ONDEFA ;Bu işlem 10 defa tekrarlanacak.



MOV AH,4CH ;DOS’a

INT 21H ;dönüş



ANA ENDP



END ANA

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.




MASM ile derleme işlemi

1- masm.zip dosyasının içeriğini C sürücüsüne (yada istediğiniz herhangi bir sürücüye mesela burada E:\ sürücüsü örnek olarak verilmiştir) açınız,

2- merhaba.asm dosyasını da bu klasöre kopyalayınız,




Şekil 6 - Çalışmalarınız bir klasör içinde olsun



3- ml/c dosyaadi.asm şeklinde kaynak kodunuzu assembly ediniz,

4- Bu işlemin sonunda assembler merhaba.obj adında bir obje dosyası oluşturur,

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 7 - MASM ile assembly ve link işlemleri



6- Programınızı dosya adını yazarak çalıştırabilirsiniz.



Şekil 8 - Programı çalıştırmak için dosya adını yazıp enter tuşuna basmalısınız



TASM ile derleme işlemi



1- tasm.zip dosyasının içeriğini C sürücüsüne (yada istediğiniz herhangi bir sürücüye mesela burada E:\ sürücüsü örnek olarak verilmiştir) açınız,

2- merhaba.asm dosyasını da bu klasöre kopyalayınız,






Şekil 9 - Çalışmalarınız bir klasör içinde olsun



3- tasm dosyaadi.asm şeklinde kaynak kodunuzu assembly ediniz,

4- Bu işlemin sonunda assembler merhaba.obj adında bir obje dosyası oluşturur,

5- program dosyası oluşturmak için .obj uzantılı dosyayı tlink merhaba.obj komutu ile link etmeniz gerekiyor.





Şekil 10 - TASM ile assembly ve link işlemleri



6- Programınızı dosya adını yazarak çalıştırabilirsiniz.




Şekil 11 - Başardık programımız çalışıyor



Dikkat ederseniz her iki assemblerda aynı kaynak kodunu derledi ve sonunda .exe uzantılı bir program dosyası oluşturdu bu assemblerları değişik parametrelerle kullanıp .com türünden dosyalarda oluşturabiliriz. Aslında ben bu kaynak kodunu TASM için yazmıştım ama önceden de dediğim gibi iki assemblerın da çok fazla ortak yanı vardır fakat bu aynı oldukları anlamına gelmez ve her zamanda aynı kaynak kodunu derlemeyebilirler. Buradaki basit bir program olduğundan sorun çıkmadı ve biz uzun bir süre böyle basit programcıklar yazacağız. Bu yüzden şu anda derleme aşamasında hangi assemblerı kullandığınızın pek bir önemi yok.



Burada download ettiğiniz assembler ve linker programları TASM ve MASM paketinin içinden alınmış dosyalardır. Daha sonra tüm paketi vereceğim şimdilik bu kadarı yeterli.



Şimdi kaynak kodlarımızı bir daha gözden geçirelim ve dikkatimizi rakamların sonundaki h harfine odaklayalım. h harfi burada rakamın veya sayının hexadecimal (16lık sayı sistemi) olduğunu gösterir. Biz debug ile program yazarken bunu belirtmemiştik çünkü debug her yazılan sayıyı hex. olarak (daha doğrusu binary olarak) kabul eder. Bu makalemize sayı sistemlerine kısaca inceleyerek son vereceğiz. Kaynak kodumuzu satır satır anlatmamı bekliyor olabilirsiniz ama bu işlemci kaydedicileri ve x86 hafıza yapısını öğrenmeden bu iş biraz zor.


Bilgisayar Aritmetiği





Genelde programcılık derslerinin ilk ve sıkıcı konularındandır sayı sistemleri, bunu nedeni; bu sayı sistemlerinin ne için kullanıldığının tam kavranamamasından kaynaklanır. Aslında işlemci sayılardan falan anlamaz, sadece elektrik akımın var yada yok olması temeline göre çalışırlar. Hani duymuşsunuzdur pentium işlemcinin içinde bilmem kaç milyon tane transistör var diye işte elektrik akımları bu transistörler aracılığı ile kontrol edilir. Transistör yarı iletken bir elektronik devre elemanıdır ve her modern elektronik cihazın içinde bulunur. Birçok kullanım alanı olan transistörler bilgisayarlarda anahtarlama elemanı olarak kullanılırlar.







Ş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).



Decimal

Binary

Hexadecimal00000 00000010000 00010120000 00100230000 00110340000 01000450000 01010560000 01100670000 01110780000 10000890000 100109100000 10100A110000 10110B120000 11000C130000 11010D140000 11100E150000 11110F

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.



Assembly dilinde özellikle bir program dosyasının kodlarını incelerken debugger programlarında görebileceğiniz yegane sayılar hexadecimal olduğundan dolayı bu sayı sistemini iyi bilmeniz gerekiyor diyorum ve bu makaleyi de burada sonlandırıyorum.



Bir sonraki makalede en kilit konu olan hafıza ve işlemciyi anlatacağım. O vakte kadar hoşçakalın.





Download:http://www.csharpnedir.com/Mimages/asm/m3/tasm.zip

Assembler ve Linkler:http://www.csharpnedir.com/Mimages/asm/m3/masm.zip

gvim63.exeEditör:http://www.vim.org/download.php#pc



Makale:

Temel Assembler Bilgisi Assembly ve X86 Programlama

İyi forumlar/ ediz