Mikroişlemcilerde Karşılaştırma İşlemi Nasıl Yapılır?
Assmbly komutlarımız arasında iki veriyi doğrudan karşılaştırmak üzere hazırlanmış IF benzeri bir komut yoktur. Bunun yerine karşılaştırma işlemi ÇIKARMA işlemi üzerine kurulmuştur. Peki çıkarma işleminin karşılaştırma ile ne alakası var?
İki sayı birbiriyle temel olarak üç bakımdan karşılaştırılabilir. Bunlar EŞİTLİK, BÜYÜKLÜK ve KÜÇÜKLÜK durumlarıdır.
Bunu bir örnekle açıklayalım. X ve Y adında iki sayımız olsun. Bu iki sayının karşılaştırılması üç soru üzerine kuruludur.
Soru 1: X ve Y birbirine EŞİT Mİ? (X = Y)
Soru 2: X, Y’den BÜYÜK MÜ? (X > Y)
Soru 3: X, Y’den KÜÇÜK MÜ? (X < Y)
Bu iki sayıya şimdi değer vererek çıkarma işlemine tabi tutalım:
X = 5 Y=5 için; X-Y = 5-5 = 0
Sonucun 0 çıktığı çıkarma işleminden her iki sayının birbirine EŞİT olduğu anlaşılır.
X = 6 Y=5 için; X-Y = 6-5 = +1
Sonucun + (pozitif) çıktığı çıkarma işleminden birinci sayının ikinci sayıdan BÜYÜK olduğu anlaşılır.
X = 5 Y=6 için; X-Y = 5-6 = -1
Sonucun – (negatif) çıktığı çıkarma işleminden birinci sayının ikinci sayıdan KÜÇÜK olduğu anlaşılır.
Yukarıdaki örnek çıkarma işlemlerinden KARŞILAŞTIRMA işlemlerinin temelinde ÇIKARMA işleminin olduğunu rahatça anlayabiliriz.
Mikroişlemciler açısından düşünecek olursak, çıkarma işlemlerinin sonucunda etkilenen BAYRAKLARA bakarak çıkarma ile ilgili bir kanaate varılabilir.
Çıkarma işleminin sonucunda etkilenen Zero Flag (Sıfır Bayrağı) ve Cary Flag (Elde Bayrağı) bize karşılaştırma hakkında bilgi vermektedir.
- Eğer bir işlemin sonucu 0 (sıfır) çıktıysa ZF=1 olur. Bu o iki sayının eşit olduğu anlamına gelir. Karşılaştırma için yazacağımız kodumuzda EŞİT Mİ? sorusunu soracaksak ZF’nin durumuna bakmamız gerekir.
- Karşılaştırma için bakmamız gereken bir başka bayrak ise CF’dir. Elde bayrağı çıkarma işleminin sonucu + (pozitif) ya da 0 (sıfır) ise CF=1 olur. İşlemin sonucu CF=0 olur. Yazacağımız kodumuzda BÜYÜK MÜ? ya da KÜÇÜK MÜ? sorusunu soracaksak CF’nin durumuna bakmamız gerekir.
- Cary Flag (Elde Bayrağı) STATUS Register’ının 0. Bitinde
- Zero Flag (Sıfır Bayrağı) STATUS Register’ının 2. Bitinde yer almaktadır.
Her iki Çıkarma komutunu için de EŞİTLİK, KÜÇÜKLÜK ve BÜYÜKLÜK durumları için örnek kodlar:
Döngü düzenlemek için bir sayaç değişkenini belirlenen ilk değerden son değere kadar artırarak ya da azaltarak değiştirmek ve sonunda da bitiş değeri ile sayacı karşılaştırmak gereklidir. Bunun için bir File Register’ının değerini 1 artıran ve 1 azaltan komutları da bilmek gerekir.
Bunlar INCF ve DECF komutlarıdır.
Prog8 dosyalarını buradan indirebilirsiniz.
UYGULAMA:
- Yukarıdaki Prog8’de anlatılan algoritmayı hem SUBLW için hem de SUBWF için yazın.
- Her ikisinde de çıkarma işlemine giren değerleri değiştirerek BÜYÜK, KÜÇÜK ve EŞİT durumlarında bayrakların nasıl etkilendiğini gözlemleyin.
Prog9 dosyalarını buradan indirebilirsiniz.
UYGULAMA:
- Yukarıdaki Prog9’da anlatılan algoritmayı hem SUBLW için hem de SUBWF için yazın.
- Her iki kodla da yazdığınız programları hem ARTAN hem de AZALAN döngü şeklinde yazın.
- Yazdığınız kodlardaki SAYAC başlangıç ve bitiş noktalarını farklı vererek kodları yeniden düzenleyin.
ÖDEV 1:
PIC16F84 STATUS REGİSTERİNİN TÜM BİTLERİ NE İÇİN KULLANILIR, NASIL ÇALIŞIR?
EL YAZISI İLE BİR A4 KAĞIDINA SATATUS’Ü ÇİZİN VE AÇIKLAMALARI YAZIN.
ÖDEV 2:
PORTA’NIN 1. BİTİNDE (RA1) BAĞLI OLAN BUTONA 10 KERE BASILCA PORTB’YE BAĞLI OLAN TÜM LEDLERİ YAKAN KODU KARŞILAŞTIRMA YAPARAK DÖNGÜ DÜZENLEME YÖNTEMİYLE YAZINIZ.
NOT: Daha önce DECFZ ile aynı soruyu çözmüştük. Sadece o kodu uyarlayın.
İlk yorum yapan siz olun