Assemly'de program Yardımı.

Başlatan 94220039, 04 Kasım 2008, 18:14:33

94220039

Pic16f873A'nın Hafızasında, 0x20'den başlayıp ard arda ve iki byte'tan oluşan toplamda 10 ( Daha az veya daha fazla da olabilir.) sayı vardır. Bu 10 sayıyı küçükten büyüğe doğru sıralayarak 0x50'den itibaren sıralı şekilde yazan bir algoritmayı assembly dilinde yazabilir misiniz?
Bu durumda 0x10'dan itibaren sayılar karışık, 0x50'den sonrakiler ise sıralı olmuş olacak.

Teşekkürler.

sigmoid


Tagli

İtiraf etmeliyim ki şimdi kodu yazmaya üşeniyorum ama sözel olarak nasıl yapılacağını anlatabilirim:

1. Orijinal verinin bozulmasını istemediğin için söz konusu 20 byte'lık veriyi bahsettiğin hedef bölgeye kopyala. Bunu FSR ve INDF (dolaylı erişim) kullanarak kolaylıkla yapabilirsin.

2. Sıralama için pek çok algoritma var. Bunlar genelde O(n^2) ve O(n*log(n)) olmak üzere ikiye ayrılırlar. İkinci türdekiler haliyle daha hızlı çalışır ama daha karışık bir kod gerektirirler (internetten bir araştır). Verinin azlığı sebebiyle O(n^2)'li bir sıralama tekniği kullanmak daha rahat olacaktır. Veriyi kopyaladığın hedef bölgede ilk veriyi al ve bunu geriye kalan 9 veriyle sırayla karşılaştır. Eğer ilk veri karşılaştırdığın veriden büyükse bunların yerlerini değiştir. İlk geçişten sonra en küçük değer 1. konuma yerleşmiş olacak. Daha sonra 2. veriyi alıp geriye kalan 8 veriyle karşılaştıracaksın ve bu şekilde sonuna kadar devam ettiğinde sıralama tamamlanmış olacak.

3. Peki karşılaştırmayı nasıl yapacağız? Bence öncelikle büyük byte'lara bakarak karşılaştırma yap. Büyük byte'lar eşitse küçüklere bakarsın. 2 byte'lık verileri doğrudan birbirinden çıkararak da hangisinin büyük olduğunu belirleyebilirsin ama bu işlemler sırasında C'yi (Cary Bit) etkin bir şekilde kullanman gerekecek (bu konuda pek yardımcı olamıyorum çünkü çıkarma işlemlerinde C'nin nasıl çalıştığından emin değilim. Ama şunu biliyorum ki çıkarma işleminin sonucu negatife düşerse C = 0 oluyor).
Gökçe Tağlıoğlu