• Forum vBulletin altyapısından Xenforo altyapısına geçirildi, bu sebeple eski şifreleriniz ile foruma giriş yapamayacaksınız, parolamı unuttum adımından mailiniz ile şifre sıfırlayarak giriş yapabilirsiniz.

    Üyeliklerinde geçerli bir mail adresi olmadığı için sıfırlama yapamayacak kullanıcılar forum kullanıcı adlarını ve yeni şifrelerini yazarak info@maxigame.org adresine şifre sıfırlamak istediklerine dair bir mail göndersinler şifrelerini sıfırlayıp mail adreslerini güncelleyeceğiz. Şifreniz sıfırlandıktan sonra foruma giriş yapıp tekrar istediğiniz gibi değiştirebilirsiniz.

Assembly [Bölüm 2]

TheOttoman

Aileden
Aktiflik
K.Tarihi
11 Haz 2009
Mesajlar
288
Puanı
190
Konum
Ankara
silkroadmaxlogo.gif


REGISTERLER :
Evet arkadaşlar geldik registerler (Namı diğer Yazmaçlar nedense bu kelimeyi görünce sinir oluyorum ben buna kaydedici demeyi uygun buluyorum ama bilmeniz açısından yazdım ) konusuna, bu konuda oldukça kolay arkadaşlar.Makaleyi okudukta sonra anlayacağınızdan eminim.Registerleri kısaca şöyle tarif edebiliriz, programlamayla ilgilenen arkadaşlar bilirler,hani program yazarken değişken dediğimiz ,(a=53 , b= ”atmaca” gibi)değer atama durumları vardır ya hani,işte registerleri de bu değişkenlere benzetebiliriz.Örneğin b=”atmaca” değişkenimize başka herhangi bir değer atamadığınız sürece “b” ‘nin değeri hep “atmaca olacaktır.Taki bir değer atarsanız ,mesela 42 derseniz o zaman “b” ‘nin taşıdığı değer 42 olur.Bunun gibi registerler de (yani kaydediciler) CPU’ nun her türlü işlemlerini yerine getirmesi için bu görevi yerine getirirler.
Kısaca şöyle de diyebiliriz ,işlemci yani CPU register adı verilen bölmelerden oluşur ve bu registerler de mikroişlemcinin en temel bileşenlerinden biridir .Bu registerleri ben 4 bölüme ayırmayı uygun buluyorum kimileri 3 yada 5 bölüm olarak inceleyebiliyor.


1-GENEL AMAÇLI REGİSTERLER
AX =Accumulator Register
BX = Base (Taban )Register
CX = Counter (Sayaç )Register
DX = Data (Veri )Register

2-SEGMENT REGİSTERLERİ
CS = Code Segment Register
DS = Data Segment Register
SS = Stack Segment Register
ES = Extra Segment Register

3-OFFSET REGİTERLERİ
IP = Instraction Pointer Register
SP = Stack Pointer Register
BP = Base Pointer Register


a-)İndex Registerler

SI = Source (Kaynak )Index Register
DI = Destination (Hedef)Index Register

4-FLAG (BAYRAK )REGİSTERLERİ
O = Overflow flag
D = Direction flag
I = Interrupt flag
T = Trace flag
S = Sign flag
Z = Zero flag
A = Auxilary Carry flag
P = Parity flag
C = Carry flag

Evet registerlerimiz bunlar,siz şimdilik hepsini de ezberlemeye kalkmayın zamanla programlar üzerinde durdukça öğreneceksiniz,bunlardan özellikle flag (bayrak )registerleri sadece bilgi almak açısından kullanırız ,yoksa bunlar üzerinde işlem yapamayız.İşlem sonunda eşitlik var mı yok mu,veya işlem sonunda taşma oluyor mu ya da olmuyor mu; gibi bilgileri görmek için kullanırız.Ben yine de mümkün olduğu kadar karşılarına Türkçe karşılıklarını da yazdım ki zorlanmayasınız.Bunların bir kısmını ayrıntılı olarak sonraki konularda anlatacağım zaten.

1-GENEL AMAÇLI REGİSTERLER :

Yukarıda görmüş olduğunuz (ax ,bx ,cx ve dx )registerleri eski 8 ve 16 bit işlemciler ( 8086,80186 gibi) için bu şekilde kullanılıyordu.Fakat bu işlemciler günümüzde pek kalmadı ve yeni 32 bit işlemciler daha yaygın bir şekilde kullanılıyor.Bunun içinde bu register isimlerinin başına Extended (Genişletilmiş ) kelimesinin “e” harfi getirildi.Yani EAX-EBX-ECX-EDX şeklinde oldular.Bizde bundan sonra bu Genel Registerler ,Segment Registerler ,Ofset ve İndex registerleri yazarken bu şekildeyazacağız.EBX-EDI-ESI-ESP vs gibi..
Bir ornek ;

Mov eax,24
Mov ebx, 10
Add eax , ebx
Sonuç = 34

Dönelim bu genel kaydedicilere ,bunlar kendi aralarında 2’ye bölünerek 8 adet olurlar.Şöyle ki;
EAX = AH - AL
(32 BİT)= (16 BİT) - (16 BİT)
EBX = BH - BL
(32 BİT)= (16 BİT) - (16 BİT)
ECX = CH - CL
(32 BİT)= (16 BİT) - (16 BİT)
EDX = DH - DL

Eğer bunlar 16 bit lik registerler olsaydı o zaman da 8 bit AH , 8 bit AL olarak değişecekti.Sonlarına eklenen H ve L harfleri “H” High (Yüksek)- “L” ise Low (Düşük) kelimelerinden gelmiştir. 16 bitlik bir register en fazla 65535 değerini alırken 32 bitlik bir register 4294836225 değerine kadar alır.
EAX register programlarda en çok kullanılan yazmaçlardan biridir. Accumulator’ün kısaltılması sonunda oluşan EAX yazmacı bütün giriş ve çıkış işlemlerinde ve bazı aritmetik işlemlerde kullanılır.
EBX Registeri Base register olarak da bilinir. RAM işlemlerinde adreslemede kullanılır. Register adresleme işlemlerinde daha çok offset degerlerini tutar. Ayrıca hesaplama işlemlerinde de kullanılır.
ECX Registeri Counter registeridir. Döngü işlemlerinde ve kaydırma işlemlerinde sayaç olarak kullanılırIZ.
EDX Register bazı giriş çıkış işlemlerinde ve matematiksel işlemlerde kullanılır.Daha çok çarpma ve bölme işlemlerinde büyük sayıları saklamak için AX registerinin bir parçasıymış gibi kullanılır.

2-SEGMENT REGİSTERLERİ :
Segment register’ ları (ECS, EDS, ESS ve ES) programımız bilgisayarın belleğine yüklendiği
zaman bellek içerisinde oluşturulan bölümlerin (Segment) başlangıç adreslerini tutarlar. Yani bu register’lar için bir çeşit yer göstergeci diyebiliriz. ECS, programımızın çalıştırılabilir kodlarını barındıran (Code Segment) bölgesinin başlangıç adresini tutar. Yani ECS ile gösterilen yerde makine dili kodlarımız vardır. EDS ise, programımız içerisindeki değişkenlerin saklı tutulduğu bölümdür. ESS (Stack), bellekte programımız için ayrılan stack bölümünün ( ki bu bölümü ayrı bir şekilde aşağıda anlatacağım ) başlangıç adresini tutar.ES (Extra segment) ise daha çok dizi yani string (Numerik olmayan) işlemleri için kullanılırız.

3-OFFSET VE İNDEX REGİTERLERİ :

Offset ve index register’ları bellek içerisindeki herhangi bir noktaya erişim sağlamak için kullanılır.Bu işlem için erişmek istediğimiz bölgenin offset ve segment adresleri gerekli register’lara aktarılır bizde bu şekilde işlemi gerçekleştirmiş oluruz..
Instruction Pointer register’ı ise CPU tarafından işlenecek olan bir sonraki komutun bellekteki adresini tutar. Bu register üzerinde programcının hiçbir eylemi olamaz. Her komut icra edildikten sonra CPU otomatik olarak kullanılan komuta göre gerekli değeri bu register’a atar.Arkadaşlar belki biraz ağır bir anlatım gibi görünebilir fakat bunların başka bir izah şeklini bulamadım yani şu an aklıma gelmiyor.
4-FLAG (BAYRAK )REGİSTERLERİ :

Arkadaşlarbunları detaylı bir şekilde anlatmadan önce şunu hatırlatmak istiyorum.Bayrak kaydedicisindeki her bir bitin 1 olma durumuna SET, 0 olma durumuna da RESET denir. İşlemcinin ürettiği bu sonuçlar hakkında programcı bunlara bakarak işlem durumunu analiz eder.
Overflow flag (OF): Biz buna taşma biti de diyebiliriz. İşaretli (negatif)sayı üzerinde meydana gelen taşma durumunu tespit etmek amacıyla kullanılır. Yani işlem sonucunda işaret biti değişmişse bu flag set edilir,yani 1 değerini alır.
Direction flag(DF):Bizim kullanmadığımız bir bayraktır.String işlemlerini yapan komutlar için kullanılır.Yani bir stringi hafızanın bir yerinden diğer bir yerine kopyalarken CPU tarafından kullanılmaktadır. İşlemci bu bayrağa bakarak transferin yönünü belirler.
Interrupt flag (IF) : Buna kesme bayrağı da diyebiliriz. CPU’nun çeşitli aygıtlardan gelen kesme isteklerini dikkate alıp almayacağını bildirir. 0 olması durumunda istekler dikkate alınmaz,1 olursa alır.
Trace flag (TF) : Trace biti de diyebileceğimiz bu bayrak CPU nun sadece 1 komut çalıştırma yapması için kullanılır.Hani Debugger ile bir programı açıp programda adım adım ilerliyoruz ya ,işte CPU bunu ,bu bayrağın durumuna göre yapar 1 olursa işletilmeye hazırdır demektir..
Sign flag (SF) : Yapılan işlem sonucunda elde edilen sayının en solundaki bit 1 ise bu negatif bir sayıdır demektir ve bu bayrakta 1 değerini döndürür.Eğer ki 0 ise pozitiftir ve bayrak 0 değerini yansıtır.Kısaca bu bayrak sayının negatif veya pozitif olduğunu gösterir.
ADD EAX, EBX
Eğer SF nin değeri 1 ise o zaman EAX deki sayı negatif bir sayı deriz.
Zero flag (ZF) : Bir işlemin toplam sonucu 0 ise bu flag set edilir yani 1, değilse reset yani 0 edilir.Bu bayrağı karıştırmayın arkadaşlar tekrar ediyorum eğer işlem sonunda sonuç 0 ise ,bu bayrak 1 değerini döndürüyor.Mesela
SUB EAX, EBX
işleminde iki register’ın değerleri eşitse sonuç 0 olacağı için ZF set (1)edilecektir.Aşağıdaki Olly debugger ile aldığım örnek resim olayı kavramanıza yardımcı olacak.


Alıntıdır !! Kaynağı görüntülemek için Tıklayınız .
 
Geri
Üst