Ben _ schrieb:
> Verstehe ich möglicherweise nicht. Die Variable sieht aus wie ein
> einfacher 8-Bit-Wert (byte). Wenn ich den in R16 oder sonstwohin lade wo
> ich ANDI anwenden kann
Das I in ANDI ist schon ein deutlicher Hinweis darauf, dass du damit ein
Register nur mit einer Konstantem verunden kannst.
1<<i
ist aber keine Konstante, wenn i eine Variable ist.
variable &= ~ (1 << i);
wenn i gerade den Wert 0 hat, dann wird das 0-te Bit gelöscht
wenn i gerade den Wert 1 hat, dann wird das 1-te Bit gelöscht
wenn i gerade den Wert 2 hat, dann wird das 2-te Bit gelöscht
....
Preisfrage:
Welches Bit (Bitnummer) wird denn in
1 | utin8_t var;
|
2 |
|
3 | void foo( uint8_t i )
|
4 | {
|
5 | var &= ~( 1<<i );
|
6 | }
|
gelöscht? Wie soll (kann, muss) dann deiner Ansicht nach die ANDI
Instruktion dafür aussehen, die genau diesen Funktionskörper
implementiert? Der Einfachheit halber kannst du davon ausgehen, dass der
Inhalt von var schon in R16 liegt. Es geht nur um das ANDI.
Wenn du mal versuchst, genau diese Funktion in Assembler zu
programmieren, kommst du drauf, dass dir nichts anderes übrig bleibt,
als eine Schleife zu konstruieren, mit der du dir erst mal das 0-Bit an
die richtige Stelle verschiebst um so die Maske zu erzeugen, die dann
anschliessend verundet werden kann.