Assembly Nedir?

Assembly Nedir?

Assembly aslında öğrenilmesi zor bir dildir. Uzun zaman ve büyük emek ister. Fakat iyi bir şekilde anlatıldığında hiçte zor değil. Ama baştan şunu belirteyim: Diğer programlama dillerinde yaptıklarınızı assembly altında daha çok satır kod yazarak ve daha uzun bir zamanda elde edebilirsiniz. Buna karşın diğer dillere göre birçok üstünlüğü bulunmaktadır. Lütfen bu sayfayı sonuna kadar okumaya devam edin.

Bir programlama dili öğrenecek insan öncelikle kolay bir dili öğrenmeli (Bu genelde Basic'dir.) Bu dil vasıtası ile programlama ve algoritma geliştirme (problemlere karşın geliştirilen hatasız ve tatmin edici çözümler diyebiliriz) hakkında bilgi ve deneyim sahibi olmalı. Son olarak ise diğer dilleri tanımalı ve seçtiği dili öğrenmeli, uygulamalar geliştirmelidir.

0C85:0100 B402 MOV AH,02
0C85:0102 B203 MOV DL,03
0C85:0104 CD21 INT 21
0C85:0106 CD20 INT 20

Yukarıda ayrıntılı çıktısı alınmış bir kod parçası bulunuyor. (Daha sonra ne işe yaradığını anlatacağım) Gri renkteki bölümler bellek lokasyonlarıdır. Yani ilgili kodların şu anda hangi bellek adresinde bulunduğunu gösteriyor bize. Kırmızı renkteki yazılar assembly kodlarıdır. Koyu yeşil kısımlar ise bu assembly kodlarının makina diline çevrilmiş halidir. Bizi ilgilendiren kırmızı bölümler olacak. Biliyorum o yazılardan hiçbir şey anlamadınız, bu çok normal...

Tam olarak anlamanız için uzun bir örnek olacak ama başlıyoruz...

Şu anda bilgisayarınızın başında oturuyor, windows işletim sisteminiz altında bazı programları kullanıyorsunuz. Muhtemelen Internet Explorer bunlardan biri. Kullandığınız her program (*.exe *.dll *.ocx ...) hangi programlama dili ile yazılırsa yazılsın hepside derlenmiş ve ilgili dosyalar haline dönüştürülmüştürler. Bir program Delphi ile yazılmış ve derlenmiş (exe uzantılı dosya haline getirilmiş) ise tersi işlem yapılması, yani programın kodlarına geri döndürülmesi imkansızdır. Derlenmiş program artık işletim sistemimizin ve makinamızın işlemcisinin anlayabileceği bir haldedir. Yani bizim makina dili dediğimiz haldedir. Tamamen iç yapısı elektronik devre elemanlardan oluşan işlemcimiz bu makina dili halindeki kodları çalıştırabilir. Başka hiçbir şeyden anlamaz. Bilgisayarlara bu nedenle de aptal makina denmektedir. Çünkü biz ne emredersek onu işlerler. Makina dili 16 lık sayı sistemindeki değerlerden oluşur. Bu kodlar sadece sayı kümelerinden oluştukları için bir insanın bunları anlaması hele hele bu sayılar üzerinden programlarını yazması nerdeyse imkansızdır...

Fakat insanların karmaşık sayılar yerine kendi konuşma dillerindeki kelimelerden oluşan bir komut kütüphanesi ile çalışmaları daha kolaydır. Bunu Basic dilinde rahatlıkla görebilirsiniz. Çünkü Basic dilindeki komutlar ingilizce bilen bir insan için öğrenme ve akılda kalma açısından çok kolay bir dildir. Makina dilindeki sayılar yani kodlar yani programımız bizim için önemlidir. Çünkü bunlar işlemcimiz üretilirken geliştirilmiş bir komut setine hitap ederler. Bir sonraki işlemci teknolojisine geçildiğinde komut seti genişletilir ve yeni komutlar eklenir. Assembly dili bu komut setindeki makina dili kodlarının insanların biraz daha kolay anlayabileceği harfler üzerinden gösterimidir. Bu tamamen semboliktir ve her assembly komutu yazıldığında birebir makina diline çevrilirler.

Peki Assembly bize ne sağladı? :

-Bize işlemcimiz üzerindeki her komuta aracısız erişim sağladı. Yani kod yazarken muhatabınız işlemci ve üzerinde çalışmakta olduğunuz işletim sistemidir. (Bu genelde Windows'tur ama başka bir sistemde olabilir.) Bu size oluşturacağınız programın kodlanması esnasında çok yüksek bir kod hakimiyeti sağlar. Böylece diğer dillerde aynı işi yapsanız dahi sizin assembly ile işlemci üzerindeki hakimiyetiniz en üst düzeydedir ve bunu sizin kadar temiz yapabilecek bir programlama dili ve/veya derleyici yoktur.

-Yazdığınız her satır kod 1 ila 4 byte civarında olup çok az yer kaplar. Diğer dillerde yazılan kodlar aynı işi yapsa dahi sizinle aranızda derleyici bulunmaktadır ve programın işleyişini sağlama almak amacıyla komutlar arasında ek bilgiler girilmekte ve programınızın boyutu büyümektedir. Ayrıca diğer dillerdeki komutlar işlemci üzerindeki komutlarla uyuşmaz ise derleyici bunu dolambaçlı yollardan işlemciye anlatır ve yazılan bir tek komut makina dilinde yüzlerce komuta karşılık gelebilir. Herhangi bir dildeki basit komut assembly ile yazılsa 2 ila 6 kat daha az yer kaplar.

-Yazdığınız programlar (eğer bir algoritma hatası yok ise) diğer dillerdeki şekillerine göre her zaman daha az yer kaplar. Programın az yer kaplaması çalışırken daha az bellek tüketmesi; işlemler daha az kod ile anlatıldığından daha kısa sürede işlemin bitmesi, yani programımız daha hızlı çalışması anlamına gelir.

Avantajları :

- İşlemcinizin gücünü en iyi şekilde ortaya koyabilecek tek programlama dilidir.
- Cok az yer kapladığı için bilgisayar virüslerin yazımında kullanılırlar.
- Çok hızlı çalıştıkları için işletim sistemlerinde kernel ve donanım sürücülerinin programlanmasında, hız gerektiren kritik uygulamalarda kullanılmaktadır.
- Yapısı itibariyle üç boyutlu ekran kartlarında ilgili çizim ve efektlerin işlenmesi amacıyla hem oyunlar hem de programlar içinde ekran kartına hitap eden makina dili kodları kullanılmaktadır.
- Herhangi bir amaç doğrultusunda (genelde programların daha hızlı çalışması için optimize edilirken), herhangi bir programlama dili altında, o dilin kodları arasında kullanılabilir. Yani diğer dillerle beraber de kullanabilirsiniz. Sizin uzman olduğunuz dil belki Visual Basic dir. Ama işin içinden çıkamadınız, assembly bilen bir arkadaşınız sizin için birkaç kod ekledi ve tamam.
- İyi öğrenildiğinde diğer dillerde karşılaşılan büyük problemlerin assembly ile basit çözümleri olduğu görülür. Yani başka programlama dillerde çalışan insanların bu iş imkansız dediği yerde assembly devreye girer. Bu üstünlük daima var olacaktır...
- Yazdığınız programın kaynak kodlarını tüm dünya ile paylaşsanız dahi kodlar o kadar karmaşıktır ki insanlar assembly bilse dahi ne işe yaradığını çözmeleri çok uzun zamanlarını alır. (Açıklayıcı bilgiler koymadı iseniz) Assembly bilmeyen bir insanın kaynak kodu anlaması imkansızdır.
- Her program derlendiğinde makina diline dönüşür. Bunlar assembly kodlarına dönüştürülebilirler. (Buna disassembly olayı denir, bunu yapan programlar ise disassembler'lar dır.) Bu sayede assembly bilen bir insan zor da olsa diger programların çalışma şekillerini inceleyebilir ve üzerlerinde oynama yapabilir. Bu özellik de başka hiçbir dilde yoktur. Daha ileri gidip programların şifre isteyen bölümleri değişik yöntemlerle kırılabilir. Serial Generator türü programlar bu şekilde yapılabilmektedir.
- Zaman geçtikce ve insanlar üreten yerine tüketen bilgisayar kullanıcıları haline geldikçe bu dili bilmenin ayrıcalığı artmaktadır.

Dezavantajları :

- Dilin öğrenilmesi uzun zaman ve emek ister.
- Yazılan programlar diğer diller göre daha çok satırdan oluşur.
- Yazdığınız programın hangi satırlarının ne iş yaptığını bir süre sonra anlamayabilirsiniz. Çünkü anlaşılması zor ve karmaşık bir dildir. Bu nedenle kodların sonuna açıklama bölümleri eklemek iyi bir çözüm olacaktır.
- İşlemciye birebir bağımlıdır. Yani sonraki sayfalarda anlatılacak olan kodlar Intel ve uyumlu (AMD, Cyrix, Via) işlemcilerde geçerlidir. Örneğin Motorola işlemcileri kullanan Macintosh bilgisayarlarda hem komut setinin hem de işlemci mimarisindeki büyük farklılıklardan dolayı geçersizdir. Fakat onlarda da bir makina dili tabii ki bir assembly dili bulunmaktadır. Fakat komutlar daha farklıdır. Bizim ilgi alanımız intel 386 (i386) üstü ve bunlarla uyumlu işlemcilerdir.

Bilgisayarlar ve Mikroişlemciler

Biraz bilgisayar tarihine değinelim, daha sonra mikroişlemcilere geçeceğiz.

Aslında abaküs'e kadar dayanıyor. Öncelikle matematikteki daha sonra fen bilimlerinde ve teknolojideki gelişmeler ve yeni teknikler bizi şu anda bulunduğumuz noktaya getirdi. İlk hesaplayıcılardan sonra Pascal ve Babbage'in mekanik hesaplayıcıları gelmektedir. Elektronik devre elemanlarının geliştirilmesi ve tüplü tranzistörlerin sayesinde ilk elektronik hesaplayıcılar, yani modern bilgisayara giden yol açılmış oldu. 1936-1951 arasındaki bu donemde 1945 de ENIAC yapıldı. ENIAC ile işlemler soket bağlantılarının değiştirilmesi ile yaptırılıyor idi. 70bin direnç, 10bin kondansatör, 18bin tüplü tranzistör ve çalışırken harcanan 150-200 kilowatt enerjisi ile dev ama sadece dört işlem yeteneği, çok yavaş çalışması, kablolarla programlamanın zorluğu ve çok sık arıza yapmasıyla da hantal bir cihaz idi.

1948 yılında germanyum, 1954 de silisyum tranzistörler bulundu. Artık vakum tüpleri yerini yarı iletken tranzistörler aldı. Mikroelektronik geliştikçe tranzistörler küçüldü ve sonunda bunları tek bir devre parçasında birleştirme fikri gelişti. Artık entegre devreler yani çipler karşımızda. Harcanan daha az enerji, daha küçük devreler taşınabilir radyolar gibi ürünleri beraberinde getirdi.

İntelin ilk ticari amaçlı işlemcisi 1971 yılının 4004 çipi idi. Dört bitlik bir işlemci olup sadece hesap makinalarında kullanıldı. Bizi ilgilendiren 1978 yilinda üretilen 8086. Bu işlemci 8bitlik basit ve yavaş bir işlemcidir. Fakat şu andaki Pentium 4 mimarisi bile geriye uyumlu olarak bu işlemciyi desteklemektedir. Farkları hız, ek birçok komut ve yeni teknolojilerdir. Biz de bu 8086 ile başlayan x86 komut setini programlıyor olacağız. Aşagıda bir ilerleme yer almaktadır.

8086 -> 80186 -> 80286 -> 80386 -> 80486 -> Pentium -> Pentium Pro -> Pentium !! -> Pentium !!! -> Pentium 4

İntel işlemciler 80386 den itibaren bazı yenilikler getirdiği için ( 32bit ve multitasking işlemci ) artık bizim için temel teşkil etmektedir.
Pentium 4 3000C işlemcisi için biraz açıklama yapalım: Mimari:Pentium 4 İşlemci çekirdek hızı: 3000Mhz (yani bir saniyede 3 milyar komut işler) C: Veriyolunun 800Mhz olduğu anlamında. Klasik özellikler: 32bit işlemci, 64 bit veriyolu, 4Gbyte bellek adresleme, Hypertreading teknolojisi ile çift işlemci gibi çalışma ve gelişmiş mimari özellikleri ile tek döngüde iki işlem yapabilme özellikleri bulunuyor.

İşlemcimizin 32 bit olması ne demek? Öncelikle bit nedir? 1 byte bilgi tek karakterden oluşur. Yani notepad içine yazdığınız tek bir 'A' harfi 1 byte yer kaplar. 1 byte bilgisayarda 8 bit yani 8 tane '1' veya '0' dan oluşur.

binary 11111111 = decimal 255 eder.
binary 01000001 = decimal 65 eder. Bu değeri içinde saklayan bir 8bitlik saklayıcı 'A' harfini gösterir. Yani matematiksel değerlerinin yanında bu 8 bitlik değerler ASCII karakter setine göre belirli bir karaktere de denk gelmektedir.

İlk sayfada 0C85:0100 B402 MOV AH,02 şeklinde bir satır bulunuyor idi. Buradaki B402 16lık sayı sistemindeki 2 byte bilgidir. Ve bu makina dili komutu assembly olarak Mov ah,02 ye denktir. Bu komut ise ah registerine (işlemcideki 8bit saklayıcılardan biri) 02 hexadecimal değerini atar. İleride bit düzeyinde işlemler de yapacağımız için 16 lık 10 luk ve 2 lik sayı sistemlerinin birbirine dönüşümlerini bilmek zorundayız. Örnek bir binary-decimal dönüşümü aşağıdadır.

binary 01001110 için Decimal karşılığı=0*2^7+1*2^6+0*2^5+0*2^4+1*2^3+1*2^2+1*2^1+0*2^0=64+8+4+2=78 eder.

Daha önce de belirttiğimiz gibi işlemci sadece matematiksel değerlerden anlar. İster kod isterse data olsun esas olan bitlerdir. 32 bit işlemciler 1 döngüde 32 bit yani 4 byte bilgiyi işleyebilme özelliğine sahiptir. Çarpma, bölme, bellekten işlemciye veri alınması ve gönderilmesi gibi...

İşlemciler teknik özellikleri yanında iç frekansları ile de karşılaştırılmaktadır. Pentium 3 1000Mhz bir işlemci saniyede 1 milyar işlem yapar. Fakat işlemcide her komut aynı sürede tamamlanmaz. Bu komutun karmaşıklığı ile alakalıdır. İşlemci içinde bir tür sinyal üreten saat bulunur. Bu işlemcinin hızını tayin eder. İşlenecek olan komut saat darbesinin verilmesi ile işlem görmeye başlar ve bir sonraki saat darbesine kadar tamamlanmak zorundadır. İşlemcideki tüm komutlar için bu geçerlidir.

Register'lar

İşlemcimizin bize sundukları üzerinden program yazdığımız için işlemcimizi de tanımalıyız. Komut setini yani assembly komutlarını bir sonraki derste anlatmaya başlayacağız. Registerler işlemci çalışması sırasında değişik amaçlar için kullanılan değişkenlerdir. Bellekteki verilere ulaşmak belirli bir zaman gerektirir, fakat registerler işlemci çekirdeğindedir ve fazladan zaman harcanmadan istenen işleme göre içerikleri kullanılabilmektedir. Fakat sınırlı sayıda bulunurlar. Registerler genel amaçlı kullanılabilecekleri gibi bazıları sadece özel görevleri üstlenmektedir. Bunlar ileride anlatılacaktır. Şimdi i386 uyumlu bir işlemcinin registerlarına bakalım.


<--- 32 bit register --->

EAX
EBX
ECX
EDX
EBP
ESP
ESI
EDI


<--- 16 bit register --->

AH AL
BH BL
CH CL
DH DL
BP
SP
SI
DI


<--- 16 bit register --->

CS
DS
SS
ES
FS
GS
<--- 32 bit register --->
EIP
EFLAGS

Evet yukarıda işlemci registerlerinin çoğu görülmekte. İlk iki tablo aslında iç içe girmektedir, fakat bu şekilde daha iyi anlışılacağını düşündüm. Aşağıda ise bu registerlerin sınıflandırılmış halini görebilirsiniz.

Data Registers Pointer Registers Index Registers Segment Registers
EAX,EBX,ECX,EDX,AX,BX,CX,DX,AH,AL,BH,BL,CH,CL,DH,DL EBP,ESP,BP,SP ESI,EDI,SI,DI CS,DS,SS,ES,FS,GS

Daha önce söylediğim gibi yukarıdaki 32 bitlik işlemcimiz 8086 tabanlı olduğu için geriye uyumlu olarak 8086 nın programlarını da çalıştırabilmelidir. Fakat 8086 işlemcisi 8 bitlik bir işlemcidir. Bu nedenle gerçekte EAX şeklindeki bir register 32 bittir, fakat bu registerin ilk 16 bitlik bölümü AX şeklinde ifade edilir. Bu AX şeklindeki 16 bitlik bölüm ise kendi içinde ilk 8 bitlik bölüm AL, sonraki 8 bitlik bölüm AH olmak üzere yine alt bölümleri bulunur. Yani ben 4 byte bilgi depolamak istersem EAX,EBX gibi 32 bitlik; 2 byte bilgi depolamak istersem AX,BX gibi 16 bit; eger 1 byte bilgi depolamak istersem AH,AL,BH,BL registerlerini kullanabilirim. Sadece şunu unutmayın, AX,AH,AL registerleri sadece EAX registerinin alt bölümleridir. Başka yerde depolanmazlar. Gerekli olduğunda alt registerlere ulaşılabilir fakat gerçekte esas olan EAX dir. Pointer ve index registerlerinde de alt bölümler bulunur. Sınıflandırma tablosunu inceleyiniz. Kafa karıştırma olasılığına karşılık aşağıda registerleri boyutlarına göre de sınıflandırdım.

32bit registers (4 byte) 16bit registers (2 byte) 8bit registers (1 byte)
EAX,EBX,ECX,EDX,EBP,ESP,ESI,EDI,
EIP,EFLAGS
AX,BX,CX,DX,BP,SP,SI,DI,
CS,DS,SS,ES,FS,GS,IP,FLAGS
AH,AL,BH,BL,CH,CL,DH,DL

Şimdi yukarıdaki registerler ne işe yarar onları öğrenelim ? (Örnekleri bir sonraki Ders içeriğinde yer alacak.)

AX : Akümülatör Registeri, Dörtişlem operasyonlarında kullanılmaktadır.
BX : Base Registeri, Bellek lokasyonlarında baz adres göstericisi olarak kullanılır, yani bir tür index registeri gibi kullanılabilir.
CX : Counter Registeri, Döngü işlemlerinde sayaç olarak kullanılır, yani döngü kaç defa daha dönecek bunun sayısını tutar.
DX : Data Registeri, Donanım ile yapılan giriş çıkış işlemlerinde kullanılır.

CS : Code Segment Registeri, Segmentler bellekte bir alt bölümü işaret ederler. Önemli olan içeriklerinin ne olduğudur. Bizim en önemli segmentimiz kod segmentdir. İçeriğinde ise tahmin edebileceğiniz gibi yazdığımız programın komutları yer alır. Hem programcı hemde kullanılan işletim sistemi kod segmentteki komutlar üzerine başka dataların yazılmayacağının garantisini almalıdır. Aksi taktirde programımız garip hatalar verir ve kitlenir. Programların sağlıklı çalışmaları için Code Segment içeriği en önemli noktadır. (NT çekirdeği taşıyan Windows 2000 ve XP işletim sistemleri gelişmiş bellek yönetimleri sayesinde Windows 9x sistemlere göre daha kararlıdırlar. Windows 9x sistemlerde programlardaki hatalar sistemi çökertebilecek seviyeye çıkabilir. Mavi ekran hataları bu sebepledir. )
DS : Data Segment Registeri, programımızı yazarken kullandığımız değişkenler,karakter dizileri ayrıca çalışma anında oluşturulan değişken tiplerinin tamamı bu segment altında tutulur.
SS : Stack Segment Registeri, Stack çok özel bir data segment tipidir. Alt programlardan, dll dosyaları içinde bulunan fonksiyonlardan, windows api fonksiyonlarından kodlar yürütülmeden önce gerekli değişkenler bu segmente sadece bu amaçla kullanılan bir assembly komutu ile alınırlar. Daha sonra çağırma işlemi yapılır. Önemli olan çalışma prensibini anlamaktır. Burada diğer data segmentlerden olduğu gibi istenilen adresinden veri çekilebilmektedir. Farkı ise stack'a yollanan son verinin çağırılma esnasında ilk olarak geri dönmesidir. Yani son giren-ilk çıkar mantığı. (ileride daha ayrıntılı anlatılacak) Veriler stackin sonundan başına doğru alınırlar. Stacka son yollanan veriyi SP isimli Stack Pointeri işaret eder.
ES : Extra Data Segment Registeri,Data segment ile aynı özelliklere sahiptir. Özel olarak bu segmenti kullanan birkaç komut bulunmaktadır.
FS,GS : Bu segment registerleri ihtiyaç olduğu zaman kullanılmaktadır. Aslında ek olarak kullanılan Data Segment Registerleridir.

BP : Base Pointer, Stack segmentin başlangıç noktasını gösterir. Yani genelde içeriği sıfırdır.
SP : Stack Pointer, Stack segment içine gönderilmiş olan son değerin (byte) adresini göstermektedir. Stack içine veriler yollandıkça değeri azalır çünkü veri segmetin sonundan başına doğru alınırlar. Veriler stackdan çekildikçe değeri artar, böylece eski verileri gösterir, eski veriler silinmez ama SP değeri değiştiği için işlem hata vermeden yürümektedir.
***BP ve SP aslında SI ve DI gibi segmentler içindeki verinin adresini gösterirler. Stack Segmentin özel bir çalışma şekli olduğu için bu Pointer registerleri özel olarak sadece Stack Segmentin sağlıklı çalışması için görev yapmaktadır.

SI : Source Index, Data segment veya istenirse başına küçük bir tanımlama eklenerek diğer data segmentlerdeki verileri de göstermek için kullanılan bir index (işaretçi) registerdir.
DI : Destination Index, SI ile tamamen aynı özelliklere sahiptir. Fakat SI ve DI bazı string komutları tarafından kaynak ve hedef işaretçisi olarak da kullanılmaktadır.

IP : Bir işaretçi registerdir. Çok özel bir işaretçidir. Code Segment içinde işlenecek bir sonraki komutun yerini işaret eder. Yaptığınız işten emin olmadan üzerinde oynama yapmayın!
FLAGS : 32 bitlik yine çok özel bir işlevi olan registerdir. Bu registerin içeriğindeki bitler çok önemlidir. Bazı bitler anlamsızdır, diğerleri ise daha önce işlenen komutların sonuçları ile ilgili bilgiler verir. Örneğin CMP komutu ile iki sayı karşılaştırılır ise sayıların eşit olma veya birinin diğerine göre büyük olması bu register içindeki bazı bitleri 1 (set) veya 0 (reset) durumuna getirecektir. Daha sonra kullanılacak bir dallanma komutu ile bu flaglar kontrol edilerek sonuca göre belirli adreslere dallanmalar yapılır. İçeriğini biz direkt olarak kullanmayacağız. Bazı komutlar işleyişleri sırasında bu registeri gizli olarak kullanmaktadırlar.

Aşağıda hangi segmentlerin hangi işaretçi registerler ile kullanılacakları verilmektedir:
CS:IP DS:SI DS:DI SS:BP SS:SP

Debug ve Kullanımı

İster DOS olsun isterse Windows, çalıştırılabilir iki tipte dosya bulunur. Com veya exe tipindedir. Com tipi dosyalar birebir programın bellekteki şeklinin aynısıdır. Exe tipi dosyalarda ise programın başında işletim sisteminin anlayacağı tipte bir başlık bulunur. İşletim sistemi bu kısımdaki direktiflere göre code, data ve diğer segmentleri bellekte boş olan yerlere göre hafızaya yükler ve ilgili segmentlerin adreslerini registerlere aktararak programin ilk komutu ile işlemi programa bırakır. Com tipi programlarda böyle bir düzenleme yapılmaz, sadece diskten okunur, boş bir bellek adresine yerleştirilerek yürütme programa bırakılır. Tabii dos altında olsa idik tam olarak böyle idi. Windows altında dos için yazılmış olan tüm programlar bir dos emülasyon penceresi altında sanal bir ortamda çalışırlar. (Com dosyaları 64k dan daha uzun olamazlar, exe tipi dosyalarda bu tür bir sınırlama olmayıp gelişmiş özellikler içerirler. Bu nedenlerle exe tip dosyalar daha çok kullanılırlar.)

Exe tipi programlar derlenerek hazırlabilirler, fakat com tipi dosyaların derlenmeye ihtiyacı yoktur ve Debug.exe isimli komut satırı programı ile bunlar programlanabilir. Debug.exe tüm dos ve windows işletim sistemleri ile birlikte geldiği için ek bir program kurmanıza gerek yoktur. Tabii bu programı sadece komutların kullanımlarını görmek, programımızı satır satır çalıştırarak registerleri nasıl etkilediğini görmek amacıyla kullanacağız. Fakat kullandıkça vazgeçmesi zor bir programdır, yani bağımlılık yapar. (Şunu unutmamalıyız: Debug ile 16 bit registerlere ulaşabilir ve bu şekilde program yazabiliriz, 32bit ile çalışmalar bir sonraki bölümden itibaren başlayacaktır.)

Başlat -> Çalıştır yolunu izleyerek command yazıyoruz. Sonra debug yazıp enterleyin. Karşımıza sadece '-' işareti geldi. Artık debug bizden komut girmemizi bekliyor. Aşağıda ilk programımızı yazdık, şimdi biraz anlatalım.

Komut satırını açarak debug'a geçiş yaptık. 'a100' şeklinde bir ifade var. 'a' komutu bizim assembly kodlarının girişine başlayacağımızı bildirir. sonundaki '100' ise komutları yazmaya başlayacağımız adrestir. Debug ile sadece com tipi dosyalar yazılabiliyor ve bu tür programlar 100h adresinden itibaren yazılırlar. (Debug altında gireceğimiz tüm matematiksel ifadeler hexadecimal sistemdedir!!! Yani 100h aslında decimal 256'ya denk gelir.)

mov ah,2 : MOV komutu bizim en çok kullanacağımız komutlardan biri. Sağdaki register içeriğini veya herhangi bir hexadecimal sabit değerin soldaki registere kaydedilmesidir. Tabii bu durumda ah'ın eski değeri kaybolur, zaten bizim için şu anda bunun önemi yok. (com tipi dosyalarda program ilk çalışmaya başladığında çoğu registerin değeri sıfırdır.)

mov dl,3 : Yukarıdaki MOV komutu gibi burada da bir atama söz konusu. DL isimli 8bit registere 3h değeri kaydediliyor.

int 21, int 20 : Bu komutlar dos kullanıldığı zamanlarda geçerli idi. Benzer işlemde şu anda windows altında API fonksiyonları görev yapmaktadır. Bunları bir tür dos işletim sisteminin bize sunduğu hazır fonksiyonlar olarak görebiliriz. Elbette sadece 20 ve 21 bulunmamakta. Fakat bunlara değinmeyeceğiz. (int=interrupt) Interrupt 20 parametresiz çağırılır ve bizim com tipi programımızı sonlandırır. Interrupt 21 dos ile gelen dev bir fonksiyonlar kütüphanesidir. Hangi numaralı fonksiyonun çağırılacağını ah registerine koymak zorundayız. Fonksiyonun tipine göre istenen başka değerler bulunuyor ise bunlar da ilgili registerlara atanmalıdır. Daha sonra interrup çağrısı yapılır. Biz iki numaralı fonksiyonu (yani ekrana karakter yollama fonksiyonu) çağırıyoruz, bunun için ah a 2 atadık. Daha sonra ASCII karakter tablosuna göre hangi değer ekrana getirilecek ise onun hexadecimal değerini DL registerine atıyoruz. (Burada 3h kalp şeklinde bir karakter, eğer 41h değeri atanırsa 'A' harfi ekrana basılır.) (Bunlardan sonraki satırı ENTER ile boş geçin.)

g : ile programa çalışma emri veriliyor. Gördüğünüz gibi bir karakter ekrana basılıp program int 20 ye geldiğinde normal olarak sonlanıyor.

n : ile programımıza isim veriyoruz. r cx ile cx registerinin değerini değiştirerek 8 giriyoruz çünkü programımızın son satırı 0108 adresini gösteriyor. Ilk satır 0100 ise arada 8 byte yokmu? Yani programımız 8byte uzunluğunda ve biz bunu cx'e aktararak diske kaydedilecek programın boyutunu belirtiyoruz ve w ile işlem tamamlanıyor. Artık q komutunu verip Debug'dan çıkın ve bulunduğunuz dizinde 8 byte uzunluğunda bir kalp.com isimli program var mı bir bakın. Veya hemen kalp yazıp ekran çıktısının debug içinde g komutu ile aldığımızın aynısı olduğunu görebilirsiniz. Bu bizim ilk programımız oldu.

Yukarıdaki çalışma yine aynı program üzerinde yapıldı. Burada t (trace, izle) komutu ile programımızı satır satır çalıştırdık ve registerler üzerindeki etkilerine baktık. Interruptlar birer dev kod bloğu olduğuna göre ve bunları da trace eder isek sayfalar sonra içinde çıkabileceğimiz için bunları pas geçmek için p kullanıldı. Ilk komut işlendikten sonra ekrana ilk gelen bölümü inceleyelim. Ilk komut mov ah,2 idi. Gördüğünüz gibi AX=0200 bölümünde AX in üst 8 bitine yani AH'a 2 değeri atanmış. Burada dikkat ederseniz DS,ES,SS,CS değerleri yani segment registerları aynı blok adresini gösteriyorlar. Yani com tipi dosyalarda kodlar ile datalar aynı yerde bulunuyor. Bu da bize program yazarken dikkatli olmamız gerektiği anlamında önemli bir not. IP pointeri daima sırada işlenecek olan komıtu gösterir. Ilk komut işlendiğine göre 0102 değerini gösteriyor. IP nin hemen sağ tarafındaki ifadeler flagların durumlarını göstermektedir, şu anda önemli değil. Üçüncü satırda sırayla şunlar yer alıyor: CS:IP

Ikinci trace'de DL ye 3 değerinin aktarılmış olduğu rahatlıkla görülebilir. Bundan sonraki p komutu ile int 21 işleme girer ve ekranda görülen kalp işareti geliyor. int 20 de programdan çıkılıyor. Bu basit bir örnek oldu, daha karmaşık bir örnek inceleyelim.

mov ah,2 : Interrupt 21 içindeki 2 numaralı fonksiyon yani ekrana karakter basmamız için atıyoruz.

mov cx,FF : Şu ana kadar görmediğimiz döngü işlemi için kullanılacak. FF yani decimal 255 değeri CX e atanıyor. Aşağıdaki loop komutuna gelindiğinde cx in değeri bir azaltılıyor ve sıfıra eşit değil ise değerine atlıyor program. CX içindeki sayı kadar bu loop döngüsü devam ediyor, yani 255 defa. CX sıfıra eşit olduğunda ise hiçbir işlem yapılmıyor ve bir alttaki komut ile programa devam ediliyor. Diyebiliriz ki LOOP komutu gizli olarak cx registerini kullanmaktadır.

inc dl : inc komutu karşısındaki registerin değerini bir artırır. Biliyorsunuz ki ekrana gönderilecek karakter dl içinde. Biz 255 döngü içinde 1 ila 255 arasındaki tüm ASCII karakterleri ekrana basmak istiyoruz. Bunun için toplama işlemi de yapabilirdik (add dl,1) fakat bu işlemin okunurluğu daha iyidir.

int 21 : Ekrana karakter yazma fonksiyonu çağırılıyor.

loop 105 : CX sıfıra eşit değil ise 105 adresine zıpla.

int 20 : Programdan çık.

Aşağıda g (go) komutu ile çıktı alınıyor. Tabii buradaki karakter seti dos altındaki; windows altındaki ile uyuşmayabilir. Daha sonra ise ascii.com şeklinde kaydediliyor.

Aşağıda bazı assembly komutları ve açıklamaları bulunuyor:

MOV : Değer aktarmak için kullanılır. mov ah,2 mov ax,FFFF mov bx,cx mov dl,bh mov [200],ah mov dl,[382] gibi. (Köşeli parantez 'adresindeki' anlamındadır. Yani ah içeriğini 200 adresine transfer et gibi.)
XCHG : İki registerin içeriklerini karşılıklı olarak değiştirmelerini sağlar. xchg ah,bh xchg ax,dx gibi.
ADD : İki değerin toplanması amacıyla kullanılır. Sonuç değer soldaki registere kaydedilir. add ax,bx add ah,AF add dl,1 add al,ah gibi.
SUB : Çıkarma işlemi yapar. Sonuç ilk registere kaydedilir. sub ah,1 sub ax,bx sub cx,10 gibi.
MUL : Çarpma işlemi yapar. Tabii ki tüm işlemlerde olduğu gibi değerler ve sonuçlar hexadecimaldir. 3 farklı durumda incelenebilir.

8bit*8bit yani byte*byte : Çarpılacak değerlerden biri al ye kaydedilir mov al,5F gibi. Daha sonra çarpma işlemi yapılır, mul bl gibi. Sonuç ise ax registerindedir. (ax=al*bl işlemi)
16bit*16bit yani word*word : Çarpılacak değerlerden biri ax ye kaydedilir mov ax,05FF gibi. Daha sonra çarpma işlemi yapılır, mul bx gibi. Sonuç ise dx,ax ikilisine aktarılmıştır. Yani üst 16bitlik kısım dx de, alt 16bitlik kısım ise ax dedir. (dx,ax=ax*bx)
32bit*32bit yani dword*dword Çarpılacak değerlerden biri eax ye kaydedilir mov eax,A055FF10 gibi. Daha sonra çarpma işlemi yapılır, mul ebx gibi. Sonuç ise edx,eax ikilisine aktarılmıştır. Yani üst 32bitlik kısım edx de, alt 32bitlik kısım ise eax dedir. (edx,eax=eax,ebx)

DIV : Bölme işlemi için kullanılır. Ayrıntılarına girmiyorum.
INC : Register içeriğini bir artırır. inc ah gibi
DEC : Register içeriğini bir azaltır. dec cx gibi.
NEG : Sayının ikili tamamlayıcısını bulur. Örneğin al de 11110000 binary değeri bulunuyor ise neg al işleminden sonra bu değer 00001111 olur.
PUSH : Stack a yani stack segmente değer göndermek için kullanılır. push ax gibi.
POP : Stack dan değer çekmek için kullanılır. pop cx gibi.

Windows Altında Win32Assembly Programlama

Artık masm ile nasıl program yazılır bir gözatalım. Aşağıdaki küçük bir windows uygulaması yer almakta:

.386
.model flat, stdcall
option casemap :none
; case sensitive

include
\masm32\include\windows.inc
include
\masm32\include\user32.inc
include
\masm32\include\kernel32.inc

includelib
\masm32\lib\user32.lib
includelib
\masm32\lib\kernel32.lib


.data

baslik db "İlk Assembly Programımız",0
yazi db "Merhaba Dünya",0

.code

start:

push MB_OK
push offset baslik
push offset yazi
push NULL
call MessageBox

push NULL
call ExitProcess

end start

; --------------- Data section

.data

baslik db "İlk Assembly Programımız",0
yazi db "Merhaba Dünya",0

; --------------- Code section

.code

; --------------- Program startup
start:

invoke MessageBox,NULL,offset yazi,offset baslik, MB_OK
invoke ExitProcess,0

end start

Yukarıdaki ilk örnek qeditor.exe ile derlenebilecek haldedir. Biz eğer notepad kullanmış olsaydık bu şekilde kodlayacak idik. Ben derledim ve boyutu 2.5kbyte olan bir exe dosyası oluştu. Yukarıdaki hem soldaki hemde sağdaki assembly kodu aynı işi yapıyor. Yaptığı iş baslik ismi ile belirtilen başlığa sahip, yazi ismi ile yine data segmentte belirtilen yazıya sahip bir mesaj kutusu gösteriyor. OK'e tıklandıktan sonra program sonlanıyor. İsterseniz hemen açıklamaya başlayayım. İlk üç satıra uzun süre hiç dokunmayacaksınız, burayı geçiyorum. Include satırları ile içinde windows api fonksiyonlarının ve bazı sabit değerlerin isimleri bulunan inc uzantılı dosyaları tanımlıyoruz. Includelib fonksiyonu ile kullandığımız api fonksiyonlarını içeren kütüphaneleri tanımlıyoruz. Windows.inc dosyasında NULL ve MB_OK tanımlamalarının matematiksel eşitlikleri bulunuyor. Birçok özel durumun hangi sayılar ile belirtildiğini ezberlemektense bunların karşılıklarını bilmek daha kolaydır, hemde programın okunurluğunu artırır. .data ile data segment tanımlanıyor ve bu data segment içinde baslik ve yazi adreslerinde ilgili string ifadeler yer alıyor. Dikkat ederseniz stringlerin bittiğini belirtmek için ayrıca 0h degeri ekleniyor. Daha sonra .code ifadesi ile cede segment tanımlanıyor. start: ve end start ifadeleri arasına kodlarımızı yazıyoruz. Dört adet push komutu alt alta yazılmış. PUSH komutu ile stack segmente bazı değerler gönderiyoruz. Bunlar mesaj kutusu ile ilgili özellikler. İlk özellik mesaj kutusunda sadece OK tuşu bulunacağı anlamında. İkinci özellik olan mesajın başlık bölümünde yer alacak yazının adresini stacka yolluyoruz. (adresi anlamına gelen offset terimi kullanılmıştır) Üçüncü yollanan özellik mesaj olarak gösterilecek string ifadenin adresi. Son yollanan ifade NULL yani sıfırdır, buraya bir değer girmemize şu anda gerek yok. Gerekli parametreler stacka yollandıktan sonra fonksiyonumuzu çağırıyoruz. CALL komutu bir fonksiyonun yada bir altprogramın çağırılmasında kullanılır. Çağırılan yerdeki işler bittikten sonra programımız bir sonraki ifade ile devam edecektir. Fonksiyonumuz MessageBox apisidir . Bu api user32.inc içinde tanımlanmış ve ilgi kutuphane user32.lib eklenmiştir. Bu apiyi kullandığımızı belirtmek için yukarıdaki ifadeleri include ile tanımlamaktayız. Daha sonraki bölümde programdan çıkış kodları bulunuyor. Öncelikle çıkış kodu stacka yollanır. Normal sonlanmalarda bu NULL yani sıfırdır. Daha sonra kernel32.inc ve kernel32.lib ile tanımladığımız fonksiyonlardan ExitProcess çağırılıyor.

İşletim sistemimizde user32.dll içinde MesageBox apisi, kernel32.dll içinde ise ExitProcess apisi bulunmaktadır. Dos altında yaptığımız interrup çağrıları gibi windows altında api fonksiyonları bulunur. Bunlar disk erişiminden, ekrana resim çizdirmeye, buttonlar ve kutucuklar hazırlamaya kadar binlerce fonksiyon içeririler. Tabii sadece bu iki dll dosyasıyla sınırlı değil apiler. Ayrıca yukarıdaki komutları yazarken dikkatli olmanız gerekiyor. Derleyicimiz büyük küçük harf ayrımı yapabiliyor. Özellikle api fonksiyonların isimlerini aynen yazın.

Soldaki kod ise işlev olarak aynıdır. Farkı ise MAsmEd altında yukarıdaki gibi yazılması yeterlidir. Include tanımlamalarını programda sol taraftaki ağaç şeklindeki kısımdan ekleyerek yapıyoruz. Data segmentin içeriği aynı. Code segmentde ise küçük bir değişiklik var. Alt alta yazdiğimiz fonksiyon çağırma işinde call yerine invoke ile tek satırda tüm parametreleri yazdık. Böylece daha kolay okunur oldu. Bunu qeditor.exe içinde de yapabilirdik, yinede eski şekilde kullanılan örnekler daha çok olduğu için ikisini de göstermek istedim. Yoksa yazım farkından başka ikiside aynen ilk örnekteki gibi çalışmaktadır. Birde editörümüz programımız için ikon ve ek bazı versiyon bilgileri eklemektedir. Bu nedenle editör içinden derlenen aynı program 5.5kbyte boyuta sahip olacaktır.

Kaynak:http://www.enginkuzu.org

MSN Hakkında Bilgi

MSN Hakkında Bilgi

Çok şık yeni ifade simgeleri ile anında ileti gönderebilir, bilgisayarınızdan dünyanın herhangi bir yerini arayabilir, görüntülü görüşmeler yapabilir, birisinin yazmakta olduğunu görebilir, arkadaşlarınıza resim ve müzik gönderebilir ve bunun gibi pek çok şey yapabilirsiniz.

Microsoft® Windows® için MSN Messenger'ın 26 farklı dil sürümünün olduğunu biliyor muydunuz?

Almanca İsveççe
Arapça İtalyanca
Brezilya Portekizcesi Japonca
Çekçe Korece
Çince (basitleştirilmiş) Lehçe
Çince (geleneksel) Macarca
Danca Norveçce
Flemenkçe Portekizce
Fince Rusça
Fransızca Slovakça
İbranice Slovence
İngilizce Türkçe
İspanyolca Yunanca

Windows® XP için Windows® Messenger

Dünyanın herhangi bir yerindeki telefonları bilgisayarınızdan arayın, video görüşmeleri yapın ve kişi listenizi gruplandırma, yeni görev tabanlı menüler ve yeni ifadeler gibi yeniliklerin avantajlarından yararlanın.

NET Messenger Service'in Windows Messenger ile kişilerinizi izlemesini ve kişiler arası iletişimi etkinleştirmesine izin verin.
.NET Messenger Service eğlenceli, kolay ve harika! Üstelik ücretsiz.Yazı yazmaktan öteye - yüksek kalitede ses, görüntü ve Windows Messenger'da bulunan bir çok özellik ile iletişim kurun. Windows XP, Windows Messenger sürüm 4.0'ı içerir. Şimdi en son güncelleştirmeyi alabilirsiniz - Windows Messenger sürüm 4.5.

Şimdi de biraz özelliklerden bahsedelim:

1-Kullanımı Çok Kolay: Yazı, Ses, Görüntü ve Daha Fazlası

  • Kimlerin çevrimiçi olduğunu görün ve anında ileti gönderip alın
    Arkadaşlarınız çevrimiçi olduğunda görün ve onlara anında ileti gönderip alın. Arkadaşlarınızla ayrı ayrı veya dörde kadarıyla aynı konuşma penceresinde sohbet edebilirsiniz. Otomatik yazma göstergesi, arkadaşlarınızdan biri yanıt yazıyorsa bunu bilmenizi sağlar.

  • Yazacağınıza konuşun
    Yazmayı bırakın! Dünyanın herhangi bir yerindeki arkadaşınızla bilgisayarınızın mikrofonunu ve hoparlörleri kullanarak konuşun. Windows Messenger bilgisayarınızdan yüksek kalitede sesli aramayı destekler.

  • Kiminle konuştuğunuzu görün
    PC kameralarının kullanımı kolay ve ucuzdur, Windows Messenger ile birlikte karşılıklı yazışırken ve konuşurken arkadaşlarınız sizi görebilir!

  • Resim veya başka dosya paylaşın
    Arkadaşlarınızın fotoğraflarını ya da herhangi bir dosyayı, çoğu e-posta sistemlerinin yaptığı gibi dosya boyutları sınırlanmadan, Windows Messenger ile değiş tokuş edin.

    Arkadaşlarınızla yardımlaşın
    Arkadaşlarınızdan Uzaktan Yardım isteyin ve sizi görebilmeleri ve sizin izninizler bilgisayarınızın denetimini alabilmeleri için bağlantınızı Windows Messenger'ın kurmasına izin verin. Bu şekilde yan yana oturup aynı ekrana bakar gibi olacaksınız!

    • Aynı programda arkadaşınızla beraber çalışın
      Arkadaşınız da Windows Messenger kullanıyorsa, programlarınızdan birini (örneğin, bir sözcük işlemci) açabilir ve aynı belgede beraber çalışabilirsiniz. Programın arkadaşınızda da olması gerekmez; sizinkini paylaşır!

    • Beyaz tahta kullanarak diğer kişilerle beyin fırtınası yapın
      Arkadaşınızla aynı anda diyagram çizin. Fikirlerinizi Windows Messenger'daki Beyaz Tahta uygulamasını paylaşarak aynı beyaz tahtada çiziyormuş gibi ortaya dökün.

    • İfade simgesi aşağı açılan listesi
      Tuş birleşimini hatırlamak zorunda değilsiniz—yalnızca, arkadaşınıza göndermek istediğiniz ifade simgesini tıklatın.
      İlgili kişilerinizi gruplar halinde düzenleyin
      Düzenli olun! Aile üyeleri, arkadaşlar veya futbol takımındaki arkadaşlarınız gibi kendi gruplarınızı oluşturun.
      Tüm özelliklere hızlı erişim
      Telefon Araması Yapmak, Video Görüşmesi Başlatmak veya diğer Windows Messenger özelliklerini kullanmak istiyorsanız - yalnızca bir tıklatma yeterli

    • http://messenger.msn.com/?mkt=tr

  • Turbo Pascal'ın Kurulumu

    TurK Pascal(c) Pascal Dersleri'ne başlamadan önce bilgisayarınıza Turbo Pascal Derleyicisini kurmamız gerekiyor.Eğer bilgisayarınızda Turbo Pascal kurulum paketi yoksa DOWNLOAD bölümümüzden gerekli dosyaları çekebilirsiniz.
    Eğer TurK Pascal(c)'dan download ettiyseniz.Bilgisayarınızda tp70.zip ismindeki sıkıştırılmış dosya bulunması gerekiyor.Bunu Winzip programı vasıtasıyla tp70 isminde bir klasöre unzipleyin.İlgili klasörü açın ve Install.exe programını çalıştırın.Eğer çalıştırdığınızda bir hata verirse.Ms-Dos modunda ilgili klasöre girip install yazın.Böylece kurulum programı çalışacaktır.Şimdi aşağıdaki listeyi takip edin.

    -Giriş ekranını Enter tuşuna basıp geçin.
    -Size kaynak sürücüyü soracaktır.Normalde install.exe programının bulunduğu sürücü otomatik olarak yazılmış olacaktır.Enter tuşuna basın.
    -Size kaynak sürücüyü soracaktır.Eğer gerekli dosyalar install.exe programının bulunduğu klasördeyse değiştirmeden Enter tuşuna basın.
    -Install Turbo Pascal on a Hard-Drive ı seçip Turbo Pascalı Hard Diske yükleyeceğimizi belirtelim.
    -Otomatik olarak C:\Tp klasörünü ayarlayacaktır.Değiştirmeden Start Installation a basın.
    -Dosyaların yüklenmesini bekletin.Mavi bir mesaj kutusu çıkacak.Herhangi bir tuşa basın.
    -Turbo Pascal'ın İngilizce Readme yazısı çıkacaktır.Çıkmak için Esc'ye basın.
    -Turbo Pascal hard diskinizin belirtilen dizinine kurulmuş olacaktır.

    Şimdi işimizi daha da kolaylaştırmak için Not Defteri programını çalıştırın ve Windows'un kurulu olduğu hard diskin içindeki Autoexec.bat dosyasını açın ve dosyanın sonuna aşağıdaki kodu ekleyin.

    Set Path=%PATH%;C:\Tp\Bin;

    Yalnız bunu yaparken dikkat edin.Başka bir kodu silmeyin.

    Bu işlemleri tamamladıysanız bilgisayarınızı yeniden başlatın.Böylece kodlarınızı programa(exe) çevirecek olan Turbo Pascal Derleyicisi bilgisayarınıza kurulmuş olacaktır.

    Değişkenler

    Değişkenler(variables) istisnasız her programlama dilinin yapıtaşlarıdır.Daha öncede söylediğimiz gibi değişkenleri içinde veri bulunduran kaplara benzetebiliriz.Bu bölümde değişken tanımlama,değiştirme ve değişken türleri üzerinde duracağız.

    Dediğim gibi değişkenler veri saklamak için kullanılır.Perl dilinde değişkenleri istediğiniz an kodun istediğiniz bölgesinde oluşturabilirsiniz.Ama bu Pascalda öyle değildir.Pascalda kullanacağınız değişkenleri ve bu değişkenlerin türlerini önceden belirlemeli ve kullanmadan önce kod içerisinde tanımlamalısınız.Aşağıdaki örneği inceleyerek anlamaya çalışalım.

    Program degisken; { Program ismi }
    (*
    Bu program A tamsayısına bir değer atayıp ekrana yazdırır.
    A değişkenini değiştirerek farklı sonuçlar aldığınızı göreceksiniz...
    *)
    var { Değişken tanımlanmaya başlanıyor }
    a: integer; { A bir tamsayı }
    begin { Başla }
    a:=200; { A=200 }
    writeln ('A sayisinin degeri ',a); { A sayısının değerini gerekli değişkeni kullanarak yazdırır }
    end. { Programın sonu }

    İşte programın gerekli açıklamaları kodun içinde.Bu açıklamalar programa ekstra bir özellik katmaz.Fakat siz koda baktığınızda açıklamalarıyla daha kolay anlayabilirsiniz.Pascal dilinde açıklama-yorum (* *) ya da { } arasına yazılarak yapılır.Bu işaretler arasındaki kodların geçerliliği yoktur.Başkasına kod gönderecekseniz mutlaka açıklamalardan faydalanın.Kendiniz kullanacağınız kodlara bile açıklama yapmanızda fayda var.Yok ben ne yaptığımı bilirim açıklamaya ihtiyacım yok demeyin.6 ay önce yazdığınız bir koddan hiçbir şey anlamamanız çok doğaldır.Bundan sonraki örneklerde açıklamayı hep kodun içinde sizlere sunacağım.

    Gördüğünüz gibi a isminde bir tamsayı değişken tanımladık.Değişkenler var komutundan sonra a: integer gibi tanımlanır.Birden fazla değişkeni aynı türe atamak için a,b,c,d: integer gibi tanımlamalar kullanılır.Farklı türde değişkenleri tanımlamayı aşağıdaki örneği inceleyerek görelim.

    Program degisken2; { Program ismi }

    var { Değişkenler tanımlanmaya başlanıyor }
    a,b: integer; { A ve B birer tamsayı }
    c,d: string; { C ve D birer alfa-nümerik(sayı olmayan) }
    begin { Başla }
    a:=200; { A=200 }
    b:=100; { B=200 }
    c:='Turbo'; { C=Turbo }
    d:='Pascal'; { D=Pascal }
    writeln ('A tamsayisinin degeri ',a); { A nın değeri }
    writeln ('B tamsayisinin degeri ',b); { B nin değeri }
    writeln ('C stringinin degeri ',c); {C nin değeri }
    writeln ('D stringinin degeri ',d); {d nin değeri }
    end. { Programın sonu }

    Değişkenler bu şekilde kullanılıyor.Ayrıca değişkenler üzerinde matematik işlemlerde yapılabiliyor.Bunu daha geniş bir biçimde ileriki konularda göreceğiz şimdi gelelim değişken türlerine... Kod içerisinde gördüğünüz gibi değişkenler integer,string gibi değerler alıyorlar.Aşağıdaki tabloyu incelediğinizde değişken türleri hakkında gerekli bilgiyi almış olacaksınız.

    Değişken Türü

    Açıklama

    string

    alfa-nümerik yani sayı olmayan herşey

    integer

    -32768 ile 32767 arasındaki tamsayılar

    byte

    0 ile 255 arasındaki tamsayılar

    real

    1.0e-38 ile 1.0e+38 arasındaki ondalıklı sayılar

    char

    1 ascii karakteri(mesela a harfi yada @ karakteri)

    boolean

    1 yada 2 yani true(doğru) yada false(yanlış)

    word

    0 ile 65535 arasındaki tamsayılar

    shortint

    -128 ile 127 arasındaki tamsayılar

    longint

    -2147483648 ile 2147483647 arasındaki tamsayılar

    single

    7 basamak hassasiyetli ondalıklı sayılar

    double

    15 basamak hassasiyetli ondalıklı sayılar

    extended

    19 basamak hassasiyetli ondalık sayılar

    comp

    -1*10 üssü 28 ile 10 üssü 28 arasındaki tamsayılar

    Gördüğünüz gibi her ihtiyaca göre değişken türü bulmak mümkün.Eğer bir integer tanımlar ve değişkenin değerini 32768 yaparsanız derleme aşamasında "Error 76: Constant out of range" gibi bir hata alırsınız.

    Aritmetik İşlemler

    Aşağıdaki örneği inceleyin.

    Program aritmetik_islemler; { Program ismi }
    (*
    Değişkenler üzerinde aritmetik işlemler programı
    *)
    var { Değişkenleri tanımlamaya başla }
    a,b,c,d: real; { a,b,c ve d birer reel sayıdır }

    begin { Programın başlangıcı }
    a := 3.5; { a ya değer ekle }
    writeln ('A: ',a:6:1); { A: 3.5 }

    b := a+2.5; { b 2.5 artı a ya eşittir }
    writeln ('B: ',b:6:1); { B: 6.0 }

    c := b-a; { c a eksi b ye eşitti }
    writeln ('C: ',c:6:1); { C: 2.5 }

    b :=5; { b nin değerini değiştir }
    d := (c*2)/b; { parantezli işlemler }
    writeln ('D: ',d:6:1); { D: 1.0 }
    end. { Programın sonu }

    Yukarıdaki programda değişkenleri birer reel sayı olarak tanımladık.Integer(Tam Sayı)da kullanabilirdik,fakat tamsayılarda 3.5 gibi değerler atayamaz ve bölme işlemini gerçekleştiremezdik.Fakat reel sayılarda da birtakım sorunlarımız var.Mesela kodun içindeki tüm :6:1 karakterlerini kaldırın ve kodu kaydedip tekrar derleyin.Programı çalıştırdığınızda 5 gibi bir sayıyı 5.0000000E+00 biçiminde göreceksiniz.Bunun anlamı E den öncesini aynen alıp bir kenara yaz ve onu 10E'den sonraki rakam ile çarp.Biraz karışık gibi gözükebilir ama aşağıdaki örnekleri incelerseniz daha iyi anlayacağınızdan eminim.

    Reel

    Açılım

    Normal

    6.4500000000e+01

    6.45*101

    64.5

    4.1500000000e-02

    4.15*10-2

    0.0415

    Şimdi gelelim bundan nasıl kurtulacağımıza.Programda gördüğünüz :6:1 reel sayıları formatlama biçimidir.Bunun anlamı soldan 6 karakter boşluk bırak ve virgülden sonra 1 basamağa izin ver.1.487 sayısının hangi formatta ne sonuç verdiğini görmek için aşağıdaki tabloyu inceleyin.

    Format

    Çıktı

    :6:3

    1.487

    :6:2

    1.49

    :6:1

    1.5

    Tablodan da anlayabileceğiniz gibi eğer formatı sayının uzunluğundan dar tutarsanız Pascal bu sayıyı yuvarlayacaktır.

    For Döngüsü

    For döngüsü çoğu programlama dilinin en basit döngüsüdür.Tek bir komutu birden fazla kez tekrarlamak için kullanılır.Aşağıdaki örneği inceleyin.

    Program for_dongusu1; { Program ismi }
    (*
    For döngüsü ile birlikte birkaç teknik...
    *)
    var { Değişkenleri tanımlamaya başla }
    a,b,c: integer; { a ve b birer tamsayıdır }

    begin { Program başlangıcı }
    a := 1;
    b := 15;

    for c := a to b do { C 1'den 15'e kadar bir tamsayı için }
    begin { Döngü için begin }
    write (c,'-');writeln('Bu ',c,'. satir...'); { 15 satır => 1-Bu 1. satır... formatında
    }
    end; { Döngü sonu }
    end. { Program sonu }

    Bu programı derleyip çalıştırdığınızda.15 satır writeln komutunun işlendiğini göreceksiniz.For döngüsü for...do biçiminde kullanılır.begin kullanımı zorunlu değildir fakat özellikle birden fazla komut kullanılacaksa yazılması gerekir.Tabi döngü sonunda end; biçiminde end komutunu da koymak şartıyla.
    Şimdi yukarıdaki programda "for c := a to b do" satırını "for c := b downto a do" şeklinde değiştirip tekrar derleyip çalıştırın.Umarım mantığını anlayabilmişsinizdir.Aynı şekilde yukarıdaki yöntem karakterler(char) içinde kullanılabilir.Aşağıdaki örneği inceleyin.

    Program for_dongusu2; { Program ismi }
    (*
    For döngüsü ile birlikte birkaç teknik...
    *)
    var { Değişkenleri tanımlamaya başla }
    alfabe: char; { alfabe bir karakterdir }

    begin { Program başlangıcı }

    for alfabe := 'A' to 'Z' do { Alfabe A dan Z ye kadar bir karakter için }
    write (alfabe);

    end. { Program sonu }

    Yine aynı şekilde downto ve begin kullanarak ta programı deneyebilirsiniz.Ancak karakterlerde dikkat edilmesi gereken şey tek tırnak(') kullanımıdır.

    Repeat-Until Döngüsü

    repeat...until döngüsü bir komutu "until" komutundan sonraki olay(eşitlik v.b.) sağlanana kadar tekrarlar.Aşağıdaki örneği inceleyin.

    Program repeat_dongusu; { Program ismi }
    (*
    Repeat-Until döngüsü ile birlikte birkaç teknik...
    *)
    var { Değişkenleri tanımlamaya başla }
    a: integer; { a bir tamsayı }

    begin { Program başlangıcı }

    a := 1;{ A=1 }
    repeat { repeat başlangıcı }
    a := a+1; { a yı birer arttır }
    write(a,'-');writeln('Bu ',a,'. satir...'); { Ekran çıktısı }
    until a = 16; { A=16 olana kadar repeat komutu sonrasını tekrar et }

    end. { Program sonu }

    Yukarıdaki örnek geçen bölümde yazdığımız for_dongusu1 örneğinin aynısı.Sondan başa yapabilmemiz için "a :=1" satırını "a :=16" olarak değiştirin.Daha sonra "a := a+1" satırını "a :=a-1" olarak değiştirin.Son olarak ta "until a = 16" satırını "until a = 1" olarak değiştirip kodu tekrar derleyin.Umarım aşağı yukarı kullanımını anlamışsınızdır.

    While ve Case Döngüleri

    While döngüsü verilen şart geçerli olduğu sürece Do blokunun içindeki komutları çalıştırır.Aşağıdaki örneği inceleyin.

    Program while_dongusu; { Program ismi }
    (*
    While ... Do ... döngü örneği
    *)
    var { Değişkenleri tanımlamaya başla }
    a: integer; { a bir tamsayı }

    begin { Program başlangıcı }

    a := 1;{ A=1 }
    while a < 16 { A 16'dan küçük olduğu sürece }
    do { Do bloku }
    begin { Do bloku için begin }
    write (a, '-');writeln('Bu ',a,'. satir...');
    { 15 satır => 1-Bu 1. satır... formatında }
    a := a+1; { A yı birer birer artır }
    end; { Do bloku için end }
    end. { Program sonu }

    Bu program bütün döngülerde yazdığımız klasik 15 satır programının while döngüsü kullanılarak yazılmış halidir.

    Case döngüsü birden fazla şartlı kullanımlar için daha pratik bir döngüdür.Değişik şartlar altında aynı veya farklı komutlar çalıştırılabilir.Aşağıdaki örneği inceleyin.

    program case_dongusu;
    (* Case döngü örneği *)
    var
    girdi: integer;

    begin { Program başlangıcı }
    repeat { Tekrarla }
    begin { repeat için }
    writeln('1 ile 5 arasinda bir sayi girin: ');read(girdi);
    { Ekrana yaz,girdi oku ve girdi değişkenine ata }
    end; { repeat için }
    until (girdi>0) and (girdi<6); { girdi tamsayısı 0 dan büyük 6 dan küçük olana kadar
    tekrarı sürdür... }

    case girdi of { Girdi değişkeni için case }
    1: writeln('Selam'); { 1 girilirse ekrana selam yazdır }
    2: writeln('Merhaba'); { 2 girilirse ekrana merhaba yazdır }
    3: writeln('Ne haber?'); { 3 girilirse ekrana ne haber? yazdır }
    4: writeln('Iyi sanslar'); { " " }
    5: writeln('Hoscakal');
    end; { case için }
    end. { Program sonu }

    Kodu biraz karışık gözükebilir ama mantığı basittir.Kullanıcıdan girdi beklenir ve bu girdi 0 ile 6 arasında bir tamsayı olana kadar program kullanıcıya girdiyi sorar.0 ile 6 arasında bir girdi verilirse.Her sayıya ayrı bir işlem uygular mesela 1 girilirse ekrana selam yazdırır.Öğrendikleriniz dahilinde writeln komutlarını başka komutlarla değiştirebilirsiniz.Örneğin 5: end. yaparsanız kullanıcı 5 rakamını girdiğinde program sonlanacaktır.


    If..Then..Else Bloku

    If..Then..Else bloku çoğu programlama dilinde olduğu gibi Pascalda da önemi tartışılmaz bir döngüdür.Kısaca yapısı şöyledir.

    If şart then
    begin
    (Şart doğru ise çalıştırılacak kod)
    end
    Else
    begin
    (şart yanlış ise çalıştırlacak kod)
    end;

    Blok içinde begin ve end komutları kullanmadanda programlarınzı yazabilirsiniz.Ancak kullanmanız sizin yararınıza olacaktır.
    Çoğu programlama dilinde Elseif yada Elsif gibi eğer yukardaki şart yanlışsa bu şartı da dene gibi bir komut vardır.Ancak bu komut Pascal'da mevcut değildir.Bu açığı Else komutundan sonra tekrar bir If bloku başlatarak kapayabiliriz.Aşağıdaki örneği inceleyin.

    program If_Then_Else;

    var
    a,b,c: integer;

    begin
    a:=5;
    b:=10;
    c:=50;

    if (a=5) and (b=10) and (c=50) then { Eğer a=5 b=10 ve c=50 ise başla }
    begin
    if a+b=14 then writeln('a+b 14 e esittir...') { Eğer a+b=14 ise }
    else writeln('a+b 14 e esit degildir...') { Eğer a+b 14 e eşit değilse }
    end
    else { Eğer a=5 b=10 ve c=50 değil ise }
    halt; { Programı bitir }
    end.

    Dikkat edilmesi gereken bir başka mevzu ise eğer If blokundan sonra else kullanmak istiyorsanız hiçbir şartla If içindeki komutları noktalı virgül(;) ile sonlandırmamalısınız.Dikkat ettiyseniz end; yerine dahi end kullandım.
    Yukarıdaki programda and gibi bir operatör kullandık bir sonraki derste operatörler hakkında geniş bilgi vereceğim.Son olarak Else If komutunuda kavrayabilmek için aşağıdaki kodu inceleyin.

    program Else_If;

    var
    a: integer;

    begin
    a:=5;

    if a=5 then writeln('A=5 Bes')

    else if a=6 then writeln('A=6 Altı')

    else writeln('A bilinmiyor...');

    end.

    Colombia hostage mission delayed

    The International Committee of the Red Cross (ICRC) and Venezuelan officials said the guerrillas had not yet given them the co-ordinates for the handover.

    The rebels have promised to release the hostages as a humanitarian gesture to Venezuelan President Hugo Chavez.

    Mr Chavez has said he hopes they will be freed either on Sunday or Monday.

    "They are still waiting for the details to complete the operation," he told Venezuelan state television late on Saturday afternoon.

    Everything is ready, all we're waiting for are the co-ordinates
    Ramon Rodriguez Chacin
    Venezuelan official

    The operation has also been delayed by the ICRC saying that the operation cannot be carried out after dark.

    "The hostages will not be released today for a very simple reason. It gets dark at 1800," a diplomat in the Venezuelan capital, Caracas, earlier told the AFP news agency.

    The captives - two Colombian women and a young boy born to one of them in captivity - are among more than 40 high-profile detainees held by the Revolutionary Armed Forces of Colombia (Farc).

    Several hundred hostages are being held by the group overall, some of whom are being held for political leverage but many also for ransom.

    International observers

    Two military helicopters carrying Red Cross insignia landed in the central Colombian town of Villavicencio on Friday.

    On Saturday, an international commission of observers from seven countries, including the American director, Oliver Stone, arrived ready to accompany the aircraft when they pick up the hostages.

    "Everything is ready, all we're waiting for are the co-ordinates," said Ramon Rodriguez Chacin, a former Venezuelan minister who is in charge of the operation.

    However, correspondents say the Farc, perhaps fearing Colombian army operations to rescue the hostages or an ambush of the guerrilla column guarding them, have opted not to reveal the location until the last minute.

    The Colombian government has said Venezuela has until 2359 GMT on Sunday to complete the rescue mission, although Mr Chavez has said he is not aware of any deadline.

    The hostages due to be freed are Clara Rojas, an aide to ex-presidential candidate Ingrid Betancourt, with whom she was kidnapped in 2002, and Ms Rojas's son, Emmanuel, said to have been fathered by one of her captors.

    The other captive is former congresswoman Consuelo Gonzalez de Perdomo, who was kidnapped in 2001.

    Fifteen members of the hostages' families, who have not seen their loved ones for more than five years, are waiting in the Venezuelan capital, Caracas.

    Negotiations

    President Chavez's efforts to negotiate the exchange of the remaining 43 hostages for some 500 guerrillas imprisoned in Colombian jails have been rejected by the Colombian government.

    He was involved in negotiations between the Farc and Colombia for months until he was told he had overstepped his mandate.

    President Alvaro Uribe said the Venezuelan leader had been in direct contact with Colombia's army chief, despite being told explicitly not to do so.

    In response, Mr Chavez said he would freeze Venezuela's bilateral ties with its neighbour and close trading partner.

    The BBC's Jeremy McDermott in Medellin says sources in the Colombian government say it wants to regain the initiative with respect to the prisoner exchange and does not want Mr Chavez, who is perceived as being too friendly with the Farc, to hijack negotiations

    vB-Hacker.com daki seo yarışması

    (Nairobi, Kenya) — Thousands of Kenyans enraged over delays in announcing the country's next president burned down homes and attacked political rivals with sticks and machetes on Saturday, tainting a vote that initially was seen as a beacon of hope for democracy in Africa.

    Three people were shot dead during protests in Migori, 360 miles west of Nairobi, said area police chief Grace Kaindi. In the capital Nairobi, hundreds of supporters of opposition candidate Raila Odinga marching on the electoral commission were beaten back by police using tear gas.

    With votes in 180 of 210 constituencies counted, Odinga clung to his razor-thin lead by 38,000 votes. Despite pleas from both parties to release final results quickly, electoral commission chairman Samuel Kivuitu suspended announcing tallies for the night, promising to look into allegations of rigging from both sides.

    "If they don't announce results in two hours, we are going to burn this place down!" shouted 23-year-old John Odhiambo as youths armed with metal rods looted a flaming market behind him in the capital's biggest slum, Kibera.

    Police Commissioner Hussein Ali appealed for calm.

    "There cannot be democracy where people think they can get recourse through hooliganism," he said.

    Thursday's vote pitted incumbent President Mwai Kibaki against Odinga, a flamboyant millionaire who cast himself as a champion of the poor. It was the country's most closely fought election since independence from Britain in 1963. On Saturday, both parties said they had won but the electoral commission said counting was not finished yet.

    Kibaki is from Kenya's largest ethnic group, the Kikuyu, while Odinga is from the second largest group, the Luos, who are poorer and feel politically marginalized.

    Odinga, a fiery 62-year-old former political prisoner, promised change and help for the poor. His main constituency is Kibera, home to at least 700,000 people who live in extreme poverty and the scene of many of Saturday's riots. In recent months he has made it a priority to reach out to the country's middle class and businessmen, many of whom are Kikuyus.

    Supporters of 76-year-old Kibaki say he has turned Kenya's moribund economy into an East African powerhouse, with an average growth rate of 5 percent and a booming tourism industry. But Kibaki's anti-graft campaign has been R10
    seen as largely a failure, and the country still struggles with tribalism and poverty.

    Odinga's Orange Democratic Movement party accused the government of deliberately delaying results because they were losing. Kibaki's Party of National Unity insists it wants the results released quickly, but says it has a list of grievances it wants addressed.

    Kiviuti, the electoral commission chairman, acknowledged there had been problems, including a constituency where voter turnout added up to 115 percent and another where a candidate ran off with ballot papers.

    During a chaotic news conference, he said he had been unable to trace the polling officers who declared results in those locations but assured the media there would be a repeat vote in those areas if necessary.

    Already frustrated by delays, slum dwellers quickly latched onto wild rumors of tit-for-tat ethnic killings and young men hacked apart wooden fence posts to use as weapons. In the Luo section of the slums, staggering silhouettes emerged from clouds of tear gas mixed with the acrid smoke from burning tires.

    "Even if it means death for us, we are ready to die for the next generation," 25-year-old Kennedy Owirah said.

    Across the railroad tracks in the Kikuyu areas, vigilante mobs stalked the fetid alleys armed with axes and machetes. A roar of anger went up at each new plume of black smoke, but the gangs were wary of venturing too far from their home turf. Ted Njoroje, 22, said he was carrying a machete for protection against rival mobs.

    "I cannot let anyone just come to my place to burn it," he said, sharpening the blade against concrete. "The Luos want to burn everything."

    As the violence spread to several other cities, residents of the capital stocked up on food and water and boarded up their shops.

    In Kisumu, some 185 miles from Nairobi, protesters clogged the streets and police said shops, banks and a supermarket were vandalized.

    Hundreds of people died in election-related clashes in months leading up to the election.

    Afghan Deaths Blamed on Anthrax

    (Kabul, Afghanistan) — Eight Afghans who ate an infected camel as part of a religious celebration died of what health experts suspect is a rare case vb-hacker
    of naturally occurring anthrax, officials said Saturday.

    The deaths, in the southwestern province of Nimroz, included two women and an infant, said Dr. Abdullah Fahim, an adviser to Afghanistan's health minister. Ten others fell sick.

    Officials cannot say positively that the deaths were anthrax related until laboratory results — expected in the next two days — are completed, said Fahim.

    The outbreak began when two men in a remote area of southwest Afghanistan along the border with Iran tried to sell a sick camel, said Ghulam Dastagir Azad, the governor of Nimroz province.

    Nobody bought the camel and the men instead killed it and distributed the meat to needy families, as is the custom during the Muslim holiday of Eid al-Adha.

    The two men "were the first victims. They cooked the meat and 12 hours later they were dead," said Azad. "Then some of the families who cooked (the meat) in their homes became victims."

    Anthrax — an acute infectious disease caused by a spore-forming bacterium — occurs in wild and domestic animals like cattle, sheep, goats and camels, according to the U.S.-based Centers for Disease Control and Prevention.

    It can also occur in humans when they are exposed to infected animals, or when anthrax spores are used as a weapon.

    Fahim said there is no evidence to suggest terrorism played any part in the outbreak.

    Bush OKs Child Health Program

    (Crawford, Texas) — President Bush on Saturday signed legislation that extends a popular children's health insurance program after twice vetoing attempts to expand it.

    Politically, the move was a victory for Bush, although Democrats say it will come back to hurt Republicans at the polls.

    The extension of the State Children's Health Insurance Program is expected to provide states with enough money to cover those enrolled through March 2009. Bush and some Republican lawmakers say the program will still serve those that it should: children from families who earn too much to qualify for Medicaid but cannot afford private insurance.

    "We're pleased that the program will be extended and that states can be certain of their funding," White House spokesman Tony Fratto Seo
    said.

    Yet many Democrats — with help from other Republicans wanted to give the program a significant cash infusion and broaden coverage to an estimated 4 million children. They overwhelmingly supported use of a tobacco tax increase to pay for the expansion.

    The matter came to dominate legislative debate and further sour relations between the Democratic leadership and Bush this year. Twice, Bush vetoed bills that would have expanded the government-provided health insurance for children.

    The Democratic-pushed bills would have expanded the program by $35 billion. Bush said the legislation did not put the neediest children first. He opposed the tax increase and, more broadly, fought against what he saw as a movement toward more government health coverage.

    The joint federal-state program currently provides benefits to roughly 6 million people, mostly children. Democratic lawmakers plan to try again to expand enrollment.