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

[Atmega8] Jak zmienić pojedynczy bit w rejestrze bez wpływu na inne?

Asmodat 09 Kwi 2012 21:42 2196 6
REKLAMA
  • #1 10776531
    Asmodat
    Poziom 10  
    Czy jest możliwa za pomocą jednej instrukcji zmiana jednego z bitów w rejestrze nie zmieniając jednocześnie innych ?

    np:
    ;R16 = 0b01010100
    sxx R16, 0
    ;R16 = 0b01010101
    cxx R16, 0
    ;R16 = 0b01010100
  • REKLAMA
  • REKLAMA
  • #3 10776614
    Asmodat
    Poziom 10  
    SBR i CBR ustawiają /czyszczą kolejne BITY, a nie bit

    np:
    ;R16 = 0b01010100
    sbr R16, 4
    ;R16 = 0b01011111

    Chodzi mi o to żeby za pomocą jednej instrukcji zmienić 1 wybrany bit.

    Dotychczas robiłem to tak:

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • REKLAMA
  • #5 10776734
    Asmodat
    Poziom 10  
    Działa, dzięki !!!

    Jednak czy mógłbym prosić jeszcze o jakieś objaśnienie tej składni, jak jest ona interpretowana ?

    dlaczego to:
    sbr R16, (0<<WybranyBit)
    to nie to samo co to:
    cbr R16, (1<<WybranyBit)

    
    Ręczny debug:
    equ. WybranyBit = 4
    ;R16 = 0b00000000
    sbr R16, (1<<WybranyBit) 
    ;R16 = 0b00010000
    sbr R16, (0<<WybranyBit) 
    ;R16 = 0b00010000
    cbr R16, (1<<WybranyBit) 
    ;R16 = 0b00000000
  • Pomocny post
    #6 10776961
    mirekk36
    Poziom 42  
    WybranyBit to po prostu najzwyklejsza maska

    np

    sbr R16, $F0

    spowoduje ci ustawienie czterech najstarszych bitów

    a

    sbr R16, $03

    spowoduje ci ustawienie 2 najmłodszych bitów

    przy czym

    sbr R16, $F0 to to samo co: sbr R16, (15<<4)

    sbr R16, $03 to to samo co: sbr R16, (3<<0)

    a

    sbr R16, (1<<6) to to samo co: sbr R16, $40
  • #7 10777145
    Asmodat
    Poziom 10  
    Wszystko jasne, temat do zamknięcia.
REKLAMA