Amiga Dünyası sayı 6, sayfa 48

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 48

Merhaba. Bu sayımızda yeni bir makine dili programı ile yazımıza devam ediyoruz.

İkinci örnek programımızda amacımız, belli bir hafıza bölgesini başka bir yere taşıma ya da kopyalama işlemi. Makina dili programlarında sık sık kullanacağımız için, bu taşıma işlemlerini çok iyi öğrenmeniz gerekiyor.

ÖRNEK PROGRAM 2a:

1 START: MOVE.L #bufferl,A0 2 MOVE.L #buffer2,Al 3L1: MOVE.B (A0),(A1) 4 ADD.L #1,A0 5 ADD.L #1,A1 6 CMP.L #buffer2,A0 7 BNE Ll 8 RTS 9 bufferl: dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1 1,1,1,1,1,1,1 10 buffer2: dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0

Programın yaptığı iş; buffer1 diye adlandırılan ve 20 byte uzunluğundaki hafıza bölgesini, buffer2 diye adlandırılan hafıza bölgesine taşımak. 68000 işlemci ile bu tür işlemleri yapmak çok rahat. Çünkü 32 bit uzunluğundaki adres ve data registerleri ile adreslerden sayıları almak, taşınacakları adreslere koymak çok kolay. Hele 68000'in göz bebeği olan MOVE komutunun bir defada 32 bitlik bilgiyi alıp başka bir yere koyduğunu ve bu işlemi tek hareket ile yaptığını düşünürsek taşıma işleminin rahatlığını siz de anlayacaksınız.

Şimdi programımızın açıklamasına geçelim.

Örnek programımızın kodu, Start label'ı ile buffer1 label'ı arasındaki hafıza bölgesinde bulunuyor.

Buffer1'den Buffer2'ye kadar olan 20 byte'lık hafıza bölgesindeki her byte'da 1 değeri bulunuyor. Ve buffer2'den itibaren 20 byte'da 0 değeri bulunuyor.

SATIRI:

START: MOVE.L #buffer1,A0 Programımızın ilk satırında buffer1 değerini A0 adres registerine gönderiyoruz. Bu satırın anlamı, daha önce de anlattığımız gibi programda sık sık kullanılan hafıza adreslerini bir adres registerine gönderip rahat bir kullanım ortamı oluşturmak.

SATIR-2:

MOVE.L #buffer2,A1 İkinci satırda da birinci satırdaki gibi bir atama işlemi yapılıyor. Buffer2 değerini A1 adres registerine gönderiyoruz.

Programın birinci ve ikinci satırlarında amacımız, taşıma işlemini yapacağımız hafıza bölgelerinin başlangıçlarını temsil eden bu label'ları (buffer1 ve buffer2) A0 ve A1 registerlerinin adı ve içeriği ile kullanmak olacaktır. Ve program içindeki L1: Label'ı ile BNE komutu arasındaki döngüde, ADD komutları ile A0 ve A1 adres registerleri içeriğindeki değerleri artırıp, taşıma işinin yapılacağı yeni byte'ı tespit ediyoruz.

Aslında 68000 makina dilinde, ilk iki satırdaki komutlar yerine, gerçekten adres registerlerine atama işlemi yapan komutlar da bulunmaktadır. Örneğin LEA (Load Effective Address) komutu gibi. Bu komutu örneğimizdeki yerine koyarsak, ilk iki satır şu şekilde de olabilir.

Bufferl,A0 buffer2,Al

Bu iki satır örnekteki işlemi MOVE komutundan çok daha kısa sürede ve program kodu üzerinden düşünürsek, en az miktarda hafıza harcayarak yapabilirler. Size tavsiyem, adres registerlerine atama yaparken hız ve işleyiş kolaylığı bakımından bunları kullanmaktır. LEA komutunun bu programdaki değişikliklerini ve etkilerini bundan sonraki örneğimizde görebilirsiniz.

SATIR-3:

L1: MOVE.B (A0),(A1) Burada taşıma işleminin adımları gerçekleştiriliyor. A0 adres registerinin içeriğindeki adresin gösterdiği hafıza bölgesindeki değer, A1 registerinin gösterdiği hafıza bölgesine gönderiliyor. Burada MOVE komutu tek byte'lık taşıma işlemi yapıyor.

SATIR-4:

ADD.L #1,A0 Bu satırda, ADD komutu ile A0 registerindeki sayı bir değer artırılmış oluyor.

SATIR-5:

ADD.L #1,A1 Bu satırda bir üst satır gibi, ama bu sefer A1 registerindeki değer bir artırılmış oluyor.

Son iki satırdaki amacımız ise, L1 label'ı ile BNE komutu arasındaki döngü esnasında bu satırlarda devamlı olarak A0 ve A1 adres registerlerindeki sayıları bir değer artırmak ve MOVE.B (A0),(A1) satırındaki adres registerlerine yeni alınacak ve konacağı değerlerin hafıza adreslerini bildirmek.

SATIR-6:

CMP.L #buffer2,A0 Programdaki döngünün son satırı burası olmaktadır. Buffer2 değeri A0 registeri ile karşılaştırılıyor. Sonuç bir alt satırdaki BNE komutu tarafından okunacaktır.

SATIR-7:

BNE L1 Bir üst satırdaki işlemin sonucunda buffer2 değeri adres registeri A0'da bulunan değeri aşmamışsa L1 label'ına, aşmışsa programın devamına gidecektir.

SATIR-8:

RTS İşte, döngülerin sonu olan satır. RTS komutu ile programdan çıkıyoruz.

İşlemci, programda satırları okurken şu mantıkla ilerleme kaydetmiştir.

I - İlk iki satırda A0 ve A1 registerlerine buffer1 ve buffer2 değerlerinin atamasını yapmıştır. LEA LEA

II - Alınacak byte'ın bulunduğu hafıza bölgesini gösteren değer yeri olan A0 ve konacak byte'ın hafıza değerini gösteren A1 registerlerini, MOVE komutunu kullanarak ilk byte'ın taşımasını yapmış oluruz.

III - ADD komutları ile her iki adres registerindeki adreslerin değerlerini birer basamak artırarak yeni taşınacak byte'ın bulunduğu hafıza adresini oluşturur.

IV - Bu değerlerin buffer2 yani buffer1'in sonunu bildirip bildirmediğini kontrol ederiz.

V - Bne'ye geldiğimizde, Cmp komutunun sonucuna göre hareket ediliyor. Değer belirtilen sınırı geçmişse programa devam ediliyor, eğer geçmemişse L1 label'ına atlanıp devam ediliyor.

VI - Ve L1-BNE döngüsünü 20 defa tekrarladıktan sonra sonuçta RTS'ye gelinip programdan çıkılıyor.

Sonuçta buffer1'de bulunan 20 adet 01 değerini almış olan byte buffer2'ye taşınmış oluyor.

Şimdi bu programı, yukarıda satırları açıklarken bir kısmına değindiğim değişikliklerle yeniden yazalım. Böylece programımız daha hızlı çalışacağı gibi, hafıza-

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