Amiga Dünyası sayı 5, sayfa 54

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 54

Merhaba assemblercılar. Siz geleceğin makina dili programcılarısınız. Sabırla çalışıyorsunuz. Ben makina kodunu öğrenmeyi bir tepeyi aşmak olarak yorumluyorum. Bütün dikkatinizi bu sayıdan itibaren vereceğimiz örneklerde toplamalısınız.

Makina dilinin bütün zorluğu yazacağımız programların her satırının icrasını anlama mecburiyeti. Aslında bana sorarsanız, tepeyi aştıktan sonra herkes için makina dilinde yazılmış satırlar basit aritmetik işlemleri gibi gelecektir. Önerim elden geldiğince program satırlarını sıralı olarak düşünmek ve hangi satırın sisteme ve registerlere ne etkisi oluyor, bunları aklında tutmak olmalıdır.

Şimdi bu sayıda bahsedeceğimiz Bcc komut dizisine gelelim. Bu komut ile beraber makina dilinde ilk örneği vermek için gerekli bütün komutları görmüş olacağız. Bcc komutunun açıklamasının bitiminde vereceğimiz örnekler ile şimdiye kadar öğrendiğimiz bütün komutları tekrar ediyoruz. Evet başlıyoruz....

Bcc - BRANCH KOMUTU Branch adı verdiğimiz komutların yaptığı iş, aslında JMP komutu gibi, başka bir yere dallanmaktan başka bir şey değildir. Tek farkı, karşılaştırmalara göre dallanma işlemini gerçekleştirir veya programa branch komutu arkasından devam eder.

Branch komutlarının çalışmasını BASIC'deki IF....THEN komutuna benzetebiliriz. IF komutunu geçen sayıda anlattığımız CMP komutuna ve THEN komutunu da Bcc komutlarına eş değer olarak düşünün.

Branch komutları karşılaştırmaları, system durum flagları ile gerçekleştirirler. Bu flaglar (daha önceki sayılarda gördüğümüz gibi) N-Negatif, Z-Zero, V-Overflow, C-Carry, X-Extend olmaktadır.

14 adet branch komutu yardımı ile system flaglarının bir ya da birkaçını birden kontrol edeceğiz. Komutların listesi TABLO 1'de gösterilmiştir.

Bu arada "Bcc" deyiminin ne olduğunu da anlatalım. Assembler'da Branch komutlarının hepsi üçer harften oluşur. Bcc'deki B harfi branch komutu olduğu ve küçük harfli iki cc harfi yerine yukarıda gördüğünüz 14 modu ifade etmiş oluyoruz.

Tablonun ilk iki harfini B harfinin yanına ekleyerek kullanacağız. Yani BLE, BGT, BNE, BEQ gibi...

Şimdi branch komutlarının modlarını inceleyelim:

Kullanım Modu : BHI label Örnekteki komut, Carry ve Zero bayrakları 1 ise label'ın gösterdiği adresten itibaren devam et; anlamına gelmektedir. Diğer bütün Branch komutları da aynı şekilde tablodaki system flagları doğrultusunda Label'a dallanma yaparlar. Sadece kullanılabilirlik bakımından bir mod daha açıklamakta fayda var.

Kullanım Modu : BHI (A0) Yukarıdaki örneği bu şekilde de değiştirebiliriz. Bu kullanım için daha önceden A0'a label değerini atamış olmamız gerekiyor.

Branch komutlarının ilke olarak nasıl çalıştığını görmek için birkaç örnek verelim. Tabii Bcc komutlarından sonuç almak için CMP komutu ile yaptığımız işlemler doğrultusunda system flaglarını etkilememiz gerekiyor.

1. Örnek : CMP #1,D0 BEQ label Açıklama : Örnekte Beq komutu doğrudan system flaglarından Zero'yu okuyup, değerine göre işlem yapacaktır.

Eğer cmp komutu işleme girmeden önce, D0 data registerinde 1 değeri varsa ve cmp ile biz 1 olup olmadığını sorarsak, sonuçta beq komutunun gösterdiği label'a dallanma olur. Nedeni ise örnekteki cmp komutunun (CMP #1,D0) işleme girdikten sonra Zero flag'ını 0 yapmasıdır.

Fakat cmp komutundan önce D0 registerinde 0 değeri varsa ve cmp komutu ile biz 1 olup olmadığını sorarsak beq komutu label'a dallanma yapmayacak ve program beq'dan itibaren işleyişine devam edecektir.

Aslında örneğimizdeki CMP #1,D0 komutunun etkisi N, Z ve C flaglarına aktarılıyor. Tabii D0'ın ilk pozisyonuna göre flagların değeri değişik oluyor.

Örnek. 1- D0=00000001 olsun, CMP #1,D0 komutu ardından flagların değeri şöyle olur:

N=0 Z=1 C=0 Örnek.2- D0=00000000 olsun, CMP #1,D0 komutu ardından flagların değeri şöyle olur:

N=1 Z=0 C=1 Örnek.3- D0=00000002 olsun, CMP #1,D0 komutu ardından flagların değeri şöyle olur:

N=0 Z=0 C=0 Bu örneklerle, registerlerdeki bir sayıyı, cmp komutu yardımı ile kontrol ettiğimizde ortaya çıkan sonucu system flaglarından nasıl okuyacağımızı görmüş olduk.

Şu ana kadar öğrendiğimiz komutlar ile ufak programlara başlayabiliriz. Diğer 68000 komutlarını da vereceğim örnek programlar içerisinde sırası geldikçe, yerine ve kullanıldıkları yer farklılıklarına göre açıklayacağız. Amacımız, size bir sürü komutu ezberletmek yerine komutları yavaş yavaş örnek programların arasına serpiştirip sindirmenizi kolaylaştırmaktır.

Bu arada program yazma safhasına geldiğimize göre makina dili ile assembler arasındaki farkı ayıralım.

Makina dili programları sayılardan oluşmaktadır. 68000 makina dilinde her komutun iki byte'dan oluşan bir değeri vardır. Bunun arkasında da komutuna göre iki byte'dan sekiz byte'a kadar parametresi bulunur. Assembler dediğimiz kavram ise, programcıları bu sayılar ile uğraşmaktan kurtarıp, bir kısmını açıklamasını yaptığımız komutlar dizisine döndürmüştür. Eğer Assembler dili olmasaydı, programları sayılardan oluşturacak ve bunları girmenin sıkıcılığını yaşayacaktık. Her komutun ilk önce iki byte'lık değerini, sonra o komutun hangi parametresini kullanacaksak o parametrenin değerini bulacak, daha sonra komutun parametresini yazmaya çalışacaktık. Tabii bu sırada bol bol hata yapacak, iki satırlık makina dili programı-

AMIGA ASSEMBLER

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