Bu sayfadaki yazılar
Sayfanın metni
Sayfa 51
;A0'daki değeri oku ve A0'ı 4 arttır
MOVE.L ;Aldaki degeri oku ve Ali 2 azalt MOVE.W -(A1),DO
Address Register Indirect with Displacement:
Verilen adres yazmacına istenen değer eklenir ve yeni adresteki değer okunur. Yeni adres compile-time'da hesaplanır, yani adres yazmacının değeri değişmez.
degerine 4 ekle ;adresteki degeri D0a al MOVE.L 4(A1),DO
Burada eklenen değer 16 bit işaretli bir sayıdır, yani $7FFF'den büyük olması durumunda çıkarma işlemi yapılacaktır. MOVE.W -30(A5),D0 şeklinde de kullanabilirsiniz.
Address Register Indirect with Index:
Yukarıdaki mod ile aynıdır, ancak okunacak adresi hesaplarken başka bir adres yazmacının değeri de eklenir.
MOVE.L 4(AO,A1L.L),DO
D0'ın değeri (A1,A2.L) adresinden okunan longword değer olacaktır.
Burada ilk verilen değer 8 bitlik işaretli bir sayıdır, sondaki yazmaç ise (data veya adres yazmacı olabilir) 16 veya 32 bitliktir. Aşağıdaki örnekleri inceleyin.
MOVE.L 4(A0,D1.W),DO MOVE.L — 20(A0,D2.L),D7 MOVE.W 4(AO,AL.W), A0 MOVE.B — -50(A0,A2.L),DO 8(A3,D4.L)
Absolute Short / Long:
Mutlak adres modunda verilen adresteki değer okunur. Absolute Short'ta verilen adres 16 bitlik (işaretli/signed) bir adrestir. Normalde 68000'de adresler için 32 bit kullanırız, örneğin $00752000 gibi. Ancak eğer kullanacağımız adres 16 bit ile ifade edilebiliyorsa biraz yer biraz da hız sağlamak amacıyla $00004560 yerine $4560.W kullanabiliriz.
;Short mod (hepsi aynıdır)
MOVE.L 4.W,A6 MOVE.L $4.W, A6 MOVE.L $0004.W, A6 MOVE.L $00000004.W,A6
;Long mod (hepsi aynidir) MOVE.L $4.L,A6
MOVE.L MOVE.L
$00000004.L,A6 $4,A6
Short modda kullanılan değerler signed olduklarından hafızanın ilk 32KB'lık bölümünü adreslemek için kullanılabilirler ($7FFF'e kadar), bu nedenle bu modu pek fazla kullanmayız.
Program Counter with Displacement:
Bu modda o an bulunulan adrese bir değer (16 bit signed) eklenerek elde edilen adresteki değer okunur.
MOVE.L 8(PC), DO
Aşağıdaki örnekte ilk satır <label> adresindeki değeri D0'a yükler, derlendiğinde komut 2 byte, adres 4 byte yer kaplar. Ancak ikinci satırda MOVE komutu kendi bulunduğu yerden relatif olarak label kadar ilerideki adresin değerini okur. Derlendiğinde MOVE komutu yine 2 byte ancak komut parametresi bu defa 4 yerine 2 byte olur.
MOVE.L label,DO MOVE.L label(PC),DO RTS label
DC.W $AA55,$7788
Bu mod yine biraz hız ve yer sağladığı gibi aslında daha önemli bir kullanım amacı vardır. Bu mod sayesinde Relocatable kod yazabilirsiniz. Yani hafızanın neresine konursa konsun aynı şekilde çalışabilecek, yüklendikten sonra da yeri değiştirilebilecek kodlar. Normalde AmigaDOS programlarınızı yüklerken zaten bir relocate işlemi yapar ve programınız hafızanın boş herhangi bir yerine yüklenir. Ancak yüklendikten sonra yerini değiştiremezsiniz. Eğer tüm lokal label işlemlerinizde PC relatif mod kullandıysanız programınızın yerini yüklendikten sonra da değiştirebilirsiniz. (Örneğin bir virüs yazıyorsanız bu çok kullanışlı bir özelliktir.)
NOT: Bu mod read-only'dir, yani PC relatif bir yazma işlemi yapamazsınız. Örneğin MOVE.L #0,4(PC) veya CLR.W 8(PC) gibi bir komutu derleyemezsiniz.
Program Counter with Index:
Bu mod da öncekinin aynısıdır, ek olarak bir register'ın değeri de (.W veya .L olarak) işleme katılır. Ayrıca burada verilen pozisyon öncekinden farklı olarak 16 bit değil 8 bittir.
;DOa PCtA14*$10 adresindeki MOVE.L — $10(PC,A1.L),DO
Her ne kadar tavsiye etmesem de buradaki pozisyon değerini kod içinden değiştirerek (self-modifying) bir tablo üzerinde okuma gibi işlemleri de yapabilirsiniz.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 50
Amiga Assembly kursumuzun 3. bölümünde artık yavaş yavaş görsel sonuçları olan konulara gireceğiz. Geçen sayımızda dallanma komutları ve donanım yazmaçlarını (hardware registerları) görmüştük. Amiga'nın görüntü ile ilgili konularına girmeden önce öğrenmemiz gereken son bir konu daha var:
Adresleme Modları
Önceki sayılarımızda 68000 komutları hakkında bilgi edinmiştik, bu komutların çoğu için 12 farklı adresleme modu vardır, 68020 ve üst modellerinde 6 mod daha vardır. 68000'de kod yazmanın kolaylığı bu adresleme modlarının çokluğundan gelir.
68000 Adresleme Modları (Addressing Modes)
1. Data Register Direct, Dn
2. Address Register Direct, An 3. Address Register Indirect, (An) 4. Address Register Indirect with Post-Increment, (An)+ 5. Address Register Indirect with Pre-Decrement, -(An) 6. Address Register Indirect with Displacement, d(An) 7. Address Register Indirect with Index, d(An,Rx) 8. Absolute Short, w 9. Absolute Long, l 10. Program Counter with Displacement, d(PC) 11. Program Counter with Index, d(PC,Rx)
12. #x
Burada kullanılan sembollerin anlamları aşağıdaki gibidir:
1. Dn: Data Register (n=0-7)
2. An Address Register (n - 0-7) 3. b 08-bit sabit 4. w 16-bit sabit
5. l: 32-bit sabit
6. x: 8-, 16-, 32-bit sabit
7. Rx: Index Register (Dn veya An)
Şimdi bu adresleme modlarının her birini örneklerle inceleyelim:
Data Register Direct:
CLR.W D3 SUB.L D2,D1
Address Register Direct:
Bu mod Data Register Direct ile aynı yazım şekline sahiptir, ancak adres yazmacı kullanıldığında .B (byte) eki kullanılamaz.
MOVE.L CLR.W
A0,DO A5
Address Register Indirect:
Bu mod ile bir adres yazmacının gösterdiği (point ettiği) adresteki değeri okunur.
MOVE.L
Burada dikkat edilmesi gereken en önemli nokta, .L veya .W ile yalnızca bir çift adresten okuma yapabilirsiniz. Örneğin aşağıdaki kodu çalıştırdığınızda, eğer <label> bir çift adres değilse bilgisayarınız kilitlenecektir.
LEA LABEL, A0 MOVE.B RTS LABEL:
DC.B $01,$02,$03
Bu durumu önlemek için EVEN veya ALIGN assembler direktiflerini kullanmak gerekir.
LEA LABEL, A0 MOVE.B RTS EVEN ;Gerekirse 1 byte atlayarak ;sonraki adresi cift yapar LABEL:
DC.B $01,$02,$03
Address Register Indirect with Post-Increment/Pre-Decrement:
Bu mod bir önceki ile aynıdır, ancak adresi okuma işlemini yaptıktan sonra kullanılan adres yazmacının değerini işlem boyutu kadar (.B, .W, .L için sırasıyla 1, 2, 4) arttırır/azaltır.