Manipulation von Registern
Für die Manipulation und Abfrage von Registern werden in der Regel zwei alternative Darstellungen verwendet:
- Darstellung mit Hexadezimalzahlen (0x-Präfix): Der Vorteil der Darstellung mit Hexadezimalzahlen ist die kompakte Schreibweise. Dafür muss aber erst eine Umrechnung ins Dualsystem erfolgen, bevor erkannt werden kann, welche Bits gesetzt wurden.
- Darstellung mit Dualzahlen (0b-Präfix): Der Vorteil der Darstellung mit Dualzahlen ist, dass die gesetzten Bitpositionen einfach erkannt werden können, dafür ist die Schreibweise aller 8 Bits auf Dauer umständlich.
Diese Darstellungen sind beide ideal geeignet für 8, 16, 32 Bit Register, da z.B. eine 8 Bit Binärzahl direkt mit 1 und 0 dargestellt werden kann oder kompakter mit zwei Hexadezimalziffern.
Um Register zu manipulieren, werden die bitweisen Operatoren verwendet.
Bitweise Operatoren
Mit bitweisen Operatoren werden Zahlen hinsichtlich ihrer binären Darstellung verarbeitet. Das Ergebnis ist eine Zahl, die dem neuen Bitmuster nach der Operation entspricht. Im dargestellten Beispiel wird die Zahl 6 bitweise mit der Zahl 5 verknüpft. Intern verarbeitet die CPU die Befehle auf Bitebene. Das Ergebnis ist die dezimale Zahl des neuen Binärmusters.
Bei den bitweisen Operatoren besitzt das Ergebnis eine Zahl (also nicht nur 0 und 1), die sich aus der bitweisen Kombination der Operanden ergibt!
In folgender Übersicht werden häufig benötigte Operationen dargestellt:
Beispiele:
Setzen von Bits, ohne die anderen zu verändern: ODER-Maske
Mit der bitweisen ODER Verknüpfung können einzelne Bits eines Registers auf logisch 1 gesetzt werden, ohne dass andere Bitpositionen verändert werden. Die Maske beinhaltet den Wert 1 an den Stellen, die gesetzt werden sollen, an den anderen Stellen den Wert 0.
Beispiel: Es soll im Register PORTD das vierte Bit (Bit 3) auf logisch 1 gesetzt werden, ohne die anderen Bits zu verändern.
PORTD = 0x45; // Anfangszustand
Löschen eines oder mehrerer Bits ohne die anderen zu verändern: UND-Maske
Mit der bitweisen UND Verknüpfung können einzelne Bits eines Registers auf logisch 0 gesetzt werden, ohne dass andere Bitpositionen verändert werden. Die Maske beinhaltet den Wert 0 an den Stellen, die gelöscht werden sollen, an den anderen Stellen den Wert 1.
Beispiel: Es soll im Register PORTD das dritte Bit (Bit 2) auf logisch 0 gesetzt werden, ohne die anderen zu verändern.
PORTD = 0x5D; // Anfangszustand
Abfragen, ob bestimmte Bit-Positionen gesetzt sind: UND-Maske
Mit der bitweisen UND Verknüpfung kann abgefragt werden, ob einzelne Bits gesetzt sind oder nicht. Die Maske beinhaltet den Wert 1 an den Stellen, die abgefragt werden sollen, an den anderen Stellen den Wert 0.
Beispiel: Es soll im Register PIND abgefragt werden, ob die vierte Eingangsleitung (Bit 3) HIGH (angeschlossener Taster nicht gedrückt) oder LOW (angeschlossener Taster gedrückt) ist.
Annahme: Taster gedrückt, d.h. das Bit 3 besitzt eine logische 0
Bei der if-Abfrage (im Bild links) oder der while-Schleife wird nur das Bit 3 beachtet. Die anderen Bits werden automatisch durch die UND-Verknüpfung im Ergebnis auf 0 gesetzt und haben somit keinen Einfluss darauf, ob die Bedingung erfüllt ist oder nicht:
- Im obigen Beispiel links wird der if-Zweig betreten, sobald das Bit 3 auf 0 gesetzt wird (Taster gedrückt). Wenn das Ergebnis der Prüfung von Bit 3 ungelich 0 ist (also 0x08), wird der else-Zweig betreten.
- Im obigen Beispiel rechts wird die leere while-Schleife solange ausgeführt, bis Bit 3 von PIND auf 0 gesetzt wird. Danach wird der Quellcode unterhalb der while-Schleife weiter ausgeführt. Das Programm wartet also, bis der Taster an PIND Bit 3 gedrückt wird.