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
Wenn du Bits schiebst, schiebst du Bits nach rechts raus. Dazu verwendest du die Befehl lsl, lsr, rol, ror. Mit ldi lädst du eine neue Zahl in das Register, da wird dann natürlich der vorherige Inhalt überschrieben.
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
Zweite Frage übersehen: Um einzelne Bits zu setzen, kannst du sbi (bzw. cbi zum Löschen) benutzen. Ab drei Bits lohnt sich das von dir vorgeschlagene Vorgehen mit in - andi - out bzw. in - ori - out
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.