Bu yazıda X86 işlemcilerine giris yapıp Assembly
programlama ile ilgili giriş bilgisi vermeye çalışacağım.
X86 NEDİR ?
X86 Intelin ilk mikroişlemcilerinden olan 8086 ile ilgili
programlama kurallarını ifade eden bir tanımlamadır.
Intelin önemli özelliklerinden biri olan "geriye dönük
yazılım uyumluluğu" böyle bir tanımlamanın oluşmasını
sağlamış.
Şöyle ki; 8086 mikroişlemcisi olan bir bilgisayar
sisteminde hazırladığınız herhangi bir assembly programı
X86 uyumlu tüm bilgisayarlarda çalışır. 80286, 386, 486
SX veya DX, Pentium, Pentium III, AMD nin 286, 386
işlemcilerinde veya Nexgen, Cyrixin aynı tür
işlemcilerinde ve diğerlerinde bu program çalışacaktır. Bu
demek oluyor ki yukarıda saydığımız tüm mikroişlemciler
ve uyumlu olan diğerlerinin ortak bir yönü var. Bu ortak
yönler ortak program kodların olması ve
mikroişlemcilerinin temel mimarileri birbirinin aynı
olmasıdır.
Yeni bir mikroişlemci üretildiğinde, eski mikroişlemcilere
uyumlu olması büyük bir avantajdır. Öyle olmasaydı bugün
dünyada %90 oranında PC, X86 uyumlu işlemci kullanıyor
olmazdı. Bu yüzden mikroişlemci pazarının bu büyük
dilimini birkaç firma paylaşıyor, aslan payını Intel, daha
sonra AMD geliyor, Cyrix ve Nexgen gibi diğer
mikroişlemci üreten firmaların isimlerini pek duymuyoruz.
X86 tabanlı sistemlerin mimarisi birbirine benzer. Birde
X86 tabanlı olmayan sistemler vardır. Apple firmasının
iMAC bilgisayarları, yada SUN Microsystems firmasının
sistemleri X86 tabanlı mikroişlemciler kullanmadıkları için
bu tür bilgisayarda çalışan programlar X86 tabanlı
sistemlerde çalışmazlar.
Şunu unutmayalım; dünyada yaklaşık %90 oranında X86
uyumlu PC sistemi kullanılıyor. Bu yüzden bu X86
assembly dili diğer assembly dillerinden daha geçerli bir
programlama dilidir.
ASSEMBLY PROGRAMA DİLİ VE DİĞERLERİ ?
Assembly programlama dilini 3 kelime ile tanımlayacak
olursak bunlar; GÜÇLÜ, HIZLI ve KISA olurdu. Bu demek
oluyor ki aynı programı assembly dili ile ve C++
programlama dili ile yaparsak, iki programın boyutlarına
baktığımızda assembly ile yazılan daha kısa olduğunu
görürüz, aynı zamanda mikroişlemciyi ve hafızayı daha
verimli kullandığı için assembly dilinde yazılan program
diğerlerine nazaran daha güçlü olacaktır, son olarak
assembly dilinde yazılan program diğerine oranla çok daha
hızlı çalışır.
Son zamanlarda mikroişlemcilerin hızları GHzler (giga
hertz - ciga herz diye okunur) mertebesine çıktığından
assembly dilinin en büyük özelliği olan hızlılığı artık pek
popüler değildir. Kullanıcıya, 2GHz hızındaki bir CPU da
hemen hemen her uygulama aynı hızda çalışıyor gibi
görünür. Buna rağmen C gibi yüksek düzey programlama
dilleri ile hazırlanan büyük projelerde işlemciyi çok fazla
meşgul edecek olan kod bölümleri assembly rutinleri
çağrılarak yapılmaktadır.
NEDEN ASSEMBLY?
X86 Assembly dilini öğrenmek kolaydır ama bu dilde
proje hazırlamak insanı çileden çıkartabilir. Bu yüzden
günümüzde X86 assembly dili yerine, daha çok
endüstriyel alanda kullanılan microcontroller chiplerin
assembly dili kullanılmaktadır. Bir programcı assembly
dilinde büyük uygulamalar hazırlamaz (genellikle). Bunun
nedeni üst düzey programlama dilleri olan delphi, C, C++,
Pascala göre daha dikkat gerektirir ve kod yazımı daha
zordur. Programcı assembly dilinde proje hazırlayacaksa
kullandığı sistemin mikroişlemcisini ve hafıza haritasının
yanında, sistemin donanımında iyi bilmesi gerekir. Her
şeyden önemlisi zamandır ki sadece assembly dili ile PC
uygulamaları geliştirmek iğne ile kuyu açmaya benzer.
Assembly alt düzey bir programlama dilidir yalnız alt
düzey kelimesini yanlış anlamayın, bu kelime bu dilin
işlemciye ve hafızaya olan yakınlığını belirtir, üst düzey
diller ise daha çok programcıya yani insana yakındır.
<
Bu yüzden assembly dilinin özel kullanım alanları vardır.
Kısaca bunları söyle sıralayabiliriz.
1- Bilgisayar sistemini yakından tanımak için,
2- Device driver (cihaz sürücüleri) yazmak için,
3- Chiplere program yüklemek için (***, microcontroller
gibi...)
4- İşletim sistemlerinin yapımında (OS),
5- Şifre kırma ve Hacking işlemleri için,
6- Virüs programları yazmak için,
7- Elektronik tablolama (Excel gibi) programlarında.
İLK X86 ASSEMBLY KODLARIMIZ PC platformunda
doğrudan hafızaya sembolik kod kullanmadan yazacağımız
bu progr***** için herhangi bir editör ve derleyici
download etmenize gerek yok. DOS veya Windows işletim
sistemine sahip bir PC kullanmanız kafidir. Sırasıyla
şunları yapın;
1- Başlat menüsünden çalıştırı tıklayıp cmd programını
çalıştırın. Şayet Windows 98 kullanıyorsanız başlat
menüsünden MSDOS komut istemini çalıştırmanız
gerekiyor. Hala DOS işletim sistemini kullanıyorsanız
bilgisayarınızın power butonuna basmanız yeterlidir
yani
halihazırda komut isteminde olan bir trex siniz.
2- Komut istemindeyken cd\ yazın ve root dizinine geçin
burada kendinize md asm yazarak asm adında bir klasör
oluşturun ve cd asm komutu ile klasörün içine girin. Tabi
ki klasör oluşturmak için bu kadar eziyet çekmenize
gerek yok, amacımız biraz nostalji. Maksat projemiz bir
klasörde oluşsun.
3- Debug yazıp enter tuşuna basın. Resimdeki görüldüğü
gibi debug programı çalıştırıldığında ekranın solunda bir -
simgesi görülür ve bu programla harikalar yapabilirsiniz
4- E 0100 yazıp enter tuşuna basınız.
6- Klavyeden Enter tuşuna basın ve ekran görüntüsü 3.
adımdaki gibi olunca g tuşuna basıp ardından son olarak
enter tuşuna tekrar basın.
Yukarıdaki ekran çıktısında görüldüğü gibi konsol ekranına
MERHABA ASSEMBLY yazdırdık ve debug programından
çıkıp komut istemine geri döndük. Hala hevesiniz
kırılmadıysa
neler yaptığımızı tek-tek açıklayalım.
Debug programı Microsoftun tüm işletim sistemlerinde
bulunan, hafıza ve CPUnun içindekileri görmemizi,
düzenlememizi sağlayan bir programdır. Çok ilkel bir
program olmasına rağmen beynimizin derinliklerine PCnin
yapısını kazıyacak olan ve bir assembly programcısının
bilgisayara ne şekilde bakması gerektiği konusunda
yardımcı olacak yegane programlardandır. En fazla 2
makale sonra Debug programını kullanmayı bırakıp daha
jan-jan lı debuger programları kullanacağız, şimdilik böyle
idare edelim.
Biraz önce Debug programının kendisi içinde
kullanacağımız e (enter) ve g (go) komutlarını kullandık. e
komutu hafızaya kod girişi yapmamızı sağlar ve g komutu
ise CPUya şu sihirli kelimeyi söylememizi sağlar; "Ey CPU
yazdığım bu kodları sırasıyla çalıştır bakayım". CPU
programcının sadık kölesi olduğundan aynen denileni
yapar.
E komutu ile hafızaya giriş yaptığımızı söyledik, komut
isteminin en solunda 152F:0100 gibi bazı rakamlar
gördünüz, buradaki 152F sizin bilgisayarınızda farklı
olabilir, ama 0100 aynıdır. işte : simgesi ile ikiye ayrılmış
bu 8 rakam hafızanın adresidir. Kodlar hafızaya yazılır,
silinir, değiştirilir fakat bu süreçte değişmeyen tek şey
hafıza adresidir. Adresler her zaman bizim onları
doldurmamız veya erişmemiz için hali hazırda beklerler,
bunu evinizin adresine benzetebilirsiniz. Eve anne gelir
baba gelir arkadaş gelir bazen tatilde boş kalır yani evin
içindekiler değişkendir ama ama ev adresi her zaman
sabit kalır, ta ki ev yıkılana kadar
E komutu ile bu örnekte hafızanın 152F:0100 adresi ile
152F:011B adresleri arasını makine kodları ile doldurduk.
Bunu yaparken kod yazacağımız adreste hali hazırda
hangi kodun olduğunu görme gibi bir lükse de sahiptik,
tesadüfen hepsi 00dı. Makine kodları CPUnun anlayacağı
yegane kodlardır ve 2lik (binary) yada 16lık
(hexadecimal) gösterimle ifade edilirler. Zamanla binary
gösterim biraz fazla yer kapladığından hexadecimal
gösterim benimsenmiştir. Daha sonra hexadecimal
gösterimin anlaşılması zor olduğundan sembolik kodlar ile
yazılan Assembly programlama dili geliştirilmiştir. İnsan
oğlu rahatına pek düşkün olduğundan
daha sonra, kod
yazması ve anlaşılması daha kolay olan B Programlama
dilini geliştirmiş bu da yetmemiş C dilini geliştirmiştir. (Bu
sıralamada Assembly programlama dilide A oluyor tabi ki)
Programlama dilleri ABC diye devam derken C harfini çok
seven programcılar buna ++ ve # gibi aksesuarlar takarak
değişik varyasyonlar denemişler ve çokta başarılı
olmuşlardır
Neyse lafı fazla uzatmadan ve "ey
programcı geçmişini bilmeyen geleceğinden bir
haberdardır" diyerek konumuz geri dönelim.
X86 PClerin hafızası byte adreslenebilir diye bir
programcı ata sözü vardır. Bu söz her adrese en fazla 1
bytelık kod yazabileceğinizi anlatır. Bizde burada öyle
yaptık zaten, toplam 28 hafıza konumuna (memory
********) kod yazdık ve göreceksiniz biraz sonra programı
derleyip dosya haline getirince dosya boyutu 28 byte
olacak.
programlama ile ilgili giriş bilgisi vermeye çalışacağım.
X86 NEDİR ?
X86 Intelin ilk mikroişlemcilerinden olan 8086 ile ilgili
programlama kurallarını ifade eden bir tanımlamadır.
Intelin önemli özelliklerinden biri olan "geriye dönük
yazılım uyumluluğu" böyle bir tanımlamanın oluşmasını
sağlamış.
Şöyle ki; 8086 mikroişlemcisi olan bir bilgisayar
sisteminde hazırladığınız herhangi bir assembly programı
X86 uyumlu tüm bilgisayarlarda çalışır. 80286, 386, 486
SX veya DX, Pentium, Pentium III, AMD nin 286, 386
işlemcilerinde veya Nexgen, Cyrixin aynı tür
işlemcilerinde ve diğerlerinde bu program çalışacaktır. Bu
demek oluyor ki yukarıda saydığımız tüm mikroişlemciler
ve uyumlu olan diğerlerinin ortak bir yönü var. Bu ortak
yönler ortak program kodların olması ve
mikroişlemcilerinin temel mimarileri birbirinin aynı
olmasıdır.
Yeni bir mikroişlemci üretildiğinde, eski mikroişlemcilere
uyumlu olması büyük bir avantajdır. Öyle olmasaydı bugün
dünyada %90 oranında PC, X86 uyumlu işlemci kullanıyor
olmazdı. Bu yüzden mikroişlemci pazarının bu büyük
dilimini birkaç firma paylaşıyor, aslan payını Intel, daha
sonra AMD geliyor, Cyrix ve Nexgen gibi diğer
mikroişlemci üreten firmaların isimlerini pek duymuyoruz.
X86 tabanlı sistemlerin mimarisi birbirine benzer. Birde
X86 tabanlı olmayan sistemler vardır. Apple firmasının
iMAC bilgisayarları, yada SUN Microsystems firmasının
sistemleri X86 tabanlı mikroişlemciler kullanmadıkları için
bu tür bilgisayarda çalışan programlar X86 tabanlı
sistemlerde çalışmazlar.
Şunu unutmayalım; dünyada yaklaşık %90 oranında X86
uyumlu PC sistemi kullanılıyor. Bu yüzden bu X86
assembly dili diğer assembly dillerinden daha geçerli bir
programlama dilidir.
ASSEMBLY PROGRAMA DİLİ VE DİĞERLERİ ?
Assembly programlama dilini 3 kelime ile tanımlayacak
olursak bunlar; GÜÇLÜ, HIZLI ve KISA olurdu. Bu demek
oluyor ki aynı programı assembly dili ile ve C++
programlama dili ile yaparsak, iki programın boyutlarına
baktığımızda assembly ile yazılan daha kısa olduğunu
görürüz, aynı zamanda mikroişlemciyi ve hafızayı daha
verimli kullandığı için assembly dilinde yazılan program
diğerlerine nazaran daha güçlü olacaktır, son olarak
assembly dilinde yazılan program diğerine oranla çok daha
hızlı çalışır.
Son zamanlarda mikroişlemcilerin hızları GHzler (giga
hertz - ciga herz diye okunur) mertebesine çıktığından
assembly dilinin en büyük özelliği olan hızlılığı artık pek
popüler değildir. Kullanıcıya, 2GHz hızındaki bir CPU da
hemen hemen her uygulama aynı hızda çalışıyor gibi
görünür. Buna rağmen C gibi yüksek düzey programlama
dilleri ile hazırlanan büyük projelerde işlemciyi çok fazla
meşgul edecek olan kod bölümleri assembly rutinleri
çağrılarak yapılmaktadır.
NEDEN ASSEMBLY?
X86 Assembly dilini öğrenmek kolaydır ama bu dilde
proje hazırlamak insanı çileden çıkartabilir. Bu yüzden
günümüzde X86 assembly dili yerine, daha çok
endüstriyel alanda kullanılan microcontroller chiplerin
assembly dili kullanılmaktadır. Bir programcı assembly
dilinde büyük uygulamalar hazırlamaz (genellikle). Bunun
nedeni üst düzey programlama dilleri olan delphi, C, C++,
Pascala göre daha dikkat gerektirir ve kod yazımı daha
zordur. Programcı assembly dilinde proje hazırlayacaksa
kullandığı sistemin mikroişlemcisini ve hafıza haritasının
yanında, sistemin donanımında iyi bilmesi gerekir. Her
şeyden önemlisi zamandır ki sadece assembly dili ile PC
uygulamaları geliştirmek iğne ile kuyu açmaya benzer.
Assembly alt düzey bir programlama dilidir yalnız alt
düzey kelimesini yanlış anlamayın, bu kelime bu dilin
işlemciye ve hafızaya olan yakınlığını belirtir, üst düzey
diller ise daha çok programcıya yani insana yakındır.
<
Bu yüzden assembly dilinin özel kullanım alanları vardır.
Kısaca bunları söyle sıralayabiliriz.
1- Bilgisayar sistemini yakından tanımak için,
2- Device driver (cihaz sürücüleri) yazmak için,
3- Chiplere program yüklemek için (***, microcontroller
gibi...)
4- İşletim sistemlerinin yapımında (OS),
5- Şifre kırma ve Hacking işlemleri için,
6- Virüs programları yazmak için,
7- Elektronik tablolama (Excel gibi) programlarında.
İLK X86 ASSEMBLY KODLARIMIZ PC platformunda
doğrudan hafızaya sembolik kod kullanmadan yazacağımız
bu progr***** için herhangi bir editör ve derleyici
download etmenize gerek yok. DOS veya Windows işletim
sistemine sahip bir PC kullanmanız kafidir. Sırasıyla
şunları yapın;
1- Başlat menüsünden çalıştırı tıklayıp cmd programını
çalıştırın. Şayet Windows 98 kullanıyorsanız başlat
menüsünden MSDOS komut istemini çalıştırmanız
gerekiyor. Hala DOS işletim sistemini kullanıyorsanız
bilgisayarınızın power butonuna basmanız yeterlidir
halihazırda komut isteminde olan bir trex siniz.
2- Komut istemindeyken cd\ yazın ve root dizinine geçin
burada kendinize md asm yazarak asm adında bir klasör
oluşturun ve cd asm komutu ile klasörün içine girin. Tabi
ki klasör oluşturmak için bu kadar eziyet çekmenize
gerek yok, amacımız biraz nostalji. Maksat projemiz bir
klasörde oluşsun.
3- Debug yazıp enter tuşuna basın. Resimdeki görüldüğü
gibi debug programı çalıştırıldığında ekranın solunda bir -
simgesi görülür ve bu programla harikalar yapabilirsiniz
4- E 0100 yazıp enter tuşuna basınız.
6- Klavyeden Enter tuşuna basın ve ekran görüntüsü 3.
adımdaki gibi olunca g tuşuna basıp ardından son olarak
enter tuşuna tekrar basın.
Yukarıdaki ekran çıktısında görüldüğü gibi konsol ekranına
MERHABA ASSEMBLY yazdırdık ve debug programından
çıkıp komut istemine geri döndük. Hala hevesiniz
kırılmadıysa
Debug programı Microsoftun tüm işletim sistemlerinde
bulunan, hafıza ve CPUnun içindekileri görmemizi,
düzenlememizi sağlayan bir programdır. Çok ilkel bir
program olmasına rağmen beynimizin derinliklerine PCnin
yapısını kazıyacak olan ve bir assembly programcısının
bilgisayara ne şekilde bakması gerektiği konusunda
yardımcı olacak yegane programlardandır. En fazla 2
makale sonra Debug programını kullanmayı bırakıp daha
jan-jan lı debuger programları kullanacağız, şimdilik böyle
idare edelim.
Biraz önce Debug programının kendisi içinde
kullanacağımız e (enter) ve g (go) komutlarını kullandık. e
komutu hafızaya kod girişi yapmamızı sağlar ve g komutu
ise CPUya şu sihirli kelimeyi söylememizi sağlar; "Ey CPU
yazdığım bu kodları sırasıyla çalıştır bakayım". CPU
programcının sadık kölesi olduğundan aynen denileni
yapar.
E komutu ile hafızaya giriş yaptığımızı söyledik, komut
isteminin en solunda 152F:0100 gibi bazı rakamlar
gördünüz, buradaki 152F sizin bilgisayarınızda farklı
olabilir, ama 0100 aynıdır. işte : simgesi ile ikiye ayrılmış
bu 8 rakam hafızanın adresidir. Kodlar hafızaya yazılır,
silinir, değiştirilir fakat bu süreçte değişmeyen tek şey
hafıza adresidir. Adresler her zaman bizim onları
doldurmamız veya erişmemiz için hali hazırda beklerler,
bunu evinizin adresine benzetebilirsiniz. Eve anne gelir
baba gelir arkadaş gelir bazen tatilde boş kalır yani evin
içindekiler değişkendir ama ama ev adresi her zaman
sabit kalır, ta ki ev yıkılana kadar
E komutu ile bu örnekte hafızanın 152F:0100 adresi ile
152F:011B adresleri arasını makine kodları ile doldurduk.
Bunu yaparken kod yazacağımız adreste hali hazırda
hangi kodun olduğunu görme gibi bir lükse de sahiptik,
tesadüfen hepsi 00dı. Makine kodları CPUnun anlayacağı
yegane kodlardır ve 2lik (binary) yada 16lık
(hexadecimal) gösterimle ifade edilirler. Zamanla binary
gösterim biraz fazla yer kapladığından hexadecimal
gösterim benimsenmiştir. Daha sonra hexadecimal
gösterimin anlaşılması zor olduğundan sembolik kodlar ile
yazılan Assembly programlama dili geliştirilmiştir. İnsan
oğlu rahatına pek düşkün olduğundan
yazması ve anlaşılması daha kolay olan B Programlama
dilini geliştirmiş bu da yetmemiş C dilini geliştirmiştir. (Bu
sıralamada Assembly programlama dilide A oluyor tabi ki)
Programlama dilleri ABC diye devam derken C harfini çok
seven programcılar buna ++ ve # gibi aksesuarlar takarak
değişik varyasyonlar denemişler ve çokta başarılı
olmuşlardır
programcı geçmişini bilmeyen geleceğinden bir
haberdardır" diyerek konumuz geri dönelim.
X86 PClerin hafızası byte adreslenebilir diye bir
programcı ata sözü vardır. Bu söz her adrese en fazla 1
bytelık kod yazabileceğinizi anlatır. Bizde burada öyle
yaptık zaten, toplam 28 hafıza konumuna (memory
********) kod yazdık ve göreceksiniz biraz sonra programı
derleyip dosya haline getirince dosya boyutu 28 byte
olacak.

