TheOttoman
Aileden
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 J 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 ve Ergenekon üstadın akademisinden de bu makaleyi okuyarak çok daha fazla istifade edeceğ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ı zatenJAnaliz 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
Binary
Değeri
Ondalık
Değeri
Hexadesimal
Rakam
Binary
Değeri
Ondalık
Değeri
0
0000
0
8
1000
8
1
0001
1
9
1001
9
2
0010
2
A
1010
10
3
0011
3
B
1011
11
4
0100
4
C
1100
12
5
0101
5
D
1101
13
6
0110
6
E
1110
14
7
0111
7
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.Rakam
Binary
Değeri
Ondalık
Değeri
Hexadesimal
Rakam
Binary
Değeri
Ondalık
Değeri
0
0000
0
8
1000
8
1
0001
1
9
1001
9
2
0010
2
A
1010
10
3
0011
3
B
1011
11
4
0100
4
C
1100
12
5
0101
5
D
1101
13
6
0110
6
E
1110
14
7
0111
7
F
1111
15
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.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.
Ş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…2-Onluk (Decimal)Sayı sistemleri ve
3-Onaltılık (Hexdecimal) Sayı sistemleri.
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 J
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 :