Assembly Programlama Dili (Bölüm-1)

Programlama ve Script dilleri konusunda bilgi paylaşım alanıdır.
Cevapla
Kullanıcı avatarı
mayhemious
Kilobyte4
Kilobyte4
Mesajlar: 711
Kayıt: 17 Kas 2007, 13:14
cinsiyet: Erkek

Assembly Programlama Dili (Bölüm-1)

Mesaj gönderen mayhemious »

GİRİs :



Evet arkadaslar yazdıgım bu makaleyi Assembly dilini çok iyi bilen biri olarak DEĞİL , ÖĞRENEN biri olarak anlattım ve mümkün oldugu kadar açıklayıcı ve basite indirgemis sekilde anlatmaya çalıstım, çünkü bu makaleyi programlamayla iyi bir sekilde ugrasan arkadaslar la beraber programlamayla amatör sekilde ugrasan arkadaslarımız da okuyacaktır.Bu nedenle oldukça basit bir sekilde anlatım yaptıgıma inanıyorum.Aynı zamanda hiç programlama bilgisi olmayan arkadaslarda 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 ögreneceginden eminim.Bu makalenin sonunda uzman bir assembler programcısı olacagınızı elbette ki söyleyemem ,fakat assembly hakkında çok sey ögreneceginizden de eminim.Assembly biraz karmasık gibi görünebilir,çünkü makinenizin yani bilgisayarınızın anladıgı asıl dil bu diyebiliriz.Diyebiliriz diyorum çünkü aslında CPU yani islemciniz Binary sayılar dedigimiz ikili sayı ( 1 ve 0 ) sisteminden baska bir dilden anlamaz.Bu sayıları ve dönüsümlerini ileriki konularda anlatacagım zaten bu nedenle üstünde durmuyorum.

Aslında üst düzey hangi programlama dilini kullanırsanız kullanın ,hepside sonunda kullandıgınız prog.dilinin compiler’i (derleyici) tarafından makine diline çevrilir. Yani 1ve 0 (sıfır)’ lara .1’in mantıgına “akım var”, 0 ‘ın mantıgı’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 ögrenmeyesiniz ki? Evet dersimize geçiyoruz .



ASCII :

Arkadaslar 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ıgınız zaman ,o dosyanın içerisinde bir çok karmakarısık semboller ,isaretler ve karakterler görürsünüz.Bunlar Ascii kod karakter setinde ki rakamlara karsılık gelen harfler veya sembollerdir.Ascii tüm ülkelerde standart hale getirilmis kod setleri olup,sizin kullandıgınız bilgisayarlarda ve cep telefonlarında da bu standart kodlar kullanılır.Bu kodlar 0-255 arası degisik karakterlere ,harflere ve sayılara sahiptir.Mesela bizim kullandıgımız 1 rakamını karsılıgı Ascii 33 ‘tür.Büyük harfler 65 ‘den baslar ,küçük harflerde 97 ‘den baslayıp 122 ‘ye kadar devam eder.Asagı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ısında kalan karakterler ise degisik sembolleri ( ?,*,-,!,é,+) ve sesleri(Beep sesi mesela) ve ayrıca satır bası,bosluk karakteri gibi islerin karsılıgıdır.



BINARY (İKİLİ SAYI SİSTEMLERİ ) :



Arkadaslar yazıya baslarken makinelerin aslında 1 ve 0 (sıfır) dan baska bir seyi anlamadıgını söylemistik.Çünkü makineler devrelerinde akım geçer veya geçmez mantıgı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.İste bu 1 ve 0 ların her birine bit ,bu bitlerin 8 tanesinin bir araya gelip olusturdukları gruba da bayt diyoruz arkadaslar.Görüldügü gibi 1 ve 0 dan olusan sadece 2 tane sayımız var ,iste bu nedenle bu sayılara da Binary (ikili sayılar) deniyor.CPU da yani mikro islemcide birçok islemlerini bu bitler üzerinde yapar.Bu kısa tarifleri yeterli bularak bunlarla yapılan islemlere geçiyorum.

Binary sayılar 0-255 arası deger alırlar.

00000000=0 11111111=255 (Ascii deger de 255 deger alıyordu)



8 tane bit bir araya gelip 1 baytı olusturuyor demistik yukarıda ,eger bunlar isaretli bir sayı olacak olsaydı o zamanda –(eksi) 127 ile + 128 arasında deger alacaklardı bi nevi ikiye bölünmüs olacaktı..2 Byte lık yani 16 bitlik(word) sayının alacagı deger normal de 65535 tir.Negatif bir sayı alması durumunda ise bir yarısı -32768 ile diger yarısı +32767 arasında olur,bunların nasıl bu degerleri aldıgını görelim.Lutfen burayı iyi takip edin çünkü sayı sistemlerin de Binary sayı mantıgını anlamanız size çok büyük kolaylıklar saglayacak.



1-) 1-1-1-1-1-1-1-1 daima hesaplamaya sagdan baslıyoruz aynen onluk düzende oldugu gibi;

1*1 - 1*2 – 1*4 – 1*8 – 1*16 – 1*32 – 1*64 – 1*128

2 ve 2 nin katları seklinde hesaplıyoruz

1+2+4+8+16+32+64+128 = 255

Çarpım sonuçlarını sadelestiriyor ve topluyoruz sonuç =255

Not: Unutmadan söyleyeyim sagdaki 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,degismez.Mesela Onluk düzen hep su sekilde gider 1-10-100-1000- 10000 gibi 10 sayısının katları seklinde ilerler.İkilik düzende de aynıdır yani; 1-2-4-8-16-32 gibi 2 ve 2 ‘nin katları seklinde gider.



2-) Peki söyle bir sey olsaydı 00101100 yine aynı isleme tabi tutardık elbette , evet yapalım ;

Dikkat sayının sagından baslıyorum

0*1- 0*2 - 1*4 -1*8 - 0*16 - 1*32

diger sıfırları çarpmaya gerek yok çünkü sonuç sıfır olacaktır.

0 + 0 + 4 + 8 + 0 +32 = 44

sadelestirip topladık sonuç = 44.

Anlası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 arkadaslar bunuda hemen bir örnekle anlatmadan önce sunu hatırlatayım ,sayımız zaten 1 ve 0 dan olusuyor onun için bu sayıyı 2 ye bölecegiz ve bunu bulmak çok kolay olacak Ayrıca bir hatırlatma eger 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 karsılıgı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ıgımızda 101100 böyle bir sayı çıkar.Bunu yukarıda göstermis oldugum sekilde hesaplarsanız saglamasını da yapmıs olacaksınız.Baska 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ıgımızda 10111 böyle bir sayı çıkar ki bunu da 1+2+4+0+16= 23 bu sekil de topladıgınız zaman sonucun 23 oldugunu göreceksiniz.



ONLUK SAYILAR (DECIMAL) :



Bu sayı sistemini aslında hepimiz biliyoruz arkadaslar.Gündelik yasantımızda ,okulda, iste kısaca her yerde kullandıgımız sayı düzeni.Ama ikili sayı sisteminin anlasılması açısından kısaca bu sayı sistemine deginerek geçecegim.Bu sayılarda kendi arasında 10 ve 10’un katları seklin de ilerler.

8452 sayısını ele alalım bu sayıda ne var?Aslında hiçbir sey yok normal bir sayı zatenJAnaliz edelim hemen ;

Sagdan baslı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 anlasılır.



ONALTILIK SAYILAR ( HEXDECİMAL ):



Bunu asagıdaki gibi örnekle açıklayalım bir .exe dosyasına baktıgımız zaman A harfinin karsılıgını 65 degerinde degil de, 41 degerinde görürüz.Halbuki A ‘nın Ascii kod karsılıgı 65 di.Peki bu neden böyle oluyor?






Bunun nedeni arkadaslar bilgisayarın ilk çıktıgı dönemlerde programcılar Binary kodlarla (ikili sayılar) çalısmak zorundaydılar.Çünkü bilgisayar bu dilden baska bir dil anlamıyordu.Düsünün bir kere 11001010 gibi bir sayı sistemi ile ne sekilde çalısabilir ve hatasız bir kod nasıl çıkarabilirsiniz.İste bu durum da program uzmanları ortaya bir bulus atmıslar . Bildiginiz gibi, dört bit ikilik degerleri 0000 ile 1111 arasında (ondalık 0 ile 15 degerleri arasına esittir), 16 olası kombinasyonun bir toplamı olarak gösterir. Eger 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ıssın diye bu sayı sistemini gelistirmis ve adına Yunan sözcügü olan “hex” (6 için) ile bir Latin sözcügü olan “decem” (10 için) birlesimiyle olusan “hexdecimal – (hexdesimal)” ismiyle isimlendirmisler. Bu sayede taban 16 sistemine “hexadesimal” (onaltılı) sayı sistemi dendi.

Böylece 1 ve 0 dünyasından kendilerini kurtarmıs oldular .Dikkat edin kendilerini kurtarmıslar bilgisayarı degil.Dedik ya makineler sadece 1 ve 0 ‘ı anlar diye.

İste yukarıdaki resimde gördügünüz 41 sayısıda “A” harfinin 16 lık sayı sistemindeki karsılıgıdır.Böylece kodlar 2 sıralı halde ve düzgün bir görünüme kavusuyor.

ASSEMBLY ise Binary sayılarla olsun,Hexdecimal sayılar olsun bunların tümünün ,CPU yu görevlendirmek için olusturdukları sayısal komutların sembolik karsılıgıdır diyebiliriz.Çünkü her ne komut verirseniz verin bunların tamamı CPU ya bir sayısal deger olarak (1,0)gidecektir.


Resim


Tabloda gördügü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 bildigimiz sayılarla hemen hemen aynı sadece araya 6 tane harf girmis. Burada görüldügü 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 deger 10 ise onluk sistemde o sayı 16 demektir. Yani 16 nın katları olarak artmaktadır.Kafanız karısmasın hemen bir örnekle gösterelim.



0Fh = 15

10h = 16

20h = 32

30h = 48

F4h = 244

Açıkladıgım gibi bu sayılarda 16 ve 16’nın katları seklinde ilerliyor ,tıpkı Onluk düzende 10 ve 10 ‘un katları seklinde ilerledigi 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ı oldugunu gösteriri ki CPU bu sayıyı onluk düzendeki bir sayı gibi algılamasın.Normalde bundan sonra bu “h” harfini kullanacagımız için bu ne demek oluyor diye takılmayın. Assembler programlarında kullanılan sayılar su sekillerde simgelenerek birbirinden ayrılırlar:



1010b sonundaki “b” harfi Binary sayı oldugunu;

2359d sonundaki “d” harfi Decimal yani onluk bir sayı oldugunu

4FA1h sonundaki “h” harfi HexDecimal yani Onaltılık bir sayı oldugunu gösterir.



- 'd' harfi yada harfsiz bu bildigimiz onluk sistemde demektir. Eger bir kaynak kodunda sayının yanında (önceden bütün sayıların hex olacagını belirten .radix16 gibi bir komut kullanılmamıssa) hiçbir simge yoksa o sayı göründügü degerinde bildigimiz onluk tabanda bir sayıdır. Ama eger onaltılık kurallarıyla yazılmıs (a,b,c,d,e,f içerikli) ve yanında hiçbir isaret yoksa derleyici burada 'illegal number' seklinde bir hata mesajı verir.

simdiye kadar görmüs oldugumuz 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 sunu belirtmem gerekiyor arkadaslar ; 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ısacak ve bazıları sadece bu sistemlerdeki degerlere göre hareket edecek. Bunun için bir assembler programcısının mutlaka bu sistemleri bilmesi ve kullanması gerekiyor.Asagıdaki konuyla bu konuları daha iyi bir sekilde pekistirip bitirecegiz…





Onaltılık Sayıyı Onluk Sayıya Çevirme :



Arkadaslar Onaltılık (Hexdecimal) bir sayıyı ,Onluk (Decimal ) bir sayıya 2 sekilde çevirebiliriz.

1.olarak asagıda anlattıgım sekilde çevirebilirsiniz.

2.olarak da bununla kim ugrasır diyerek, Windows ’un hesap makinesini kullanıp çevirebilirsiniz J

Ben yine de 1. olarak bahsettigim sekliyle açıklayayım..Arkadaslar yukarılarda ikili ve onlu sayı sistemlerini anlatırken birinci basamak her zaman kendi degerindedir demistik.Burda da aynı kural geçerli yani sayı 0ah,0bh,0ch.. olsa bile onluk sisteme çevirilince birlik basamak olarak digerlerine eklenir. Diger basamaklarda aynı bildigimiz matematik kurallarında oldugu 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 oldugunu biliyorsak onaltılık sistemde de bu kuralın böyle oldugunu 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 oldugu degeri 16 ile , F’nin (Onaltılık sistemde) sahip oldugu degeri de 16 ‘nın bir sonraki katı ile yani 256 ile çarpacagız.Devam edelim,

Sagdan baslayarak yapıyorum yine ;

5*1 + A*16 + F*256 simdi A ile F nin yerlerine Hexdecimal degerleri koyalım

5*1 + 10*16 + 15*256

Yukarıda ki tabloda A’nın hex karsılıgını 10 , F nin hexdec.karsılıgını ise 15 olarak göstermistik.Sonuçları toplayalım o zaman ,

5 +160 + 3840 = 4005 olarak sonucu bulmus oluruz.Biraz zor gibi görünebilir ama ben mümkün oldugu kadar sadelestirip anlattım.Zaten 1 veya 2 deneme yaparsanız mantıgı kavrarsınız arkadaslar.Asagıdaki katlara bakınca daha iyi anlayacagınızı ümit ediyorum….

Onluk Sistem : Onaltılık Sistem :

1 1

10 16

100 256

1000 4096

10000 65535

Gördügünüz gibi 4005 gibi Onluk düzendeki büyük bir degeri Onaltılık sayı sistemine göre sadece FA5 diyerek gösteriyoruz.Bunun bize ne kadar büyük bir kolaylık getirdigini ve Hexdecimal sayıların neden kullanıldıgını anlamıs oldugunuz kanaatindeyim.

Buraya kadar anlattıgım yerleri eger anlamak ta güçlük çekiyorsanız ; tekrar bu makaleyi bastan okumanızı tavsiye ederim çünkü gerçekten okudukça kolay oldugunu göreceksiniz,ama yok eger 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ısma prensibini anlamak ta çok daha zorlanırsınız.Bilen ve bunlar çocuk oyuncagı diyen arkadaslar varsa da onlar için devam edecegim.Bir sonraki konularımız Registerler ve Komutlar.



****Alıntı yapmadan önce yayıncı arkadasla temas kurmaya çalıstım. Cevap alamadım. Bilginize
En son mayhemious tarafından 01 Nis 2008, 18:18 tarihinde düzenlendi, toplamda 2 kere düzenlendi.
Kullanıcı avatarı
drog_1
Megabyte3
Megabyte3
Mesajlar: 1467
Kayıt: 15 Mar 2006, 16:40

Mesaj gönderen drog_1 »

etik davranısına saygı
paylasımına tesekürler
ama çok detaylı bir konuyu seçmissin :)
ve 1 demissin ki bu da devamı var demek...

sorularımıza hazır olmanı bekliyorum...
Kullanıcı avatarı
mayhemious
Kilobyte4
Kilobyte4
Mesajlar: 711
Kayıt: 17 Kas 2007, 13:14
cinsiyet: Erkek

Mesaj gönderen mayhemious »

drog_1 yazdı:etik davranısına saygı
paylasımına tesekürler
ama çok detaylı bir konuyu seçmissin :)
ve 1 demissin ki bu da devamı var demek...

sorularımıza hazır olmanı bekliyorum...
evet abi devamı var. aynen yazanlar gibi ustası degil ögrencisiyim :) bi hobim de ters mühendislik. Düzünü olamadım bari tersi olayım. derslerin müthis bir akıcılıgı var. tam anlamıyla giris seviyesinde. ben kagıt kalem alıp yazarak çalıstım. ters mühendislik veya programcılıgın özü konularına meraklı olan arkadasların mutlaka bilmesi gereken bir konu assembly... adminlerim izin verirse ters mühendislik konularında bilgi ve program paylasımlarım olabilir. Tamamen zararsız ve yasal konularda (ilaç me) tartısabiliriz...
Kullanıcı avatarı
velociraptor
Yottabyte4
Yottabyte4
Mesajlar: 46474
Kayıt: 14 Mar 2006, 02:33
cinsiyet: Erkek
Teşekkür etti: 4602 kez
Teşekkür edildi: 3916 kez

Mesaj gönderen velociraptor »

elbetteki istediginizi paylasirsiniz ;)
Cevapla