ASSEMBLY PROGRAMLAMA DİLİ (BÖLÜM-1)
GİRİŞ :
Evet arkadaşlar Bismillah diyerek başlıyoruz.CW (Cyber-Warrior
)için yazdığım bu makaleyi Assembly dilini çok iyi bilen biri olarak
DEĞİL , ÖĞRENEN biri olarak anlattım ve mümkün olduğu kadar açıklayıcı
ve basite indirgemiş şekilde anlatmaya çalıştım, çünkü bu makaleyi
programlamayla iyi bir şekilde uğraşan arkadaşlar la beraber
programlamayla amatör şekilde uğraşan arkadaşlarımız da okuyacaktır.Bu
nedenle oldukça basit bir şekilde anlatım yaptığıma inanıyorum.Aynı
zamanda hiç programlama bilgisi olmayan arkadaşlarda bu yazıyı
okuyacaklardır ,fakat “Bu da ne böyle ,bu nasıl dildir”diyeceklerine de
eminim Ama tekrar yapılarak ve azimle onlarında öğreneceğinden
eminim.Bu makalenin sonunda uzman bir assembler programcısı olacağınızı
elbette ki söyleyemem ,fakat assembly hakkında çok şey öğreneceğinizden
de eminim.Assembly biraz karmaşık gibi görünebilir,çünkü makinenizin
yani bilgisayarınızın anladığı asıl dil bu diyebiliriz.Diyebiliriz
diyorum çünkü aslında CPU yani işlemciniz Binary sayılar dediğimiz
ikili sayı ( 1 ve 0 ) sisteminden başka bir dilden anlamaz.Bu sayıları
ve dönüşümlerini ileriki konularda anlatacağım zaten bu nedenle üstünde
durmuyorum.
Aslında üst düzey hangi programlama dilini kullanırsanız kullanın
,hepside sonunda kullandığınız prog.dilinin compiler’i (derleyici)
tarafından makine diline çevrilir. Yani 1ve 0 (sıfır)’ lara .1’in
mantığına “akım var”, 0 ‘ın mantığı’na da “akım yok” diyebiliriz,kısaca
makine bu dilden anlar, ve yine kısaca makineler aptaldır ama çok seri
ve hızlıdırlar diyebiliriz. O zaman neden assembly öğrenmeyesiniz ki?
Evet dersimize geçiyoruz .
ASCII :
Arkadaşlar bir byte ile temsil edilen harfler için kullanılan en yaygın
ASCII (Ameri can Standard Code for Infırmation Interchange) kod
standardıdır. Herhangi bir *.exe dosyasına debugger (editor) ile
baktığınız zaman ,o dosyanın içerisinde bir çok karmakarışık semboller
,işaretler ve karakterler görürsünüz.Bunlar Ascii kod karakter setinde
ki rakamlara karşılık gelen harfler veya sembollerdir.Ascii tüm
ülkelerde standart hale getirilmiş kod setleri olup,sizin kullandığınız
bilgisayarlarda ve cep telefonlarında da bu standart kodlar
kullanılır.Bu kodlar 0-255 arası değişik karakterlere ,harflere ve
sayılara sahiptir.Mesela bizim kullandığımız 1 rakamını karşılığı Ascii
33 ‘tür.Büyük harfler 65 ‘den başlar ,küçük harflerde 97 ‘den başlayıp
122 ‘ye kadar devam eder.Aşağıda ki,
Sayılar: Harfler:
32=0 65=A 97=a
33=1 66=B 98=b
34=2 67=C 99 =c
35=3 68=D 122=z
gibi örnekler verebiliriz.Bunların dışında kalan karakterler ise
değişik sembolleri ( ?,*,-,!,é,+) ve sesleri(Beep sesi mesela) ve
ayrıca satır başı,boşluk karakteri gibi işlerin karşılığıdır.
BINARY (İKİLİ SAYI SİSTEMLERİ ) :
Arkadaşlar yazıya başlarken makinelerin aslında 1 ve 0 (sıfır) dan
başka bir şeyi anlamadığını söylemiştik.Çünkü makineler devrelerinde
akım geçer veya geçmez mantığını kullanır.Dolayısıyla 1 için “akım
vardır”,0 içinse “akım yoktur” deriz.Veya 1 için Açık,0 için Kapalı
diyebiliriz.İşte bu 1 ve 0 ların her birine bit ,bu bitlerin 8
tanesinin bir araya gelip oluşturdukları gruba da bayt diyoruz
arkadaşlar.Görüldüğü gibi 1 ve 0 dan oluşan sadece 2 tane sayımız var
,işte bu nedenle bu sayılara da Binary (ikili sayılar) deniyor.CPU da
yani mikro işlemcide birçok işlemlerini bu bitler üzerinde yapar.Bu
kısa tarifleri yeterli bularak bunlarla yapılan işlemlere geçiyorum.
Binary sayılar 0-255 arası değer alırlar.
00000000=0 11111111=255
(Ascii değer de 255 değer alıyordu)
8 tane bit bir araya gelip 1 baytı oluşturuyor demiştik yukarıda ,eğer
bunlar işaretli bir sayı olacak olsaydı o zamanda –(eksi) 127 ile + 128
arasında değer alacaklardı bi nevi ikiye bölünmüş olacaktı..2 Byte lık
yani 16 bitlik(word) sayının alacağı değer normal de 65535 tir.Negatif
bir sayı alması durumunda ise bir yarısı -32768 ile diğer yarısı +32767
arasında olur,bunların nasıl bu değerleri aldığını görelim.Lutfen
burayı iyi takip edin çünkü sayı sistemlerin de Binary sayı mantığını
anlamanız size çok büyük kolaylıklar sağlayacak.
1-) 1-1-1-1-1-1-1-1 daima hesaplamaya sağdan başlıyoruz aynen onluk düzende olduğu gibi;
1*1 - 1*2 – 1*4 – 1*8 – 1*16 – 1*32 – 1*64 – 1*128
2 ve 2 nin katları şeklinde hesaplıyoruz
1+2+4+8+16+32+64+128 = 255
Çarpım sonuçlarını sadeleştiriyor ve topluyoruz sonuç =255
Not: Unutmadan söyleyeyim sağdaki ilk rakamı hep 1 ile çarparız daha
sonra kullanılan sayı sisteminin katları ile çarparız.Bu Onluk düzende
de,Onaltılık düzende de aynıdır,değişmez.Mesela Onluk düzen hep şu
şekilde gider 1-10-100-1000- 10000 gibi 10 sayısının katları şeklinde
ilerler.İkilik düzende de aynıdır yani; 1-2-4-8-16-32 gibi 2 ve 2 ‘nin
katları şeklinde gider.
2-) Peki şöyle bir şey olsaydı 00101100 yine aynı işleme tabi tutardık elbette , evet yapalım ;
Dikkat sayının sağından başlıyorum
0*1- 0*2 - 1*4 -1*8 - 0*16 - 1*32
diğer sıfırları çarpmaya gerek yok çünkü sonuç sıfır olacaktır.
0 + 0 + 4 + 8 + 0 +32 = 44
sadeleştirip topladık sonuç = 44.
Anlaşılması açısından 0*1 ve 0*2 yi ekledim yoksa bunları katmadan çıkan sonuçları toplayıp sonucu bulabilirsiniz.
Onluk Sayıyı Binary’e Çevirme :
Evet arkadaşlar bunuda hemen bir örnekle anlatmadan önce şunu
hatırlatayım ,sayımız zaten 1 ve 0 dan oluşuyor onun için bu sayıyı 2
ye böleceğiz ve bunu bulmak çok kolay olacak Ayrıca bir hatırlatma eğer
tam bölünme oluyorsa 0 ,kalanlı bölünüyorsa 1 olarak yazılır çünkü bir
sayı 2 ye ya tam bölünür yada kalanlı bölünür.Yukarıdaki sayımızın
Binary karşılığını bulalım yani 44 sayının.
44 / 2 0
22 / 2 0
11 / 2 1
5 / 2 1
2 / 2 0
1 / 1 1 Kalan 1 sayısı aynen alınır.
Bu sayıyı ters çevirip aldığımızda 101100 böyle bir sayı çıkar.Bunu
yukarıda göstermiş olduğum şekilde hesaplarsanız sağlamasını da yapmış
olacaksınız.Başka bir örnek;
23 /2 1
11 /2 1
5 /2 1
2 /2 0
1 /1 1 Kalan 1 sayısı aynen alıyoruz çünkü 2 ye bölemeyiz.
Bu sayıyı ters çevirip aldığımızda 10111 böyle bir sayı çıkar ki bunu
da 1+2+4+0+16= 23 bu şekil de topladığınız zaman sonucun 23 olduğunu
göreceksiniz.
ONLUK SAYILAR (DECIMAL) :
Bu sayı sistemini aslında hepimiz biliyoruz arkadaşlar.Gündelik
yaşantımızda ,okulda, işte kısaca her yerde kullandığımız sayı
düzeni.Ama ikili sayı sisteminin anlaşılması açısından kısaca bu sayı
sistemine değinerek geçeceğim.Bu sayılarda kendi arasında 10 ve 10’un
katları şeklin de ilerler.
8452 sayısını ele alalım bu sayıda ne var?Aslında hiçbir şey yok normal bir sayı zatenAnaliz edelim hemen ;
Sağdan başlıyoruz : 2 tane 1 var,5 tane 10 ,4 tane 100 ,8 tane 1000
var.Dikkat ettiniz mi; 1-10-100-ve 1000 diye gittik.Yani 2*1 + 5*10 +
4*100 + 8*1000 =8452 umarım ikilik sayı düzeni bu örnekle daha iyi
anlaşılır.
ONALTILIK SAYILAR ( HEXDECİMAL ):
Bunu aşağıdaki gibi örnekle açıklayalım bir .exe dosyasına
baktığımız zaman A harfinin karşılığını 65 değerinde değil de, 41
değerinde görürüz.Halbuki A ‘nın Ascii kod karşılığı 65 di.Peki bu
neden böyle oluyor?
Bunun nedeni arkadaşlar bilgisayarın ilk çıktığı dönemlerde
programcılar Binary kodlarla (ikili sayılar) çalışmak
zorundaydılar.Çünkü bilgisayar bu dilden başka bir dil
anlamıyordu.Düşünün bir kere 11001010 gibi bir sayı sistemi ile ne
şekilde çalışabilir ve hatasız bir kod nasıl çıkarabilirsiniz.İşte bu
durum da program uzmanları ortaya bir buluş atmışlar . Bildiğiniz gibi,
dört bit ikilik değerleri 0000 ile 1111 arasında (ondalık 0 ile 15
değerleri arasına eşittir), 16 olası kombinasyonun bir toplamı olarak
gösterir. Eğer sayma sistemi bu 16 kombinasyonda gösterirse, 16 rakama
sahip olmalıdır. Bu da bir “taban 16 sistemi” olmalı.Bu durumda
programcılar bir nebze olsun daha rahat çalışsın diye bu sayı sistemini
geliştirmiş ve adına Yunan sözcüğü olan “hex” (6 için) ile bir Latin
sözcüğü olan “decem” (10 için) birleşimiyle oluşan “hexdecimal –
(hexdesimal)” ismiyle isimlendirmişler. Bu sayede taban 16 sistemine
“hexadesimal” (onaltılı) sayı sistemi dendi.
Böylece 1 ve 0 dünyasından kendilerini kurtarmış oldular .Dikkat edin
kendilerini kurtarmışlar bilgisayarı değil.Dedik ya makineler sadece 1
ve 0 ‘ı anlar diye.
İşte yukarıdaki resimde gördüğünüz 41 sayısıda “A” harfinin 16 lık sayı
sistemindeki karşılığıdır.Böylece kodlar 2 sıralı halde ve düzgün bir
görünüme kavuşuyor.
ASSEMBLY ise Binary sayılarla olsun,Hexdecimal sayılar olsun bunların
tümünün ,CPU yu görevlendirmek için oluşturdukları sayısal komutların
sembolik karşılığıdır diyebiliriz.Çünkü her ne komut verirseniz verin
bunların tamamı CPU ya bir sayısal değer olarak (1,0)gidecektir.
Onaltılık sayı tablosu
Hexadesimal Rakam BinaryDeğeri Ondalık Değeri
0 0000 0
1 0001 1
2 0010 2
3 0011 3
4 0100 4
5 0101 5
6 0110 6
7 0111 7
8 1000 8
9 1001 9
A 1010 10
B 1011 11
C 1100 12
D 1101 13
E 1110 14
F 1111 15
Tabloda gördüğünüz gibi 1,2,3,4,5,6,7,8,9 ‘dan sonra
A,B,C,D,E,F,10,11,12 diye devam ediyor.Onluk düzende bildiğimiz
sayılarla hemen hemen aynı sadece araya 6 tane harf girmiş. Burada
görüldüğü gibi onaltılık sistem her 16 sayı sonrası basamak atlatıyor.
Ayrıca a,b,c,d,e,f olmak üzere 6 tane daha fazladan sayıya sahip. O
zaman onaltılık bir sistemde değer 10 ise onluk sistemde o sayı 16
demektir. Yani 16 nın katları olarak artmaktadır.Kafanız karışmasın
hemen bir örnekle gösterelim.
0Fh = 15
10h = 16
20h = 32
30h = 48
F4h = 244
Açıkladığım gibi bu sayılarda 16 ve 16’nın katları şeklinde ilerliyor
,tıpkı Onluk düzende 10 ve 10 ‘un katları şeklinde ilerlediği
gibi.Yukarıdaki örnekte dikkatinizi çektiyse ,soldaki rakamların
sonunda küçük “h” harfi var.Bunu hesaplamalarda dikkate almayın sadece
o sayının Hexdecimal bir sayı olduğunu gösteriri ki CPU bu sayıyı onluk
düzendeki bir sayı gibi algılamasın.Normalde bundan sonra bu “h”
harfini kullanacağımız için bu ne demek oluyor diye takılmayın.
Assembler programlarında kullanılan sayılar şu şekillerde simgelenerek
birbirinden ayrılırlar:
1010b sonundaki “b” harfi Binary sayı olduğunu;
2359d sonundaki “d” harfi Decimal yani onluk bir sayı oldugunu
4FA1h sonundaki “h” harfi HexDecimal yani Onaltılık bir sayı olduğunu gösterir.
- ’d’ harfi yada harfsiz bu bildiğimiz onluk sistemde demektir. Eğer
bir kaynak kodunda sayının yanında (önceden bütün sayıların hex
olacağını belirten .radix16 gibi bir komut kullanılmamışsa) hiçbir
simge yoksa o sayı göründüğü değerinde bildiğimiz onluk tabanda bir
sayıdır. Ama eğer onaltılık kurallarıyla yazılmış (a,b,c,d,e,f
içerikli) ve yanında hiçbir işaret yoksa derleyici burada ’illegal
number’ şeklinde bir hata mesajı verir.
Şimdiye kadar görmüş olduğumuz sayı sistemlerini kısaca hatırlayalım;
1-Binary (ikilik) Sayı sistemleri
2-Onluk (Decimal)Sayı sistemleri ve
3-Onaltılık (Hexdecimal) Sayı sistemleri.
Öncelikle şunu belirtmem gerekiyor arkadaşlar ; onluk zaten
biliyoruz ama onaltılık ve ikilik sistem mutlaka bilinmesi gerekiyor.
Programlarınızda, denemelerinizde hep bu sistemler kullanılacak.
Komutlar hep bu sistemlere göre çalışacak ve bazıları sadece bu
sistemlerdeki değerlere göre hareket edecek. Bunun için bir assembler
programcısının mutlaka bu sistemleri bilmesi ve kullanması
gerekiyor.Aşağıdaki konuyla bu konuları daha iyi bir şekilde pekiştirip
bitireceğiz…
Onaltılık Sayıyı Onluk Sayıya Çevirme :
Arkadaşlar Onaltılık (Hexdecimal) bir sayıyı ,Onluk (Decimal ) bir sayıya 2 şekilde çevirebiliriz.
1.olarak aşağıda anlattığım şekilde çevirebilirsiniz.
2.olarak da bununla kim uğraşır diyerek, Windows ’un hesap makinesini kullanıp çevirebilirsiniz
Ben yine de 1. olarak bahsettiğim şekliyle açıklayayım..Arkadaşlar
yukarılarda ikili ve onlu sayı sistemlerini anlatırken birinci basamak
her zaman kendi değerindedir demiştik.Burda da aynı kural geçerli yani
sayı 0ah,0bh,0ch.. olsa bile onluk sisteme çevirilince birlik basamak
olarak diğerlerine eklenir. Diğer basamaklarda aynı bildiğimiz
matematik kurallarında olduğu gibi basamak çarpanı esas alınarak
çarpılır. Nasıl ki 8452 sayısının 8*1000+4*100+5*10+2*1 olduğunu
biliyorsak onaltılık sistemde de bu kuralın böyle olduğunu biliriz.Kısa
bir örnekle acıklayalım;
FA5h sayısını ele alalım ve analiz edelim.Burda ilk önce 5 sayısını 1
le ,A’nın (Onaltılık sistemde) sahip olduğu değeri 16 ile , F’nin
(Onaltılık sistemde) sahip olduğu değeri de 16 ‘nın bir sonraki katı
ile yani 256 ile çarpacağız.Devam edelim,
Sağdan başlayarak yapıyorum yine ;
5*1 + A*16 + F*256 şimdi A ile F nin yerlerine Hexdecimal değerleri koyalım
5*1 + 10*16 + 15*256
Yukarıda ki tabloda A’nın hex karşılığını 10 , F nin hexdec.karşılığını
ise 15 olarak göstermiştik.Sonuçları toplayalım o zaman ,
5 +160 + 3840 = 4005 olarak sonucu bulmuş oluruz.Biraz zor gibi
görünebilir ama ben mümkün olduğu kadar sadeleştirip anlattım.Zaten 1
veya 2 deneme yaparsanız mantığı kavrarsınız arkadaşlar.Aşağıdaki
katlara bakınca daha iyi anlayacağınızı ümit ediyorum….
Onluk Sistem : Onaltılık Sistem :
1 1
10 16
100 256
1000 4096
10000 65535
Gördüğünüz gibi 4005 gibi Onluk düzendeki büyük bir değeri Onaltılık
sayı sistemine göre sadece FA5 diyerek gösteriyoruz.Bunun bize ne kadar
büyük bir kolaylık getirdiğini ve Hexdecimal sayıların neden
kullanıldığını anlamış olduğunuz kanaatindeyim.
Buraya kadar anlattığım yerleri eğer anlamak ta güçlük çekiyorsanız ;
tekrar bu makaleyi baştan okumanızı tavsiye ederim çünkü gerçekten
okudukça kolay olduğunu göreceksiniz,ama yok eğer buraya kadar
anlatılanlardan bir harf dahi anlamadım diyorsanız,size buradan
itibaren bırakmanızı tavsiye ederim çünkü bundan sonraki Registerler ve
Komutların çalışma prensibini anlamak ta çok daha zorlanırsınız.Bilen
ve bunlar çocuk oyuncağı diyen arkadaşlar varsa da onlar için devam
edeceğim.Bir sonraki konularımız Registerler ve Komutlar.