Selam arkadaşlar benim bir sorum olucaktı.
Yazılım olarak asm kullanıyorum.
8 bitlik 2 adet register'ım var ,bu iki registere porttan gelen önce yüksek anlamlı olmak üzere, 16 biti yerleştirmek istiyorum.
Anladıgım kadarıyla rlf reg1,f şeklinde sola kaydıracagım ,8 bit taştıgında ise taşan deger carry bitinde olcak.Mantıgını anladım ancak 8.biti geçtikten sonra carry'de olan degeri 2.registerden nasıl devam ettirecegim,yani carry'deki degeri 2.reg. nasıl aktaracagım.
Teşekkürler
Selam,
Olayı kavramış sayılırsın.Tam olarak anlaman için yardımcı olayım.Carry biti adındanda anlaşılacağı üzere elde (taşma) bitidir.2 tane 8 bitlik registerimiz var.Bunlara REGH ve REGL diyelim.
Sola kaydırma (RLF) komutunu aşağıdaki resimlede gösterelim.
(http://hobby_elec.piclist.com/gif/pic_rlf1e.gif)
Görüldüğü üzere sola kaydırma komutu çalıştığında carry deki bit kaydırdığın registerin başına(0. bite) geçer ve 8. bit ise carry e geçer.
Sen porttan aldığın veriyi önce carry e yerleştireceksin.Şimdi sıra bu biti içeri almaya geldi.Örnek kod üzerinde anlatsam daha iyi olacak.
MOVLW .16
MOVWF SAYAC
LOAD
;PORTTAN SIRA ILE GELEN VERILERI CARRY BITINE YERLEŞTİR
RLF REGL,F
RLF REGH,F
DECFS SAYAC,F
GOTO LOAD
görüldüğü üzre once regl hemen ardından regh yı kaydırdım.kaydırmaya başlamadan once carry de porttan gelen sıradakı veri bitim var.ilk kaydırmada bu bit regl nın 0. bitine yerleşti.ve regl nın 8. biti carry e aktarıldı.Akabinden regh yi kaydırdım ve regl den taşan carry deki bit regh nin. 0. bitine girdi.Böylece ne oluyor regl den taşanlar reg h ye girerek devam ediyor.Sanırım sormak istediğin nokta burasıydı.Umarım anlatabilmişimdir.
Kolay gelsin.
1. registerden gelen carry registeri içeriği 2. registeri kaydırdığında aynen 2. registerin kayan yönünde 2. registere ilave olur
@F493
1)C içinde 2 register kullanıp kaydırma operatörleri olan >> veya << kullanırsan derleyici her kaydırma operatörlerini gördüğü zaman Carri flag'i siler. Dolayısla bit aktarımı olmaz. Sadece kaydırma kısmını asm ile yaparsan carry silinmez ve bit aktarımı olur.
2)Veya bir tane C içinde 16 bitlik register tanımlarsan bunun üzerinde shift yaparsan carry'yi derleyici silmez. İstediğin gibi shift yapabilirsin.
Kolay gelsin
Şekilde izah edildiği gibi 1. durumda registerler işlem yapılmamış hali.
2. durumda reg1 sağa kaydırılıyor. ve carry içeriğindeki bit register1 'e 7. bite geliyor. register1 deki sıfırıncı bit ise carry nin içine geçiyor.
3. aşamada register 2 sağa kaydırılıyor. böylece carry içeriği regisre2 nin 7. biti olarak geçiş yapıyor. register2 nin sıfırıncı biti de carry nin içeriği olarak yerini alıyor.
(http://img170.imageshack.us/img170/4060/adszyy4.th.jpg) (http://img170.imageshack.us/my.php?image=adszyy4.jpg)
Arkadaşlar yardımınız sayesinde hallettim ,ellerinize saglık.
Aslında benim amacım 64 bitlik bir register'a bitleri yerleştirmekti , amacım bu örnekle mantıgını kavramaktı ve testimiz başarılı oldu , sanırım bu şekilde 64 bitide alıp registerlera yerleştirebilirim.
arkaşlar 64 bit için yaptım ,simülasyonda mevcut isteyen arkadaşlara kaynak olabilir.
http://rapidshare.com/files/59467805/carrylikaydirma.rar.htmll