Bits schubsen

Gast #410262
Lesenswert?

Hallo,

nur mal so zum Verständnis eine Grundlagenfrage.

ldi r16,$ff
ldi r16,(1<<3)

danach siehts in r16 so aus 0b00001000, richtig?

D.h. wenn ich Bits verschiebe, wird das Register vorher auf 0 gesetzt
und wie in diesem Fall nur das eine Bit gesetzt? Ich hatte damit
gerechnet, das die Bits aus dem Register nach links "rausgeschoben"
werden.

Obige Erkentniss habe ich mit dem AVR Studio ermittelt und bin nun
etwas unsicher.

Wie würde ich den in einem Register einzelne Bits löschen oder setzen.
Müsste ich mir dazu erst den alten Wert merken und mit dem neuen
Bitmuster logisch verknüpfen?

Gruß
Martin
#410264
Lesenswert?

du verschiebst keine Bits.
Der 2. Befehl lautet immer noch ldi, Also "Load immediate".
Das Register r16 wird geladen. Womit? Mit 1<<3. Also einer
binären 1, die 2 mal nach links geschoben wird.
1<<3 ist also einfach nur eine andere Schreibweise für 0b00001000
Und damit wird das Register geladen.

> Wie würde ich den in einem Register einzelne Bits löschen oder
> setzen.

Gesetzt wird mit einem ODER. Gelöscht mit einem UND

Das 3. Bit setzen

   ori  r16, $08     ; $08 == 00001000

das 3. Bit löschen

   andi r16, $F7     ; $F7 == 11110111

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren