Amiga Dünyası sayı 19, sayfa 28

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 28

Selam!!! İşte yine bu ay sizlerle beraberiz ve her zamanki gibi, birlikte Assembler dünyasında biraz uçacağız. Bu arada dergimiz aracılığıyla bana gelen bir mektubu da cevaplamak istiyorum. Bu mektuptaki bazı soruların cevapları gerçekten de eski sayılarda kısaca açıklanmış. Mektubu yazan arkadaşın ismi Tolga ATUĞ. Bu ay size göstermek istediklerim arasında geçen ay da bahsettiğim gibi window kenarlarını bozmadan grafik gösterme var. Diğer değinmek istediğim konular da sürpriz olsun isterseniz. Ehhh, lafı fazla uzatmadan hemen mektubumuza ve ardından da açıklamalarımıza başlayalım...

1. CLR.L Dx ne demek, CLR komutu ne işe yarıyor?

C. CLR komutu, istediğiniz bir register'ın içeriğini silmenize yarar. Bu komutla kullanabileceğiniz register'lar, data register'larıdır. Ayrıca hafızada istediğiniz adresin içeriğini de silebilirsiniz. Komuta eklenebilen '.L', '.W' ve '.B' takılarıyla, silme işleminin o register'daki kaç biti etkileyeceğini belirleyebilirsiniz. Her zamanki gibi '.B' takısı en alt değerlikli 8 biti (bit 0-bit 7), '.W' alt değerlikli 16 biti (bit 0-bit 15) etkiler. '.L' takısı ise register'daki tüm longword'u (32 bit) sıfır konumuna getirir.

2. 8. sayıda yayınlanan örnek programda 2 ve 10, D3 register'ına atanıyor ve (A0)'daki 2 word'de 3 ve 5 oluyor. Yani D3=$00000A02. Peki $A002 ve $0305 nasıl karşılaştırılır?

C. Zannedersem Tolga arkadaşımız programın L1 label'ından sonraki satırları yanlış anlamış. Bu satırlarda yapılan işlemler şunlar: A0 register'ında BUFFER data tablosunun başlangıç adresi bulunmaktadır. 'MOVE.W 2(A0),D3' komutuyla tablodaki 10 değil, 5 rakamı okunur. Nedeni de tablodaki dataların word olarak hazırlanmış oluşudur. 1 word iki byte ettiğine göre, az önceki komutumuz A0 register'ının içeriğindeki adrese 2 ekleyerek tablodaki ikinci sayının adresini elde edecektir. MOVE.W komutuyla sadece bu 5 sayısı D3 register'ına atanır. Programda bir sonraki satırımız olan 'CMP.W (A0), D3' komutu, D3 register'ının içeriğiyle A0 register'ında kayıtlı olan adresin içeriğindeki sayıyı (bu durumda tablodaki ilk rakam 3) birbiriyle karşılaştırır. Bu iki rakamın durumuna göre de gerekli flag'ları açar ya da kapatır. BCC, BEQ, BNE gibi şartlı dallanma komutlarıyla da bu flag'ların konumlarına göre programımızın çeşitli yerlerine dallanabiliriz.

3. DBRA komutu ne işe yarar? C. Bu komut da tıpkı BRA ya da JMP gibi bir direkt dallanma komutudur. Yaptığı işlem ise gayet basit. Verilen Dx register'ını her seferinde bir azaltır. Bu register içeriği -1'den büyük olduğu zamanlarda register'dan sonra verilen label'a gider. Kullanılışı 'DBRA Dx,Label' şeklindedir.

4. TST komutu ne işe yarar? C. Verilen register'ın ya da adresin içeriğini kontrol ederek gerekli flag'ları açar ya da kapatır. Bu flag'lara göre de çeşitli şartlı dallanma komutlarını kullanarak değişik işlemler gerçekleştirebilirsiniz.

5. Bu problem, demin bahsettiğim örnekten ayrı. Mesela '1(A0)' denildiğinde bu ekleme sadece o satır için mi geçerli oluyor, komut uygulanıyor ve alt satırda (A0) tekrar eski halini mi alıyor?

C. Demin de bahsettiğim gibi 1(A0) şeklinde bir adresleme şekliyle A0 register'ının içeriğindeki adrese 1 ekleniyor ve bulunan adresteki data işleme tabi tutuluyor. Bu şekilde bir adreslemeyle A0 register'ının içeriği ya da bu içeriğin gösterdiği adresteki data hiçbir değişmeye uğramıyor. Bu adresleme şekline indeksli adresleme ya da ofsetli adresleme denir.

6. 'MOVEM.L D0-D7/A0-A6,-(A7)'. (A7)'deki - işareti neyi belirtiyor?

C. Dilerseniz bu satırı komple açıklayayım. A7 register'ı hemen hemen her zaman Stack Pointer görevini gerçekleştirmektedir. Stack Pointer kütük göstergeci anlamına gelmektedir ve adından da anlaşılacağı gibi kütüğün bulunduğu adresi gösterir. Kütük nedir? Kütük gerektiği zaman çeşitli sayıları depolamak için kullanabileceğimiz bir depo sayılabilir. Dilediğimiz sayıları buraya atarak saklarız. Daha sonra register içerikleriyle istediğimiz gibi oynayarak çeşitli işlemler yapabiliriz. Yine gerektiğinde de stack'e atılan tüm sayıları tekrar register'larına yerleştirebiliriz. Ayrıca stack bir işe daha yarar. BSR ya da JSR komutu kullanarak dönüşlü bir dallanma yaratmışsak, bu adresten ana programa dönüş adresi stack'in en üstüne atılır. Alt rutinde RTS komutuyla karşılaştığımızda da bu adres geri alınır ve o adre-

se dallanılır. Program satırımızda A7 dışındaki bütün register'ların içerikleri stack'e atılmakta. - (A7) adresleme yöntemiyle stack'in adre- si, buraya her değer atılışında değerin bit uzunluğuna bağlı olarak 1, 2 ya da 4 byte geriye çekilmektedir. Bu sayede stack pointer'ın sayılarımızın başlangıcını gös- termesini sağlayabiliriz. (A7)+ şeklinde bir adreslerle yardımıyla da stack'teki de- ğerleri her alışımızda stack pointer'ın, alı- nan dataların bit uzunlukları kadar ileri alınmasını sağlarız. Bunu ufak bir örnekle daha kolay anlayabiliriz : q: move.l #$fedacb93,d0

move.l #$26711356,d1 move.l a7,a0 movem.l d0-d1,-(a7) move.l a7,a1 movem.l (a7)+,d0-d1 move.l a7,a2 rts Bu örnekte, D0 ve D1 register'ları verdiğimiz sayıyı aynen tutuyor olacaklar. A0, A1 ve A2 register'larında değişik adresler görürüz. A0 register'ında stack pointer'ın ilk baştaki içeriği görülür. Sayıları attıktan sonra stack pointer 8 byte geri çekilmiştir ve A0 register'ının gösterdiği adresin 8 byte (2 longword) öncesini gösterir. A2'de ise yine A0'ın içeriğini görebiliriz. Bu da ikinci MOVEM.L komutundan sonra stack pointer'ın halidir. Şimdi stack pointer'ın gösterdiği adresten sonrasına bir göz atalım. Bunun için Seka'da q komutunu kullanarak A1'deki adresi girin. Bu adresten sonrasının içeriği şu şekildedir: Adres : fe da be 93 26 71 13 56 xx xx XX XX ....

Gördüğünüz gibi adresten sonra gelen ilk longword D0'ın, ikinci longword ise D1'in içeriğini taşımakta, xxxxxxxx ile belirtilen sayı da, hata durumlarında dallanılacak adrestir. Bu adresten sonrasına bir göz attığımızda, burada sadece bir ILLEGAL komutuna rastlıyoruz. Bu komut tüm işlemleri durdurur ve Seka'ya hata mesajı verdirerek dönmemizi sağlar. Bu komutu ilerde daha detaylı göreceğiz.

Programlarınızda A7 yerine SP'yi de kullanabilirsiniz. SP, stack pointer kelimelerinin başlangıç harfleridir. Bu sayede programlarınızı daha anlaşılır yapabilirsiniz. Seka, programınızı assemble ederken SP gördüğü yerleri A7'ye otomatik olarak dönüştürür.

7. Bir sorum da register'lardaki ilk byte veya word ile ilgili. Yani 'CMP.W $50000,D0' komutunda, D0=$1efd5432. Burada $50000 adresindeki ilk sayı ($1efd) $50002'deki sayı ($5432) ile mi karşılaştırılacak?

C. Bir register her zaman 32 bittir (1 longword=2 word=4 byte). Eğer bunun en alt byte'ını (bit 0-bit 7) kullanmak istersek, bunu komuttan sonraki takıyla gerçekleştirebiliriz. Bu takıyı '.B' yapmamız gerekmekte. Aynı şekilde en alt iki byte için (alt word) '.W' takısını kullanmamız

AMIGA ASSEMBLER

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