swap komutu

Başlatan robikod, 31 Mart 2017, 19:22:30

robikod

Swap komutu yerine geçecek programı nasıl yazabiliriz ?

robikod

Yardımcı olabilecek fikir verebilecek yok mu ? 4 kez sola kaydırma işlemi yaptığımda aslında yer değiştirebiliyorum ama nasıl art arda sola kaydırabiliriz ?

xoom


x = (x<<4) | (x>>4) ;

robikod

Alıntı yapılan: xoom - 31 Mart 2017, 21:01:47
x = (x<<4) | (x>>4) ;

Biraz açıklayabilir misiniz anlamadım

xoom

#4
Alıntı yapılan: robikod - 31 Mart 2017, 21:03:33
Biraz açıklayabilir misiniz anlamadım
x değişkenini 4 bit sola ve 4 bit sağ kaydırıp toplarsanız swap() yapmış olursunuz..yani nibble'lar yer değiştirir.

x= 1000 0110 olsun..

4 bit sola kaydırırsanız =    0110 0000
4 bit sağa kaydırırsanız =   0000 1000 olur..

Toplarsanız
x=  0110 1000 olur..     

robikod

Alıntı yapılan: xoom - 31 Mart 2017, 21:20:40
x değişkenini 4 bit sola ve 4 bit sağ kaydırıp toplarsanız swap() yapmış olursunuz..yani nibble'lar yer değiştirir.

x= 1000 0110 olsun..

4 bit sola kaydırırsanız =    0110 0000
4 bit sağa kaydırırsanız =   0000 1000 olur..

Toplarsanız
x=  0110 1000 olur..   

Şu şekilde yaptığımda olmaz mı peki ?

LIST P=16F877A
INCLUDE "P16F877A.INC"
    SAYAC EQU h'21'
    ORG 0x00
    CLRF PORTC
    BSF STATUS,5;Bank 1 e geç
    BCF STATUS,0; Carry Flag temizlendi
    CLRF TRISC; port c çıkış olarak ayarlandı.
    BCF STATUS,5;bank 0 a geç
    MOVLW 0xFF;
    MOVWF PORTB; giriş olarak ayarlandı
    MOVLW 0x04
    MOVWF SAYAC
SOLA
    ;sola kaydırmayı görmek istemediğimiz için gecikme vermedik
    RLF PORTB,F; Port b deki veriyi sola kaydır
    DECFSZ SAYAC,F; sayaç sıfır mı ? 
GOTO SOLA ; değişse sayaç sıfır olana kadar dönsün    
END
 

xoom


Alıntı yapılan: robikod - 31 Mart 2017, 21:30:00
Şu şekilde yaptığımda olmaz mı peki ?

LIST P=16F877A
INCLUDE "P16F877A.INC"
    SAYAC EQU h'21'
    ORG 0x00
    CLRF PORTC
    BSF STATUS,5;Bank 1 e geç
    BCF STATUS,0; Carry Flag temizlendi
    CLRF TRISC; port c çıkış olarak ayarlandı.
    BCF STATUS,5;bank 0 a geç
    MOVLW 0xFF;
    MOVWF PORTB; giriş olarak ayarlandı
    MOVLW 0x04
    MOVWF SAYAC
SOLA
    ;sola kaydırmayı görmek istemediğimiz için gecikme vermedik
    RLF PORTB,F; Port b deki veriyi sola kaydır
    DECFSZ SAYAC,F; sayaç sıfır mı ? 
GOTO SOLA ; değişse sayaç sıfır olana kadar dönsün    
END
 

Asm bilmiyorum maalesef.

mir_as82

Hocam sorunun tam mahiyetini okumadım ama iki değişkeni swap yapmanın en iyi yolu ikisini XOR yapmaktır. Başka yerlerde işine yarayabilir.

robikod

Alıntı yapılan: mir_as82 - 31 Mart 2017, 21:41:00
Hocam sorunun tam mahiyetini okumadım ama iki değişkeni swap yapmanın en iyi yolu ikisini XOR yapmaktır. Başka yerlerde işine yarayabilir.
Swap komutunun algoritmasını çözmeye ve kendim yazmaya çalışıyorum asembly ile