Cyber-Warrior.Org \ Doküman \ Web Güvenlik Açıkları > Assembler (2)
| Madde |
| |
Yazar : «¥¡g¡t€®» |
| |
Date : 23.11.2004 16:16:30 |
| |
# Assembler (2) |
| |
Registerler
Registeler en basit sekilde söyle anlatilabilir: a=1 Burada "a" isimli bir degiskenimiz var ve ona bir degerini atiyoruz. Bundan sonra yeni bir deger atamadigimiz sürece a her zaman 1 olacaktir. Aynen bunun gibi CPU\' nun her türlü islemlerini yerine getirmesi için isimleri sabit registerleri vardir. Bunlari yukaridaki gibi degiskenlere benzetebilirsiniz. Bunlar;
AX ,BX , CX, DX = Bunlar matematiksel ve mantiksal islemlerde kullanilir. Bu registerler çalisan özel opkodlar vardir. SI, DI = Yazi, veri arama veya aktarimi gibi islemler BP, SP = Yigin islemleri ile ilgili IP = Komut noktasi o andaki nokta ES, DS, CS, SS = Segment islemleri ile ilgili F = Bayrak registeri, Bu registe rin bitlerine göre islemler yapilir yada yapilmaz
Bunlardan baska korumali modu sistem ile ilgili DR(0)-DR(7) ve matematik islemcisi St(0) - St(7) registerleri bulunmaktadir. Ayrica MMX ile birlikte yeni registerler gelmistir.
Registerler kullanim sekline göre yada yapilarina göre deger alabilirler. Örnegin; AX register diger BX,CX,DX registerler gibi 8 bit 8 bit seklinde deger alabilir yada tamamen 16 bit seklinde deger alabilir. Açilimi söyledir:
AX = AL ve AH BX = BL ve BH CX = CL ve CH DX = DL ve DH
Burada \'L\' low demektir ve ilk 8 biti (1byte) temsil eder. \'H\' ise high demektir ve son 8 biti (1 byte) temsil eder.
SI, DI registerler genel amaçli kullanildiklari gibi islemcinin tahsis ettigi bazi özel komutlarla beraber veri aktarma, doldurma, silme yada karsilastirma islemlerini yerine getirir.
SI, DI, BP, SP, IP,ES,CS,DS,SS, FS, GS,F registerler daima 16 bittir (2byte) ve yukaridaki registerler gibi düsük-alçak bit seklinde ayrilmazlar. Ancak komutlarla bu bitlere müdahale ve degistirmek mümkündür.
AX,B X,CX,DX registerler matematiksel islemler, lojik islemler, sayma islemleri, ve bazi komutlarla string islemlerinde kullanilir.
AX register "akümulatör" olarak adlandirilir. Bu register ile çalisan ve sonuçlari bu registere aktaran pek çok opkod vardir.
BX register "base = taban" register olarak adlandirilir. Örnegin XLAT gibi komutlar bu register ile çalisir ve genelde AX registere yakin ve yardimci olarak kullanilan bir registerdir.
CX register "counter = sayaç" olarak nitelendirilir. Bu register sayaç v e döngü konularina tahsis edilmistir. Yine pek çok opkod bu registere göre sayma ve sonuçlandirma islemleri yapar.
DX register yine diger registerler gibi birçok islemde kullanildigi gibi bölüm sonu kalan sayisi için AX registerle beraber kullanilir.
Bu re gisterler DOS ortaminda 16 bit yada 8 bit olarak çesitli interrupt (kesme) fonksiyonlarinida olustururlar.
CS,DS,ES,GS,FS registerler programin bulundugu hafiza bölgesi ile ilgili tanimlamalari yaparlar. Örnegin bir yere veri aktarilacaksa ve bu bölge programin bulundugu bölgenin disinda ise bu registerler ile exstra olarak gösterilerek aktarma yapilabilir.
Bütün registerler deger alirken basina \'MOV\' komunu alirlar. Bu komut yükle anlamindadir ve "mov ax,1020" dersek bunun anlami "ax registere 1020 yükle" olur. Buradan sonra ax register degistirilmedigi sürece 1020 degerini almis olur. IP ve F register hariç bütün registeler MOV komutu ile deger alir veya deger yazar.
SI, DI registerler CPU\' nun onlara tahsis ettigi komutlar ile hizli ve en yüksek seviyede data aktarma, arama, isleme yetenegi kazanir. Ayni zamanda diger registerler ile matematiksel ve lojik islemlerde de kullanilabilirler.
BP, SP, SS registerler yigin için kullanilir. Yigin kelimesini açiklamak gerekirse programin çalismasi için saklanan degerlerdir. Yani programda ayni registeri kullanarak farkli islemler yapmamiz gerekiyorsa önceki register degerini saklamamiz gerekiyor. Aksi halde bu degeri kaybederiz ve yeniden kazanmak mümkün olmayabilir. Bunu iki yolla yapariz. Ya bir yere bu degeri yazariz yada sistemin bize verdigi saklama komutlari ile hafizada saklariz. BP ve SP registerler iste bu hafizada yigilan saklanan degerlerin yeni gösterir.
IP register özel bir registerdir ve direk olarak kullanilamaz. Programin o andaki çalisma adresini belirtir ve degistirmek için CPU\' nun verdigi özel debug registerler kullanilir.
ES, DS, CS, FS, GS, SS registerler hafizayi daha iyi ve güçlü kullanmayi saglamak, dogru veri kontrolu ve aktarimi saglamak ve programin çalistigi yeri saptamak için kullanilir. Bazilarinin bilinçsizce degistirilmesi programda büyük sorunlara yol açar ancak hiç bir deneme yada sorun sisteme kalici bir zarar vermez, reset islemi ile hersey eskiye döner.
F register Türkçe adiyla bayrak register sistemin karsilastirmalar, olay - sonuç - durum gibi hayati hallerine yön verme gibi etkilere sahiptir. Bütün atlamalar bu registerin bitlerine bagli olarak olusur. Bir karsilastirmanin sonucunda bu registerin sabit ve belli bitleri set (1) veya reset (0) olarak durum bildirimi yaparlar. Sartsiz atlama komutu hariç bütün atlama komutlari bu registerin bitlerine bakarak atlama yaparlar.
Modlar
8088 islemciler hem 16 bit bir CPU idi hem su anda kullandigimiz islemcilere göre daha yavas ve daha az özellikliydi. Sanal86 modu yoktu. Zamanina göre yeterli görülsede sonradan bunun asla yetmeyecegi anlasildi ve 80286 ile beraber yeni bir16 bitlik islemci ve mod stratejisi gelistirildi. Buna göre hem eskiye uyumlu olarak 8088 gibi çalisacak hemde yeni nesil programlari destekleyecekti... Ancak asil düzenlemenin 80386 sonrasi islemcilerde yapildigi kabul edilir. Uzun süreli DOS isletim sisteminin hakimiyeti ve korumali modun DOS altinda zahmetli programlanmasi bizim bu yeniliklerden ve birçok avantajdan istemeyerekte olsa mahrum kalmamiza neden old u. Windows ile beraber 80386\' dan beri gelen degisim ve avantajlar kullanima geçti. En basta birden çok program çalistirma, büyük adresleme yapabilme ve zaten var olan 32 bitlik komutlari tam anlamiyla kullanma bunlardan sadece bazilari.
Su an kullandigimiz 386+ islemcili sistemlerde üç mod var. Bunlar: Gerçek mod, Korumali mod ve Sanal mod. Bunlarin arasinda çalisma, adresleme, hafiza kullanilimi gibi pek çok farkliliklar var. Bilgisayar ilk çalistirildiginda gerçek modda çalisir. Daha sonra isletim sistem i onu istedigi moda geçirir.
DOS isletim sistemi gerçek modda çalisir. Bu mod tek (single) moddur ve yardimci emulasyonlar olmadigi sürece ayni anda tek program çalistirilir. Ayrica adresleme sekli segment ve offset düzenine bagli. Bir programda bir yerin adresi Seg:Off olarak gösterilir ve segmentler 16\' nin katlari seklinde artar. Bir verinin yada programin fiziksel adresi segment 16 ile çarpilir. Bu onaltilik sistemde 10h ile çarpmaktir ve kisaca yanina bir 0 eklemek yeterli. Bundan sonrada offset çikan sayi ile toplanir ve bize fiziksel hafizadaki adresi verir.
Korumali mod çoklu islemi (multi) destekleyen saglam, ve güçlü bir hafiza stratejisi olan bir moddur. Gerçek mod ile korumali mod arasindaki en önemli farklardan birisi hassasiyet derecelendirmesidir. Buna "ring" de denir ve korumali modda toplam 4 hassasiyet seviyesi vardir. En düsük seviye 0 aslinda en büyük, gerçek zamanli seviyedir. Gerçek modda bir program hafizadaki baska bir programa rahatça ulasabilir ve degistirebilir. Bunun sakincasi ve b ilgi kaybi açisindan riski vardir. Korumali modda ise bu ancak iki programda 0 (ring 0) olmasi durumunda mümkündür.
Sanal mod gerçek mod ile korumali mod arasindaki emulasyonu saglar. Böylece korumali modda gerçek mod programlarinida kullanabilmek mümkün ol ur.
CS, DS, ES registerler bir bakima gerçek moda ait segment registerleridir. Çünkü korumali modda segment kavrami yoktur. Ayrica korumali mod bazi gerçek mod komutlarinin direkt olarak çalismasina izin vermez. Örnegin dos isletim sisteminin vazgeçilmez komutlarindan int nn ( interrupt) komutu ancak bir VXD içerisinde çalisir. VXD dosyalari daima en yüksek modda çalisan programlardir.
32 bit registerler
Önceki konularda 16 bir registerleri anlatmistim. Buna göre 16 bit registerler 8 olarak ikiye ayrilabilirler. 32 bit registerlerde registerin 16 bitlik kismi ayni sekilde kullanilabilir ancak eklenen 16 bitlik kisim böyle 8\' er bit yada tek basina 16 bit halinde kullanilamazlar. Ancak lojik komutlar ile bit kaydirmasi yaparak erisilir. 16 bitlik bir regis ter en fazla 65535 degerini alirken 32 bitlik bir register 4294967295 degerine kadar alir.
Yukarida anlattigim bütün registerler baslarina bir \'E\' (extended) harfi alarak 32 bit olurlar.
AX --> EAX BX--> EBX F ---> EF SP --> ESP .... gibi
Registelerin n ormal olarak \'mov\' komutu ile adresleme ve yükleme yaptigini daha önce belirtmistim. Buna göre AX registere örnegin 1234h sayini yüklemek istedigimizde :
mov ax,1234h
yazmamiz yeterli Ayrica 32 bit bir register olarak kullanmak istedigimizde :
mov eax,12345678
seklinde kullaniriz. Bu örnekte görüldügü gibi bütün registerler MOV regname, deger seklinde yüklenirler.
Adresleme ise bir yerden deger yükleme yada bir yere deger aktarma demektir. Bir adresten deger alip registerleri yüklemek için [] köseli parantezi kullaniriz. Ayrica editör ile bir asm dosyasi olusturduksa ve sembolik olarak bir yeri veri adreslemesi için kullaniyorsak LEA komutunu yada adresin yanina offset komutu kullanabiliriz.
mov ax word ptr,[1234] mov cx,word ptr,[sayac1] mov dl, byte ptr [sayi] mov ax,[bx] mov si,[ax+bx]
seklinde kullanilir. Ayrica sembolik adreslemeler için:
lea ax, string1 lea si, aktarma_start mov si, offset aktarma_start
olarak kullanilabilir.
Simdi register degerlerinin degistirilmesi ile ilgili örnekleri inceleyel im:
Örnek1: Burada AX registerin düsük 8 biti degistiriliyor mov ax, 1234h -------> ax=1234 mov al,0aah -------> ax = 12aah
Örnek2:
mov ax,4423 ----> ax=4423 mov bx,1167 ----> bx = 1123 mov al,bl -----> al= bl yani al= 23 iken 67 oluyor mov word ptr [sonuc],ax -----> sonuc adresine ax register yaziliyor. AX = 4467
Adreslemeler
Adresleme konusu assembler dilinde önemli bir konudur. Adresleme hafizanin bir bölgesini kullanma yada bir bölgesini gösterme olarak tanimlanabilir. Herhangi bir degeri saklama, bir hafiza bölgesi üzerinde çalisma yada kisaca BUFFER olarak kullanma olanagi saglar. Örnegin klavyeden girilen bir yaziyi inceleyebilmek ve üzerinde arastirma yapabilmek için bir bölgeye yazilmasi gereklidir. Bunun için kullanilan fonksiyona göre registerlerle önceden ayrilmis bir adrese aktarma yapilir. Daha sona burada kullanicinin istedigi sekilde bu yazi üzerinde degisiklik, hesaplama veya mantiksal islemler yapabilir.
Baslica adreslemeler sunlardir:
- Register adreslemesi : Registere bir degeri yüklemek için registerin biti kadar bir adresten yükleme yapilmasi.
Örnegin: mov eax, [sayi1] veya mov eax,sayi1 Burada eax register sayi1 ile belirtilen hazifa adresinden o andaki degeri alip eax registere yüklüyor.
- Deger saklamak için adresleme (Dolayli adresleme) : Burada ileride görecegimiz PUSH ve POP komutuna benzer olarak istenilen bir hafiza adresine saklama islemi yapilir. Bu bir register olabilecegi gibi bagimsiz bir degerd e olabilir.
Örnegin : mov dword ptr [deneme],ebx yada mov word ptr [04010000],1234h gibi...
- Hafiza bölgesi adreslemesi : Bu adresleme ile register hafizanin herhangi bir bölgesi isaretlenir. Bunun için MOV komutu yerine LEA komutunu kullanabiliriz. MOV komutu registere verilen degeri yükler yada adresler. LEA komutuda ayni isi yapar. Ancak MOV komutundan önemli farki vardir. Verdiginiz yerdeki degeri degil adresi yükleme yapar. Örnegin:
debug \'Yazi1\',0
lea eax, debug seklinde verilince eax registere \'Yazi\' degeri degil bulundugu yerin adresi yüklenir. Böylece biz bu verinin basindan itibaren istedigimiz gibi çalisma yapabiliriz.
- Dolaysiz adresleme : Bu adresleme registerler arasindaki degerlerin hafiza adresi olarak kullanilmasi ile olusan adreslemedir. Buna göre elimizde hiçbir deger yok sadece registeler vardir. Yaygin bir kullanima sahiptir. Örnegin:
mov dword ptr [esi] ,eax mov byte ptr [eax],bl mov dword ptr [esi],ebx mov word ptr [edi+esi],ax
gibi sadece registerler arasi adreslemedir. |
| |
|
| |
|
|