Amiga Dünyası sayı 27, sayfa 37

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 37

Adresleme şekillerine göre harcadığı süre: Komutun işlemesi 34 CLCK sürmektedir. Komut: TRAPV (TRAP if oVerflow) Kullanım şekilleri: TRAPV Açıklama: Overflow flag'ı 1 ise 7 numaralı trap gerçekleştirilir. Aksi halde programa devam edilir. Normal TRAP komutunda olduğu gibi PC ve SR (Program Counter ve Statü Register'ı) SSP'nin gösterdiği adrese atılır. Etkilenen flaglar: Adresleme şekillerine göre harcadığı süre: Trap olduğunda 34 CLCK, olmadığında 4 CLCK. Komut: TST (TeST) Kullanım şekilleri: TST Dy / TST (Ay) / TST (Ay)+ / TST -(Ay) / TST d(Ay) / TST d(Ay,Dy) / TST $yy.W / TST $yyyy.L Açıklama: Destination'ın içeriğini test eder ve bu içeriğe göre gerekli flag'leri yakar ya da söndürür. Test etme işlemi 0 ile karşılaştırmayla aynıdır. Etkilenen flaglar: -**00 Adresleme şekillerine göre harcadığı süre: TST Dy — 4 CLCK, 4 CLCK / TST (Ay) — 8 CLCK, 8 CLCK, 12 CLCK / TST (Ay)+ — 8 CLCK, 8 CLCK, 12 CLCK / TST -(Ay) — 10 CLCK, 10 CLCK, 14 CLCK / TST d(Ay) — 12 CLCK, 12 CLCK, 16 CLCK / TST d(Ay,Dy) — 14 CLCK, 14 CLCK, 18 CLCK / TST $yy.W — 12 CLCK, 12 CLCK, 16 CLCK / TST $yyyy.L — 16 CLCK, 16 CLCK, 20 CLCK Komut: UNLK (UNLinK) Kullanım şekilleri: UNLK Ay Açıklama: LINK komutu ile rezerve edilen bir stack bölgesinin serbest bırakılmasını sağlar. Destination adres register'ının içeriği Stack Pointer'a atılır ve Stack Pointer'ın son adresi destination adres register'ına atılarak stack pointer bir sonraki longword'ü gösterecek şekilde 4 artırılır. LINK ve UNLK komutlarıyla lokal değişkenlerinizi kendiniz için ayırdığınız bir stack'e atarak programınızın fazla karışmasını engelleyebilirsiniz. C ve BASIC'te programlar compile edilirken bu iki komut bir hayli kullanılır. Etkilenen flaglar: Adresleme şekillerine göre harcadığı süre: Sadece long-word genişliğinde çalışan bu komut 12 CLCK sürmektedir.

Evet, sonunda bu uzun komut listesi bitti. Şimdi de koşullandırma komutlarına şöyle bir göz atalım. Amiga'da koşullandırma komutları Bzz, DBzz ve Szz olmak üzere üç tanedir. Bzz ve DBzz komutları koşullu dallanma komutlarıdır. Szz ise belirtilen koşul gerçekleştiğinde reaksiyon göstererek, istediğimiz bir register içeriğini $ff ya da 0 yapar. Bu komutlarda zz yerine çeşitli koşul tanımlamaları gelebilir. Koşul tanımlamaları da 16 tanedir. Bu durumda 16*3=48 tane koşullandırma komutumuz oluyor. İsterseniz bu koşullandırma komutlarına koşul tanımlamalarıyla beraber bir göz atalım: BT, BF, BHI, BLS, BCC, BCS, BNE, BEQ, BVC, BVS, BPL, BMI, BGE, BLT, BGT, BLE, DBT, DBF, DBHI, DBLS, DBCC, DBCS, DBNE, DBEQ, DBVC, DBVS, DBPL, DBMI, DBGE, DBLT, DBGT, DBLE, ST, SF, SHI, SLS, SCC, SCS, SNE, SEQ, SVC, SVS, SPL, SMI, SGE, SLT, SGT, SLE

Şimdi de dilerseniz bu komutlarla ilgili örneklerimize bir göz gezdirelim. Bütün bu örnekler sadece komutları öğrenebilmeniz içindir. Uygulamada ufak tefek ekler gerekebilir.

1. BT komutu sonuç mantıksal olarak True (doğru) olduğunda dallanmamızı sağlar. Mantıksal doğru, 1 değeridir. Aşağıdaki örnekte test edilir. True olduğunda TRUE label'ına dallanılır. Orada da d0'ın içeriği silinmektedir. move.l #1,d0 tst.l

bt True rts True: cir.l d0

2. BF komutu ise bir önceki işlemin sonucu False (yanlış) ise, istenilen yere dallanmamızı sağlar. Mantıksal False, 0 değerine eşittir. Aşağıdaki örnekte d0 test edilir. Sonuç False ise FALSE label'ına gidilir. Orada da d0'a 1 değeri yazılmaktadır.

move.l — #0,d0 tst.l d0 bf False Tits False: move.l — #1,d0 rts

3. BHI komutu son karşılaştırma işlemine göre sonuç yüksekse dallanmayı gerçekleştirir. Aşağıdaki örnekte d0'a 50, d1'e de 75 değeri yazıldıktan sonra d0 ile d1 karşılaştırılır. d1 register'ının içeriği d0'ın içeriğinden büyükse (ki büyük) programa HIGHER label'ından itibaren devam edilir. Burada d0 ile d1 register'larının içerikleri değiştirilerek programdan OUT label'ına dallanarak çıkılır. Zira OUT label'ında bir rts komutumuz bulunmakta!

move.l — #50,d0 move.l — #75,d1 cmp.l d0,di bhi Higher Out: — Tts Higher: exg d0,di bra Out

4. BLS komutu, karşılaştırmanın sonucu eşit ya da daha küçükse dallanmamızı sağlar. Aşağıdaki örnekte d1 register'ının içeriği, d0 register'ının içeriğini geçinceye kadar test işlemi tekrarlanır. d1 register'ının içeriği 51 değerine ulaştığında (d0'ın içeriği+1) programdan çıkılır.

move.l #50,dü move.l #40,dl Test: cmp.l — bis LowSam rts LowSam:add.l #1,dl bra Test

rts 5. BCC komutu Carry flag'i sönükse dallanmamızı sağlar. Aşağıdaki örnekte ilk önce d1 register'ının 15. biti clear edilmekte ve ardından da LSL ile d0'ın içeriği bir bit sola kaydırılmakta. LSL komutunda taşan bit hem C, hem de X flag'ini etkilemekte. Fakat bizi sadece C flag'ini etkilemesi ilgilendirir. Clear edilmiş 15. bit bu durumda carry flag'ine kopyalanır. BCC komutu da carry flag'inin sönük olmasına baktığından programa direkt olarak CSET label'ından devam edilir. Burada da d1 register'ının 0. biti silinerek programdan çıkış sağlanmakta.

belr #15,d0 #1,d0 bec CSet ris CSet: #0,d1 rts

6. BCS komutu ise Carry flag'inin yanık durumda olduğu zamanlarda dallanmayı gerçekleştirir. Aşağıda d0'ın 15. biti yakılır ve LSL ile bu bitin carry bitine kopyalanması sağlanılır. Carry yanık durumda olacağından da BCS komutu programın CCLEAR label'ından devam etmemizi sağlar. Burada da d1'in 0. biti silinerek programdan çıkış sağlanmakta,

bset #15,d0 İsl.w #1,d0 bes CClear rts CClear: bset #0,d1

rts 7. BNE komutuyla son karşılaştırma işleminde sonucun belirtilen değere eşit olup olmadığı kontrol edilir. TST komutu ile beraber kullanıldığında belirtilen register'ın içeriğinin 0 olup olmadığı kontrol edilebilir ve 0'dan farklı durumlarda istediğimiz label'a dallanma gerçekleştirilir. Aşağıdaki örnekte d0'a herhangi bir değer (0'dan farklı!) yazılmakta ve TST ile bunun 0 olup olmadığı kontrol edilmekte. Yazdığımız değer (#$1234) 0'dan farklı olduğundan, programa NEQUAL label'ından devam edilir. Burada da d0 register'ının içeriği silinmektedir. Sonuçta programın başında d0 register'ına ne yazarsak yazalım, program çıkışında d0 register'ında 0 değeri bulunacaktır.

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