|  | 
        
            | 
                    
                        | Temel Assembler Bilgisi |  |  
                        | 
	
    
		
            | Gönderiliyor lütfen bekleyin... | 
 |  | 
        
            | 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 Assemblerda 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 assemblyyi 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? Intelin işlemcileri 
ve Microsoftun işletim sistemleri tabi ki. İşte bizde Intel uyumlu ve Microsoftun 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) PCler için en popüler assemblerlar TASM, MASM ve NASM 
dır.
 
 
 
   
  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 IDEsi ile C++ uygulamaları 
geliştiriyorsanız MASM kullanmanız daha akıllıca olur, en azından
MSDNde desteği mevcut. Biz makalelerimizde hem TASM hemde MASMı 
kullanacağız. 
    | Assembler | Tam Adı | Üretici |   
    | 
		TASM | 
		Turbo 
		Assembler | Borland |   
    | MASM | Microsoft Macro Assembler | Microsoft |   
    | NASM | Netwide Assembler | LGPL |  
 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ı 
IDEler yoktur. Eskiden edit.com (DOS zamanından kalma) programını kullanırdık 
ve bu program hala windowsun tüm versiyonlarında mevcuttur.
 
 
  Şekil 2 - Edit programını çalıştırmak için 
BAŞLAT/ÇALIŞTIRdan edit.com yazıp tamama tıklayın.
 
 
  Şekil 3 - İşte en ilkel editörlerden EDIT.
 
 Yine Windowsun 
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 GVIMi 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.
 
 
  Ş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. GVIMi ç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.
 
 
 
   
  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 0lara ç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.
    | 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               
	;DOSa
 INT       
	21H                    
	;dönüş
 
 ANA
	      
	ENDP
 
 END  ANA
 
 |  
 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 - 1ler ve 0lar 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 16lı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 1den 15e 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 bite 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 binaryye 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 filelar olan klasör anlamına 
gelir buna bazı ftp sitelerinde rastlayabilirsiniz. 
    | Decimal | Binary | Hexadecimal |   
    | 0 | 0000 0000 | 00 |   
    | 1 | 0000 0001 | 01 |   
    | 2 | 0000 0010 | 02 |   
    | 3 | 0000 0011 | 03 |   
    | 4 | 0000 0100 | 04 |   
    | 5 | 0000 0101 | 05 |   
    | 6 | 0000 0110 | 06 |   
    | 7 | 0000 0111 | 07 |   
    | 8 | 0000 1000 | 08 |   
    | 9 | 0000 1001 | 09 |   
    | 10 | 0000 1010 | 0A |   
    | 11 | 0000 1011 | 0B |   
    | 12 | 0000 1100 | 0C |   
    | 13 | 0000 1101 | 0D |   
    | 14 | 0000 1110 | 0E |   
    | 15 | 0000 1111 | 0F |  
 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ğız. O vakte 
kadar hoşçakalın.
 
 
 
   
  Tablo 3 : 
Download 
    | Dosya Adı | Açıklama | Dosya |   
    | 
		tasm.zip | 
		Assembler ve Linker | Download |   
    | masm.zip | Assembler ve Linker | Download |   
    | gvim63.exe | Editör | Link |  
 
 
                Makale:Temel Assembler Bilgisi Assembly ve X86  Programlama Eren Erener
 | 
        
            |  | 
        
            |  | 
        
            | 
                    
                        
                            
                        
                            Eklenen Son 10 
                            Bu Konuda Geçmiş 10 
                        
                            Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
                         
                            Son Eklenen 10 Makale Yükleniyor
                         
                            Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
                         | 
        
            |  |