seviyeli programlama dillerine göre anlaşılması biraz daha zordur. Assembly dili ile program
yazarken kullanılan bilgisayarın donanım özellikleri programcı için önemlidir. Yazılan kodlar
çoğunlukla donanıma bağlı yazılır ki bu da programın taşınabilirliğini azaltan bir faktördür.
Assembly dili ile program yazarken programcı doğrudan bilgisayarın işlemcisi ve hafızası ile
uğraşır. Yani hafızadaki ( RAM’deki ) ve işlemci gözlerindeki değerleri doğrudan değiştirme
olanağı vardır.
Yüksek seviyeli dillerdeki derleyicilerden farklı olarak, assembly kaynak dosyalarını
çalışabilir dosya haline getirebilmek için “assembler” ve “linker” adı verilen programlar
kullanılır. Aslında derleyiciler de bir tür assembler programıdır denebilir. Fakat derleyiciler,
ekstra bir parametre kullanılmadığı taktirde, kaynak dosyasını önce gerekli Object dosyasına
çeviriler daha sonra, bir hata ile karşılaşılmaz ise, elde edilen object dosyası linker yardımı ile
çalışabilir dosya haline getirilir.
Bilgisayarımızda çalıştırılan tüm programlar önce bilgisayarımızın RAM’ine yüklenir. Daha
sonra RAM üzerinde çalıştırma işlemi gerçekleştirilir. RAM’e yüklenen bilgi programımızın
makine dili karşılığından başka bir şey değildir. Makine dilinin kullanıcı tarafından anlaşılabilir
şekline ise assembly dili demek pek yanlış olmaz.
Aslında assembly programlarının en önemli özellikleri boyutlarının yüksek seviyeli bir dil ile
yazılan programlara nazaran çok küçük olması ve buna bağlı olarak çok daha hızlı
çalışmalarıdır.
Programların hızlı çalışmaların kodlarının sadeliğinden kaynaklanmaktadır. Fakat günümüzde
kullanılan yüksek hızlı işlemciler ve büyük kapasitelere sahip sabit diskler assembly
programlarının bu özelliklerini önemsiz kılmaktadır. Aşağıdaki örnekte ekrana “A” harfini
basan bir program önce assembly dili ile daha sonra C ve Pascal dilleri ile yazılmıştır.
Programların yaptıkları işlerin aynı olmasına karşın boyutları arasındaki büyük farka dikkat
edin.
Assembly Programı C Programı Pascal Programı
MOV AH,02
MOV DL,41
INT 21
INT 20
#include
main()
{
printf(“A”);
}
begin
write(‘A’)
end.
Assembler Bilgileri
MS-DOS DEBUG
Derleyici Bilgileri
MS-DOS için Turbo C 2.01
Derleyici Bilgileri
MS-DOS için FreePascal
0.9
Boyut : 8 bayt Boyut : 8330 bayt Boyut : 95644 bayt
Gördüğünüz gibi C ile yazılan programın boyu assembly ile yazılanınkinin boyunun 1000
katından daha büyük! Pascal ile yazılan programın boyu ile assembly ile yazılanınkinin boyunu
karşılaştırmaya bile gerek yok sanırım. Bu fark eski bir bilgisayar için önemli olabilir fakat
günümüz standartlarındaki bir bilgisayar için pek önemli değildir. Bu sebepten assembly
programlama dili günümüzde daha çok sistem programcıları tarafından ve inline olarak diğer
8
programlama dilleri içerisinde kullanılmaktadır. “inline assembly” ile kastedilmek istenen,
assembly kodlarının olduğu gibi yüksek seviyeli bir dil içerisinde kullanılmasıdır. Bu, bize
sabit diskin herhangi bir bölümüne ( mesela MBR ), BIOS gibi sistem kaynaklarına veya belirli
bellek bölgelerine kolayca erişme olanağı sağlar.
Bölüm 1 : Temeller
1.1 Sayı Sistemleri
Günlük hesaplamalarımızda kullandığımız sistem onluk sayı sistemidir ve bu sistem
0,1,2,3,4,5,6,7,8 ve 9 rakamlarından oluşur. Diğer sayılar ise bu rakamlar kullanılarak elde
edilir. Kullandığımız bilgisayar için (aslında tüm elektronik cihazlar için dersek daha iyi olur)
durum böyle değildir. Bilgisayar binary sayı sistemi dediğimiz ikilik sayı sistemini kullanır ki
bu sistemde sadece 0 ve 1 vardır. Bilgisayar için 0’ın anlamı “yanlış” ( FALSE ) ve 1’in
anlamı
( TRUE ) “doğru”dur. Buna karşın assembly programları yazılırken kullanılan sayı tabanı
hexadecimal olarak bilinen on altılık sayı tabanıdır. Bu sistemde kullanılan ilk on rakam
onluk sistemdeki ile aynı olup 0,1,...,9 rakamlarından oluşur. 10, 11, 12, 13, 14 ve 15 için
sırasıyla A, B, C, D, E ve F harfleri kullanılır. On altılık sayılar gösterilirken sonlarına “h”
veya “H”harfi konur. Assembly dili ile onaltılık sayı sisteminin kullanılmasının sebebi, bellek
adresi gibi uzun rakamların ikilik sistem ile gösterilmesinin zorluğudur. Sayı tabanı
büyüdükçe herhangi bir sayıyı göstermek için gereken basamağın sayısının azalacağı açıktır.
Mesela “1BA5:010F” gibi bir bellek bölgesinin adresini ikilik sistem ile göstermek isteseydik
“0001101110100101:0000000100001111” şeklinde olacaktı ki bu hem akılda tutması hem de
yazması zor bir sayı.
1.2 Veri Tipleri
1.2.1 Bit
Bilgisayarın ikilik sayı sistemini kullandığından bahsettik. Bu sistemdeki her bir
basamağa Binary Digit anlamına gelen “bit” denir. Yani bir bit içerisinde 0 veya 1 olmak
üzere iki bilgiden biri bulunabilir. Bilgisayar için en küçük bilgi birimi bit’tir.
1.2.2 Bayt
Sekiz adet bit’in oluşturduğu topluluğa “bayt” denir. Bir bayt içerisinde 0-255 arasında
olmak üzere 256 değişik değer tutulabilir.
(ikilik) 00000000 = 0 (onluk)
(ikilik) 11111111 = 255 (onluk)
Görüldüğü gibi bir bayt’ın alabileceği maksimum değer 255 ve minimum değer 0’dır.
1.2.3 Word
İki bayt’lık (16-bit’lik) bilgiye “Word” denir. Bir word’un alabileceği maksimum değer
65535 ve minimum değer 0’dır. Bu da bir word içerisinde 65536 farklı değer
saklanabileceği anlamına gelir.
1.2.4 Double Word (Long)
İki ayrı word’un birleştirilmesi ile bir “Double Word” elde edilir. Bir double word 32-bit
uzunluğundadır.
9
8086, 80186 ve 80286 işlemcilerde aynı anda işlenebilecek bilgi sayısının 16 bit
uzunluğunda olmasından dolayı bu işlemcilere 16-bit işlemci adı verilir. Intel firması
80386 ve sonrası işlemcilerinde 32 bitlik bilgi işleme sistemi kullanmıştır ve bu işlemcilere
de 32-bit işlemci adı verilir.
1.3 Bitler Üzerinde Mantıksal İşlemler
İşlemciler birçok işlemi mantıksal karşılaştırmalar yardımı ile yaparlar. Assembly
programlama dili içerisinde AND, OR, XOR ve NOT olmak üzere dört adet mantıksal komut
kullanılır. Aşağıda bu komutların doğruluk tabloları verilmiştir.
AND 1 0
1 1 0
0 0 0
OR 1 0
1 1 1
0 1 0
XOR 1 0
1 0 1
0 1 0
NOT 1 0
0 1
Bilgisayarımızda kullanılan baytlar da 1 ve 0’lardan oluştuğu için CPU her mantıksal işlemde
bitler üzerinde ayrı ayrı işlem yapar. Aşağıda birkaç örnek verdim.
1001 0110 1001 1111
1011 1101 0001 1110
AND _______________________________
1001 0100 0001 1110
1011 0010 1110 1010
1011 0000 0000 0000
OR ____________________________
1011 0010 1110 1010
1010 1010 1000 1111
1110 1110 1100 0001
XOR________________________________
0100 0100 0100 1110
0010 0000 0000 1111
NOT______________________________
1101 1111 1111 0000
1.4 İşretli ve İşaretsiz Sayılar
Daha önce veri tipleri anlatılırken bayt için değer aralığı 0-255 word için 0-65535 olarak
tanımlandı. Peki işlemlerimizde negatif sayıları kullanmak istersek ne yapmalıyız? Bu
durumda bayt, word veya long için ayrılan bölgenin yarısı negatif diğer yarısı da pozitif
sayılar için tahsis edilir. Yani bir baytın alabileceği değerler –128....-1 ve 0....127 arasında
olur. Aynı şekilde word için bu değer –32.768......+32.767 arasında olur. Bir bayt, word yada
long için en soldaki bite işaret biti denir. İşaretli sayımızın işaret bitinin değeri 0 ise sayı
pozitif, 1 ise negatif olarak değerlendirilir. Yani
0110 0101 1110 1100 pozitif bir sayı (word)
1000 1100 1010 0000 negatif sayı (bayt)
Herhangi bir sayının negatifini bulmak için ikiye tümleyeni bulunur. Bu iş için
1) Sayı NOT işleminden geçirilir
2) Elde edilen sonuca 1 eklenir
Şimdi, –13’ü bulmaya çalışalım.
+13 = 0000 1101 (bayt)
1) Sayı NOT işleminden geçirilir
10
0000 1101
NOT______________
1111 0010
2) Elde edilen sonuca 1 eklenir
1111 0010
1
+------------
1111 0011 -13
Şimdi elde ettiğimiz sonucu bir test edelim.
13+(-13) = 0000 1101 + 1111 0011
Yukarıdaki işlemin sonucu sıfır olamlı.
0000 1101
1111 0011
+--------------
1 0000 0000
Eldeki 1 göz ardı edilirse sonuç sıfır bulunur ki bu bizim işlemimizin doğru olduğunu
gösteriyor.
1.5 Shift ( Kaydırma ) ve Rotate ( Döndürme ) İşlemleri
Bit dizgileri üzerinde yapılan bir diğer mantıksal işlemler de kaydırma (shift) ve döndürme
(rotate) işlemleridir. Bu iki işlem kendi içlerinde sağa kaydırma (right shift), sola kaydırma
(left shift) ve sağa döndürme (right rotate), sola döndürme (left rotate) olarak alt kategorilere
ayrılabilir.
1 0 1 1 1 0 0 1
Yukarıdaki gibi bir bayta sağa kaydırma (right shift) işlemi uygulanırsa 7. bit 6.nın yerine,
6. bit 5.nin yerine, 5. bit 4.nün yerine .... geçer. Boş kalan 7. bit pozisyonuna 0 yazılır ve 0.
bit içersindeki 1 değeri bit dışarısına atılır.
Sola kaydırma (left shift) işlemi de aynı şekilde gerçekleştirilmektedir. Bu sefer boş kalan
0. bit pozisyonuna 0 yazılır ve 7. bit işlem dışı kalır.
0 1 0 1 1 1 0 0 Sağa kaydırma sonrası
0 1 1 1 0 0 1 0 Sola kaydırma sonrası
Döndürme (rotate) işleminde de yine kaydırma işleminde olduğu gibi bitler bir sağa veya
sola kaydırılır fakat burada boş kalan 7. veya 0. bit yerine sıfır değil de 7. bit için 0. bitin ve
0. bit için de 7. bitin değeri yerlerine yazılır. Yani yukarıdaki baytımıza sırasıyla sağa ve sola
döndürme işlemleri uygulanırsa aşağıdaki gibi sonuçlar elde edilir.
1 1 0 1 1 1 0 0 Sağa döndürme sonrası
0 1 1 1 0 0 1 1 Sola döndürme sonrası
Hiç yorum yok:
Yorum Gönder