Hi-tech c de carry bitini kullanarak kaydırma nasıl oluyor

Başlatan XX_CİHAN_XX, 24 Eylül 2008, 21:04:39

CLR

Alıntı yapılan: "XX_CİHAN_XX"Hocam evet bu yöntem sonuç verir ama performansı düşürür :(
Yani basit bir RLF komutu ve bunlardan bende peşi sıra olacak yani 1 değil birçok registeri farklı noktalarda bu şekilde kaydırdığım vakit verimsiz bir kod olacak.
Yani basit bir RLF işleminde Carry durumunu sorgulayıp ona göre kaydırma sonucuna ilave yapmak bana çok abes geliyor.
Bunun yerine ASM kullanarak yapmak çok daha mantıklı değil mi?

Aslında kod verimsiz olmaz, ama assembly gibi herşeye erişebileceğini düşünüyorsan yanılırsın.

Çözüm : Anladığım kadarıyla sen porttan bir bit okuyorsun ve bunu carry'ye yazıyorsun, onun yerine Carry'yi kullanmazsan sorun çözülür.
ve 16bitlik registere yazabilirsin

myreg_low : low order byte
myreg_high : high order byte

unsigned int myreg;

   if(RB0)          // portu oku (asm olarak btfss komutu)
   myreg+=1;   // D0=1 ve (asm bsf  myreg_low,0 )
   myreg<<=1; // RLF myreg_low,f 
                       // RLF myreg_high,f
Knowledge and Experience are Power

XX_CİHAN_XX

Hocam yapmaya çalıştığım şeyi doğru anladınız ancak verdiğiniz kod sanırım hatalı. myreg e değer verirseniz kaydırma işleminin sonunda myregde olması gereken değere ulaşılamıyor  :?
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

CLR

Alıntı yapılan: "XX_CİHAN_XX"Hocam yapmaya çalıştığım şeyi doğru anladınız ancak verdiğiniz kod sanırım hatalı. myreg e değer verirseniz kaydırma işleminin sonunda myregde olması gereken değere ulaşılamıyor  :?

Doğru haklısın sadece önce kaydırma sonra bit set edilecek


unsigned int myreg;

// bit default olarak 0
   myreg<<=1; // RLF myreg_low,f
                       // RLF myreg_high,f 
// bit 1 ise set et
   if(RB0)          // portu oku (asm olarak btfss komutu)
   myreg+=1;   // D0=1 ve (asm bsf  myreg_low,0 )
  
Knowledge and Experience are Power

XX_CİHAN_XX

Evet hocam haklısınız şimdi güzel oldu  :)
Bu yöntem tabiiki asm deki kadar direkt değil ama güzel.
Zaten dediğiniz gibi direk asm deki gibi olmasını beklemekte yanlış olur.
Gecenin bir yarısı uğraştığınız için ayrıca teşekkür ederim.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

CLR

Merhaba,

Rica ederim. C ile herşey yapılabiliyor bazen bir kaç assembly komutu fazladan ekliyor, Yeni işlemciler de buna gerek kalmıyor çünkü işlemci donanımı C optimizasyonuna sahip tasarlanıyor.

mesela asm'yi bir delay'de kullanıyorum gerikalan kısımlar C.
Knowledge and Experience are Power