Makine Dili

Vedat Hallaç, son zamanlarda yazılarımı anlayan insan popülasyonu iki elin parmaklarıyla bile gösterilebilecek hale gelmişti. Sayın yayın koordinatörümüz bu konuda bir şeyler yapmamı istediği zaman ben de bunun farkına vardım ve yeni bir yazı dizisine girişmeye karar verdim. Şu anda okumakta olduğunuz dizimizde kaynak yetersizliği yüzünden BASIC'te çakılıp kalmış arkadaşları kurtarmayı, BASIC'ten başka dil kullanmayan arkadaşların da aklını çelmeyi planlıyorum. Bu sayede program yapmaya kalktığınızda Commodore'un inanılmayacak kadar az komutu olan BASIC'inin sınırlarından kurtulup, hayal gücünüzün elverdiği her programı yaratabilecek bir güç kazanacaksınız. Şimdiye kadar makine diliyle ilgili olan her kursumuz en azından komutları kullanacak kadar makine dili bilmenizi gerektiriyordu. Oysa, bu yazı dizisinde makine diliyle ilgili hiçbir şey bilmediğinizi varsayarak yola çıkacağım ve ilk bir-iki sayıda sadece makine dilinin temelleriyle ilgili bilgiler vereceğim. Kısacası makine dili program yazmaya başlamak için bile en azından iki sayı beklemeniz gerekecek. Bu sırada makine dilini çatpat konuşan arkadaşlarımız sıkılacaklar ama daha sonra hep birlikte bu dilin inceliklerini öğrenmeye çalışacağız. Bu arada döküm ekinde de bize yarayacak programlar yayınlanacak. Mesela komutları öğrenmeye başladıktan hemen sonra, evinizde kullanabilmeniz için bir monitör programı yayınlayacağız. Tüm komutlarını dergide açıklayacağım bu monitör programı, makine dili programlarınızı yazmakta ve kaydetmekte, hatalarınızı ayıklamakta, kısaca her konuda size yardımcı olacak. İsterseniz sözü daha fazla uzatmadan konularımıza başlayalım. İşte geliyor...

Neden Makine Dili? Neden olmasın?

Tabii ki cevap bu kadar basit değil. Makine dilinin BASIC'e göre en büyük üstünlüğü hızından kaynaklanmaktadır. BASIC'in de makine diliyle yazılmış bir program olduğunu düşünürseniz, makine dilinden yavaş olması size de çok normal gelecek. Evet, yanlış okumadınız. Bilgisayarınızı açtığınız anda kullanıma hazır olarak sizi karşılayan BASIC, aslında makine diliyle yazılmış ve elektronik olarak bilgisayarınızın belleğine kazınmış bir programdır. Aslında bu programa doğrudan BASIC diye hitap etmek pek doğru değil. Programın asıl adı BASIC Yorumcusu'dur. Bilgisayarınızı açtığınız anda çalışmaya başlayan bu yorumcu, klavyeden girdiğiniz tüm satırları harf harf tarar ve bunlardan anlam çıkartmaya çalışır. Eğer kendisi için anlamsız bir şeyler girerseniz başka bir makine dili programı çağrılır ve ekrana (gene karakter karakter) “?SYNTAX ERROR” yazılır. Daha sonra da yeni satırın girilmesi beklenir. Eğer girdiğiniz satır PRINT “BEN MAKINA DILI OGRENİYORUM” gibi anlamlı bir komut-parametre dizisiyse, BASIC yorumlayıcısı bunu parçalarına ayırır. İlk olarak PRINT komutunu fark eder ve bu komutu çalıştıracak olan (gene) makine dili programa sıçrar. Buradaki program komutun arkasındaki yazıyı okur ve bu yazıyı doğrudan doğruya ekrana basar. Sonuç olarak BASIC yorumlayıcısının çok sıkıcı bir işi vardır. Her saniye, ağzınızdan çıkacak sözleri bekler ve anlayabildiği tüm işlemleri sadık bir köpek gibi yerine getirir. Her zaman sizin isteklerinizi yerine getirmeye çalışacağı için de BASIC oldukça yavaştır. Tablo 1'deki programı yazıp çalıştırdığınız zaman, ekranı A harfiyle dolduran BASIC ve makine dili programlarının hız karşılaştırmasını gözlerinizle görebilirsiniz. Aslında makine dili programları da temelde BASIC ile aynı prensibe göre çalışır. Ama makine dilinde yazılmış olan programlar hataları yakalamaya çalışmadığı için ve pek size bağlı olmadıkları için BASIC'e göre 10 ile 1000 kat arası değişen bir hız farkıyla karşılaşmanız çok olasıdır. Bunların yanında, makine dili kullanmaya başladığı andan itibaren BASIC yüzünden kullanamadığınız birçok özellik kullanıma açılacaktır.

53- / 110101 nıma açılacaktır. Mesela bir işin belli aralıklarla tekrarlanmasını isterseniz (bir saatin saniyesinin artırılması gibi), interrupt ya da kesme adı verilen özelliklerden yararlanıp, zamanlama işini bilgisayara yükleyebilirsiniz. Nedense BASIC tasarımcıları BASIC kullanıcılarını bu harika özellikten yoksun bırakmışlar. BASIC kullanıcılarının sahip olmadıkları bir şey daha var: Yeterince bellek. Makine dilinde program yazan bir programcı, bazı şeylerden ödün vererek (daha sonra bu konuların hepsine geleceğiz, acele etmeyin) bilgisayarın toplam hafızası olan 64 Kilobaytın tamamına erişebilir. BASIC programcısı ise 30K'dan az bir bellekle sınırlıdır.

Her şey yorumcunun anlayabileceği şekilde saklandığı için, BASIC programlar bellekte çok fazla yer kaplarlar. Basit bir BASIC programı bile hemen 1000 bayta çıkabilirken, aynı yere yazılabilecek makine dili programı çok daha fazla iş yapabilir. Makine dilini size sevdirmek için öncelikle bu dilin avantajlarını saydım. Ama madalyonun bir de öteki yüzü var (hiçbir şey bedava değildir). BASIC'in değişken bolluğuna alıştıktan sonra, sadece üç tane değişkene sahip olan makine diliyle çalışmak zor gelebilir size. Özellikle bu değişkenlerin her biri sadece 0-255 arası değerler alabiliyorsa... Tabii ki bu üç değişken sadece görünür değişkenlerdir. Belleği değişkenler yığını olarak kullanmaya alıştığınızda, BASIC'ten bile daha fazla değişkeniniz olduğunu anlayacaksınız.

BASIC programlarının en iyi yanı, neredeyse İngilizce diyebileceğimiz bir dille yazılmış olması, dolayısıyla çok kolay anlaşılabilir olmasıdır. Makine dilindeki tüm komutlar üç harfle kodlanmış olduğu için hem öğrenirken, hem de eski programlarınızı incelerken oldukça zorlanırsınız. Bir de BASIC'de yaptığınız gibi notlar düşme gibi imkanınız da olmadığı için programın neresinde ne iş yaptığınızı kısa süre içinde unutursunuz. Komutlarınızın anlaşılır olmasını sağlamasa da, yanlarına not düşmenizi sağlayacak programlar (neyse ki) mevcut. Assembler adı verilen bu programların asıl amacı tabii ki komut yanına not düşmek değil. Monitör programıyla bir makine dili rutin yazdığınızda, aradan bir komut çıkartmak ve araya bir komut eklemek çok zordur. Assembler kullandığınız zaman ise bu konuda BASIC kullanıyormuşcasına rahat olursunuz. Assembler kullanmanızı teşvik etmek için, monitör programından önce (daha önceleri de yayınlamış olduğumuz) SUPER ASSEMBLER programını yayınlayacağız.

250 |16

240
250—-SFA

Tablo : 3

Her ne kadar itici görünse de, makine dilini kullanmaya bir kez başladıktan sonra bırakması zordur. Altı aylık bir makine dili programcılığından sonra BASIC'in ne kadar sıkıcı bir dil olduğunu siz de kabul edeceksiniz. Artık BASIC'le makine dili arasındaki farkların çoğunu bildiğimize göre makine dilini öğrenmek için ilk adımlarımızı atmaya başlayabiliriz:

Bilgisayarınızın Sayı Sistemi

Aslında bilgisayarların sayı sistemi diye bir şey yoktur. Gerekli programı yazdıktan sonra her sayı sisteminde işlem yaptırabilirsiniz bilgisayarınıza. Ama, bilgisayarınız tamamen digital devrelerden oluşmuş olduğu için, her şeyin sahibi olan 6502'niz sadece yan yana gelmiş olan 0 ve 1'lerden daha iyi anlar. Belki de sırf bu yüzden “Bilgisayarlar ikilik düzenden başka sayı düzeninden anlamaz!” kanısı çok yaygındır. Bilgisayarınızın hangi dilden anladığını tartışmadan önce, sayı düzenleri, bitler ve baytlar hakkında bir miktar genel bilgi vermek istiyorum:

Sayı Sistemleri

Sayılardan bahsedildiği zaman, matematik dersinde sayı sistemleri konusunu görmemiş olan herkes, günlük hayatta kullandığımız onluk düzenden bahsedildiğini sanır. Onluk sayı sisteminde sayılar (hepimizin bildiği gibi) 0'dan başlar ve 9'a kadar çıkar. 9'dan bir sonra gelen sayı da 1 ve 0'ın yan yana gelmesinden oluşur. Yani ilk basamak gene en başa döner ve bunun bir yanındaki basamağın değeri bir artar. Tabii ki yıllardır aynı sistemi kullanmaya alıştığımız için, tüm işlemlerin sadece bu şekilde yapılabileceği gibi bazı fikirler olmuştur kafamızda. Oysa, bir söylentiye göre, kullandığımız sayı sisteminin her basamağında sadece on adet işaret olmasının tek sebebi on tane parmağımızın olmasıymış. Yani insanlar sekiz parmaklı olsaydı, sayılar şu şekilde sıralanacaktı belki de: 0, 1, 2, 3, 4, 5, 6, 7, 10, 11 vb. İlk

O'ya baktığınız zaman garip görünüyor değil mi?

Oysa sayı sistemlerinin temelinde bu mantık yatar. Sayılar (tabii ki pozitif tam sayılar demem gerekliydi) sıfırdan yani 0'dan başlar ve sayı sisteminin bir eksik rakamına kadar tek basamaklı olarak gider (8'lik sistem için 7). Bundan bir sonra gelen sayıyı göstermek için de ilk basamak sıfırlanır (0) ve ikinci basamak bir artırılır. Alfabemizi 29'luk bir sayı sistemi olarak düşünebiliriz mesela: Sayılar A ile başlar, 29 sayı tek basamaklı gösterilebilir (A, B, .., Z). Daha sonra gelen 30. sayı ise iki basamaklı olarak gösterilir: BA. Yani ilk basamak sıfırlanır (ya da A'lanır) ve ikinci basamak bir artırılır. Alfabetik sistem diye bir şey olsaydı, bu sistemdeki CA sayısı bizim sistemimizde 60'a denk düşecekti. Bu sayıların onluk düzendeki karşılıklarını bulmak çok kolaydır. İsterseniz örneklerimizi alfabetik sistemden değil de 8'lik sistemden verelim. Dikkat ettiyseniz, onluk sistemdeki sayılan her sekiz sayıda bir ikinci basamak bir artırılıyor. Bu demektir ki bu basamaktaki sayıyı sekizle çarpıp, birinci basamaktaki sayıyı buna eklersek, bir basamaklı tüm sayıların onluk sistemdeki karşılıklarını bulabiliriz. Yani sekizlik sistemden onluk sisteme çevirme formülü şöyle olacaktır:

ONLUK - Bi 48xB2

Buradaki B1'in sekizlik sistemdeki birinci basamak, B2'nin de ikinci basamak olduğunu hepiniz fark ettiniz sanırım. Ama formül sadece iki basamaklı sayılar için geçerli. İki basamaklı en büyük sekizlik sayı 77 olduğu için, formülümüz sadece 0 ile 63 arasındaki ondalık sayılar için geçerli olacaktır. Peki 77'den sonra gelen sayı sekizlik olarak ne olacaktır? 100 değil mi? Demek ki onluk sistemdeki 64'ün karşılığı sekizlik sistemdeki 100 oluyor. Bu durumda formülümüzü üç basamaklı sayılar için değiştirebileceğiz. Acaba 64 ile 8'in bir ilişkisi var mı? Evet, “Karesi! Karesi!” diye bağırdığınızı duyuyorum. Doğru. Bu durumda formülümüzü en genel haline getirmek çocuk oyuncağı olacak:

ONLUK-BI148xB248x8xB348x8 X8xB34...

Ya da n basamaklı bir sayı için:

ONLUK - BI 4 811 x B2 4 B2 4 812 xB3 * 4 ...4 8İ(n-1)x Bn

Tabii ki basamakların sağdan başlayıp sola doğru arttığını göz ardı etmemelisiniz. Aslında günlük hayatta hiçbir önemi olmayan bu sayı sistemlerinin hepsini öğrenmenize de gerek yok. Bilgisayarda sıkça kullanılan sayı sistemi ikilik ve onaltılık sistemlerdir. Niçin sadece bu iki sistemin önemli olduğunu bitler ve baytlar kavramlarını açıklarken tam olarak anlayacaksınız. Ama ilk önce ikilik ve onaltılık sistemlere biraz detaylı olarak göz atalım:

İkilik (Binary) Sayı Sistemi

Eğer demin anlattığım “sayı sistemleri” kavramını biraz anladıysanız, ikilik sayı sistemlerinin rakam bakımından oldukça fakir kalmış olduğunu farkedersiniz. Bu sistemde sadece 0 ve 1 rakamları hüküm sürebilir, çünkü 1'den sonra 2 değil 10 gelecektir. Kafanızın karışmaması için değişik sayı sistemlerindeki 10'u “on” olarak okumayın. “Bir Sıfır” demeye üşenebilirsiniz, ama “Sıfır, bir, on, onbir, yüz, yüzbir, ...” diye saymaktan çok daha az kafa karıştırıcı olacaktır. Çok uzun yıllardır onluk sayı sistemi kullanılan bir yerde yaşadığınız için, bu sayılarla yapılan toplama, çıkarma, çarpma ve bölme işlemlerini doğrudan doğruya ikilik sayılar üzerinde yapamayabilirsiniz. Bu yüzden, bir şekilde sayıları onluk düzenden ikilik düzene ve ikilik düzenden onluk düzene çevirebilmelisiniz. Bu sayede sayıları ilk olarak onluk düzene çevirip, işlemi yapıp sonucu ikilik sisteme çevirebilirsiniz. Aslında işlemler ikilik sistemde de onaltılık sistemde de onluk sistemde aynı kurallara bağlıdır. Eğer kendinizle tutarlı davranırsanız, bu çevirme işlemine hiç bulaşmadan da tüm işlemleri gerçekleştirebilirsiniz. İsterseniz, sayı çevirme işine önce daha basit olanından, yani ikilik sistemden onluk sisteme çevirme kısmından başlayalım: Demin de bulduğumuz formülü kullanarak ikilik sayıların onluk karşılığını bulalım:

4212 xB44...

Burada, Bi, B2, ..., Bn yalnızca 0 ya da 1 olabildiği için, Bk terimi toplamaya 2.(k- 1) değerini ekleyecektir, ya da toplamı etkilemeyecektir. İsterseniz basit bir örnek yapalım artık:

90110101 (fi tarihinde yapılmış bir kabul sonucu “o işareti gelecek olan sayının ikilik olduğunu belirtir) ikilik sayısını onluk sisteme çevirelim. Formülümüze göre

ONLUK-142x04212x1-4213x0-421 4x14255x1

Kolay değil mi? Şimdi de tam tersini nasıl yapacağınızı göstereceğim. Ondalık bir sayıyı ikilik bir sayıya çevirirken kullanılan standart bir metod vardır: Sayı önce ikiye bölünür ve kalan, bir yere not edilir. Daha sonra bölüm de ikiye bölünür ve kalan bir yere not edilir. Bu işlem, bölüm | olana kadar devam eder. Sonra başa (en sola) bir adet 1 yazılır ve kalanlar sondan başa doğru sayının sağına eklenir. Tablo 1'de 53 sayısının ikilik düzene nasıl çevrildiğini görebilirsiniz.

Onaltılık (Hexademical) Sayı Sistemi

Aynı işlemler onaltılık sayı sistemleri için

-de geçerlidir. Yalnızca, formülde yer alan tüm 2'lerin yerine onaltı yazmalısınız. Yani:

ONLUK 4... 4 x Bn

Tabii ki basamaklarda 10 ve sonrasındaki rakamları yazmak için yeni bazı şekillere ihtiyacımız olacak. Bu rakamlar için garip garip şekiller icad etmek yerine, alfabemizde yer alan tanıdık şekillerin ilk altısını kullanmak çok daha makul ve mantıklı. Sonuç olarak onaltılık sayılar şekilde sıralanırlar: 0,1,2,3,4,5,6,7,8, 9, A,B,C,D, E, F, 10,... Alışana kadar biraz garip gelecek tabii, ama bu sistemi o kadar sık kullanacaksınız ki sonunda ““Neden onluk yerine onaltılık sistem kullanmıyoruz?” diye hayıflanacaksınız. Örneğin $FA (aynı fi tarihinde $'ın da onaltılık sayıları göstermesi kararlaştırılmış) sayısının onluk karşılığını bulalım:

ONLUK - $A 416x$F-10416x15-250

Bir de 250 sayısının 16'lık karşılığını bulalım. Ama bunun için Tablo 3'e bakmalısınız. İkilik ve onaltılık sayılar üzerine söylenebilecek çok şey bulunabilir, ama bu kadarı başlangıç için yeterli. Daha sonra, yeri geldikçe bu konulara değineceğiz. Şimdi biraz da bilgisayarla ilgili kavramlara bulaşalım:

19 1111 1010 EL 15 - 10-2 $ A - $SFA

Bit, Bayt (ya da Byte) ve Nibble

Bilgisayarınızın digital bir devre olduğunu biliyorsunuz. Digital devrelerin özelliği, bir telde bulunan sinyalin ya | ya da 0 olmasıdır. Yani elektronik bir ikilik sistemden başka bir şey değildir. Biz bu tellerin her birinde bulunan değere bir bit adı veriyoruz. Daha matematiksel olarak ifade etmemiz gerekirse, ikilik sistemdeki bir sayının her basamağına bir bit denir.

C-64'ünüz, kendisiyle yaşıt olan bilgisayarların çoğu gibi sekiz bitlik hatlarla veri iletir. Bu yüzden belleğinde sakladığı değerler en fazla sekiz bit uzunluğunda olabilir. Bellekte saklanan bu değerlere her seferinde “sekiz bit” demek yerine bir bayt demek genelde tercih edilir. Ufak bir hesapla, bir baytın alabileceği en yüksek değerin 255 olacağını bulabilirsiniz artık. Ama bu 255'in olmasından başka bir özelliği daha vardır: $FF olması. En büyük sayı olan 255 bile iki basamakla yazılabildiği için, onaltılık sistem, baytların değerlerini göstermek için idealdir. Bu yüzden makine diliyle uğraşan her insan ilk olarak onaltılık sistemle yakınlaşmaya çalışır. “Neden onluk değil de onaltılık sistem kullanılıyor?”” sorusu çoğunuzun kafasını şu anda kurcalıyor olmalı. Aslında sadece bir çeşit gösterim kolaylığı. 0-255 arası sayılar bir, iki ya da üç basamaklı ondalık sayılar olarak yazılabilirler. Oysa genel bir kabul olarak, bu sayılar ne olursa olsun, iki basamaklı onaltılık sayılar şeklinde yazılır. Yani 0 sayısı her zaman $00 olarak yazılır. Bu da görüntüde bir güzellik sağlar.

Bir de onaltılık sayılarla ikilik sayılar arasında geçiş yapmanın kolaylığı göz ardı edilemez. Onaltılık sayıların her basamağı tam dört adet bitten oluşur ve bu basamakların her birine bir nibble adı verilir. Tablo 4'e bir göz atarsanız Nibble'lardan yararlanarak onaltılık sistemle ikilik sistem arası sayı değişiminin nasıl yapılabileceğini görebilirsiniz. Bu aylık benden bu kadar. Artık temel konularda fikir sahibi olduğunuza göre gelecek saayıdan itibaren makine dili öğrenmeye başlayacağız. Bu ayki konunun sıkıcılığına aldanmayın, makine dili öğrenmek eminim çok hoşunuza gidecektir. Biz sadece ge-

Gelecek aya kadar bu onaltılık ve ikilik sayı sistemlerine biraz daha çalışın ki, konular başladığında bu konular geçtiğinde şaşırmayın.