ASSEMBLER -1
Makina dili bilgisayarın doğrudan doğruya anlayabildiği tek dildir ve sayılardan oluşmaktadır. Sadece bu sayıları kullanarak program yazmak imkânsızdır. Bunun için bilgisayarla iletişim kurarken bir aracıya gereksinimimiz olacaktır. Bu aracı da ASSEMBLER'dir.
Büyük bir olasılıkla C-64'de Assembler ile yapılabilecekleri gördükten veya okuduktan sonra, aynı şeyler neden Basic'de yapılamıyor diye içinizden geçirmişsinizdir. Belki de hemen C-64'ünüzün başına geçip C000 LDA — $00 gibi bir satır yazıp RETURN'e bastığınızda bilgisayar SYNTAX ERROR hata mesajı vermiştir. Yukarıdaki satır bizim C-64'- ün makina dile olduğunu biliyoruz.
süyle okunup belli adreslere POKE edilen DATA satırlarıyla karşılaşmışsınızdır. En sonda gelen bir SYS komutu ile de herhalde DATA satırlarındaki sayıların makina dilinde yazılmış bir program olduğunu farketmişsinizdir. Nasıl oluyor da doğrudan doğruya Basic'den makina dili programlar yazmanız mümkün oluyor? İşte bu makina dilini anlatan yazı
ANIL GÜL konunun asıl başladığı yerde, yani işletim sistemi rutinlerinin ve yorumlayıcıların kullanımında son bulmaktadırlar. Esasında makina dili komutları tek başlarına hiçbir şey ifade etmezler. Makina dilinde yazılmış bir program, o bilgisayarın kullandığı mikroişlemcinin komutlarının ve işletim sistemi rutinlerinin beraber kullanılmasıyla işlev kazanır. Kursumuz süresince sık sık C-64'- ün Kernal alt rutinlerini kullanacağız. Bu nedenle elinizin altında C-64'ün bir bellek haritasının (Memory Map) bulunmasında büyük fayda vardır. Bildiğiniz gibi makina dili bilgisayarın doğrudan doğruya anlayabildiği tek dildir ve sayılardan oluşmaktadır. Sadece bu sayıları kullanarak program yazmak imkânsızdır. Bunun için bilgisayarla iletişim kurarken bir aracıya gereksinimimiz olacaktır. Bu aracı da ASSEMBLER'dir. Burada “iletişim kurmak” demek CPU'ya (Central Processing Unit « Merkezi
Peki nerede hata yapılmıştı? dizimizde yukarıdaki sorulara cevap — işlem ünitesi) bazı emirler verebilmek Yine büyük bir olasılıkla dergi ve- — bulacaksınız. Hemen herkesin elinde — demektir. Bu CPU'lar değişik firmaya kitaplardan yazdığınız bir prog- C-64'ün makina dilini anlatan bir ki- — lar tarafından üretilmektedirler ve bu ramda basit bir FOR-NEXT döngü- tap vardır, fakat bunların birçoğu — yüzden aralarında farklılıklar vardır. Güç kaynağı 8- Bit-Data bus
6502 oldukça yayılmış bir Processor'- dur ve C-64'ün mikro işlemcisi olan 6518'la hemen hemen aynıdır. Bu ikisi de 6502 Assembler ile programlanabilmektedirler. Bir Assembler kendi dilinde yazılmış komutları makina diline tercüme etmektedir. Bir de Assembler'in tam tersi olan, yani makina dili komutları çeviren Disassembler'lar vardır. C- 64'de makina dili bir program yazabilmek için Assembler ve Disassembler özelliği olan bir monitör programına ihtiyacımız olacaktır. Her ne kadar değişik özelliklere sahip birçok monitör programı mevcut ise de bunların kullanımı hemen hemen aynıdır. Yeri geldiğinde bu konuya daha detaylı değineceğiz.
Basic'e karşı Assembler:
Bu ikisi arasındaki farkı daha iyi görebilmek için aşağıdaki satırları yazın.
10 FOR TO
1024 STEP-İI
20 POKE I,1:POKE 1-4 54272,14
30 NEXT I
Bu programcık ekranın üst tarafındaki bölüme 255 tane ““A”' harfi basmaktadır. Eğer kronometre ile zaman tutarsanız bu işlem için aşağı yukarı 4 saniye harcandığını göreceksiniz. Ayrıca bu program hafızada 62 bayt işgal etmektedir. Şimdi aynı işi Assembler ile yapalım. NEW yazdıktan sonra bilgisayara aşağıdaki satırları girin:
10 FOR 1-7000 TO
20 READ A:POKE I,A:NEXT
30 DATA 160,255,162,14,169,1,
153,255,3,138,153,255,215,136,
208,244,96
RUN komutunu verdiğinizde makina dili program 7000. bayttan itibaren hafızada yer alacaktır. SYS 7000 ile programı çalıştırabilirsiniz, ama hiç süre tutmaya kalkışma) ra bu işlem Assembler ile 5,4 mili niyede halledilmektedir. Ayrıca program bellekte sadece 17 bayt işgal etmektedir. Görüldüğü gibi Assembler kullanımını bu kadar çekici yapan başlıca unsur sürattir. Bazı işlemler Basic'e göre aşağı yukarı 1000 kat hızlı gerçekleştirilmektedir. Ayrıca Basic'te halledilmesi imkansız olan programlar Assembler'in çok yönlü kullanımı ile mümkün olmaktadır. C-64 açıldığında ile programlanmayı beklemektedir. Bizim bilgisayara yazdığımız Basic komutları her seferinde “Interpreter” adındaki bir çevirici program tarafından bilgisayarın anlayabileceği bir şekilde yorumlamaktadır. Yalnız bu yorumlayıcı ile Assembler programları arasında çok önemli fark vardır: Assembler'da yazılan bir program bir defa çevrilerek tamamen makina dili haline gelmektedir ve bir daha yazıldığı Assembler programlarına ihtiyaç duymamaktadır. Basic programlarda ise tam tersine her seferinde yorumlayıcı işe karışmaktadır ve bu da önemli bir zaman kaybına yol açmaktadır. C-64'ün içinde açılışta hazır bir Assembler bulunmaması bu bilgisayar için önemli bir handikap teşkil etmektedir. Şimdi isterseniz normal şartlarda yani doğrudan Basic yardımıyla C-64'de nasıl makina dili program yazılacağını görelim: a)İlk önce Assembler program hazırlanmalıdır. Bu programda bir dizi komut yer alacaktır. Örnek olarak bu diziden bir RTS komutunu ele alahım. b) Her Assembler komutunun makina dilinde bir “binary” (ikilik sistem) kodu vardır. RTS için bu kod 01100000 dur. c) Şimdi bu kodun hafızanin bir registerine kaydedilmesi lazımdır. Bu işlem POKE komuduyla gerçekleşir. Yalnız Basic ikilik sistemden anlamadığı için bunun onluk sisteme çevrilmesi gereklidir. RTS'nin onluk sistem karşılığı 96'dır (onaltılık veya heksadesimal karşılığı 60). Bu değer istenen adrese POKE edilir, örneğin PO-KE 7016,96. d) Bu yöntemle tüm program bayt bayt hafızaya yerleştirilir. Eğer hafızadaki program incelenmek istenirse bu sefer PEEK komutu ile her bayt tekrar okunmalıdır. Görüldüğü gibi yukarıdaki yöntem oldukça zahmetlidir. Bu nedenle herhangi bir monitör programının kullanılmasında büyük yarar vardır. Kullanışlıkları açısından bize en uygun olanları S-MON veya EX-MON'dur. Monitörlerin yanında çok çeşitli Assembler programları mevcuttur. Örneğin Direkt-Assembler'lar yazılan her satırı anında makine diline çevirmektedirler. Bunun yanında 2-Pass- Assembler'lar tüm program tamamlanınca assembler (makina diline çe-
2
> virme) işlemine geçmektedirler. Bazı Assembler'larda her satıra (Basic'teki REM komutuna benzer şekilde) bir yorum sözcüğü ilave edilebilmektedir. Ayrıca istenen satırlara (Label) veya program bölümlerine (Makro) isim verme olanağı da vardır. Tüm bunlar kullanıcının üzerindeki yükü hafifletmek için geliştirilmiştir. Biz burada başlangıçta bu tür lüks Assembler'lar kullanmayacağız.
ARR ölü ELİ
al
Assembler'da program yazarken bilgisayarın iç dünyası ile çok yakın ilişki kuracağımız için cihazımızın işleyişini bilmemiz gerekmektedir. Bunun için (Resim 1'e bakın.) Burada öncelikle tüm işlemleri yönlendiren mikroişlemci yer almaktadır ve yollarla bilgisayarın diğer bölümlerine bağlanmış durumdadır. Bu bağlantılar “Bus” diye adlandırılmaktadır. En altta mikroişlemci tarafından oluşturulan, verileri geldiği ve gideceği yerleri içeren 16 Bit'lik adresleri (örneğin $efd4) taşıyan Adress-Buss'u görmektesiniz. İşlemcinin sol tarafında değişik senkronizasyon işlemlerini gerçekleştirilen “Kumanda Bus”'unu görmektesiniz. Sağ tarafta ise ROM (Read Only Memory) yer almaktadır. Buradan sadece okuma işlemleri yapılabildiği için “Data-Bus''a doğru tek yönlü bir ok gösterilmiştir. Çift yönlü ok ise RAM (Random Access Memory) üzerinde bulunmaktadır, zira burada hem okuma hem de yazma işlemleri yapılabilmektedir. En sağda ise bilgisayarın diğer ünitelerle iletişim kurmasını sağlayan giriş/çıkış birimini görmektesiniz.
Mikroişlemcinin iç dünyası:
Mikroişlemcinin iç yapısı aslında burada birkaç satırda anlatılamayacak kadar karışıktır, fakat bize bu kadar derin bilgi gerekli değildir. Resim 2'de herşey basit bir şema halinde gösterilmiştir. Bir mikroişlemcinin kalbi ALU (Arithmetik Logical Unit) diye adlandırılan mantıksal elemandır. Bu ALU akkumulator veya Data-Bus'undan aldığı verilerle hesap işlemlerini gerçekleştirir ve sonucu tekrar akkumulator( — birşeyi toplayan, biriktiren)'a bildirmektedir. Bu akkumulator veya kısaca akku ile oldukça sık karşılaşacağız, zira birçok veri okuma, yazma ve taşı-
Basic'te halledilmesi imkânsız olan programlar Assembler'in çok yönlü kullanımı ile mümkün olmaktadır.
ma işlemleri bu register'le yürütülmektedir. X ve Y Index-Registerinde ne olduğu gibi akku'nunda alabileceği en büyük değer 255 (ikilik sistemde lili 1111)'dir. Resmin en sağ tarafında P diye adlandırılan mikroişlemci statü registerini (Processor Status Register) görmekteyiz. Bu register diğerlerinden çok farklı bir işleve sahiptir. Statü registerini (sicilini) oluşturan 8 Bit'ten her biri mikroişlemcinin o anki du- Tumunun çeşitli yönlerini gösteren bir evet/hayır göstergesi (Flag) olarak kullanılır. Buradan örneğin yapılan bir işlemin sonucunun negatif olup olmadığı, programın kesintiye uğrayıp uğramadığı vs. öğrenilebilir. C-64'ün belleğinde mikroişlemcinin doğrudan kullanabildiği 256 bayt uzunluğunda özel bir bölüm vardır ve burası “stack” diye adlandırılır. Yine oldukça sık kullanacağımız “Stack Pointer” bize yukarıda anlatılan özel bölümdeki ilk boş yerleşim adresini gösterir. Son registerimiz ise ““Program Counter”'dir. Bu register iki tane 8-Bit Registerden oluşmaktadır ve bu şekilde 65535 bayt erişilebilir. Program
Counter (program sayacı) bir sonra işlenecek olan makina dili komutunun adresini içerir. Bilgisayarımızın iç dünyası hakkında gerekli bilgileri aldıktan sonra Assembler programlarında kullanacağımız S-MON'a değinebiliriz. S-MON'u çalıştırdığımızda karşımıza ilk önce aşağıdaki gibi bir register göstergesi çıkacaktır:
PC-E147
NV-BDIZC-10110000
AC-0O
XR-0O
SP-F8
PC her seferinde bir sonra ele alınacak komutu gösterir (burada $E147). IRO ise bize Interrupt vektörünün adresini verir. Bu adres 788. ve 789 registerlerden de öğrenilebilir. Bir sonraki 8 haneli değer ise statü registerinin 8 Bit'ini yani flag'larını bildirir. AC akumulator'un o an içerdiği değeri göstermektedir. Aynı şekilde XR X-registerini, YR ise Y-registerini içerir. Bu ay makina dilinde ilk adımları atabilmek için gerekli temel bilgileri ele aldık. Gelecek ay değişik adresleme yöntemlerini görüp ilk Assembler programlarımızı yazacağız. Bu aylık hoşçakalın.