Amiga Dünyası sayı 3, sayfa 35

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 35

1. Kullanım Modu : MOVEM.L D0- D1/A4-A5, (A0)

D0,D1 ve A4,A5 registerlerinin içerikleri (AO)'in gösterdiği adrese saklanacak.

2. Kullanım Modu : MOVEM.L D0/A2-A3, $40000

D0 ve A2.A3 registerleri $40000'den itibaren LONGWORD olarak yerleşecekler.

3. Kullanım Modu : MOVEM.L D0- D7/A0-A6,-(SP)

DO'dan D7'ye kadar ve AO'dan A6'ya kadar olan registerler (kısaca bütün registerler) Stack Pointer'in gösterdiği adresin arkasına yerleşecekler.

Artık registerleri istediğimiz yerlere saklamayı öğrendik. Şimdi onları tekrar kullanılmak üzere okumayı görelim.

4. Kullanım Modu: MOVEM.L (SP) + ,D0-D7/A0-A6

Stack Pointer'in gösterdiği adresteki LONGWORD'ları sırası ile D0'dan D7'ye ve AO'dan A6'ya kadar olan registerlere (kısaca bütün registerlere) gönder.

Bu komut akıllıca bir kullanım sayesinde beni çok büyük dertlerden kurtardı. Ayrı ayrı iki tane programdan alınmış ve bir arada kullanılacak iki rutin düşünün. Ve programın akışı sırasında bu iki rutine tekrar tekrar erişmeniz gereksin. Bu iş kolay. Fakat iki rutin de aynı registerleri kullanıyorlarsa ve birinci döngüden sonra registerlerdeki sayılar ikinci döngü için bir anlam ifade ediyorsa program çalışmayacaktır. Şimdi MOVEM komutunun zamanı gelmiştir. Hemen rutinlerin başına ve sonuna MOVEM komutlarını ekleyerek probleminizi çözebiliriz.

Bunlara ek olarak, MOVEM komutuna her programımızda ihtiyaç duyacağız. Programlarımıza başlamadan önce MOVEM komutu yardımı ile bütün registerleri Stack Pointer'e atacak ve programlarımızdan çıkarken onları SP (Stack Pointer)'den tekrar okuyup, registerlere yazacağız.

LEA KOMUTU Orijinal adı (LOAD EFFECTIVE ADDRESS) olan bu komutun yaptığı iş, herhangi bir adres registerine bir adresi atamak.

Aslında bu komutun yaptığı işi MOVE komutu da yapıyor. Fakat LEA kadar hızlı olmuyor. LEA komutunun görevi adresleri taşımak olduğundan sadece LONGWORD olarak çalışıyor.

Örnekler; 1. Kullanım Modu : LEA $50000,A0 $50000 adresi değerini A0 adres registerine gönder.

2. Kullanım Modu : LEA (A0),A2 (A0) registerinin içeriği olan adresi, A2 adres registerine gönder. 3. Kullanım Modu : LEA 4(A0),A2 Bu örneğin yukarıdakinden değişikliği A0 adres registerinin içeriğine artı 4 eklenerek çıkan sonucun A2 adres registerine gönderilmesidir. Yani diyelim ki (A0)'da $50000 var ve yukarıdaki komut icra oldu. Sonuçta $50000'e başındaki pozitif sayı yüzünden 4 eklenir ve ortaya çıkan $50004 değeri A2 adres registerine gönderilir.

Başlangıçta MOVEA.L #$50000, A0 komutu ile LEA $50000, A0 komutu arasında hiçbir fark gözükmese de zamanla konuda ilerlediğinizde aradaki büyük farkı göreceksiniz.

Bu arada MOVE.L #$50000, A0 ile MOVEA.L #$50000, A0 arasında hiçbir fark yoktur. MOVE'dan sonraki A harfi, değerin bir adres registerine atanacağını belirler.

Aynı şekilde MOVE.L #14,D0 ile MOVE.L #14,D0 arasında da hiçbir fark yoktur. Biz bu A ve I harflerini yazmasak da Monitör programları (C MONİTÖR ve SEKA ASSEMBLER) onları bizim kullanımımıza göre düzenleyeceklerdir.

ADD KOMUTU Add komutu bir hafıza adresindeki veya bir adres veya data registerlerindeki değerlerin üzerlerine yeni bir değer eklemek için kullanılır. Bu işleme toplama adını veriyoruz. Çalışması gayet basittir. Byte, Word, Longword olarak çalışabilmektedir. Yani ADD komutunun Longword modu ile 0'dan $FFFFFFFF'e kadar olan sayıları rahatlıkla toplayabileceğiz. Kullanım modları şöyledir.

1. Kullanım Modu: ADD.L #10,D0 veya ADDI.L #10,D0

D0 data registerindeki değere 10 daha ekliyoruz. Toplama sonucu ortaya çıkan değer yine D0 registerine yazılmaktadır.

2. Kullanım Modu : ADD.L #255,A0 veya ADDA.L #255,A0

A0 adres registerindeki adresin değeri 255 artırılmış oluyor. 3. Kullanım Modu : ADD.B #$18, $50000

$50000 nolu hafıza adresindeki değeri $18 artırmış oluyoruz. Fakat $50000 adresinde $F0 değeri varsa ve $F0 + $10 işlemini BYTE olarak toplarsak sonuçta $50000'de 00 değeri alır. Çünkü toplamada bir BYTE'ın alacağı değerleri geçmiş bulunuyoruz. Bu yüzden komut sadece bir Byte'a sığabilecek kısmını $50000'e yazacak. Ve bilgisayar EXTEND ve CARRY Flagları ile bizi, toplama işleminde taşma olduğuna dair uyaracaktır.

4. Kullanım Modu : ADD.L D0,D1 Bu komut ile, D0 data registerindeki LONGWORD değeri D1 registerindeki değere eklenmesini ifade ediyoruz. Komutu aynı şekilde LONGWORD yerine

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