Amiga Dünyası sayı 4, sayfa 52

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 52

Bu ay makina dilinde atlama ve dallanma komutlarını inceleyeceğiz. Bu komutlar JMP, JSR ve RTS'dir. Bunlardan başka şartlı dallanma ve branch olarak dallanma yapan komutlar da vardır. Onlara daha sonra değineceğiz.

İlk olarak; JMP Jmp komutu herhangi bir hafıza adresindeki makina dili programına atlamaya ve işlemcinin işleyişini oradan yapmaya yarar. Böylece programımıza bazı makina dilinde rutin seçenekleri sunup, duruma göre değişik makina dili rutinlerine atlama yaparız. Jmp komutunun işleyişini BASIC programlama dilindeki GOTO komutuna benzetebiliriz. Tabii komutu izleyen parametreler; satır numarası yerine hafıza adresi veya bir hafıza adresini gösteren herhangi bir adres registeri olacaktır.

Kullanım modları şöyledir. 1. Kullanım Modu: JMP $50000 Örnekte de görüldüğü gibi, bilgisayar bu satırdan itibaren (JMP $50000) komutları 50000'den almaya ve işleyişine oradan devam etmeye başlayacaktır.

2. Kullanım Modu: JMP (A0) İşlemci A0 adres registerindeki adresi okuyup, işleyişine o adresten devam edecektir.

3. Kullanım Modu: JMP 4 (A0) İşlemci A0 adres registerindeki adresi okuyup, artı olarak o adrese 4 ekleyip gösterilen adrese atlayacaktır.

JSR & RTS

Bu iki komut yardımı ile subrutinler yazıp işimizi daha da kolaylaştıracağız. JSR komutu ile dallanıp RTS komutu ile ana programa geri döneceğiz.

Subrutin kavramını BASIC programlamadan tanıdığınızı tahmin ediyorum. Subrutin kavramını özetlemek gerekirse kısaca; tekrarı gereken makina dili rutinlerimizi, tekrar tekrar yazmaktansa bir tane yazıp onu defalarca aynı işi yapmak üzere çağırabiliriz. Böylece hem makina dili programlarımızı kısaltmış, hem de hızlandırmış oluruz.

Bir subrutini aynı türden başka bir işi yapmak üzere de programlayabiliriz. Bu iş için rutinin amacına göre kendimize parametreler tanımlayıp aynen Amiga ROM'unda bulunan subrutinler (ROM kütüphaneleri) gibi bunların herbirini data ve adres registerlerine tanımlayıp, rutine atlamadan önce tanımladığımız bu registerlere değerleri koyup çağırarak subrutinleri mükemmelleştirebiliriz.

Makina dilindeki JSR komutu işleyiş bakımından BASIC'deki GOSUB'a ve RTS'yi de RETURN komutuna benzetebiliriz.

Dallanma komutlarının kullanım modları ve parametreleri ise şöyle olmaktadır. 1. Kullanım Modu: JSR $50000 örnekte $50000'deki makina dili alt rutinine dallanacağımızı ifade ediyoruz.

2. Kullanım Modu: JSR (A0) adres registeri olan A0'ın içeriğinde gösterilen adrese dallanılması ifade ediliyor,

3. Kullanım Modu: JSR 16 (A0) Adres registeri olan A0'ın içeriğinde gösterilen adres olan sayıya 16 daha ekleyerek, yeni çıkan adrese dallanılması gerektiği ifade edilmiş oluyor.

4. Kullanım Modu: RTS Rts komutunda, komuttan sonra hiçbir parametre yoktur. Bu komutu subrutinden çıkmaktan başka hemen hemen bütün programlarımızın sonuna, o programdan çıkmak için koyacağız.

JSR komutu parametresinde gösterilen adrese dallanmadan önce ilk olarak Stack Pointer'e (System registerlerinden bir tanesi) ana programın neresinde kalmışsa, o adresi atayacaktır. Ondan sonra gösterilen adresteki subrutine gidecektir. Ve bilgisayar nerede RTS komutunu görürse, tekrar Stack Register'inden ana programda kaldığı yerin adresini alıp oradan ana programa devam edecektir.

Subrutinlerde, ana programda kullandığımız registerlerden başka register de kullanabiliriz. Böylece subrutinlerdeki programımızda, programın işleyişinde registerler yönünden hiçbir kısıtlama olmayacaktır. Bu iş için öncelikle subrutinin başında adres ve data registerlerinin değerlerini stack registerine gönderip, rutinden çıkarken tekrar buradan registerlerin değerlerini okuyup registerlere yazmamız gerekiyor. Bu iş için ise subrutinin başına ve sonuna şu satırları eklememiz gerekiyor.

İlk başa; MOVEM.L D0-D7/A0-A6, -(A7) ve sona; MOVEM.L (A7)+, D0-D7/A0-A6 ekleyeceğiz. Şimdi yeni bir komut;

NOP

Amiga makina dilinde hiçbir iş yapmayan bir komut var mı diye sorarsanız, benden var cevabı alacaksınız. Peki hangi komut? Tabii ki cevap, NOP komutu olacaktır. Evet gerçek adı NO OPERATION olan bu komut işleme girdiğinde hiçbir şey yapmıyor. Tek yaptığı iş (gerçi ona da iş denirse) 68000 işlemcisine 4 vuruşluk zaman harcatıyor. Bilgisayar bu komutu gördüğünde hiçbir şey olmamış gibi işine devam ediyor.

Nop komutunun çalışmasını BASIC'deki REM komutuna benzetebiliriz. Fakat yine de arasında çok fark var. İlk olarak Nop komutunda, BASIC'deki Rem komutunda olduğu gibi parametre olarak yazılar yazamıyoruz. Nop komutu her zaman tek başına parametresiz olarak durmaktadır.

Şimdi diyeceksiniz ki; "Madem hiçbir şey yapmıyor. Neden böyle bir komutu icat etmişler?". Bu komut ile neler yapılabilir? Bu sorunun cevabı aslında makina dili programcısına kalıyor. Çünkü Nop komutunun görevi programa göre değişiyor. Birkaç örnek verelim.

Örneğin; makina dili rutinimizin işleyişini yavaşlatmak için kullanabiliriz. Gerçi işlemci her Nop komutu başına 4 hz harcadığı halde yine de bu yavaşlık bazı durumlarda işe yarayabilir, özellikle grafik işlemleri sırasında bazen işlemciye grafik taşıma ve scroll komutlarını aralıklı göndermek gerekebilir. O zaman aralara Nop koyarak ekran titremelerini ya da renk bozulmalarını önleyebiliriz. Gerçi 4 hz'lik başka komutlar da aynı işi yapabilir fakat Nop komutunun özelliği hiçbir registerin değerini değiştirmemesidir.

Klavyeyle gezinmek için ← ve → tuşları.