|
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.
Assembler
|
Tam Adı
|
Üretici |
TASM
|
Turbo
Assembler
|
Borland |
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 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.
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.
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
|
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.
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).
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 |
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.
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.
Dosya Adı
|
Açıklama
|
Dosya |
tasm.zip
|
Assembler ve Linker
|
Download |
masm.zip |
Assembler ve Linker |
Download |
gvim63.exe |
Editör |
Link |
Tablo 3 :
Download
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
|
|