Picproje Elektronik Sitesi

DERLEYİCİLER => PIC Assembly => Konuyu başlatan: robikod - 31 Mart 2017, 19:22:30

Başlık: swap komutu
Gönderen: robikod - 31 Mart 2017, 19:22:30
Swap komutu yerine geçecek programı nasıl yazabiliriz ?
Başlık: Ynt: swap komutu
Gönderen: robikod - 31 Mart 2017, 20:46:22
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 ?
Başlık: Ynt: swap komutu
Gönderen: xoom - 31 Mart 2017, 21:01:47

x = (x<<4) | (x>>4) ;
Başlık: Ynt: swap komutu
Gönderen: robikod - 31 Mart 2017, 21:03:33
Alıntı yapılan: xoom - 31 Mart 2017, 21:01:47
x = (x<<4) | (x>>4) ;
Biraz açıklayabilir misiniz anlamadım
Başlık: Ynt: swap komutu
Gönderen: xoom - 31 Mart 2017, 21:20:40
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..     
Başlık: Ynt: swap komutu
Gönderen: robikod - 31 Mart 2017, 21:30:00
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
 
Başlık: Ynt: swap komutu
Gönderen: xoom - 31 Mart 2017, 21:38:41

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.
Başlık: Ynt: swap komutu
Gönderen: 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.
Başlık: Ynt: swap komutu
Gönderen: robikod - 31 Mart 2017, 21:53:21
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