Basic

 BASIC:

İnsanların konuştuğu dillerin nasıl birer alfabesi varsa bilgisayar programlama dillerinin de alfabeleri vardır.bu alfabeler o dilde bir program yazabilmek için kullanılabilecek sembolleri ifade eder. BASIC öğrenilmesi çok kolay olan bir programlama dilidir.

İnsanların konuştuğu dillerin nasıl birer alfabesi varsa bilgisayar programlama dillerinin de alfabeleri vardır.bu alfabeler o dilde bir program yazabilmek için kullanılabilecek sembolleri ifade eder.
BASIC programının iki modda çalıştırılması mümkündür.
1.Dolaylı(indirect) Mod:Bu modda basıc dilinde yazılmış programın her satırına satır numarası denilen bir numara vermek zorunludur.satır numarası 0 ile 65529 arasında herhangi bir sayı olabilir.
10 PRINT 13+15 gibi.

2.Doğrudan(direct)Mod:Bu modda satır numarasına gerek yoktur.

BASIC SABİTLERİ VE DEĞİŞKENLERİ
1.1 SABİTLER

Programın çalışması esnasında değerleri değişmez.İki tip sabit vardır.
a) Karakter zinciri (strıng) sabiti:iki tane çift tırnak içine alınmış 255tane harf veya rakam olabilen karakter kümesidir.
''merhaba''
''12,000''
b)sayısal sabitler:5 gruba ayrılır;
b1) Tamsayı(ınteger)sabitler: -32768 ile +32767 aralığındaki tamsayıları ifade eder.
b2) Sabit noktalı sabitler : ondalık sayıların basıc'teki karşılığıdır.
b3) Kayan Noktalı Sabitler :Bir ondalık veya tamsayıyı üstel formda yazmak için kullanılır.

basıc kayan noktalı sabiti matemetiksel karşılığı
205.989E-2 2.05989
12E3 12000

c) Hekzadesimal(onaltılık)sabitler: &H ön eki kullanılır.

&H42 ondalık karşılığı 66'dır.

d) Oktal (sekizlik)sabitler : & veya &0 önekine sahip olan sabitlerdir.
&567 ondalık karşılığı 375'dir.

1.2 DEĞİŞKENLER(VARIABLE)
Değişken isimlerinde ilk 40 karakter anlamlıdır.Değişken isimlendirilirken harfler,rakamlar ve nokta sembolü kullanılır.ilk karakter alfabetik karakter (harf) olmalıdır.Değişken tipini belirlemek için özel tipte karakterler kullanılır. ($,!,%,ALFA$
MAKSİMUM!
GAMA
Bir değişken ismi ;
a)basıc deyimleri
b)basıc komutları
c)basıc fonksiyonlarının ismi
d)basıc oparatör isimleri ................... OLAMAZ.

Basıc değişkenleri iki gruba ayrılır:
a)sayısal değişkenler
b)karakter zinciri değişkenler . (değişkenin türünü belirlemek için iki yol vardır.)

1.özel tip bildiri karakterleri:
$ : değişkenin karakter zinciri değişkeni olduğunu bildirir.
! : değişkenin tek duyarlıklı olduğunu gösterir.(tek duyarlıklı değişkenler 7 ondalık hane kadar hassasiyetle depolanır.)
16 ondalık hane genişliğinde yer kaplar.)

2.basıc tip bilderi deyimleri:
DEFtip[harf1] , [harf2]....
tip 4 özel kelimeden biri olmalıdır.
INT :Tamsayı değişkeni
STR:karakter zincir değişkenleri için (strıng)
SNG:Tek duyarlıklı değişkenler için
DBL:çift duyarlıklı değişkenler için kullanılır.

örn. DEFINT A,X ( A ve X harfleri ile başlayan bütün değişkenler tamsayı değişken olarak tanımlanır.)

2.2.BASIC'TE İNDİSLİ DEĞİŞKENLER:Diziler( arrays)
DIM: Diziler kullanılacağı zaman DIM deyimi kullanılır.Bu deyim dizinin yapısını ve boyutunu bildirir.
DIM M(1,2) Bu deyim ile bilgisayarda 1 satır ve 2 sütun açılır.

3.İFADELER VE ATAMA DEYİMLERİ
basic sayısal operatörleri"ni 3 guruba ayırırız
1)aritmetiksel operatörler 2)ilişkisel operatörler 3)mantıksal operatörler

3.1 ARİTMETİK OPERATÖRLER : toplama,çıkarma,çarpma,üs alma gibi işlemleri gerçekleştirir.
^ : üs alma + :toplama
* :çarpma - :çıkarma

aritmatiksel operatörlerde işlem sırası ; varsa parentez içindeki ifade,üs alma,çarpma veya bölme,modüler aritmetik işlemi,toplama veya çıkarma.
İki operatörün birbirini izlemesi gerekiyorsa ,bunlar parentezle ayrılmalıdır. A/(-B) gibi.

matematiksel ifade basıc karşılığı
5 üssü 6 5^6 'dır.
x'in karesi + Y/(3.Z) X^2 +Y/(3*Z)

3.1.1 Tamsayı Bölme:
'' '' sembolü tamsayı bölmeyi simgeler. 5 2 =2'dir. eğer bölünen ve bölen ondalık sayılarsa önce yuvarlatma yapılır ve sonra işlem yapılır.
3.1.2 Modüler Aritmetik :
Mod operatörü yardımıyla gerçekleştirilir.8 Mod 3 ifadesi 8'in 3 ile bölümünden kalanı ifade eder.
8MOD 3=2'dir.

3.2 İLİŞKİSEL OPERATÖRLER: Bu operatörler iki değeri birbiri ile karşılaştırırlar.karşılaştırmanın değeri doğru ise -1 sayısal değeri görülür,yanlış ise 0 değeri görülür.
Operatör Kontrol ettiği eşitlik
= eşitlik
<> veya >< eşitsizlik
< den daha küçük
> den daha büyük
=< veya <= den daha küçük veya eşit
=> veya >= den daha büyük veya eşit

3.3- OPERATÖRLERİN ÖNCELİK SIRASI: Sayısal ,mantıksal ve ilişkisel opreratörler ve basıc fonksiyonlarının bulunduğu
bir ifadede öncellik sırası şu şekildedir:
1.Fonksiyon alma
2.Aritmetiksel işlemler
a.^ üs almak
b.*, /
c.
d.MOD
e.+ , -
3.İlişkisel operatör işlemleri
4.Mantıksal işlemler,aşağıdaki önceliklerle:
a. NOT
b.AND
c.OR
d.XOR
e.EQV
f.IMP

örnek: sın(3,14159/2)^2*2-3<2 AND5/2*3>1
öncesın(3,14159/2)=1 olarak hesaplanır (basıc fonksiyonları için 10.bölüme bakın)

1^2*2-3<2 AND 5/2*3>1
sonra üs almak hesaplanır.
1*2-3<2 AND 5/2*3>1
sonra çarpma ve bölmeler yazılış sırasına göre yapılır:
2-3<2 AND 2,5x3>1
2-3<2 AND 7,5>1
sonra toplama ve çıkartma yapılır :
-1<2 AND 7,5>1
ilişkisel işlemler gerçekleştirilir:
-1<2 soncu Doğru (-1) ve 7,5>1 sonucu Doğrudur(-1).

Doğru AND Doğru sonucu olarak da Doğru (-1) sonucu hesaplanabilir

4.0- ATAMA DEYİMİ (Assignment Statement)-LET DEYİMİ: Basıc dilinde bir değişkene değer atama,aşağıda
yazılış biçimi verilen bir atama deyimi ile gerçekleşir
[LET] değişkeni ismi = ifade

10 Let A=A+1 veya let deyimi kullanılmadan 10 A=A+1 şeklinde atama yazılır.

4.1 -PRINT DEYİMİ : Ekrana bilgi yazdırmak için kullanılır.
LPPRINT : yazıcıdan çıkış alınmak isteğinde kullanılır.

Örnek;
10 X$="ESRAGÜL"
20 Y$="KOYUNCU"
30 LPPRINT X$;
40 LPPRINT Y$

Sonuç: ESRAGÜL KOYUNCU

4.2 TAB Fonksiyonları :Yazdırılacak değerlerin, n ile belirtilen pozisiyondan itibaren yazılmasını sağlayan 1 ile 255 arasında bir sayıdır.
TAB (n)
Örnek;
10 LPPRINT "ESRAGÜL"TAB(9) "KOYUNCU"
Sonuç: E S R A G Ü L K O Y U N C U
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

4.3 SPC Fonksiyonu : Yazdırılacak iki değer arasında n ile belirtilen miktarda boşluk bırakır.

5.0 WRITE DEYİMİ

Ekrana bilgi yazdırmak için kullanılır.
WRITE ve PRINT arasındakı farklar;
1)WRITE komutu elemanlar arasına yazılan virgülleri de ekrana aktarır.PRINT virgülleri aktarmaz.
2)WRITE komutu pozitif sayıların sol tarafında boşluk bırakmadan yazdırır.PRINT boşluk bırakır.
Örnek;
10 X=15 : Y=9 Z$="ESRAGÜL"
20 WRITE X,Y,Z$
Sonuç : 15,9,"ESRAGÜL"

5.1 LOCATE komutu : LOCATE X,Y şeklindedir.
Kursörün konumu X'ıncı satır Y'inci sütundur.

5.2 READ/DATA deyimleri :READ deyime değişkenlere değer okur.Bu değerlerin okunduğu yer DATA deyimidir.
Örnek;1
10 READ a,b,c
20 DATA 1,2,3
Sonuç : a=1, b=2, c=3 şeklinde görülür.

Örnek;2
10 READ X,Y,Z
20 DATA 1,2,3
30 SUM=X+Y+Z
40 PRINT "X=";X. "Y=";Y, "Z=";Z, "SUM=";SUM
50 END

Sonuç : X=1 Y=2 Z=3
SUM =6

Örnek;3
10 PRINT A
20 READ A
30 DATA 12
40 END
Sonuç: Ekranda sıfır değeri görülür.Çünkü A ya değer atanmadan önce programda 10 numaralı deyimle yazdırılmaktadır.

5.3 RESTORE deyimi : DATA deyimin dan okunan değerlerin programın daha sonraki bir kısmında tekrar okunması gerekebilir.Bu kısaca RESTORE deyimi ile sağlanır.

RESTORE [satır no'su]; eğer satır no su yazılmadıysa bir sonraki READ deyimi, programdaki ilk DATA deyimindeki değeri alır.
Örnek;
10 READ A,B,C,D
20 RESTORE
30 READ X,Y,Z,Q
40 DATA 1,2,3,4
50 LPPRINT A;B;C;D;X;Y;Z;Q
60 END

Sonuç : 1 2 3 4 1 2 3 4 bu şekilde görülür.

5.4 INPUT deyimi : Girilen karakterlere klavyeden değer atanmasını sağlar.

Örnek;
10 INPUT "EN VE BOY NEDİR?";A,B
20 ALAN=A*B
30 LPPRINT "DIKDÖRTGENIN ALANI" ALAN "DÜR"
40 END

Sonuç : Önce ekranda EN VE BOY NEDİR? görülür.Klavyeden değer girilir,mesela 20,5 değerleri girilir ve Enter'a basılırsa DIKDÖRTGENIN ALANI 100 DÜR ifadesi ekranda görülür.

6.0 GOTO deyimi : Herhangi bir koşul olmadan programın kontrolünü belirlenen satıra göndermek için kullanılır.

Soru: Verilen sayıların toplamını bulan ve sayıların kaçtane olduğunu hesaplayan program;
10 TANE=0: TOPLAM=0
20 READ A
30 TANE=TANE+1
40 TOPLAM=TOPLAM+A
50 PRINT "TANE", "SAYI", "TOPLAM"
60 PRINT TANE, A, TOPLAM
70 GOTO 20
80 DATA 20, 30, 40, 50
90 END

Sonuç : TANE SAYI TOPLAM
1 20 20
TANE SAYI TOPLAM
2 30 50
TANE SAYI TOPLAM
3 40 90
TANE SAYI TOPLAM
4 50 140

6.1 IF deyimi : Bir ifade doğruysa THEN'i izleyen deyimler yapılır.Eğer ifade yanlışsa ELSE'i izleyen deyimler yapılır.
IF...THEN... ELSE

Örnek1;
10 LET X=2: LET Y=3
20 IF X<=Y THEN A=X+Y ELSE A=X*Y
30 PRINT A
40 END

Sonuç : A= 5 Ekranda görülür.

Örnek2;
10 INPUT A,B
20 LPPRINT "a=";A, "b=";B
30 IF A > B THEN LPPRINT "a,b den büyüktür" ELSE IF B>A THEN LPPRINT "a,b den küçüktür"
ELSE LPPRINT "a,b ye eşittir"

Sonuç : a=12 b=45
a,b den küçüktür ifadesi Ekranda görülür.

Örnek3;
5 INPUT A,B
10 IF A<>B GOTO 5 ELSE PRINT "A,B ye eşittir"
20 PRINT "A=";A, "B=";B
25 GOTO 5
30 END

Sonuç : Eğer A,B ye eşit değilse 5 numaralı deyime gidilir .Eşitse ELSE'i izleyen deyim yapılır.Bundan sonra GOTO deyimi ile yeni bir A,B değere okunmak üzere 5 numaralı deyime gidilir.

7.0 FOR ve NEXT deyimleri : Bu deyim sayaç görevi görür.

Örnek1;
10 FOR X=1 TO 5 STEP 2
20 PRINT "X=",X
30 NEXT X

Sonuç : X'ın başlangıç değeri 1 son değeri 5 tir.X herdefasında ikişer artar.Sonuç olarak X=5 ise Ekrana 5 değeri yazılır.

Örnek2;
10 INPUT N
20 FAKT=1
30 FOR I=2 TO N
40 FAKT=FAKT*I
50 NEXT I
60 LPPRINT "n!=1*2*3*4......";N;"=";FAKT
70 END

Sonuç : Önce I =2 için 40 nolu deyimde FAKT=1*2=2 görülür.Sonra I birer birer artar ve N değerine ulaşınca 1*2*3...N =N! sonucu görülür.

Örnek3;
10 FOR I=1 TO 2
20 FOR X=1 TO 3
30 PRINT "I=";I, "X=";X
40 NEXT X,I

Sonuç : I=1 X=1
I=1    X=2
I=1 X=3
I=2 X=1
I=2 X=2
I=2 X=3 Şeklinde iç içe döngü görülür.

7.1 WHILE/WEND deyimi: Ifade doğru olduğu sürece WHILE ve WEND arasındaki deyimler işlenir. WEND'e gelince program WHILE deyimine döner.Ifade yanlış olursa WEND'den sonraki deyimler işlenir.

Örnek;
10 X= -1
20 Y= 0
30 WHILE X
40 Y=Y+1
50 IF Y>6 THEN X=0
60 WEND
70 LPPRINT "X=";X,"Y=";Y
80 END

S onuç : Y değeri 6'dan küçük olduğu sürece Y'ye 1 eklenmektedir.50 deyimi ile Y'nın değeri 6'dan büyük olduğu anda X'e 0 atanır.60 deyimi ile 30 deyimine gelince,X=0 olduğu için program 70 deyimine geçer ve X=0,Y=7 Ekrana yazılır.

8.2 ALT PROGRAMLAR -GOSUB VE RETURN DEYİMLERİ

Program içinde aynı türden bir işlem bir çok kez tekrarlanıyorsa basic deyimlerine her seferinde tekraryazmak yerine bu işlemi alt program halinde tanımlayarak daha kısa sürede işlemi bitirebiliriz.
GOSUB (satır no su) şeklinde ifade edilir.

Örnek;
10 GOSUB 40
20 LPPRINT "ESRAGÜL KOYUNCU"
30 END
40 LPPRINT "ASAAD";
50 LPPRINT "MOHAMED"
60 RETURN

Sonuç : 10 GOSUB 40 deymi ile program 40 deymine gelir.Bu deyimle ASAAD MOHAMED yazılır.60 RETURN deyimine gelince program 20 LPPRINT deyimine gelir ve ESRAGÜL KOYUNCU yazar.
ASAAD MOHAMED
ESRAGÜL KOYUNCU

9.1 BASIC'te MATRİS DEYİMLERİ

DIM : Bütün Matrislerin boyutları bu deyimle gösterilir.DIM A (1,20) ifadesi Matrisin bir satır ve 20 sütün dan oluştuğunu gösterir.
MAT : Bütün Matris deyimleri bu ifadeyle başlar.
Örnek;
10 DIM A (2,3 )
20 MAT READ A
30 DATA 1,2,3,6,11,13
40 MAT PRINT A
50 END
Sonuç :
1 2 3
6 11 13

MATRIS'te TOPLAMA ve ÇIKARMA
MAT A = B+C MAT A= A-B Şeklinde yazılır.

MAT A= B+C+D Şeklinde yazılmaz dığrusu MAT E= C+D
                MAT A= B+E Şeklinde yazılır.
matrısın transpozu MAT B=TRN(A)
matrısın tersı MAT A= INV(B) Şeklindedir.

Örnek;
10 DIM A(2,6)
20 MAT READ A
30 DATA 1,2,3,4,5,6,7,8,9,10,11,12
40 MAT PRINT A,
Sonuç: 1 2 3 4 5
6
7 8 9 10 11
12

NOT: Eğer MAT PRINT deyimindan sonra virgül kullanılırsa her eleman arasına büyük boşluk bırakır.Eğer noktalı virgül kullanılırsa hiç boşluk bırakmaz.
   
Örnek;
10 DIM A(2,4),B(2,4),C(4,2),P(3,3),Q(3,3)
20 MAT READ A
30 DATA 1,2,3,4,5,6,7,8
40 PRINT "ESRA FORMU"
50 MAT PRINT A,
60 PRINT "GÜL FORMU"
70 MAT PRINT A;
80 MAT C = TRN(A)
90 PRINT "TRANSPOZE",
100 MAT PRINT C;
110 MAT E=CON
120 MAT A=A-B
130 MAT PRINT A;B;
140 MAT P=IDN
150 MAT Q=ZER
160 MAT P=P+P
170 MAT PRINT P;Q;
180 END

Sonuç: ESRA FORMU
1 2 3 4
5 6 7 8

GÜL FORMU
1 2 3 4
5 6 7 8

TRANSPOZE
1 5
2 6
3 7
4 8
0 1 2 3
4 5 6 7
1 1 1 1
1 1 1 1
2 0 0
0 2 0
0 0 2
0 0 0
0 0 0
0 0 0


Esragül KOYUNCU

 

Assembly

Assembly Dili

 Iste internette bircok sitede, formda gördügüm bu cümle. HAYIR Assembler ölmedi ve ölemezde! Assembler bugünde tipki yillar öncesindeki gibi önemli bir dil. Makine yakini hizli, kücük programlar üretmek icin en iyi dil. >> Neden Assembler? C/C++ da makine yakini, kücük ve gercekten hizli programlar üretebiliyor. << diyorsaniz ve eger yeni bir isletim sistemi veya sürücü yazmak istemiyorsaniz, hakli oldugunuzu itiraf etmeliyim. Ama bugun bile bazi yerlerde derleyicilerden daha iyi programlari optime etmek mümkün. Bunun disinda Assembler ile programlamak size bilgisayarla tam bir iletisim kurma imkani veriyor. Yani yazdiginiz her komut, bilgisayarin CPU(FPU komutlari haric) tarafindan direkt olarak calistiriliyor. Ilk bölümde daha önce Bilgisayar donanimi hakkinda yada CPU ve FPU hakkinda fazla bilgi sayibi olmayan insan lara bu donanim parcalari hakinda bilgi verecegim.


Her bilgisayar bir CPU ya sahiptir. CPU lar farkli bicimlerde olabilirler. Su an kullanilan CPU lar genelde iki bicimdelerdir. RISC ve CISC CPU lar. CISC 8086 tabanli islemcilerin kullandiklari komut modelidir. RISC komut destekli CPU lar ise genelde Server ve Workstation larda kullanilirlar. RISC az bir komut kapestesine ve az sapida adresleme modellerine sahiptir. Genelde her komut bir Takt da yapilir. Hatta bazi durumlarda bir Takt icinde bir kac islem yapmakta mümkündür. CISC CPU lar ise bir CPU ne kadar komut taniyorsa o kadar iyidir, felsefesi üzerine yapilirlar. Bazi komutlar 10 Takt bile gerektrebilirler. Ama yeni CISC CPU lari ile CISC ile RISC arasinda fazla bir fark kalmamistir. Cogu CISC CPU usu günümüzde CISC komutlarini kücük RISC komutlari haline getirip calistirabilme özelliginin yani sira 1 Takt da bir kac islem yapma özzelliginede sahiplerdir. Bunun disinda yeni bir islemci modeli olan EPIC (CISC ile RISC in karisimi) de intel tarafindan IA64 ile su anda pazara yerlestirilmeye calisiliyor. Ama genel bir CPU her sekilde registerlere, ve bir adresleme bicimine sahiptir.
CPU:
Datenbus

----------------------------------
^....-REGISTERS-.-.............
|...............|..........-.................
|...............|.........-..................
|...............|........-...................
|...............|.......-....................
|...............|......-.....................
|...............|...- . . OP-Code.
---------ALU-------BR .. BZ
Flags...... |...........................
----------------------------------
Adressbus

ALU bir islemcinin kalbidir denebilir. Islemler ALU icinde gerceklesir. Adressbus bize herhangibi bir alani adresleme olanagi verir. Datenbus üzerinden veri degis tokusu olur. Registerler bir islemcinin en önemli parcalaridirlar.Islemlerin yapilabilmesi icin ihtiyac duyulurlar, ve her hangibibir veri den cok daha hizli erisilebilirler. FPU ya gelince. FPU da CPU gibi kendi register lerini icerir ve kendi komut satiri vardir. Yüksek, komali vs. sayilarin hesaplanmasinda CPU dan cok daha hizlidir. 8486 dan beri FPU CPU un bir parcasi olarak bulunuyor. FPU ile programlamayi bu dökümanda ögrenmeyeceksiniz. Ama talep gelirse bu konu hakkindada bir döküman hazirlayabilirim.
Merhaba Dünya!

--------------------------------------------------------------------------------
Bircok kitaptaki gibi bizde önce bir “Merhaba Dünya!” programiyla Assembler diline girelim. Derliyici olarak aksi söylenmedigi sürece TASM kullanilacaktir.(Zaten MASM ile TASM arasinda bir fark oldugu söylenemez)

.model small

.data
merhaba db ‘Merhaba Dunya!$’
.code

start:
mov ax, @data
mov ds, ax

mov ah, 0x09
lea dx, merhaba
int 0x021

mov ah, 0x04c
int 0x021

end start
ends

Aslinda ilk bakista fazla cana yakin bir dile benzemiyor Assembler, ama anlayinca gercektende kolay oldugunu anlayacaksiniz. Anlatmaya basliyorum;
Öncelikle “.model small” komutu ile programin programin bir CS(Code Segment) ve bir DS(Data Segment) e sahip olacagini söylüyoruz.SS(Stack Segment) ile DS ne yazikki ayni yeri paylasiyorlar. Daha sonra “.data” ile degiskenlerin saklanacaklari yeri belirliyoruz. DB(Define Byte) ile satirimizin Byte lar halinde saklanan bir degisken olmasini istedigimizi belirtiyoruz. “.code” ile CS e girdigimizi söylüyoruz. “mov ax, @data” ve “mov ds, ax” ile önce AX e DS nin baslangic adresini yükleyip sonrada DS in baslangic adresini AX den DS e yüklüyoruz. Bu cok önemli cünkü 8086 Segment ve Offset lerle adreslemeye izin veriyor. “mov ah, 0x09” ilea ax registerinin üst 8 Bittine 9 degerini yüklüyoruz. “int 0x21” ile bu DOS icin ds:dx adresindeki satiri yaz anlamina geliyor. Tabi adresin offset kismini dx e “lea” ile yüklüyoruz. Sonrada yine ah ye 0x04c yükleyerek int 0x21 i cagiriyoruz, buda DOS icin “Program bitti CIK!” demek oluyor. Simdi gelelim NE DEMEK Segment NE DEMEK Offset isine. 8086 islemcisi 20 Bitlik bir Adressbus a sayipti. Yani 1MB lik adresleme olanagina. Ama sadece 16 Bitlik registerleri vardi, bu yüzden INTEL aklina gelen süper(Ne kadar süper oldugu tartisilamaz tabi) bir fikri hayata sundu. Buna göre adresler söyle hesaplaniyordu: Adres= 16*Segment+Offset Mesela havisada F6000 adresine ulasilmak istendiginde bu ister bu adresi F600:0000 olarak ister F000:6000 seklinde yazibilisiniz. Birinci kisimda Segment ikinci kisimda ise Offset in bulunmasi gerekiyor. Iste size 8086 nin registerleri:

8086:

ax ah al
bx bh bl
cx ch cl
dx dh dl

cs: ip
ds: di
es: si
fs
gs
ss: bp, sp

Flags

Aslinda 8086 nin gercektende az registere sahip oldugunu söyleyebiliriz. Ax, bx, cx, dx genel amacli registerlerdir. Cs, ds, es, fs, gs, ss adreslemede Segment kisminda kullanilabilir ip, di, si, bp ve sp ise offset kisminda kullanilabilirler. Bunun disinda her register 16- Bit boyutunda ve ax, bx, cx, dx registerleri üst ve alt kisimlari seklindede kullanmak bümkün. H üst 8 Bit L ise alt 8Bit icindir. Bu sekilde mesela ax registerine hem 6 hemde 4 degerini tutacak sekilde verebiliriz. Örnek:
mov ah, 6
mov al, 4
; iki degerde ax registerinin icinde bulunuyor.
Programcilar icin bir diger önemli gelisme ise 8386 ile gerceklesti. Bu islemci ilk IA32 destekli islemci olmakla beraber, kendi 32-Bitlik registerlerini sunuyordu. Hemde bu islemci üzerinde her registeri her islem icin kullanmak mümkün. Tabi CS ile EIP disinda. Cünkü CS:EIP programin o anda bulundugu durumu, yani bir sonraki komutun adresini tutar. Iste 8386 nin registerleri:

8386:

eax ax ah al
ebx bx bh bl
ecx cx ch cl
edx dx dh dl
cs
ds
es
fs
gs
ss
eip ip
edi di
esi si
ebp bp
esp sp
eflags

Önünde e harfi olan registerler 32 Bitlikler. Ve 8386 sayesinde artik adreslemek icin Segment lere ihtiyacimiz yok, 20 Bitlik adres kapestesi yerine 32- Bitlik bir adres kapestesi var 8386 nin, ve bu adresler tam bir registere sigiyorlar, yani 1MB lik adres kapestesi 4GB seviyesinde artik!

Eski(8086):
Merhaba db ‚Merhaba Dunya!’
lds di, merhaba
; merhaba nin adresi= ds:di

Simdi(8386)
Merhaba db ‘Merhaba Dunya!’
lea edi, merhaba
; merhabanin adresi= edi

Simdilik öncelikle en önemli Assembler komutlarini burda kisaca bir aciklayayim:
“mov register/segment/degisken, register/segment/degisken” virgülden önceki kisma, virgülden sonraki kismi yükler. Önemli olan ve dikkat edilmesi gereken en az bir tane registerin verilmis olmasi. Daha sonraki en önemli komutlar ise Matamatik komutlari. “add” toplama, “sub” cikarma “mul” carpma ve “div” bölme icindir.
Mesela deger1= deger2*16;
Assembler:
mov ax, deger2
shl ax, 4
mov deger1, ax
Burada dikkatinizi ceken komut “shl” olabilir. Shl belirtelen sekilde bitlerin sola kaydirir, fakat capma islemlerindede kullanilabilirler, üstelik mul dan 4-5 kat daha hizli calisirlar. 1 degerinde kaydirmak 2 ile capmak, 2 degerinde kaydirmak 4 ile carpmak , vs seklinde devam eder. Tabi matamatik komutlarini “lea” ile gerceklestirmekte mümkün, tabi 8386 dan itibaren, nasilmi? 8386 da her registerle adresleyebildigimizi söylemistim, artik cs, sp gibi registerleri kullanmak zorunda degiliz. Bu yüzden, simdik su komutun ne yaptigina bir bakalim:
lea eax, [eax+eax*4]
Bu komut eax e eax+eax*4 ün icerigini yüklüyor. Ama bu eax ile 5 in carpimindan baska bir sey degil!
mov ecx, eax
shl eax, 2
add eax, ecx
Burda “lea” ile sadece 3 satiri 1 satir haline getirmekle kalmiyoruz ayni zamanda bir registerin kullaniminida engellemis oluyoruz. Bu kadar derinlere girdikten sonra simdik kaldigimiz yerden devam edelim. Ilk programda “merhaba db ‘Merhaba Dunya!$” satirinda dikkatinizi ‘$’ cekmisdir herhalde. Bu isaret Dos icin cok önemli, satirin sonunu belirtiyor. Windows da 0 ile satir sonu belli edilebiliyor. Simdik en basta yazdigimiz “Merhaba Dünya!” programini birde Windows icin yazalim;

Includelib import32.lib ;
Windows fonksiyonlari icin

.386
; 8386 nin registerlerine ve
;komutlarina ihtiyacimiz var!
.model flat, stdcall
; 32- Bit adresleme(4GB!)

extrn MessageBoxA : Proc
extrn ExitProcess : Proc

.data
Caption db „Merhaba Dunya!“,0
Text db “MERHABA!”, 0
.code
start:
push 64
push Caption
push Text
push 0
call MessageBoxA ; MsgBox göster
call ExitProcess ; cik
end start
ends
Yukaridaki programda push ile fonksiyonlara verileri gönderdik. Normalde push ladiginiz herseyi pop lamalisinizda, ama bu örnekte ExitProcess zaten bir degisken beklemedigi icin bu bir sorun yaratmiyor, neyse bu tek Windows programiydi bu kitap icerisindeki, daha fazlasi icin Windows API isini ögrenmeniz gerekiyor. Bunun disinda diger DOS programlarinda kullandigimiz “mov ax, @data”, “mov ds, ax” satirlarinida kullanmamiz gerekmiyor, cünkü adresle tek bir registere sigdiklari icin Segment lere ihtiyacimiz olmuyor.
Programlamaya kaldigimiz yerden devam edelim,
Size bir kac Tipp vereyim;
Carpma ve bölme islemleri icin shl ve shr yi kullanin.
Bir sayi 0 a esit olup olmadigini kontrol ederken cmp ax, 0 yerine test ax, ax i kullanin.
CMOVcc ve SETcc yi programlarinizda kullanin.
Bir sayiya 0 yüklemek isterken mov ax, 0 yerine xor ax, ax i kullanin. Bir sayiya bir eklerken inc bir cikarirken dec i kullanin.

Bir kac altin tipten sonra simdikte iki sayiyi toplayan, basit bir program yazalim;

sayi_bir equ 0x18 ; 24
sayi_iki equ 0x5 ; 5
sonuc equ ax

.model small
.stack 0x100 ; 256 Bytes yeter
.code
start:

mov ax, sayi_bir
add ax, sayi_iki

mov ah, 0x9
int 0x21
end start
ends

Bu programda sayi_bir, sayi_iki ve sonuc birer degisken degil sadece equ ile isimlendirilmislerdir. Daha önce C ile programladiysaniz EQU nun #define ile ayni oldugunu size söyleyebilirim. Bir diger önemli komut ise CMP komutudur. Degerleri karsilastirir ama kaydetmez bunun yerine Flag lari degistirir. Cmp nin kullanim sekli söyledir;
Örnek:
cmp ax, 2
Bu komuttan sonra cmp önce ax 2 ye essitmi diye bakar., esitse zero-flag (zf) doldurur, sonra da kücük büyük denemesi yapar. Kücük ise SF=OF büyük ise SF!=OF degerlerini gönderir.
Örnek:

.model small
.code
start:

cmp ax, 4
jge kucuk
jl buyuk
je esit
jmp son

kucuk:
inc ax
jmp son

buyuk:
dec ax
jmp son

esit:
add ax, ax

son:
mov ah, 0x09
int 0x21
end start
ends

Böylece degerleri karsilastirabiliriz. Üstekki program 8086 icin yazildi. Pentium Pro icin optime edildiginde söyle bir kod cikacaktir:
.686
.model small
.code
start:
cmp ax, 4
cmovge cx, 1
cmovl cx, -1
cmove cx, ax
add ax, cx
mov ah, 0x09
int 0x21
end start
ends

seklinde cok daha kisa, ve performans bakimindan cok daha yüksek bir program elde edecegiz, iste bu tip Optime olaylari bize Assembler ile gerceklestirilirken bütün diger dillerden daha cok kolaylik sagliyor bize. VC++ 6.0 hayla cmove, csete gibi komutlari desteklemiyor, yukaridaki kodu bir VC++ 7.0(.Net) derliyicisiyle elde etmeniz mümkün.
Kaldigimiz yerden devam edelim yukaridaki kod ne anlama geliyor; iste C/C++ veya Java bilenler icin:
if(ax<4) ax++;
else if(ax>4) ax--;
else if(ax==4) ax = ax*2;
Yada herkesin anliyacagi bir bicimde:
Eger(ax 4den kücükse) ax i bir degerinde arttir.
Eger(ax 4den büyükse) ax i bir degerinde azalt.
Eger(ax 4 e esitse) ax i 2 ile carp.
Bunun disinda ziplama komutlari dilin en önemli yapi taslarini olusturmaktadirlar. Hicbir Flag a bakmazsizin ziplama JMP komutu ile yapilir. Daha sonra Jcc(cc yerine herhangibi harfler gelebilirler) seklinde belli flaglar doldurulduklarinda yada silindiklerinde sadece ziplama yapan komutlar vardir. Bir ziplama komutunu ister bir label in adini ister bir adresi yazarak kullanabilirsiniz. Simdi buraya kadar gördügümüz ziplama komutlarina bakalim:
JE = Eger ZF dolu ise ziplar.
JLE= Eger SF OF den farkli ise ziplar.
JGE= Eger SF OF ye esitse ziplar.
Bunun disinda simdi yeni baslayanlara birkac Tipp daha vereyim:
Mümkün oldugunca az ziplama komutlarini kullanin. Mümkün oldugunca az sekilde registerlerin alt, ve üst kisimlariyla ayri seklide calisin. Mesela ah ye 2 ve al ye 4 degerini yüklemek istediginizde:
mov ah, 2
mov al, 4
Yerine;
mov ax, 0x0204
yazarak programinizin icindeki bir islemin hizini 2 Kat daha hizli halledebilirsiniz.
Eger 8086 icin programlamak zorunda degilseniz CMOVcc, SETcc ve MMX i kullanmaktan kacinmayin.Degerleri DX:AX icine saklamak yerine 32- Bitlik registerleri kullanin. FPU yu kullandiktan(dagittiktan) sonra tekrar toplamayi unutmayin. Bu size ve diger programcilara yardim eder. Eger 32- Bit programliyorsaniz her registeri her is icin kullanmaktan kacinmayin. Ama Windows icin programliyorsaniz EBX, EDI, ESI ve EBP nin degerlerini degistirmeden önce yedeklemeniz gerekmekte. Bunu su sekilde yapabilirsiniz:
push ebp
push edi
push esi
push ebx
; Burada registerleri kullanabilirsiniz.
; ….
pop ebx
pop esi
pop edi
pop ebp

Burda gördügünüz gibi PUSH stack’a(Yada havisaya) deger itmek icin kullanilirken, POP da deger cekmek icin kullanilir. Neden ilk ebp nin itilipte en son cekildigine gelince: Biz dokunmadan önce bos bir havisa rutini (Stack):

BP
SP

Simdi önce iki degeri push liyalim.

push 3
push ds

Su anda Stack söyle gözüküyor:

BP
3
DS
SP

Eger bir degeri pop larsak stack in en basindaki elemani cekiyoruz demektir. Yani:

pop ax ; ax= 3
pop es ; es=ds

Ve bu komuttan sonra Stack yine su sekilde gözüküyor:

BP
SP

Unutmayin SP herzaman Stackin sonunu BP ise basini tutar. Ayni zamanda BP fonksiyonlarda elemanlara erismek icinde kullanilir. Aslinda fonksiyonlar bir cok sekilde yaratilma imkani sunarlar ki bunlardan bazilari su sekildedirler:
topla proc near
push ebp
mov ebp, esp
mov eax, [ebp+4]
add eax, [ebp+8]
leave
ret
endp

yada;

topla:
push ebp
mov ebp, esp
mov eax, [ebp+4]
add eax, [ebp+8]
pop bp
ret

yada;

topla:
mov eax, [esp+4]
add eax, [esp+8]
ret

En alttaki sekil size biraz yabanci gelebilir, cünkü derliyiciler tarafindan fazla kullanilmaz. Bunun disinda ebp+4 ün ikinci ebp+8 ise birinci deger oldugunu unutmayin. Bunun sebebi Stackin yukaridan asagi dogru gitmasidir.Yani esp+8, esp+4 den daha önce push ile itilmistir. Bu yüzden birinci degerdir. Ama C/C++ da ikinci deger! Cünkü C/C++ Stack a biraz baska bir acidan bakar ve ilk push ile itilen degeri en son, en sonda push lanan degeri ise ilk deger olarak görür. Bunun disinda söyle bir fonksiyonun yapisina bakildiginda:

topla proc near
push ebp
mov ebp, esp
mov eax, [ebp+8]
add eax, [ebp+12]
pop ebp
ret

Bu yukardaki fonksiyon C/C++ de su sekilde yazilabilir:
int topla(int sayi1, int sayi2)
{
return sayi1+sayi2;
}

Ama eger size gelen verinin icerigini degistirmek istiyorsaniz,
Java da;

public static
void topla(int sayi1, int sayi2)
{
sayi1+=sayi2;
}

Ilk bakista bu koddan yola cikarak asagidaki kodu yazarsak gercekten bir yanlis yapmis oluruz;
void topla(int sayi1, int sayi2)
{
sayi1+=sayi2;
}
C/C++ ile programlayanlar yukardaki kodun, size hicbirsey kazandirmadigini bilirler, bu ayni sekilde Assembler dilindede böyledir, eger toplama islemini bu sekilde yapmak istiyorsaniz, iki yolunuz var:

void topla(int *sayi1, int sayi2)
{
*sayi1+= sayi2;
}

yada C++ da;

void topla(int &sayi1, int sayi2)
{
sayi1+=sayi2;
}

ikiside ayni Assembler Kodunu yaratirlar;

topla proc near
push ebp
mov ebp, esp
mov eax, [ebp+8]
mov edx, [ebp+12]
add [eax], edx
pop ebp
ret

Burada ilk dikkatinizi ceken “add [eax], ecx” kod parcasi olmali, bu kod C/C++ da “*eax+=ecx” ile aynidir. Yani size gelen degeri degistirmek yerine, size gelen degeri tasiyan degiskeni degistiriyoruz burda. Yani eger bir deger, yada register parantez icinde ise, o registerin icindeki deger degil, gösterdigi adresdeki deger önemli demektir. Dikkat edin yukardaki fonksiyonu su sekilde cagiramazsiniz;
push 12
push 6
call topla
Böyle bir kodda siz eax in icine 0x06 adresini yüklersiniz, ve programiniz bu yüzden hata cikartir. Cünkü “topla” fonksiyonu 0x06 adresindeki veriyi degistirmeye calisir. Böyle bir fonksiyon su sekilde kullanilir;

lea eax, degisken
push 12
push eax
call topla

Bu durumda fonksiyona degiskenin adresi gönderilir(°isken) ve fonksiyonda bu degeri degistirmesi beklenir.Degisken icin tanimladigimiz bir degisken, yada Stack dan bir degisken koyabiliriz. Bunun disinda Assembler dilinde bir döngü yapmak icinde bir kac yöntem bulunmakta, iste iki temel döngü sekli:

dongu:
cmp ax, cx
je devam_et
dec cx
jne dongu

devam_et :
;...
Yukaridaki kod C/C+ da;
while(cx!=ax) cx--;
Seklinde yazilabilir. Bu cx, ax e esit olmadigi sürece cx den bir cikar anlamina geliyor. Ama bir dongunun cx sifir olana kadar devam etmesini isterseniz;
while(cx!=0) cx--;
Seklinde bir kod parcasina derleyici size baska bir kod parcasi gösterecektir;
dongu:
loop dongu
; …
Seklinde olacaktir kodunuz. „loop“ komuttu cx sifir oalana kadar donguyu devam ettirir, her seferinde cx den bir cikarir. Mesela;
while(cx!=0) { ax++; cx-- }
su sekilde derlenir;
dongu:
inc ax
loop dongu
; …
Tabikki derliyicinizin yukaridaki koddan daha degisik bir kod da vermesi dogal olacaktir, nede olsa C/C++ da registerlerle degil, degiskenlerle ugrasir programci, eger derleyici yeterli bir optime islemi yapmayi basarirsa elinize yukardaki kod gecer. Son olarakta SETcc hakkinda kücük bir kod örnegi yazayim ;
mov ax, 0x00FF
mov dx, 0xFF00
; dx :ax= 0xFF0000FF
add ax, 0xFF00
setc dl

Yukaridaki kod ne yapar? DX:AX in icine 32- Bitlik bir sayi yazar, daha sonra bu sayinin alt 16- Bittini 0xFF00 ile toplar. Eger sonuc sigmazsa dl nin icine 0x01 degerini yükler, böylece toplama islemi sorunsuzca gerceklesmis olur.
Not: Yukaridaki kod sonuc bilindigi icin yazildi, eger böyle bir koda programinizda ihtiyac duyuyorsaniz, asadaki sekilde yazin:
add ax, 0xFF00
adc dx, 0
Böylelikle isinizi riske atmamis olursunuz 😉

Tabikki Setcc nin gücünü gösteren Örnek bir kodda yazmak mümkün, mesela asadakki gibi cok fazla kosulun oldugu program parcasinda, C++:

if(r1==r2) r1++;
else if(r2==r1) r2++;
else r1=r2;
if(r1==r2) r1--;
if(r2==r1) r2--;
else if(r2==(r1-1)) r3=r2;
else r2=r3;

Assembler x86:
if0:
Cmp ax, bx
Jne else_if0
Inc ax
Jmp if1
else_if0:
Cmp bx, ax
Jne else0
Inc bx
Jmp if1
else0:
Mov ax, bx
if1:
Cmp r1, r2
Jne if2
Dec ax
if2:
Cmp bx, ax
Jne else_if1
Dec bx
else_if1:
Mov cx, bx
Dec cx
Cmp ax, cx
Jne else1
Mov cx, bx
Jmp cnt
else1:
Mov bx, cx
cnt:
;...

Burda Cmov ve Set komutlarini kullanarak yüksek bir seviyede performans elde ediyoruz, cünkü sadece 4 kere zipliyoruz. Yukarida ise 8 kere.

xor ecx, ecx

cmp eax, edx
jne else_if1
inc eax
jmp if_1
else_if1:
cmp edx, eax
sete cl
cmovne eax, edx
add eax, ecx
if_1:
cmp eax, edx
sete cl
sub eax, ecx
cmp edx, eax
jne else_if2
dec edx
jmp end_if
else_if2:
mov ecx, eax
dec ecx
cmp edx, ecx
xor ecx, ecx
cmove ecx, edx
cmovne edx, ecx
end_if:
Yukaridaki Cmov ve Set ile yazilmis olan kod x86 icin yazilmis koddan cok daha hizli(Tabikki Pentium Pro icin), ziplama komutlari kullanilmadigi icin, islemcinin bir sonraki komutu tespit etme imkani daha yüksek. Bunun disinda ziplama olmadigi icin koddaki CS:EIP register ciftlerinin icerigide degistirilmiyor. Unutmayin Set komutu 8386 dan Cmov komutu ise Pentium Pro dan itibaren gecirlidir.
Eger Assembler i ögrenmek istiyorsaniz, BIOS int. lerini ögrenmelisiniz. Ama eger Dos icin program yapmak(yazmak) istiyorsaniz Dos cagrilarini, Windows icin program yapmak(yazmak) istiyorsaniz Windows API isini ögrenmelisiniz. Ama BIOS int. lerini kesinlikle ögrenmeniz gerekmekte, bunlar size er yada gec lazim olacaktirlar.(Meselaa bir isletim sistemi yazmak istediginizde!)
Yüksek sayilarla calismak

--------------------------------------------------------------------------------
Bir cok dilde 64-Bitlik veri tiplerine raslamak dogal, oysa x86 islemcilerinin 64 Bitlik registerleri bulunmuyor, peki nasil oluyor bu? Öncelikle ilk akla gelen cevap 64-Bit lik bir sayinin 32 Bitinin bir resistere, diger 32 Bittin baska baska bir resistere yüklenmesi. Bu VC++ deki __int64 ile tanimlanabilen veri türü ile ayni islemin yapilmasi anlamina geliyor. Mesela:
mov eax, 0x00ffff00
mov edx, 0x000000ff
Seklinde 0x000000ff00ffff00
(1095233437440) sayisini eax:edx in icine kaydediyoruz. Mesela basit bir toplama islemini su sekilde yapiyoruz,
add eax, eax
adc edx, edx
Burda 1095233437440 sayisini kendisi ile topladik(yada iki ile carptik). Adc komutu add dan farkli olarak önce sayiyi topluyor sonrada üstüne CF in degerini ekliyor. Akla gelen ikinci yöntem ise FPU, bu sayede C/C++ da double adi verilen sayilarla carisma olanagimiz oluyor. 3 üncü ve en iyi tekniklerden biride MMX. MMX 8 tane 64-Bitlik register le geliyor.(MM0…MM7) Ama bu registerler yeni degiller, aksine eski 80-Bitlik FPU registerlerini(ST0…ST7) kullaniyorlar. Ama yaninda bu sayilari islemek icin bircok yeni komutla beraber geliyor MMX, ve bu sekilde sadece bir register icinde bir sayi ile calismak zorunda degiliz. Herhangibir registerin icine 8 tane sayi koyup, 8 ile ayni anda calismamiz bile mümkün. Ama yinede MMX inde eksikleri var, ama bunlar 3Dnow! SSE ve SSE2 ile ortadan kalkmis durumdalar. Yinede size su anda MMX ile calismanizi tavsiye ederim, cünkü hem 3DNow, hem SSE hemde SSE2 MMX i destekliyorlar. Ama su anda SSE2 sadece Pentium 4 tarafindan destekleniyor. TIP: Sayilarin hesaplanmasinda Windows un hesap makinesi, gelismis bölümünü kullanabilirsiniz. Gercektende cok faydali, hem hex, hem binary hemde normal sayilarin hesaplanmasinda.
DOS ve Windows
Ilk programlamaya basliyanlar icin kusursuz bir ögrenim ortami olusturan DOS ayni zamanda bazi isleri gercektende zorlastiriyor. Mesela dosda sayilari ekrana yazmak icin ASCII formatina cevirmeniz gerekiyor ki, bu bir sayinin her basamaginin tek tek cevrilmesi anlamina geliyor. DOS icat edildigi siralarda 8086 bulundugundan dolayi sadece 1MB lik adresleme kapastesine sahip DOS, ve bu DOS un en son sürümü 6.0 ile bile bugün öyle. Bunun disinda Windows 3.x de 16-Bitlik bir isletim sistemi ama 16MB lik adresleme destegi var. Yani Windows 3.x de adresler 8286 ya göre hesaplaniyorlar:
DOS(8086)
adreslemesi=16*Segment+Offset
Windows 3x(8286)
adreslemesi=256*Segment+Offset
Bunun disinda Windows 3.x su anki Windows versiyonlarina göre cok daha farkli bir coklu-kanal programlama teknigi kullaniyor. Buna göre sadece o an secili olan program calisiyor, diger kanallar arkada beklemede kaliyorlar. TSS 16-Bitlik ve cok kanalli programlama mantigi cok basit bir sekilde calisiyor Windows 3.x de. Buna göre TSS 44 Bytes büyüklügünde. Windows 95 ile gelen coklu kanal sisteminde ise her program belli bir aralikla calistiriliyor. Kanallar degistirilirken(Yani sira diger programa geldiginde) TSS(Task Switch Segment) ye programin her registeri ve Flaglari yüklüyor. 32-Bit TSS 104 Bytes büyüklügünde. Windows EDI, ESI, EBX ve EBP registerlerini kullaniyor ve bu degerleri degistirmemenizi bekliyor. Bu yüzden bu registerler kullanilmadan önce yedeklemeniz gerekiyor, aksi halde sistemi cöktürebilirsiniz. Hernekadar 8386 da 4GB gibi bir bellek alani gösterilebilsede, Windows altinda bu sadece 2GB büyüklügünde. Geri kalan 2GB Windows tarafindan ayrilmis, ve kullanimi yasak olarak duruyor. Coklu kanallilik olunca her programin adresleme kismida Windows a yükleniyor. Yani programlarin biribirlerinin degiskenlerini göstermemeleri, vs. Kisimlarida Windows hallediyor. Windows XP ise gercek bir 32-Bit isletim sistemi olma özelligi ile geliyor. Bundan önceki Windows serisi Dos üzerinde aciliyordu, ve daha sonra 32-Bit moda geciyorlardi. Bu yüzden aslinda Windows 9x serisininde 16/32-Bit bir isletim sistemi oldugu söylenebilir. 32-Bit Moda sizde programlariniz icinde DOS dan gecebilirsiniz, bunun icin programiniza su kücük satiri eklemeniz yeterli:
push cr0
; Daha sonra Real-Mode geri dönmek icin.
smsw ax
or ax,0x01 ; Protected –Mode
lmsw ax
; ...
pop cr0
; Geri Real-Mode dayiz simdik

Her ne kadar bir programin icinde Mode degistirmek fazla gerekli bir durum olmasada, burda kisa bir aciklamada bulunayim dedim. SMSW ile CR0 registerinin ilk 16-Bit tini ax e kaydedip, 1 inci biti degistererek Protected mode girmek icin gerekli degeri ax e yüklüyoruz. Daha sonrada LMSW ile ax i CR0 registerine yazarak Protected Mode geciyoruz.
Protected Mode: Windows 9x ve yeni sürümlerinin kullandigi, isletim sistemi Mode u. Bu mod un özelligi degisik programlarin birbirilerine zarar vermelerini engelleyebilmesi. Real- Mode: 8086 ile beraber gelen isletim sistemi Mode u. Pogramlamayi ögrenmek icin kusursuz bir ortam bence. Virtual 8086 Mode: Protected Mode altinda baslatilan fakat 8086 icin yazilmis programlarin calistiklari Mode.

CPUID

Pentium ile birlikte, programinizin üstünde calistigi islemci hakkinda bilgi alabilecegi bir komut geldi, CPUID. CPUID eax registerinin icinde bir fonksiyon numarasi bekler, böylelikle hangi bilgileri göndermesi gerektigini anlar. Bu bilgiler EDX icinde geri dönerler. Daha sonra TEST komutu ile geri dönen bilgilerde istenilen özelligin olup olmadigi anlasilabilir.
Mesela:
mov eax, 0x01
cpuid eax
test edx, 0x0800000
;(23 uncu bit dolu ise MMX vardir.) jnz mmx_var

EKLER
ADC
----------------------------------------
add with carry
ADC O1, O2

ADC iki elemani(O1 ve O2) toplar ve bu sonuca Carry Flags sida ekler.

Örnek:
stc
mov al, 3
mov ah, 2
adc al, ah ; al= ah+al+cf=6

ADD
--------------------------------------
ADD O1, O2
ADD O1 ile O2 yi toplayip O1 in icine yazar.
Tip:
Eger bir registere 1 eklemek
istiyorsaniz INC i kullanin.
DIV
----------------------------------------
division
DIV O1
Bu komut bölme icindir. Eger O1 8 Bit ise AX deki sayi bölünür, kalan AH nin icine ve sonuc AL nin icine yazilir.

Eger O1 16 Bit ise DX:AX icindeki sayi bölünür, kalan DX in icne sonuc AX in icine yazilir. Eger O1 32- Bit ise EDX:EAX deki sayi bölünür, kalan EDX e sonuc EAX e yazilir.
Tip:
Eger bir sayiyi 2 nin katlarina bölmek istiyorsaniz;
SHR komutunu kullanabilirsiniz.
mov ax, 24
mov bl, 8
div bl
yerine;
mov ax, 24
shr ax, 3 (2 üstü 3)
yazarsaniz kodun boyu ve hizi degisecektir.

IDIV
---------------------------------------
interger division
IDIV O1
Bo komut DIV ile hemen hemen aynidir, fark olarak isaretli sayilarlada islem yapabilir.
IMUL
---------------------------------------
interger multiply
IMUL O1, [O2, [O3]]
IMUL iki virgüllü sayiyi carpar.
Ilk olarak eger iki tane adress yada register le kullanirsaniz;
Örnek:
IMUL ax, dx
sonuc ax= ax*dx
Eger ama 3 tane adress yada register kullanirsaniz; Örnek: IMUL ax, dx, cx O zaman ax= dx*cx seklindedir.

MUL
---------------------------------------
multiply
MUL O1
MUL O1 i Akkumulator(AH, AL, AX, EAX) ile carpar.
Tip:
Eger bir sayiyi 2 nin katlariyla carpacaksaniz:
mov al, 5
mov bl, 4
mul bl
yerine;
mov al, 5
shl al, 2
seklinde yazarsaniz programinizin boyutunu ve hizini degistirmis olursunuz.

SBB
---------------------------------------
subtraction with borrow SBB O1, O2 SBB O2 ile Carry- Flag i toplayip sonuctan O1 i cikarir.

SUB
---------------------------------------
subtract
SUB O1, O2
O2 yi O1 den cikarir ve sonucu O1 e yazar.
Tip:
Bir sayidan 1 cikarmak istiyorsaniz,
Örnek:
sub ax, 1
yerine:
dec ax
yazmaniz kodunuzun boyunu ve hizini degisterecektir.

XADD
---------------------------------------
exchange and add
XADD O1, O2
XADD iki elemanin önce iceriklerini degistirir sonrada ADD komutunun yaptigini yapar.
Örnek:
mov al, 3
mob bl, 5
xadd al, bl ; Al= 8, Bl=3

KARSILASTIRMA KOMUTLARI

CMP
Compare
CMP birinci ile ikinci girilen degerleri karsilastirir ve sonucu FLAG lara yazar.
Örnek:
mov ax, 2
cmp ax, 2 ; ZF=1
CMPXCHG
Compare and exchange
Cmpxchg komutu kendisine gelen ilk degeri al, ax veya eax ile(Kendisine gelen ilk degeri boyutuna göre) karsilastirir. Eger degerler esitseler kendisine gelen ilk degere ikinci degeri yükler ve ZF ki doldurur. Örnek:
mov eax, 3
mov edx, 3
lea ecx, [eax+edx*8]
cmpxchg edx, ecx ; edx= ecx
Bunun disinda cmpxchg8b ile 64-Bit lik sayilar üstündede bu islemi yapabilirsiniz. Yalniz cmpxchg8b biraz daha degisik calisiyor, sadece bir tane adres gelmesini bekliyor kendisine, daha sonrada bu adresteki degeri EDX:EAX icindeki deger ile karsilastiriyor. Eger esitlerse ECX:EBX icindeki degeri bu adrese yaziyor.
Örnek:
Cmpxchg8b qword ptr[ebp]
TEST
Test
Test kendisine gelen degeri, ile kendisine gelen ikinci deger arasinda bir “and” islemi yapar. Ama sonucu and komuttundaki gibi kaydetmek yerine sadece FLAG lari degistirir.
FONKSIYON KOMUTLARI:

CALL
Call bir fonksiyonu cagirmak icin kullanilir. Eger bir near-call yapilirsa sadece o anki programin eip(ip) registeri yedeklenir, böylece fonksiyon bittikten sonra programda kalinan yerden devam edilebilir. Eger bir far call yapilirsa hem cs hemde eip(ip) yedeklenir.
INT
Interrupt
Int kendisine gelen 8-Bitlik(0 ile 255 arasinda sayilar) adresdeki aliciyi cagirir.
Örnek:
int 0x21 ; Dos interrupt unu cagirma.
Bunun disinda birde into vardir. Bu komut ise eger OF=1 ise bir int islemi gerceklestirir. Ama bir deger göndermeniz gerekmemektedir, otomatik olarak interrupt 0x04 ü cagirir.
RET
Ret Call ile cagrilan bir fonksiyondan tekrar dönmek icin kullanilir. Eger bir near call yapilmissa eip yi tekrar eski haline getirir. Eger bir far call yapilmissa hem cs yi hemde eip yi eski haline getirir.

MANTIKSAL OPERATORLER

Assembler
C/C++/Java

And
&&

Not !

Or
||

Xor
^

Shl
<<

Shr
>>

REGISTER KOMUTLARI

BSWAP
---------------------------------------
byte swap
BSWAP O1
BSWAP O1 yerinde 32 Bit lik bir register bekler. 0 .ile 4. üncü byte'i ve 2. ile 3. yü degistirir. Örnek:
mov eax, 11223344h
BSWAP EAX ; EAX= 44332211h

CBW
---------------------------------------
convert byte to word CBW AL- registeri icinde bulunan seyi, bir Word seklinde AX e yazar.

CDQ
---------------------------------------
convert word to quadword CDQ EAX icindeki doubleword 'u EDX:EAX icine quadword olarak yazar.

CWD
---------------------------------------
convert word to doubleword CWD AX icinde bulunan word' u DX:AX e doubleword olarak yazar.

CWDE
---------------------------------------
convert word to doubleword extended CWDE AX icindeki word'u EAX 'E doubleword olarak yazar.
LEA
---------------------------------------
load effective address
LEA O1, O2
LEA O2 nin adresini O1 e yazar. O1 16 yada 32 Bit lik bir register olabilir. Örnek:
lea dx, deger
mov dx, offset deger
; Bu ikisi ayni isi yapar
LMSW
---------------------------------------
load machine status word
LMSW O1
O1 e CR0 registerinin ilk 16 bitini yazar(32 Protected Mode gecmeye yariyon kisimda ordadir) Ne yazikki real mode da bu gecirli degil, o yüzden mov O1, cr0 yazmaniz gerekebilir.
Bu komut aslinda isletim sistemi icindir, ve normal bir programda kullanilmasi gerekli degildir.

MOV
---------------------------------------
move
MOV O1, O2
Assembler dilinin en önemli komutudur. O1 e O2 yi tasir, önemli olan her iki Ox nun esit olmasidir. Ikinci kural ise ikisininde Segmentregister olmamasidir. 16 bitlik bir registeri 32 bit lik bir registerin icine kopyaladiginiz zaman Pentium Pro dan itibaren 0 ile diger bitler doldurulur. Önceki islemcilerde karisik bitlerle dolduruluyorlardi. Tip: xor ax, ax ; mov ax, 0 push ds ; mov ax, ds pop es ; mov es, ax

MOVSX
---------------------------------------
move with sign- extension MOVSX O1, O2 MOVSX o1 in icine o2 yi kopyalar, burdaki fark ise o1 in 16 yada 32 bit olup o2 nin 8 veya 16 bit olabilmesidir. Örnek: mov ax, 0 mov bl, -5 movsx ax, bl

MOVZX
---------------------------------------
move with zero- extend
MOVZX O1, O2

POP
---------------------------------------
POP O1
Stak(daha önce PUSH lanmis seyler) tan O1 icine cekmeye yarar. Stak n son karakterini ceker. Eger O1 16-Bit ise SP = SP+ 2 eger O1 32-Bit ise SP= SP+4 olur.

POPA
---------------------------------------
pop all
POPA bütün registerleri kullanmak icindir. Registerler siradaki gibi kullanilmis olurlar;
DI, SI, BP, BX, DX, CX, AX
POPAD
-------------------------------------
pop all doubleword
Baknz: POPA

POPAW
-------------------------------------
pop all word
Baknz: POPA

PUSH
--------------------------------------
PUSH O1
Stak 'a eleman göndermeye yarar, ama o1 8- Bitlik bir eleman olamaz. Eger O1 16-Bit ise SP = SP- 2 eger O1 32-Bit ise SP= SP- 4 olur.

PUSHA
--------------------------------------
push all
16 bitlik bütün registerleri su sirada pushlar;
AX, CX, DX, BX, SP, BP, SI, DI.

PUSHAD
------------------------------------
push all doubleword
baknz: PUSA

PUSHAW
--------------------------------------
push all word
baknz: PUSHA

SMSW ---------------------------------------
store machine status word
SMSW O1
SMSW CR0 in ilk 16 bitini O1 e kaydeder. Aslinda isletim sisteminin ihtiyac duydugu, bir komuttur ve bir uygulamada kullanilmasi gerekli degildir.

MSRs
-------------------------------------- 80 nin üzerinde MSR vardir, ama her islemcide degisik olabilirler. Bu yüzden Pogramlamada fazla kullanilmamaktadirlar, WRMSR ile EDX: EAX icindeki eleman yazilir, RDMSR ile okunurlar. Tip: Hayla merak ediyorsaniz Döküman Nr. 245472 de Pentium4 ün MSRs hakkinda bilgi bulabilirsiniz, developer.intel.com da.

XCHG --------------------------------------
exchange
XCHG O1, O2
Iki elemanin iceriklerini degistirir. XLAT
---------------------------------------
translate
XLAT [O1]
XLAT DS:(E)BX adresindeki degeri AL ye kopyalar. Önceden AL de hangi Byte istendigi yazilmalidir.
Örnek:
var db "ABCDE"
...
lea bx, var
mov al, 3 ;Dördüncü eleman
XLAT ; AL=D
...
XLAT ES: O1

EK B: NASILSINIZ?

; 2003 Anil Öner
.model small
.data

msg db "Iyimisiniz?([E]vet/[H]ayir)$"
msg2 db 0Ah, "Iyi. :)$"
msg3 db 0Ah, "Kotu. :($"
.code
start:
mov ax, @data ; ds = data
mov ds, ax
mov ah, 09h
lea dx, msg ; Ekrana msg yi yaz.
int 21h
mov ah, 07h
int 21h
cmp al, 'e'
je sec_1
cmp al, 'E'
je sec_1 ; e yada E ise sec_1 e git.
mov ah, 09h
lea dx, msg3 ; degilse msg3 u ekrana yaz
int 21h
sec_1: ; iyi ise
mov ah, 09h
lea dx, msg2
int 21h
son:
mov ah, 04ch ; cikis
int 21h
end start
ends

EK C: AMD vs Intel(I64 vs X86-64)

Bu yazimda size bir kac yeni teknolojiden söz edecegim. Eminim ki aranizda Ia64 ve x86-64 ü duymus olanlar vardir.
Bu iki teknolojide 64- Bitlik sistemler.
Ia64
----------------------------------------------------------------------------
Intelin CISC tabanli islemcileriyle Hp nin RISC tabanli islemcilerinin komutlarinin birlestirilmesiyle olusmus EPIC teknolojisine dayaniyor. Ilk EPIC islemci Itanium' du. Itanium Server ler icin gelistirilmis bir islemciydi, bu yüzden pahali. IA64 gercekten cok fazla registere sahip. Bu yüzden ziplama orani düsürülebiliyor. Buda gercekten cok iyi bir performans demek oluyor. Tabiki EPIC in gercek ten zor oldugunu söylemem gerek. Bunun disinda derleyicilerde EPIC icin cok optimize edilmis kod yaratamiyorlar.
Iste örnek bir kod:
Mantik
Eger p1=p2
r2=r3+r4
Yoksa
r7=r6-r5
EPIC:
cmp.eq p1, p2 = r1, r0
(p2) br.cond else_clause
add r2 = r3, r4
br.endif
else_clause:
sub r7 = r6, r5
endif:
....

Tabiki yukaridaki kod daha optimize edilmeden x86 gözüyle bakilarak yazildi, yani ziplama komutlariyla. Ayni Kodun optimize edilmis hali:
EPIC:
cmp.eq p1, p2 = r1, r0
(p1) add r2 = r3, r4
(p2) sub r7 = r6, r5
...
x86-64
----------------------------------------------------------------------------
Simdide x86-64 sistemine bakalim. Ia64 ün aksine x86-64 Ia32 programlarini da 64- Bitlik programlarla ayni hizda calistirabiliyor. Eski x86 komut satirini kullaniyor, ama tabiki bircok yeni gelismeyle, bulardan en önemlileri:
-Eski registerlerin 64- Bitlik leri ve 8 yeni 64- Bit register.
-Daha temiz ve kullanisli bir FPU
-Gercek 64 Bitli adresleme
x86-64 de Intelin 16- Bit den 32- Bit e gecerken yaptigi straji kullaniliyor. Ilk x86-64 islemci AMD denin Hammer adli islemcisi.
Gcc de derlenmis örnek bir kod su sekilde gözüküyor:
Hammer: gcc
-------------------------------------------------------------------------------
C:
int bar(int a,int b,int c) { return foo(a,b,c,0); }
bar_x86: bar_hammer:
pushl %ebp xorl %ecx, %ecx
movl %esp, %ebp jmp foo
pushl $0
pushl 16(%ebp)
pushl 12(%ebp)
pushl 8(%ebp)
call foo
addl $16, %esp
leave
ret
...

Ve Gelecek
----------------------------------------------------------------------------
Peki ya gelecek, acaba Intel IA64 üylemi yeni nesil islemci modelini belirleyecek, yada AMD x86-64 üylemi.
Nasil olursa olsun 64- Bit lik islemcilerin kapida oldugunu görmemek olagan degil. Intel Serverler icin 64- Bitlik islemci yaratmaya calisirken, AMD Desktop Pc ler icin bunun aynisi yapmaya calisiyor. Peki ya gercektende Desktop Pclerin buna ihtiyaclari varmi? Gercektende gelecekte 16TByte lik Ram lar kullanmamiz gerekecekmi? Iste bu tip sorularin cevabini vu yilin sonuna dogru Amd nin Hammer islemcisi cikinca alacagimizi düsünüyorum. Eger AMD Hammer tutarsa büyük ihtimalle Intel 32- Bitlik Pentium 5 in tasarimini 64- Bitlik EPIC tasarimiyla zenginlestirip, masaüstüne sunmaya calisacaktir. Ama su anda x86-64 daha parlak bir gelecege sahip benziyor, cünkü 32Bitlik programlar cok fazla. Ve Intelin EPIC seti 32 Bitlik islemcileri gercekten yavas calistiriyor.
Yani su birkac yil bilgisayarlar icin cok önemli,
Iyi calismalar...
Kaynaklar:
-----------------------------------
www.intel.com
www.amd.com
AMD Athon 64
IA64 Assembler
IA64 vs X86-64 was soll ein Hacker darüber wissen?
Itanium Sowftware Developer's Manual Volume 1,2,3

EK C: Küyük bir isletim sistemi YAZMAK!

Hangi Dil?
----------------------------------------------------------------------------
Isletim sistemini aslinda C/C++ da yapmak isterim, ama mesela ekrana girdi vermek istedigimde bunun icin gerekli olan "printf" komutunu cagirmam gerektigini varsayalim. O zaman adindaki baslik dosyasini kullanmam gerekmekte.Ama sorun her basligin C/C++ derliyicileri tarafindan belli isletim sistemler(yada belli sistemler) icin tasarlandigi icin ne yazikki C/C++ dillerini cekirdegi yazarken kullanmayacagim fakat sonradan isletim sisteminin devamini C/C++ ile yazabilirsiniz.
Söyle düsük seviyede Assembler bilginiz olmasi sizin cekirdegi daha iyi anlamanizi saglayacaktir...
Gerekenler
---------------------------------------------------------------------------
1.Netwide Assembler (NASM)
2.RaWrite yada Diskete Imageleri yazacak baska bir program.
3.Bos bir disket.
Buraya Dikkat!
----------------------------------------------------------------------------
Size söylemem gerekirki Assembler ile cok sey yapilabilir(yada cok sey yanlis yapilabilir).Bu bilgisayariniza gelebilecek herhangibir zarar benim degil, sizin sucunuzdur!
Basliyoruz
----------------------------------------------------------------------------
Bir isletim sisteminin nasil calistigini anlamak icin, önce bir bilgisayarin nasil calistigini iyi anlamak gerekir. Burada kisaca söylüyorum ki, önce bilgisayar acilir, hemen BIOS devreye girer ve denetimler yaptiktan sonra isletim sistemini cagirir. BIOS hangi sürücünün önce "BOOT" lanacagini belirler. Isletim sistemini önce yerel sürücüde arar. Biz isletim sistemimizi diskete yazacagiz.
Simdik kodlari yazmaya basliyalim;
----------------------------------------------------------------------------
Ilk Kernel:
Tabiki bir Kernel sadece bir mesaj ekrana yazip sistemi yeniden baslatmak la kalmaz ama böyle bir kod yapiyi anlamak icin kolaydir:
--------------------------------------------------------
mov ax, 1000h
mov ds, ax
mov es, ax
start: ; Burda gercek anlamda isletim
; sistemimize basliyoruz.
mov si, msg ; hemen bir string gösteriyoruz
call put
call read ; "oku" bir tusa basilana kadar bekler
jmp reset
msg db "Yeniden baslatmak icin bir tusa"
db "basin!",13,10,0
put:
lodsb
or al, al
jz short put_d
mov ah, 0x0E
mov bx, 0x0007
int 0x10
jmp put

put_d:
retn

read:
mov ah, 0
int 016h
ret

reset:
db 0Eah
dw 0000h
dw 0FFFFh
---------------------------------------------------------
Dosyayi kernel.asm diye kaydettikten sonra;
nasm –f bin –o kernel.bin kernel.asm
seklinde derlenmelidir.

Bir BOOTMANAGER
----------------------------------------------------------------------------

BIOS ilk acildiginda 512Bytes boyutunda bir OP-Code arar ve BIOS bu dosyayi 0x7C00 adresine yükler.
-----------------------BOOT.ASM--------------------------
org 0x7C00 ; Öncelikle dosyanin adresini ayaliyoruz.

start:
cli ; Interrupts kullanma!
mov ax, 0x9000 ; Stack adresini kayit etme
mov ss, ax
mov sp, 0 ; Stackpointer' 0 lamak
sti

mov [bootdriv], dl
call load ; Kernel i yükleme

mov ax, 0x1000 ; 0x1000 Shell' in adresi
mov es, ax
mov ds, ax
push ax
mov ax, 0
push ax
retf

bootdriv db 0
loadmsg db "Sistem Yükleniyor...",13,10,0

putstr:
lodsb
or al,al
jz short putstrd
mov ah,0x0E
mov bx,0x0007
int 0x10
jmp putstr
putstrd:
retn

load:
push ds
mov ax, 0
mov dl, [bootdriv]
int 13h
pop ds
jc load

load1:
mov ax,0x1000
mov es,ax
mov bx, 0
mov ah, 2
mov al, 5
mov cx, 2
mov dx, 0
int 13h
jc load1
mov si,loadmsg
call putstr
retn

;Programin 512 Bytes dan büyük olmamasi icin...
times 512-($-$$)-2 db 0
dw 0AA55h ; Bu da BIOS sa bitis talimatini verir
----------------------------------------------------
nasm –f bin –o boot.bin boot.asm seklinde de dosya derlenmelidir.

Simdide isletim sistemimizi Diskete yükleyip calistirmak icin;

copy boot.bin+kernel.bin vitaxia.img
Seklinde iki dosyayi birlestiriyoruz.
Son olarak da RaWrite programi ile bu img dosyasini diske yaziyoruz. Disketi sokup bilgisayari yeniden baslattigimizda isletim sistemimiz calisacaktir.
Son olarak tabi ki bunu hepsi sadece bir örnek, nasil bir isletim sistemi yapabilecegimize dahil.
Herkese iyi calismalar...

- The END -

ASP Giriş 2

 ASP sayfaları web sunucusu altında çalışan, içindeki scriptler sayesinde aktif olarak web sayfası oluşturan ve oluşturduğu sayfayı sunucuya bağlanmış olan internet browser' ına gönderen interaktif sayfalardır. Internet ortamında çalıştığı için herkesin aşina olduğu aşağıdaki temel elemanları kullanır:

ASP, 1996 yılının Kasım ayında Microsoft’un bir Active Platform dizaynını açıklaması ile doğdu. Active Platform, Microsoft’un bir masaüstü bilgisayar ile bir server bilgisayarın nasıl haberleşmesi gerektiği konusundaki fikirlerini yansıtmaktadır. Active Desktop ve Active Server olarak iki bölümden oluşur. Active Desktop client tarafını ya da HTML sayfalarının bir web browser üzerinde izlendiği kullanıcı tarafını temsil etmektedir. Active Server ise server tarafı componentini temsil etmektedir. Server tarafından işlenen sayfalar da Active Server Pages adını almaktadır.

Microsoft’un dökümanları ASP’yi “dinamik, interaktif, yüksek performanslı Web server uygulamalarını yaratıp çalıştırmak için kullanabileceğiniz bir server tarafı scripting ortamı” olarak tanımlamaktadır. ASP dosyaları sade HTML dosyalarının verebileceğinden çok daha yüksek seviyede interaktiflik sağlayabilmek için HTML’i, scriptleri ve ASP kodlarını birleştirmektedir. ASP ile Windows NT üzerinde çalışan programcılar dışarıdan gelen bilgileri temel alarak sayfalarının nasıl görüntüleneceğini düzenleyebilirler. Her hafta farklı bir resim veya kullanıcının yaşına göre bilgi gösterilebilir. Durum dallanması (Condition Branching) olarak adlandırılan bu işlem ASP’ye belirli durumlar karşısında ne göstereceğine karar verme olanağı sağlamaktadır.

Diğer yanda HTML’in bunu yapmak için hiç bir şansı yoktur. Çünkü HTML sadece gösterme amaçlı bir dildir. Gerçek hayatta genellikle kullanıcılarınızın tecrübelerine bağlı olarak farklı içeriklere sahip olan sayfalar sunmak isteyeceksiniz. Bunun için önce karar verme yeteneğine sahip olmanız lazım.

DOSYALAR NASIL İŞLENİR?

Normalde HTML dosyaları client tarafında (yani kullanıcının web browserında) işlenmekedir. Microsoft’un Active Server Platform’u sayesinde artık server tarafı da dosyaları işleyebilecektir. Burada server’ın işlemesinden kasıt bir dosyanın kullanıcının browser’ında gösterilmeden önce server tarafından bazı temel adımların tamamlanmasıdır:

Dosyanın uzantısına bakar. Eğer dosya .html ya da .htm gibi standart bir uzantıya sahipse server dosyayı browser’a gönderir. Eğer dosya .asp (ya da .asa) gibi bir uzantıya sahipse server dosyayı açar ve içinde ASP kodunu belirten tag’ları aramaya başlar. ASP kodu özel tag’lar dahilinde yazılır; "<%" kodun başlangıcını," %>" ise kodun bitişini gösterir.

Server bu işaretlerin dahilindeki kodu işleme koyar ve onun yerine HTML kodu yazar. Bu HTML kodu kullanıcının ayarları ile bilgiye ya da client tarafındaki diğer durumlara dayanmaktadır.

Sonuç olarak kendi orijinal ve ayrıca ASP tarafından üretilen işaretleri taşıyan sayfa kullanıcının browser’ına gönderilir.

Bir alışveriş kartı örneğini ele alalım. Bir müşterinin mağazanın kataloğundan 5 tane malzemeyi seçtiğini farzedelim. Bu seçimler satır sütunları olan bir tablo içeren bir alışveriş kartı sayfasında listelenecektir. Her sütunun en üstünde örneğin miktar, stok numarası ya da fiyat gibi bir başlık olacaktır. İçeriği müşterinin ne seçtiğine bağlı olarak değişen bu sayfayı nasıl dizayn etmeyi düşünürdünüz?

Sütun başlıkları değişmeyeceği için onlar orijinal HTML kodunun içine yerleştirilebilir. Tablonun pozisyonu da büyük ihtimalle değişmeyeceği için o da HTML dosyasına dahil edilebilir. Sayfaya ne kadar geri dönüp tekrar izlesenizde bunlar değişmeyecek olan değerlerdir.

Ancak tablonun içi alışveriş için kullanıcının ne seçtiğine bağlı olarak değişecektir. Siteye giren herkes değişik malzemeler seçebilir. Bunu gösterebilmek için ASP bilgileri bir database’den çeker ve kullanıcaya gönderilmeden önce bunları HTML kodunun içine gömer. Programcılar bu tür sayfaları “on the fly” olarak tanımlıyorlar çünkü gerçekte böyle bir sayfa yok. Bunun yerine gerektiğinde istek üzerine (on the fly) oluşturuluyor. ASP scripti statik sayfa elemanları ile database’den seçilen bilgileri birleştirerek safyanın tamamını oluşturur.

ASP’ Yİ GENİŞLETMEK İÇİN SCRIPT KULLANMAK

VBScript, JavaScript ve JScript bir HTML dosyasına eklendiğinde görüntü üzerinde değişikliklere olanak sağlayan scripting dilleridir. Bu diller genellikle client tarafında çalıştırılırlar yani başka bir deyişle kullanıcının browser’ı tarafından işletilirler.

Ancak bazı ciddi dezavantajları mevcuttur:

- Browser’a özeldirler. Yani aynı kod browser’a bağlı olarak farklı çalıştırılabilirler.

- Bir database ile ilişki (ürün kataloğu gibi) kuramazlar ve bilgi saklayamazlar.

Bu dezavantajlarına rağmen scripting dilleri kullanışlı olabilirler. Muhtmelen en iyi kullanılabilecekleri alan bilgi onaylamaktır (data validation). Mesela server’ a işleme konması için gönderilmeden önce bir giriş formu üzeinde eksik alan olup olmadığının kontrol edilmesi gibi. Bu gönder düğmesine basıldığı zaman çalışan bir script sayesinde gerçekleştirebilir. Fonksiyon formun bütün alanlarını kontrol edecek ve eğer bir alan boş bırakılmışsa kullanıcıyı bilgilendirecek şekilde bir hata mesajı gönderecektir.

Scriptler server tarafında da kullanılabilir ama genellile kullanıcı tarafında kullanılırlar. SCRIPT tag’ının bir özelliği sayesinde programcı kodun nerede çalışacağını tayin edebilir. Default olarak kod client tarafında işleme konur ancak bunu değiştirmek programcının elindedir.

COMPONENTLER VE OBJECTLER (BİLEŞENLER VE NESNELER)

Componentler ve objectler server’ın ortamı ve sistemi ile haberleşmek için kullanılan araçlardır. Bir component bir ya da birden fazla object’i içerebilir. Ve bir object de bir ya da daha fazla metod ve bir ya da daha fazla özellik (properties) içerebilir. (Metodları dilbilgisindeki fiiller özelikleri de sıfatlar olarak düşünebilirsiniz). Bir object’in bir örneğini (instance) yaratarak görevleri yapmak için metodlarını kullanabilirsiniz. Bir object’in özelliklerini değiştirmek metodlarının görevleri farklı icra etmesine sebep olur.

Bazı objectler ASP, bazıları VBScript ve bazıları da server sisteminin içine gömülmüştür. Bir uygulamayı daha rahat geliştirmek için başka componentler de yaratılabilir.

Ortak Componentler ve Objeler

Object / Component

Fonksiyonu

Kaynak

Request Object

Browser’dan gelen istekleri düzenler

ASP içine gömülmüş

Response

Browser’a gönderilen bilgiyi düzenler

ASP içine gömülmüş

Server Object

Bazı temel server servislerine erişimi sağlar

ASP içine gömülmüş

Application Object

Bir uygulamanın yaşamı için bilgileri düzenler

ASP içine gömülmüş

Session Object

Bir session’ın yaşamı için bilgileri düzenler

ASP içine gömülmüş

Text Object

Text dosyalarını kullanır

VBScript scripting object

Error Object

Hata analizi sağlar

VBScript scripting object

Dictionary Object

Lookup referans oluşturur

VBScript scripting object

File System Object

Dosya sistemlerine erişim sağlar

VBScript scripting object

Content Linking

Sitedeki sayfalara bir düzen verir

Server Component

Browser Capabilities

Browser’ının ne yapabileceğini belirler

Server Component

Ad Rotator

Sayfa üzerinde bir noktada reklamları döndürür

Server Component

Voting

Kullanıcı havuzundan bilgi toplar

Server Component

Active Database

Bir database ile iletişim kurar

Server Component

MUHTEMEL DEZAVANTAJLAR

ASP dinamik web içeriği için kuvvetli bir araç olmakla beraber diğer çözümler gibi onun da bazı dezavantajları mevcuttur. ASP sadece Windows NT ve 95 içinde çalışır. ASP kullanmak için bir Microsoft web server’ına (genellikle Internet Information Server) ihtiyaç duyulur. Diğer sunumcularda ASP için Chili!ASP adlı ürünü kullanmak gerekir. Ayrıca ASP cookie kullanmaktadır. Bu da Lynx kullanan kullanıcıların sayfalara erişememesi demektir. Gerçi günümüzde Lynx kullanan kullanıcıların sayısı oldukça az ve hedef kitlenin büyük bir kesimine hitap etmemektedir.

Durumunuza ve ihtiyaçlarınıza bağlı olarak ASP sizin için en iyi çözüm olabilir. ASP’nin piyasada şu an rekabet halinde bulunduğu diğer rakibinin adı Cold Fusion’dır. Allaire Grubu tarafından yaratılan Cold Fusion da sizin Access ve SQL Server gibi database’lere erişmenize olanak vermektedir. Bunun yanında Cold Fusion’ın tagları biraz kafa karıştırıcı ve hata ayıklaması biraz daha zor olabilir ve bazı kullanıcılar bellek problemleri ile karşılaşmışlardır

 

Mevcut teknolojiler

Başlangıçtan beri web sayfalarından veritabanına erişim için çeşitli standartlar ortaya çıkmıştır. Bu teknolojiler gün geçtikçe ilerlemekte ve daha kapasiteli hale gelmektedir. Yapısal olarak iki sınıfa ayırabiliriz.

1. Push Web Page Teknolojisi:

Statik web sayfaları kullanıcının etkileşimi ile değişmezler. Statik web sayfaları push teknolojisi olarak bilinen bir teknoloji ile oluşturulur. Push web page teknolojisinde önce sayfalarınızı yaratırsınız. Daha sonra bunu webserver üzerindeki bir dizine yüklersiniz. Daha sonra web server bunları Statik web sayfası haline getirir. Eskiden beri birçok site bu yöntemle yaratılmıştır. Bu siteler dataya dinamik olarak erişime izin vermezler. Push teknolojisi yaygın olmasına rağmen hızla gelişen Pull teknolojisi yavaş yavaş onun yerini almaktadır.

2. Pull Web Page Teknolojisi:

Pull teknolojileri SQL server’a yapılan bir query’nin karşılığı olarak dinamik olarak web sayfalarının inşa edilmesini sağlar. Bu query bir sorguyu oluşturan opsiyon kümesinden veya datayı güncelleyen standart Transact-SQL ifadeleri şeklinde olabilir. Bu erişim değişik teknikler sayesinde olur.

  1. Microsoft Internet Database Connector (IDC) dosyaları
  2. ActiveX Data Object (ADO)’lu Microsoft Active Server Pages (ASP)
  3. Microsoft Remote Data Services (RDS) (eski Advanced Data Connector-ADC)

3. SQL Server’a Diğer Erişim Metodları:

Microsoft’un şu anki yaklaşımına göre en iyi erişim metodu ADO’dur. ADO, OLE-DB uyumlu veritabanlarını sorgulamak için kullanılan erişim metodur. Siz Active Server Pages (ASP) scriptlerinizi yazarsınız, bunlar Internet Information Server (IIS) 3.0 ve daha yukarısı versiyonlarında işlenir ve kullanıcının web browser’ına gönderilir. ADO’ya yapılan çağrılar Microsoft’un VBScript programlama dili gibi server-side script ile yazılır. Sonuç olarak kullanıcıya gönderilen normal HTML kodu olduğundan karşı tarafta herhangi bir web client kullanılabilir.

Veritabanlarına ADO ile erişim, IDC dosyaları kullanarak erişime oranla çok daha kuvvetlidir ancak bunun yanında bir o kadar daha kompleksdir. ADO database erişiminiz için kodlamayı ASP dosyaları içinde yapabilir veya SQL Server' a çağrıda bulunan ayrı DLL’ler ve çalışabilir programlar şeklinde ActiveX kontrolleri yaratabilirsiniz. Bu ActiveX kontrolleri Microsoft Transaction Server’ın bir parçası olarak da çağırılabilir. Bütün bu teknolojileri ve beraber nasıl çalıştıklarını anlamak biraz zaman alabilir.

Son olarak; Microsoft Remote Data Services (RDS) olarak adlandırılan bir teknolojiye sahiptir. Bu teknoloji daha önce Advanced Data Connector (ADC) olarak biliniyordu. Bu teknoloji de veritabanlarını sorgulamak için ADO’yu kullanmaktadır ancak ActiveX kontrollerini kullanarak sizin client Web browserınız üzerinde çalışır. Bu yüzden Web browserınız ActiveX kontrollerini desteklemelidir.

Uygulama Ortamları ve Alternatifler

Web sayfanızı veritabanı ile ilişkilendirmek için bir çok alternatif vardır. Bunlar çok güçlü olmayan basit çözümlerden kullanılması güç olan çok kuvvetli araçlara kadar olan geniş bir yelpazeye sahiptir.

asp_pic_1.GIF (2910 bytes)

Şekil 2.1. Alternatiflerin karşılaştırılması

Yukarıdaki şekil iki koordinattan oluşmaktadır. Yatay eksen araçların özelliklerinin yeteneklerini alçaktan-yükseğe olacak şekilde derecelendirerek ölçmektedir. Dikey eksen kullanım kolaylığını gösterir ve alçaktan - yükseğe olacak şekilde derecelendirilmiştir. Her aracın matrixdeki pozisyonunu bulmak için iki eksende de karşılaştırılması yaparak değerlendirilmiştir. (Kaynak: Morrison M. “Special Edition Using Microsoft Visual Interdev” Macmillan Publishing, USA [1997]) Karşılaştırmadan da görebileceğiniz Visual Interdev .ok güçlü ve kullanımı kolay bir araçtır. Java programları ve appletleri platformlar arasında geçiş yapabilme özelliklerinden dolayı yetenek ekseninde Visual Interdev’den daha yüksek bir dereceye sahiptirler. Fakat aynı araçlar kullanım kolaylığı ekseninde ise Java programlama dilinin doğasından ötürü daha düşük değerler almaktadır.

Java, C++ benzeri bir dildir ve Visual Interdev ile karşılaştırıldığında çok kompleks kalmaktadır. Ayrıca Visual Interdev’de görsel olarak SQL sorgulamalarınızı oluşturabileceğinizden Visual Interdev’deki veritabanı araçlarının kullanımı çok kolaydır.

Visual Interdev hem web sayfası hemde uygulamalarımız için database çağrılarını oluşturmak amacıyla tek ortam sağlaması yeteneğiyle yüksek not almakatdır. IDC (Internet Database Connector) gibi daha önceki database çözümlerinde; SQL bilgilerinizi ve çağrılarınızı idare etmek için bir dosya ve HTML sayfası işlemek için ayrı bir dosya yaratmak gerekiyordu.

API, programlama yetenek ekseninde yüksek skorlar elde etmektedir ancak kullanılması diğer çözümlerden daha zordur. CGI sevenler ise karşılaştırma matrixinde CGI’ın derecesini görünce üzüleceklerdir. CGI veritabanı ilişkilendirme çözümü olarak kullanılmaya devam edecek ancak server bağlantılarının performansını arttıran API’lerin geliştirilmesi ve veritabanı uygulamamızı geliştirmek için harcadığımız süreye görsel araçların getirdiği kolaylıkların eklenmesinden sonra, CGI artık eski bir teknoloji sayılacaktır.

VISUAL INTERDEV

Visual Interdev’i diğer database bağlantı araçları ile karşılaştırdıktan sonra şimdi de Visual Interdev’in içerdiği bazı spesifik özelliklerden bahsedelim. Uygulamınızı geliştirmek için tam bir geliştirme ortamına sahip olmanın getirdiği avantajlar küçümsenemez. Yukarıda web-database bağlantı karşılaştırma matrixinde belirtilen bazı araçlara tanıdık olabilirsiniz. Bu çözümlerin bir çoğunda database bağlantısı sağlamak için ayrı geliştirme ortamı ve araçları kullanmak zorunda kalırsınız. Visual Interdev aşağıdaki özellikleri ve avantajları içeren tam bir geliştirme ortamı sunmaktadır :

  1. Kullanım Kolaylığı

Visual Interdev bir çok veritabanı aracını bütünleşik bir çatı altında toplayan benzersiz bir ortam sunmaktadır. Bundan dolayı Visual Interdev’in kullanımı çok kolaydır. Veritabanı bağlantınızı SQL çağrılarınızı ve HTML web sayfalarınızı oluşturmak için farklı araçlar ve ortamlar arasında geçiş yapmanız gerekmemektedir. Ayrıca Visual Interdev web sayfalarınıza database fonksiyonelliği ekleme süreci esnasında size toolbar' lar ve menu optionlarla rehberlik etmektedir.

  1. Görsel Ortam

Adından da anlaşılacağı gibi Visual Interdev uygulamalarınızı oluşturmak için size görsel bir ortam sağlar. Bu görsel ortam Visual Data Tool’ larını içermektedir. Bu araçlar SQL ifadelerinizi görsel olarak oluşturmanıza ve anında test etmenize imkan tanımaktadır. Sorgulamanızı oluşturabilmek için SQL detaylarını bilmenize hiç gerek yoktur. Kuvvetli SQL programcıları içinse araçların doğal görsel ortamı onların rutin sorgulamaları yazarken kaybettikleri zamandan tasarruf edip bu kazanılan zamanı daha kompleks SQL sorgusu yazarken harcamaya fırsat tanıyacaktır.

  1. RAD (Rapid Application Development)

Visual Interdev uygulamanızda hızlıca database ilişkisi oluşturmanızı sağlayan görsel bir ortam sağlar. Modern çağın gereksinimi olarak her zaman anında bilgiye ihtiyaç duyulmaktadır. Visual Interdev hem PC masaüstü hemde server databaselerinin her ikisini de destekleyerek RAD’ın arkasındaki teoriyi desteklemektedir. Database araçları uygulamanızı MS SQL Server gibi daha güçlü database programlarına geçirirken de kullanabileceğiniz ODBC uyumlu SQL çağrıları oluşturmanıza olanak verir.

  1. Etkinlik

Buraya kadar Visual Interdev’in sağladığı kolaylıklardan bahsettik. Bazıları bu kadar kolaylık sağlayan bir uygulamanın çok kuvvetli olamayacağını düşünebilir. Ancak Visual Interdev dünyanın en iyi kolaylık ve kuvvetlilik desteğini vermektedir. Visual Interdev ortamında kompleks SQL programlayabilirsiniz. Visual Interdev, Microsoft SQL Server, Oracle, Sybase, Informix, IBM DB/2, Microsoft Access, FoxPro, Paradox gibi ODBC uyumlu bütün veritabanlarını desteklemektir.

ACTIVEX DATA OBJECT (ADO)

ADO bütün Visual Interdev araçları için veritabanı erişimi sağlar. Web sayfalarınızla database ilişkisi kurmak için ADO temel modeli oluşturmaktadır. ADO web sayfalarınız ile herhangi bir ODBC uyumlu database arasında bağlantıyı sağlar. ADO modelinin ana faydası düşük memory overheadi ve yüksek sürattir ki bu da Web temelli uygulamalar için idealdir.

ADO, veri kaynağına erişimi sağlamayabilmeniz için ActiveX script kullanmanıza izin verir. Ayrıca ActiveX scripti bir ADO’nun özelliklerini ve metodlarını değiştirmek içinde kullanabilirsiniz. ADO, resimleri ve büyük binary nesneleri (BLOB) de içeren değişik veri tiplerini desteklemektedir. ADO transactionları, cursorları, hata yönetimini ve veritabanı içinde oluşturulmuş Stored Procedure' lerin kullanımını destekler.

Microsoft, ADO’yu web sayfalarınızdan bir veritabanına erişmek için dilden bağımsız objeler olması için yarattı. ADO, Microsoft’un OLE database modelinin üzerine inşa edildi. DAO (Data Access Object) ve RDO (Remote Data Objects)’ya aşikar olan Visual Basic programcıları Microsoft’un kısaltmaları birleştirip harflerle oynadıgını düşünebilir. ADO hem RDO’dan hem de DAO’dan daha üstündür. ADO daha önceki veri erişim metodlarını nesneye yönelik bir standartla birleştirirken RDO ve DAO’nun özelliklerini de içermekte ve OLE modelini kullanarak İnternet için veri erişimi sağlama yeteneğini arttırmaktadır.

DAO (Data Access Object) ilk olarak Microsoft Visual Basic ve Microsoft Access’in önceki versiyolarında bulunuyordu. DAO bir objenin kapsamı içerisinde database fonksiyonlarını ve işlemlerini birleştirmek için geliştirildi. DAO ODBC-uyumlu databaselere erişimi sağlamaktadır.

RDO ise DAO’dan daha üstündü ve Visual Basic 4’ün içine koyulmuştu. RDO ODBC-uyumlu databaselere erişim için daha iyi bir çözümdü ve bu objelerin server’a olan erişimlerini arttırmıştı. Bu iki metodun üzerine ADO’nun avantajı bağımsız olarak objeleri yaratabilmenizdir. Hem RDO hem de DAO’da objeler için bir hiyerarşi yaratmak zorundaydınız. Ayrıca ADO bu metodlara oranla daha hızlı ve daha etkindir.

OLE DB’nin arkasındaki fikir remote objectleri sanki local’miş gibi gösteren bir nesne temelli arayüz sağlamaktır. Amaç uzaktaki server makinada ya da kendi makinanızda bulunan yardımcı objeler sayesinde database erişiminizi sağlayabilmenizdir.

asp_pic_2.JPG (13039 bytes)

Şekil 2.2 SQL Server veritabanına erişim

Yukarıdaki şekilde ADO ve OLE-DB' nin birlikte Microsoft SQL Server database’ine erişim sağlamak için nasıl çalıştıklarını görüyoruz. ADO web server üzerinde ASP içinde yer alır. Browser database bilgisi için istek gönderdiğinde ASP çağrılır ve ADO OLE DB aracılığıyla isteği database server’a gönderir. MSDA SQL spesifik bir SQL dilidir ve Microsoft Access ve Microsoft SQL Server kendi veri kaynakları ile haberleşmede kullanımı desteklemektedir. ODBC sürücüsü her database için MSDA SQL’i spesifik bir dile çevirir. Daha sonra bu bilgi bu hat boyunca ilerler. ASP ve ADO sonuçları düzenleyip browser’a geri göndermek için beraber çalışırlar.

ADO’nun nesne-temelli bir çözüm olduğundan bahsetmiştik. ADO modelinde 7 ana nesne mevcuttur :

- Connection Object

- Command Object

- Recordset Object

- Field Object

- Parameter Object

- Property Object

- Error Object

Bu modelde Connection objectinin temel object olduğunu görüyoruz. Modeldeki diğer bütün objectler Connection objectine bağlıdır. Veritabanına bir bağlantı olmadan diğer nesneler varolamayacağından bu hiyerarşi önemlidir. Oluşturulan yeni bir Recordset'i mutlaka daha önce tanımlanmış bir Connection objesinin altına koymak yerine, yeni bir Connection yaratarak onun altında oluşturmak mümkündür. ADO modelinin bu yapısal doğası kodun daha düzenli olmasına katkıda bulunur.

Connection Object

Database ile olan bağlantınızı kontrol eder. Bağlantı ile ilgili bütün bilgiler bu object sayesinde sağlanır. Connection Objectinin timeout gibi özelliklerini değiştirebilirsiniz. Database ile olan bağlantıyı açıp kapatabilir ve transaction özelliklerini düzenleyebilir.

Command Object

Command objecti database üzerinde çalıştıracağınız spesifik bir komutu tanımlamanızı sağlar. Mesela Command objesini bir stored procedure’ü çağırmak için kullanabilirsiniz. Command Objectini daha önce yaratılmış bir connection objesi ile ilişki kurarak oluşturmak zorunda değilsiniz. Bu ADO’nun diğer database iletişim metodlarından farkıdır. Komutlarınız için object hiyerarşisini kullanmak zorunda değilsiniz.Yine de aynı database bağlantısı üzerinde bir çok komut çalıltıracaksanız, objelerinizi bir hiyerarşi altında düzenlemek daha doğru olur.

Recordset Object

Bu object sayesinde kayıtları ya da database tablosundaki satırları düzenleyebilirsiniz. Bir recordset bir temel tablodaki bütün satırları tutabilir veya bir sorgulamanın sonuç kümesinden de oluşabilir. Recordset objecti hem anında hem de toptan güncellemeleri destekler.

Recordset objecti veritabanının desteklediği değişik tipte cursorler kullanmanıza izin verir. Cursor veritabanında nerede olduğunuzu ve nereye gideceğinizi belirtir. Bazı cursorler:

Dynamic : Diğer kullanıcılar tarafından yapılan silme, değişiklik ve eklemeleri gösterir.

Keyset : Değişiklikleri gösterir ama eklemeleri ve silmeleri göstermez.

Static : Datanın bir kopyasını gösterir. Değişiklikleri, silmeleri ve eklemeleri göremezsiniz.

Forward-only: Static ile aynı tablo içinde sadece ileri doğru ilerleyebilirsiniz.

Field Object

Field objecti recordset içerisindeki özel bir sütun ile ilgilidir.

Parameter Object

Paramater objectini bir veritabanına karşı komut işletirken parametre tanımlamak maksadı ile kullanabiliriz. Mesela bu objeyi database üzerindeki bir stored procedure’e geçirilen parametrelerin değerlerini ayarlamak için kullanabiliriz. Bu object genelde Command Object ile beraber kullanılır.

Property Object

Property objecti dataya erişimi ve sorgulamayı sağlayan özel servisleri gerçekleştiren ve servis sağlayıcı tarafından belirlenen spesifik özellikleri yakalar. OLE DB servis sağlayıcılarını, ActiveX Data Object’e ek karakteristikler ve özellikler sunmak üzere ayarlayabilir, daha sonra bu özellikleri uygulamanızın kapasitesini arttırmak için kullanabilirsiniz. Örneğin Property Objectini bir servis sağlayıcısının transactionları destekleyip desteklemediğini anlamak için kullanabilirsiniz.

Error Object

Error objecti veritabanı tarafından üretilen hata mesajlarını toplar. Bir veritabanı fonksiyonunu gerçekleştirmeye çalışırken oluşan herhangi bir hata bu object içinde tutulur.

ODBC Data Source Name (DSN)

Open Database Connectivity yani ODBC veritabanına erişimi sağlayan bir standarttır. Oracle, SQL Server, Sybase, Interbase, Paradox gibi bir çok veritabanı sistemine erişimi sağlar. NT işletim sisteminde DSN tanımlayarak veritabanlarına ulaşılabilir. Bu Delphi' de Borland Database Engine için Alias tanımlamaya benzer.

  1. File Data Source

Bir File DSN belirli bir bilgisayar dahilinde dosya temelli bir bağlantı kurulmasını sağlar. Ve bu bağlantı bir çok kullanıcı tarafından paylaşılabilir. Dosya temelli bağlantıdan kastedilen bir veritabanına bağlanırken gerekli olan bilgilerin bir .dsn dosyasında saklanıyor olmasıdır. Bu bilgisayarda veritabanına bağlanabilmek için ODBC driver yüklemiş olmanız gerekmektedir. Uygulama için veritabanı bağlantısı gerçekleştirildiğinde .dsn dosyasındaki bilgi global.asa dosyasındaki bağlantı stringinin içine eklenir.

File DSN bazen DSN-less bağlantı olarak adlandırılır çünkü bağlantı bilgisi başka herhangi bir yerde değil projenizin içinde saklıdır. File DSN taşınabilirlik özelliğinden dolayı tercih edilmektedir. Uygulamanızı taşıdığınızda ek olarak bir DSN dosyası da kopyalamak ya da yaratmak zorunda değilsiniz.

  1. Machine Data Source:

İki tip Machine Data Source oluşturulabilir. Birincisi User DSN olarak adlandırılır. Bu tip DSN’ler sadece belirtilen kullanıcılar tarafından kullanılabilir ve makineye özeldir. System DSN ise diğer Machine Datasource tipidir. Bir System DSN’i de makineye özeldir ancak bir çok kullanıcı tarafından kullanılabilir, yani kullanıcıya özel değildir. Bu bilgiler Windows Registry’sinde saklanır ve eğer uygulama başka bir makineye taşınacaksa bu bilgilerde geçirilmelidir. Genellikle File DSN tercih edilir çünkü her kullanıcı için ayrı bir dsn kurulmak zorunda değildir. Machine Datasource makineye özel tanımlandığından uygulama başka bir platforma taşındığı için yeniden tanımlanmak zorundadır