logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[asembler] Jak "obrócić" bajt?

robiw 26 Sty 2010 13:57 1272 11
REKLAMA
  • #1 7594418
    robiw
    Poziom 26  
    Witam,
    Zna ktoś może szybki i prosty sposób by obrócić bajt bez indeksowania bitów- nic nie przychodzi mi do głowy. Czyli by Bajt.8=Bajt.1, Bajt.7=Bajt.2 itd...czyli taki obrót wokół osi symetrii ;-)... robiw


    inventco.eu - temat poprawiłem.
  • REKLAMA
  • REKLAMA
  • #3 7594621
    m.bartczak
    Poziom 16  
    Ten kod chyba nie działa dobrze...

    Przykład:

    R16 = 10110000

    R17 = 11010000

    Oczekiwane:

    R17 = 00001101

    Moja propozycja

    
    	lsl	r16
    	ror	r17
    	lsl	r16
    	ror	r17
    	lsl	r16
    	ror	r17
    	lsl	r16
    	ror	r17
    	lsl	r16
    	ror	r17
    	lsl	r16
    	ror	r17
    	lsl	r16
    	ror	r17
    	lsl	r16
    	ror	r17
    


    lub ewentualnie odpowiednik z pętlą.
  • #4 7594648
    mgyz
    Poziom 14  
    m.bartczak zwróć uwagę, że rozwinąłeś pętlę z mojego kodu :-)
  • #5 7594668
    m.bartczak
    Poziom 16  
    Tak :)

    Tylko że Twoja pętla kończy się w momencie gdy R16 zawiera 0, a to nie do końca o to chodzi chyba w tym ćwiczeniu.

    Pętla musi się wykonać zawsze 8 razy.
  • #6 7594713
    mgyz
    Poziom 14  
    yyy racja...
    przy pierwszym obiegu pętli trzeba zrobić:
    sec
    rsl R16

    zeby wsunąć 1 na najmłodszy bit R16 i wówczas pętla wykona się 8 razy
  • REKLAMA
  • #7 7594758
    rodzio
    Poziom 12  
    albo po prostu

    LICZNIK=8


    ...
    DEC LICZNIK
    BREQ albo BRNE
  • #8 7594789
    m.bartczak
    Poziom 16  
    Albo jeszcze lepiej (15 cykli bodajże):

    
    ; r16 = ABCDEFGH
    	swap	r16
    ; r16 = EFGHABCD
    	mov	r17, r16
    	andi	r17, 0xcc
    ; r17 = EF00AB00
    	lsr	r17
    	lsr	r17
    ; r17 = 00EF00AB
    	andi	r16, 0x33
    ; r16 = 00GH00CD
    	lsl	r16
    	lsl	r16
    ; r16 = GH00CD00
    	or	r16, r17
    ; r16 = GHEFCDAB
    	mov	r17, r16
    	andi	r17, 0xaa
    ; r17 = G0E0C0A0
    	lsr	r17
    ; r17 = 0G0E0C0A
    	andi	r16, 0x55
    ; r16 = 0H0F0D0B
    	lsl	r16
    ; r16 = H0F0D0B0
    	or	r16, r17
    ; r16 = HGFEDCBA
    
  • REKLAMA
  • #9 7594924
    robiw
    Poziom 26  
    Tak też myślałem, sporo taktów procka.... Właśnie pomyliłem kolejność bitów szyny danych i myślałem, że załatwię to w kilka taktów a tu brrr. Nie znalazłem niestety w AVR nic oprócz przesuwania bitów, przesuwania cyklicznego czy zamiany nibli i obawiałem się, że tak właśnie będzie...:-(. Dzięki...robiw
  • #10 7594940
    m.bartczak
    Poziom 16  
    Cóż, zawsze możesz podpiąc odpowiednio druciki z portu A do portu B i mieć to sprzętowo ;)

    Żart oczywiście, tracisz 16 linii na to. Ale zadziała.
  • #11 7595009
    Konto nie istnieje
    Poziom 1  
  • #12 7596002
    szelus
    Poziom 34  
    Jak jest dużo flash-a, to można jeszcze przejsć przez tablicę. Jak się ją wyrówna do granicy 256 bajtów, to chyba będzie ciut szybciej, niż ta rozwinięta pętla.
REKLAMA