Arkadaş C'de yazılan programı assemblyde yazmak istiyor , hazırladığı C kodunun açıklamalarını yanlarına yazıp geri yollar mısınız dememiş.
Program bir dizideki sayıları küçükten büyüğe doğru sıralamaya yarayan bir program.
Oradaki temp de sıcaklık değil , geçici anlamına gelen Temporary'nin kısaltılmışı ve bu TEMP döngü esnasında sırası düzgün olmayan 2 eleman bulunduğunda bu 2 değişkenin yerini değiştirmede kullanılıyor.
Assembly kod yazanlar bilir , bu C kodunu asm'ye çevirmek giriş seviyesi bir programlama sayılamaz , eğer bu içinde dizi işlemi içeren C örneği assembly'e çevrilmek istenirse "Dolaylı Adresleme" kullanılması gerekir aksi taktirde klasik "Direk Adresleme" kullanılarak yapılan program
Fatih54'ün CCS den otomatik olarak çevirdiği gibi çok uzun ve anlaşılmaz bir hal alır.
Bu durum soruyu soran ve asm öğrenmek isteyen
sametehm için iyice kötü bir hal alır , eğer asm öğrenmek istiyorsa asm öğrenmeye sondan başlamış olur , C'den sonra asm'ye geçtiği için hevesi kırılır , iyice lanet eder . Asm'ye bu şekilde balıklama atlanılmaz .
Ama eğer
sametehm ASM öğrenmek istemiyorsa sadece ödevini yaptırmak için buraya bu kodu yazdıysa , burası ödev yaptırma yeri değildir , şahsen ben hazırcılara yardım etmiyorum sadece tavsiye veriyorum. Copy-paste paylaştığı kodun yeni halini copy-paste olarak alıcak , o kodu çalıştırmaya çalışacak çalışmayacak , olmadı yarım yamalak hocaya vereyim dicek , eğer hoca da dikkatli ise copy-paste aldığını anlayacak ve 0 alacak ödevden , en önemlisi hiçbirşey öğrenemeyecek.
Ama madem konu bu noktaya kadar geldi
biotec'ün güzel hatırına bu kodu "Dolaylı Adresleme" kullanarak yazıvereyim , hem
sametehm eğer hala forumda ise nasiplenmiş olur hem de ASM programlamaya başlayan
Aykut54 için fikir olur.
Açıklamalarıyla beraber. Buyrun kodlar:
Kod:
;Pic16f84a kullanığımızı varsayaraktan diziyi 0x0C adresinden başlatıyorum
;Bu program ile 16f84a ile 67 adet değişen küçükten büyüğe sıralanabilir
;=======Kullanılan Yazmaçlar======
CBLOCK 0x0C ;a dizisinin eleman sayısı 67
a1 ;dizinin ilk elemanın ismi a1 adresi:0x0C
a2 ;0x0D
a3 ;0x0E
a4 ;0x0F
a5 ;0x10
; ....
; ...
a67 ;0x4E
TEMP ;0x4F
ENDC
;..................
;...............
;...................
BASLA movlw 0x0B ;dizinin ilk elemanın bir önceki adresi FSR yazmacına yüklendi
movwf FSR
UP movlw 0x4E
subwf FSR,w
btfsc STATUS,Z ;dizinin son elemanı kontrol edildi mi?
GOTO CIKIS ;dizilim tamamlandı , ÇIKIŞ
incf FSR ;dizinin 2 elemanını karşılaştıran bölüm
movf INDF,w
incf FSR
subwf INDF,w
btfss STATUS,C ;sıralama doğru mu?
GOTO UP ;evet doğru , sıradakine bak
movf INDF,w ;doğru değil yerlerini değiştir
movwf TEMP
decf FSR
movf INDF,w
incf FSR
movwf INDF
decf FSR
movf TEMP,w
movwf INDF
GOTO UP ;Başa dön
CIKIS nop ;işlem tamam , a dizisi küçükten büyüğe dizildi
;............
;..............
;...............