Logische Operationen und Bitmanipulationen

  CLR, SETB und CPL   ANL   ORL   XRL   RL/RR und RLC/RRC
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:

InputErgebnis CLRErgebnis SETBErgebnis CPL
0011
1010

Verwendet werden diese Befehle beispielsweise, um einzelne Ausgänge des Controllers gezielt zu manipulieren, ohne die anderen zu beeinflussen.
Die erlaubten Operationen:

CLR [Op]
SETB [Op]
CPL [Op]
Operator
C-Flag Bit im RAM A
CLR X X X
SETB X X  
CPL X X X

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

Input1Input2Ergebnis ANL
000
010
100
111

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.

ANL [Ziel],[Quelle] Quelle
A Rn @Rn Byte im RAM #Konstante Bit im RAM
Ziel A   X X X X  
Byte im RAM X       X  
C-Flag           X

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

Input1Input2Ergebnis ORL
000
011
101
111

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.

ORL [Ziel],[Quelle] Quelle
A Rn @Rn Byte im RAM #Konstante Bit im RAM
Ziel A   X X X X  
Byte im RAM X       X  
C-Flag           X

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

Input1Input2Ergebnis ANL
000
011
101
110

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 [Ziel],[Quelle] Quelle
A Rn @Rn Byte im RAM #Konstante
Ziel A   X X X X
Byte im RAM X       X

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.

RL A
RR A
RLC A
RRC A

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

zurück zum Anfang
Seite zurück Startseite Seite vor
Erik Buchmann
EMail an: Owner@ErikBuchmann.de