Bu sayfadaki yazılar
Sayfanın metni
Sayfa 32
MUKAYESE (COMPARE) KOMUTLARI
Bu bölüme başlamadan önce assembler programına ilave etmeniz gerekiyor: Bunları yazdıktan sonra tekrar SAVE et. Bu satırlar P registerinin değerini bulacak ve her flag'- ın değerini yazacaktır. X, Y ve A registerlerinin her biri için toplam3 mukayese komutu vardır. X registeri için CPX (ComPare X), Y registeri için CPY ve A registeri için CMP dir.
IMMADIATE (DOLAYSIZ) ADRESLEME Bu # sembolü ile yapılan adreslemedir. A registeri için kıyas komutu 'CMP 67'. Bu A registeri ile 67 sayısını mukayese eder. Kıyas komutunın neticesi aşağıda olduğu gibidir: 1- Eğer register mukayese edilen veri (data) den küçükse Negatif (N) flag set (1) olur. 2- Eğer register ve data eşitse Zero ve Carry flaglar set (1) olacaktır. 3- Eğer register mukayese edilen datadan büyükse Carry flag set (1) olacaktır. Yukarıdaki noktalar kıyas komutları için önemlidir. İşte dolaysız adresleme kullanmaya bir örnek: Co00 LDA # $ 56 CMP # $ 70 RTS Bu programı çalıştırdıktan (execute) sonra Negatif flag'ın set (1) durumunda olduğunu göreceksin. Çünki A registeri data (70)dan daha küçük. İşte CPX kullanılan bir başka örnek: LDX # $ 67 C002 CPX # $ 67 Co04 RTS Program çalıştırıldığı zaman Carry ve Zero flag'lar set (1) olacak, çünki X registeri data (67) ya eşit. İşte CPY kullanılan bir başka örnek:- Cco00 LDY # $ 60 C002 CPY # $ 20 Co04 RTS Burada sadece Carry flag set (1) Y registeri data (20)dan büyüktür.
Dr. Ali Özçelik
ZERO PAGE ADRESLEME Bütün registerler Zero Page üzerindeki bütün bölgelerle mukayese edilebilirler. Önce bakacağımız CMP: C000 LDX #$09 STX $FB C004 LDA #$06 C006 CMP $FB C008 RTS A registeri FB bölgesindeki değerden az, dolayısıyle Negatif flag set (1) dir. İşte CPX ve CPY için örnekler: C000 LDA #$57 C002 STA $FD C004 LDX #$58 C006 CPX $FD C008 RTS
C000 LDA #$30 C002 STA $FE C004 LDY #$30 CPY $FE C008 RTS Birinci programda Carry flag set olur, çünki X registeri data ($57)'den büyüktür. İkinci programda hem Carry flag ve hem de Zero flag set olur, çünki Y registeri data ($30)'ya eşit.
ZERO PAGE INDEXLİ ADRESLEME Sadece A registeri Zero Page indexli adreslemede kıyas komutuna sahiptir. X registeri index olarak kullanılır: C000 LDX #$10 C002 LDA #$0F C004 CMP $B7,X C006 RTS Program A registerini $B7+X bölgesine mukayese eder. $B7 bölgesi reverse / non-reverse print'i kontrol eder. Eğer 01'e eşitse kompüter reverse olarak print eder. Eğer reverse print yapıyorsan ve yukarıdaki programı çalıştırıyorsan (execute) Carry ve Zero flaglar set (1) durumuna geçecektir.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 33
ABSOLUTE ADRESLEME Her 3 register de bu çeşit adreslemeyi kıyas için kullanabilir. İşte her biri için örnek: C000 LDA #$00 C002 CMP $0286 C005 RTS
Cco00 LDX # $ 00 C002 CPX $ DO15 coo5 RTS
C000 LDY #$00 CPY $0291 C005 RTS Birinci örnekte A registerini $0286 bölgesi ile mukayese ediyor. İkinci örnekte X registeri sprite enable flagın kontrol edildiği $D015 bölgesi ile mukayese ediliyor. Sonuncu programda ise Y registeri $0291 bölgesi ile mukayese ediliyor.
ABSOLUTE İNDEXLİ ADRESLEME Sadece A registeri bu tip adresleme kullanarak kıyas yapar. X registeri aşağıdaki örnekte de görüldüğü gibi index olarak kullanılır: C000 LDX #$77 C002 LDA #$64 C004 CMP $0200,X C007 RTS Yukarıdaki örnek A registerini keyboard buffer'ın ilk bölgesi ($0277) ile mukayese eder. Y registeri de index olarak kullanılabilir.
İNDEXLİ DOLAYLI ADRESLEME Bu adresleme için sadece A registeri kullanılabilir. Aynı zamanda sadece X registeri index olarak kullanılabilir. İşte X registerinin bir index olarak kullanıldığını görebileceğiniz örnek bir program: C000 LDY #$0D C002 STY $FB C004 LDY #$03 STY $FC C008 LDX #$1B C00A LDA #$20 C00C CMP ($E0,X) C00E RTS
Y registerini $0D ile yükler. C002: Y registerini FB bölgesine depolar. C004: Y registerini $03 ile yükler. Y registeri FC bölgesine depolanır. C008: X registerini $1B ile yükler. C00A: A registerini $20 ile yükler. C00C: Kompüter FB bölgesinden LOW byte ve FC bölgesinden HI byte alır ve $030D adresini oluşturur ve bu adresteki değeri A registeri ile mukayese eder. C00E: Kompüteri BASIC'e döndürür.
DOLAYLI İNDEXLİ ADRESLEME Sadece A registeri bu tip adresle mukayesede kullanılabilir. Bu defa Y registeri index olarak kullanılmıştır: C000 LDX #$00 C002 STX $FD C004 LDX #$04 C006 STX $FE C008 LDY #$09 C00A LDA #$10 C00C CMP ($FD),Y C00E RTS
C000: X registerini $00 ile yükler. C002: X registerini FD bölgesinde depolar. C004: X registerini $04 ile yükler. C006: X registeri FE bölgesinde depolanır. Y registerini $09 ile yükler. C00A: A registerini $10 ile yükler. C00C: Kompüter FD bölgesinden aldığı LOW byte ve FE bölgesinden aldığı HI byte ile $0400 adresini oluşturur. Sonra adrese Y registerinin değerini ilave eder. Neticede $0409 olur. Sonra A registeri ile $0409 bölgesindeki değer karşılaştırılır.
Bu konunun son programı idi, şimdi bir problem.
A registeri bilinmeyen bir değere sahiptir. 34 sayısı ile mukayese edildiğinde Carry flag set, 55 sayısı ile mukayese edildiğinde Negatif flag set olmaktadır. Aşağıdaki cevaplardan birini seçiniz: A. — A registerinin değeri 34'ten küçük. B. — A registerinin değeri 35-54 arası. C. — A registerinin değeri 55'ten büyük. Cevap B'dir. Eğer cevabı anlıyamadıysan son iki sayfayı yeniden okumadan gelecek bölüme geçme.