Manipulationen auf Bit-Ebene dienen vor allem für die Ein- und Ausgabe von Daten, der Überwachung von bestimmten Pins oder Bitfolgen. Die Rotationsbefehle können zur sehr schnellen Multiplikation oder Division mit dem Faktor 2 oder zur Serialisierung von Bytefolgen eingesetzt werden. | |||||||||||||||||||||||||||||||||||||||||||||||||||||
CLR, SETB und CPL |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
Diese Befehle wirken auf ein einzelnes Bit. Werden sie soweit möglich auf das A-Register angewendet, so werden alle Bits dieses Registers unabhängig voneinander manipuliert, als wären es einzelne Bits. CLR setzt ein Bit bzw. das A-Register auf 0, SETB setzt ein Bit auf 1 und CPL 'toggelt' den Zustand eines Bits, negiert ihn also. Die Logiktabelle für diese Operationen sieht so aus:
Verwendet werden diese Befehle beispielsweise, um einzelne Ausgänge des Controllers
gezielt zu manipulieren, ohne die anderen zu beeinflussen.
Als Beispiel dient die Erzeugung eines Rechtecksignals mit einer Frequenz von 200 Microsekunden an P1.0. Zur Berechnung der Warteschleife wird das Beispiel von DJNZ verwendet. label: cpl P1.0 ; P1.0 toggeln - dauert 1 Zyklus mov a,#98 ; 1 Maschinenzyklus warteschleife: djnz Acc,warteschleife ; 2 Zyklen 98 mal verbrauchen jmp label ; dauert 2 Zyklken zurück zum Anfang |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
ANL |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
ANL bildet das logische UND zweier Bits von [Ziel] und [Quelle]. Das Ergebnisbit ist nur dann gesetzt, wenn beide Inputbits gesetzt sind. Auch dieser Befehl wirkt auf alle Bits eines Bytes unabhängig. Werden zwei Bytes als Operanden angegeben, so wird die ANL-Operation daher jeweils zwischen den Bits 0:0, 1:1, 2:2 ... 7:7 ausgeführt.
Mit ANL lassen sich schnell einzelne Bits aus einem Byte herausmaskieren. Das ist beispielsweise notwendig, wenn bei der Datenübertragung zwischen zwei Geräten eine Prüfsumme in den unteren 3 Bit gespeichert werden soll, und die oberen 5 Bit anderweitig genutzt werden. ; der erste Operand mov a,#10101101b ; die unteren 3 Bit in A ausmaskieren anl a,#00000111b ; Ergebnis: #00000101b zurück zum Anfang |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
ORL |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
ORL bildet das logische ODER zweier Bits von [Ziel] und [Quelle]. Ist eines oder sind beide Bits gesetzt, so ist auch das Ergebnis 1. Sind beide Bits 0, so ist das Ergebnis 0.
Mit ORL können zum Beispiel bei der Datenübertragung zwei Bytes zusammengefügt werden. Um bei dem Beispiel von ANL zu bleiben: wenn die oberen 5 Bit unabhängig von den unteren 3 Bit Prüfsumme ermittelt werden, aber zusammen in einem Byte übermittelt werden sollen, muss der Sender diese zusammenfügen. mov a,#10101000b ; die Operanden mov R0,#00000101b orl a,R0 ; die Bits zusammenfügen ; Ergebnis: #10101101b zurück zum Anfang |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
XRL |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
XRL bildet ein Exclusiv-ODER zweier Bits. Das bedeutet, dass das Ergebnis der Operation nur dann 1 ist, wenn einer von beiden Input-Bits 1 ist. Sind beide Bits 0 oder 1, so ist das Ergebnis 0.
XRL kann zum Test auf Gleichheit zweier Bytes dienen: werden zwei identische Bytes mit XRL verknüpft, so ist das Ergebnis 0, anderenfalls nicht: ; Testen, ob A=126: xrl a,#126 jz WertIstGleich WertIstNichtGleich: ; A != 126 WertIstGleich: ; A == 126 zurück zum Anfang |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
RL/RR und RLC/RRC |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
Diese Befehle sind sogenannte Rotationsbefehle. Sie wirken jeweils auf das A-Register, und rotieren die Bits dieses Registers wahlweise nach links (RL, RLC) oder rechts (RR, RRC) und durch das Carry-Flag (RLC, RRC) oder nicht (RL, RR). Bei der einfachen Rotation lach links (RL) werden alle Bits um eine Stelle nach links verschoben. Das höchstwertigste Bit, das an Position 7 herausfällt, wird an Stelle 0 wieder eingefügt. Bei der Rotation durch das C-Flag (RLC) wird an Stelle 0 nicht das höchstwertigste Bit eingetragen, sondern der Inhalt des C-Flags. Das 'oben' herausfallende Bit wird in das C-Flag geschrieben. Bei der Rotation nach rechts (RR, RRC) passiert genau dasselbe mit der entgegengesetzten Richtung.
Bei einer Verschiebung aller Bits nach links verschiebt sich ein Byte um eine Bitposition. Das bedeutet eine Verschiebung um eine Zweierpotenz, also aus 20 wird 21, aus 21 wird 22 und so weiter. Daher sind diese Verschiebungen eine sehr schnelle Möglichkeit, um ein Byte mit 2 zu multiplizieren oder durch 2 zu dividieren. Dabei muss nur dafür Sorge getragen werden, dass das 'hinten' herausfallende und am 'Anfang' eingefügte Bit 0 ist, da sonst das Ergebnis verfälscht wird. ; Multipliziert den 16Bit-Wert in R1:R0 mit 2 clr c ; Das neu einzufügende Bit löschen mov a,R0 ; ersten Wert laden rlc a ; erste Multiplikation mit 2 mov R0,a ; Ergebnis sichern mov a,R1 ; zweiten Wert laden rlc a ; zweite Multiplikation, herausgefallenes ; Bit von R0 im C wird an unterster ; Position eingefügt mov R1,a ; Ergebnis sichern |