Dieser Teil des Assemblerkurses soll Ihnen ein paar Gruppen des Befehlssatzes des 68000 mit einigen Anwendungen zeigen.
In unserem letzten Programm (Ausgabe 1/86), haben Sie ein Beispiel für die Anwendung der Arithmetik- und Programmsteuerbefehle gesehen. Außerdem konnte man die Umsetzung eines Algorithmus am Beispiel des Hornerschemas sehen.
Als Übersicht, gebe ich Ihnen an dieser Stelle, die Bezeichnungen der Gruppen, die in diesem Teil des Kurses besprochen werden.
Die Gruppe der arithmetischen Befehle umfaßt außer den vier Grundrechenarten, die Negation und die vorzeichenrichtige Erweiterung, die virtuelle Substraktion (Vergleich). Hier nun die Tabelle der Befehle.
ADD binäre Addition
CLR löschen eines Operanden
CMP vergleichen zweier Operanden
DIV Division
EXT vorzeichenrichtige Erweiterung
MUL Multiplikation
NEG Zweierkomplement
SUB binäre Subtraktion
TST testen gegen Null
Dieser Befehl existiert in vier Versionen. Die Unterscheidung wird durch das Anhängen eines Buchstabens kenntlich gemacht. Das hatten Sie ja schon bei dem MOVE Befehl kennengelernt. Bei dem ADD-Befehl gibt es aber noch die Variante ADDX. Er hat die Funktion wie der ADC-Befehl beim 6502 Prozessor. Das X-Flag (Extended) wird bei bestimmten Befehlen genauso gesetzt, wie das C-Flag (Carry). Andere Befehle beeinflussen jedoch nur das C-Flag, so daß es möglich ist, daß X-Flag über einige Operationen aufzuheben.
Formen des ADD Befehls
ADD normale Addition
ADDA auf Adressregister
ADDI mit Konstante
ADDQ addiere schnell
ADDX addiere mit X-Flag
Beispiel:
ZAHL1 EQU 17
ZAHL2 EQU $0D
MOVEI.B #ZAHL1,D1
MOVEI.B #ZAHL2,D2
ADD.B D2.D1
MOVEI.B #ZAHL1,D1
ADDI.B #Zahl2,D1
MOVEA.L (SP)+,A3
ADDA.L (SP)+,A3
ADD.L D1.D3
ADDX.L D2,D4
In diesen Beispielen sieht man den Umgang mit dem ADD-Befehl. Als erstes, wird den „Variablen“ ZAHLl und ZAHL2 mit der EQU-Anweisung (Equal = Gleich) die Werte 17 und $0D zugewiesen. Manche Assembler erlauben auch ein „ = “ Zeichen an dieser Stelle. Da der ADD-Befehl immer ein Datenregister als Quelle oder Ziel haben muß, speichern wir die Werte in Datenregistern. Die Operation, die bei dieser Art von Befehlen ausgeführt wird, ist immer QUELLE Operation ZIEL nach ZIEL. Somit erscheint als Ergebnis im Datenregister Dl der Wert 30 bzw. $1E. Die Flags werden entsprechend dem Ergebnis gesetzt (Alle auf NULL).
Mit dem nächsten Beispiel sparen wir uns einen Befehl und ein Datenregister. Am Ergebnis ändert sich jedoch nichts.
Als nächstes werden zwei Adressen vom Stack miteinander addiert, deren Summe sich im Adressregister A3 befindet. Die Flags werden von dieser Operation nicht berührt. Dies bedeutet, daß ein eventuell entstehender Überlauf nicht erkannt wird.
Das letzte Beispiel zeigt eine 64 Bit Addition, wobei die erste Zahl mit ihrer Bitfolge in D2,D1 steht, und die zweite Zahl in D4,D3. Als erstes werden die beiden niederwertigen Langworte addiert, und danach die zwei höherwertigen Langworte, wobei der ADDX-Befehl einen eventuellen Überlauf mit berücksichtigt. Das Ergebnis steht dann in den Registern D4,D3. Ist bei der zweiten Addition ein Überlauf aufgetreten, so ist dies wieder durch das X-Flag vermerkt.
Ganz analog zu der Addition verläuft die Subtraktion, wenn man beachtet, daß das X-Flag bei der Subtraktion eine Entlehnung (Borgen) bedeutet. Mit em ADDX und SUBX werden folgende Operationen ausgeführt:
ADD
Quelle + Ziel + X Flag = Ziel
SUB
Quelle-Ziel-X Flag=Ziel
Beim SUBX-Befehl hingegen, wird das X- Flag mit abgezogen, wenn es gesetzt ist.
Will man etwas über den Zustand eines Registers oder einer Speicherstelle bezüglich einer weiteren Größe erfahren, so bietet sich der CMP-Befehl (compare = vergleichen) an. Dieser Befehl bewirkt eine virtuelle Subtraktion. Das bedeutet, er subtrahiert die eine von der anderen Größe und setzt entsprechend dem Ergebnis die Flags. Das Ergebnis wird allerdings nicht, wie beim SUB-Befehl, an das angegebene Ziel gespeichert.
Auch hier werden weitere Buchstaben angehängt, die die Anwendung deutlicher machen sollen. Bei den meisten Assemblern ist die Schreibweise redundant, das heißt, der Assembler erkennt sowohl
CMP (A1)+,(A2)+
als auch
CMPM.W (A1)+,(A2)+
als equivalente Schreibweise an. Ebenso wie der Assembler als Standardverarbeitung Wortverarbeitung wählt. Zugelassen als Schreibweisen sind:
CMP normaler Vergleich
CMPA auf Adressregister
CMPI mit Konstante
CMPM im Speicher
Beispiele:
CMPI.B #65,D3
BEQ GEFUNDEN
MOVEA.L #BLOCK1, A1
MOVEA.L #BLOCK2,A2
MOVEI.L #ANZAHL-1,D1
LOOP CMPM.B (A1)+,(A2) + BNE UNGLEICH DBRA D1,LOOP
Da der CMP-Befehl alle Flags - außer dem X-Flag - beeinflußt, wird er fast ausschließlich mit einer bedingten Verzweigung benutzt. Das erste Beispiel verzweigt dann, wenn im ersten Byte von D3 dezimal 65 steht. Im zweiten Beispiel werden erst einmal die Anfangsadressen von zwei Blöcken festgelegt. Danach benötigt man noch die Länge der Blöcke minus eins, wegen der Funktion des DBcc-Befehls. Dann werden die Blöcke solange miteinander verglichen, bis die Anzahl (D1) gleich -1 ist, oder bis ein Fehler (Ungleichheit) festgestellt worden ist. Die Adressen der „Ungleichheit“ ist dann um eins kleiner als A1 und A2.
Dies ist ein recht einfacher Befehl, da er nur den Zieloperaden besitzt. Den Vorteil, den der CLR-Befehl hat, ist seine Geschwindigkeit gegenüber vergleichbaren Konstruktionen. Mit ihm kann man recht einfach so ziemlich alles löschen (Null setzen).
Beispiel:
CLR.L D0
CLR.W $85000
CLR.L (A3)
Dieser Befehl wird benutzt um Datenregister vorzeichenrichtig zu erweitern. Dies ist manchmal nötig, wenn z. B. ein Datenregister nur ein Byte oder Wort als Adresse beinhaltet, aber als Indexregister Wort- oder Langwortlänge haben muß.
Als Verarbeitung ist nur Wort und Langwort zugelassen. Ist Wortverarbeitung gewählt, so wird ein Byte vorzeichenrichtig auf Wort erweitert. Ebenso verhält es sich mit Wort auf Langwort. Damit kann man auch durch zweimaliges Anwenden von EXT auf das Datenregister, von Byte auf Langwort erweitern. Erweitert wird, indem das höchstwertigste Bit (Bit 7 oder 15) in die restlichen Stellen (Bit 8-15 oder Bit 16-31) kopiert wird.
Beispiel:
EXT.L D0
vorher nachher
D0 XXXX7FD3 00007FD3
D0 XXXX8FD3 11118FD3
EXT.W D4
vorher nachher
D4 12435687 1243FF87
D4 12345678 12340078
Anhand dieser Beispiele können Sie noch einmal die Wirkungsweise von Wort- und Langwortverarbeitung sehen. Die Grenze, an der sich entscheidet, ob mit Eins oder Null erweitert wird, ist die Sieben. Zahlen, die an der entsprechenden Stelle größer sieben sind, werden mit eins erweitert.
Die Negation (Zweierkomplement) dient zum Vorzeichenwechsel von Binärzahlen. Dies erreicht der Befehl durch eine Subtraktion, indem er die Zahl von Null abzieht. Die Flags werden bei dieser Operation entsprechend dem Ergebnis gesetzt.
Um Zahlen, die größer als 32 Bit lang sind, benötigt man den NEGX-Befehl, da dann die Entlehnung der Subtraktion mit berücksichtigt wird. In dem Beispiel sieht man die Wirkung des X-Flags auf die Negation. Das X-Flag wird einfach ebenfalls von Null abgezogen.
Beispiel:
NEG.W DO
vorher nachher
DO XXXX4321 XXXXBCDF
NEGX.W (A3)
vorher nachher
A3 00006000 00006000
X=0
S6000 1AC2 E53E
X=1
S6000 1AC2 E53D
Eine der Stärken des 680OC ist die Multiplikation und Division. Diese beiden Befehle erlauben die Verarbeitung von vorzeichenbehafteten (signed) und vorzeichenlosen (unsigned) Zahlen. Die Schreibweisen dafür sind MULS und MULU. Die Operandengröße ist auf 16 Bit festgelegt. Als Ergebnis erscheint eine 32 Bit Zahl. Die Flags zeigen nach der Operation an, ob das Ergebnis negativ oder null ist.
Beispiel:
MULI #10,D3
vorher nachher
D3 XXXX2525 00074040
MULS (A3),D2
vorher nachher
A3 00001450 00001450
D2 XXXX2837 FFFFE7D9
$1450 FFFF FFFF
Im ersten Teil erfolgt eine vorzeichenlose Multiplikation mit einer Konstanten. Da diese im dezimalen Zahlensystem angegeben ist, findet man diese auf den ersten Blick im Ergebnis nicht wieder. Das nächste Beispiel ist eine vorzeichenbehaftete Multiplikation mit der Adressierung Adressregister indirekt (ARI). Das Adressregister zeigt auf die Adresse des Multiplikanten. Der Multiplikant hat den Wert -1, da er vorzeichenbehaftet ist. Dies entspricht einer Negation.
Auch hier existieren die zwei Versionen vorzeichenlos und -behaftet. Die Division entspricht dem MOD-Befehl in Pascal. Es ist eine ganzzahlige Division mit Rest. Die Operation, die der Befehl ausführt, ist eine Division einer 32 Bit Zahl durch eine 16 Bit Zahl. Das Ergebnis im Datenregister besteht aus 16 Bit (0—15) Divisor und dem Rest (16-31). Bei der Division können zwei außergewöhnliche Fälle auftre-ten. Erstens, es wird versucht durch Null zu teilen, dann wird sofort in eine Exception verzweigt. Zweitens, der Quotient würde größer als 16 Bit werden, dann wird die Operation nicht ausgeführt. Der Divisor und der Dividend bleiben unverändert. Die fehlerhafte Operation wird im V-Flag (Overflow) kenntlich gemacht.
Beispiel:
DIVU #3,03
vorher nachher
D3 0000000E 00020004
Anhand des Beispiels kann man die ganzzahlige Division erkennen. In D3 steht $0E. Dies entspricht Dezimal 14. Teilt man die Zahl durch 3, so ergibt dies vier Rest zwei.
Als letzten Befehl dieser Gruppe haben wir den TST-Befehl.
Dieser Befehl dient zum Prüfen eines Operanden. Der Zieloperand wird mit null verglichen, und danach werden die Flags entsprechend gesetzt. Durch diesen Test kann man eine Aussage bezüglich null machen. Die Wirkungsweise entspricht dem CMPI #0, wobei aber der TST-Befehl schneller ist.
Nun haben wir die Gruppe der arithmetischen Befehle geschafft. Hier ist jetzt die Tabelle mit den Adressierungsarten und den Flags.
In der letzten Ausgabe ist eine Kleinigkeit verloren gegangen. Diese Kleinigkeit ist der Umgang mit der Tabelle. In der Tabelle befindet sich der Syntax nach dem Motorola Standard. Diese Schreibweise ist eine Art „Norm“, der von den meisten Assemblern verstanden wird. In der Beschreibung der Adressierungsarten bedeutet der Schrägstrich / „ohne, außer“. Z. B. bedeutet Alle/An/PCR, daß alle Adressierungsarten, außer Adressregister direkt und Programmzähler relativ zugelassen sind. Ein Komma hingegen bedeutet „und“.
Syntax | Flags XNZVC | .X | Quelle | Ziel |
---|---|---|---|---|
ADD.x (ea),Dn | ***** | B,W,L | Alle | Dn |
ADD.x Dn,(ea) | ***** | B,W,L | Dn | Alle/An/PCR |
ADDA.x (ea),An | ----- | W,L | Alle | An |
ADDI.x #Konst,(ea) | ***** | B,W,L | # | Alle/An/PCR |
ADDQ.x #Konst,(ea) | ***** | B,W,L | # | Alle/PCR |
ADDX.x Dy, Dx | ***** | B,W,L | Dn | Dn |
ADDX.x -(Ax),-(Ay) | ***** | B,W,L -(An) | -(An) | |
CLR.x (ea) | XOOOO | B,W,L | Alle/An/PCR | |
CMP.x (ea),Dn | X**** | B,W,L | Alle | Dn |
CMPA.x (ea),An | X**** | W,L | Alle | An |
CMPI.X #Konst,(ea) | X**** | B,W,L # | Alle/An/PCR | |
CMPM.x (Ay)+,(Ax)+ | X**** | B,W,L (An) + | (An) + | |
DIV (ea),Dn | X***O | Alle/An | Dn | |
EXT.x Dn | X**OO | W,L | Dn | |
MUL (ea),Dn | X***O | Alle/Dn | Dn | |
NEG.x (ea) | ***** | B,W,L | Alle/An/PCR | |
NEGX.x (ea) | ***** | B,W,L | Alle/An/PCR | |
TST.x (ea) | ***OO | B,W,L | Alle/An/PCR |
Bei der Schreibweise der erlaubten Adressierungsarten bedeutet:
ARI alle Adressregister indirekt
abs Absolut kurz und lang
PCR alle Programmcounter relativ
SR Statusregister
CCR Condition Code Register
USP User Stack Pointer
Um alle Adressierungsarten zu ermitteln, kann man jede Quelle mit jedem Ziel verknüpfen.
Der SUB-Befehl hat die gleichen Adressierungsarten wie der ADD-Befehl.
Die nächste Gruppe könnte man auch zu den arithmetischen Befehlen zählen. Da mit ihnen aber keine Binärzahlen bearbeitet werden, hat man sie in eine eigene Gruppe zusammengefaßt.
BCD bedeutet Binary Coded Dezimal. Dabei wird jede Ziffer Dual, mit der Wertigkeit 8-4-2-1, kodiert. Diese Darstellung der Zahlen findet seine Anwendung hauptsächlich in der Speicherung und Verarbeitung von Gleitkommazahlen.
Beispiel:
2 5
%0010 0101
Der Aufbau von Gleitkommazahlen
Es gibt eine ganze Reihe Darstellungsmöglichkeiten der Gleitkommazahlen.
Ich will Ihnen hier aber nur eine vorstellen. Eine Gleitkommazahl besteht aus einem Exponenten und einer Mantisse, (z. B. 1.5E3 = 1500), wobei E (Exponent) gleichbedeutend mit „zehn hoch“ ist. Außerdem werden noch zwei Vorzeichen benötigt, und zwar für Exponent und Mantisse. Als einfachste Lösung könnte man den Exponent als Zahl im Zweierkomplement betrachten, und ein Extrabit für das Vorzeichen der Mantisse reservieren.
Da die Rechengenauigkeit von der Mantisse abhängt, speichert man diese ab der ersten von Null verschiedenen Stelle ab. Den Exponenten muß man dann entsprechend der Anzahl, um die man das Komma verschoben hat, angleichen.
15.345E4 = 1.5345E5
oder
15.345E4 = 0.15345E6
Diese Darstellung nennt man die Normalform, wobei entweder die eine oder andere Darstellung verwendet wird. Benutzt man die zweite Normalform, so wird man die Null nicht mit abspeichern, sondern wie gesagt, die erste von Null verschiedene. So sieht nun das Ergebnis der Zahl 1.5E3 im Speicher aus, wenn der Exponent 7-Bit, das Vorzeichen 1-Bit und die Mantisse 4-Byte (8 Stellen Rechengenauigkeit) hat:
%0000011 1 0001 0101 0000 0000
Exponent VZ Mantisse
Nun wieder zurück zu den BCD-Befehlen. Diese Gruppe besteht aus den drei Befehlen:
ABCD Addition
NBCD Negation
SBCD Subtraktion
Bei dem Umgang mit diesen Befehlen sollte man folgendes berücksichtigen. Die Verarbeitung erfolgt nur mit Byteverarbeitung, also zwei BCD-Zahlen (= gepackte BCD-Zahlen). Es wird stets das X-Flag mitverarbeitet, und es sollte darauf geachtet werden, daß nur BCD-Zahlen mit dieser Gruppe verarbeitet werden. Eine weitere Besonderheit ist das Z-Bit (Zero), da es nur gelöscht wird, wenn das Ergebnis ungleich null ist. Dies bedeutet, daß man das Z-Flag vor der Operation auf eins setzen muß! Eine BCD-Zahl besteht aus vier Bits, wobei aber nur die Zahlen von 0 bis 9 Dual kodiert werden. Die restlichen Kombinationen werden nicht benötigt. Man nennt sie Pseudotetraden.
Beispiel
MOVE.B #%01000101,D1 ;45
MOVE.B #%00110110,D2 ;36
ABCD D2,D1
D1 = %10000001 (81)
Die Addition erfolgt zuerst mit den niederwertigsten vier Bits. Dies ergibt 5 + 6 gleich 11. Da aber bei 10 schon ein Übertrag stattfindet, bleibt eins übrig. Bei der Addition der nächsten BCD-Zahl wird dieser Zwischenübertrag berücksichtigt. Somit ergibt die nächste Teilrechnung: 4+3 + 1 gleich 8. Da sich hier kein Übertrag ergab, wird das C- und X-Flag gelöscht. Das Z-Flag wird nur dann gelöscht, wenn es gesetzt war.
Ebenso wie beim ABCD-Befehl gelten hier die Besonderheiten in Bezug auf die Verarbeitung und der Flags. Nur bedeutet ein gesetztes X-Flag kein Übertrag, sondern ein Borgen. Das hatten wir ja schon beim SUB-Befehl.
Hier ist ein Beispiel für die Verarbeitung von mehr als zwei BCD-Zahlen. Da dies einfacher im Speicher als in den Registern zu lösen ist, nehmen wir einmal an, sie stünden an den entsprechenden Adressen. Als erstes werden zwei Adressregister mit der Adresse des Zahlenendes plus eins geladen, danach löschen wir das X-Flag und setzen das Z-Bit im CCR. Dadurch wird ein vorhandener Übertrag nicht mit subtrahiert und die Null als Ergebnis abfragbar. Nach der Operation befindet sich an der Speicherstelle $1000 das Ergebnis. Außerdem ist das X-Flag gesetzt worden, was bedeutet, daß ein Borgen stattgefunden hat. Dies wiederum bedeutet, das die Zahl negativ ist. Nun gibt es aber keine negativen BCD-Zahlen. Das endgültige Ergebnis wäre somit um diesen Betrag kleiner als die größte mit sechs Ziffern nicht mehr darstellbare Zahl. Subtrahieren sie von dem Ergebnis einfach 1000 000 mit dem Taschenrechner, und sie erhalten das gleiche Ergebnis, als wenn sie es nur mit dem Taschenrechner gerechnet hätten.
Beispiel:
Zahl1: 123456
Zahl2:835933
Im Speicher:
1000 12
1001 34
1002 56
2000 83
2001 59
2002 33
MOVEA #$1003,A1
MOVEA #$2003,A2
MOVE #4,CCR
SBCD -(A2),-(A1)
SBCD -(A2),-(A1)
SBCD -(A2),-(A1)
Nach der Operation
1000 28
1001 75
1002 23
Mit diesem Befehl können Sie das Neuner- bzw. Zehnerkomplement bilden. Ist das X-Flag vor der Operation gesetzt, so wird das Neunerkomplement erzeugt. Auch hier gelten wieder die Besonderheiten der BCD-Befehle.
Mit diesem Befehl kann man negative Zahlen in BCD-Darstellung erzeugen. Wendet man dies auf das Ergebnis des SBCB-Beispiels an, so nimmt das Zehnerkomplement, da die Zahl negiert werden soll.
Beispiel:
MOVEA #51003,A1
MOVE #4,CCR
NBCD -(A1)
NBCD -(A1)
NBCD -(A1)
1000 71
1001 24
1002 77
Da an der Zahl nicht zu erkennen ist, ob es sich um eine negative Zahl handelt, sollte man dies noch irgendwo vermerken.
Mit dieser Gruppe von Befehlen können Sie logische Verknüpfungen bewerkstelligen; sei es, daß Sie diese nur zum Setzen oder Ausblenden von Bits benutzen oder um Boolsche Ergebnisse berechnen zu wollen. Zu den Bool-schen Operationen gehören:
Mit dem AND-Befehl kann man zwei Operanden miteinander „verunden“. Dieses Verunden findet bitweise statt. Die Flags werden nach der Operation dem Ergebnis entsprechend gesetzt oder gelöscht. Das bitweise verunden stellt man mit einer Wahrheitstabelle dar. Eines der wichtigsten Befehle ist das verunden einer Konstanten mit dem CCR, bzw. dem SR. Bei der BCD-Subtraktion hatten wir den Befehl MOVE #4,CCR. Dadurch wurden alle Flags gelöscht und das Z-Flag gesetzt. Will man aber nur ein oder mehrere Flags gezielt löschen und den Rest unbeeinflußt lassen, so kann man dies mit der AND-Verknüpfung machen.
Syntax | Flags XNZVC | .X | Quelle | Ziel |
---|---|---|---|---|
ABCD | Dy,Dx | UU* | Dn | |
ABCD | -(Ay),-(Ax) | UU* | -(An) | |
SBCD | Dy,Dx | UU* | Dn | |
SBCD | -(Ay),-(Ax) | UU* | -(An) | |
NBCD | (ea) | UU* | ||
AND.x | (ea),Dn | -**OO | B,W,L | Alle/An |
AND.x | Dn,(ea) | -**OO | B,W,L | Dn |
ANDI.x | #Kons, (ea) | -**OO | B, W,L | # |
NOT.x | (ea) | -**OO | B,W, L |
Wahrheitstabelle
B A Q
0 0 0
0 1 0
1 0 0
1 1 1
Formen von AND
AND
Zwei Operanden
ANDI
Konstante mit Operand
ANDI to CCR
Konstante mit CCR
ANDI to SR
Konstante mit SR (PRIV)
Beispiel:
D1 %01100101
ANDI.B #%11001001,D1
D1 = %01000001
Immer nur dann, wenn zwei Einsen verundet werden, erscheint eine Eins im Ergebnis. Mit dem AND-Befehl können Sie bestimmte Bits ausblenden (löschen) oder andere Bits abfragen. Alle Operationen, die das oberste Byte des SR verändern können, sind Privilegierte Befehle (Priv), die im Usermode nicht benutzt werden dürfen.
Ebenso wie mit dem AND-Befehl funktioniert dies mit allen anderen logischen Operationen. Das OR bildet das Gegenstück zum AND. Mit ihm werden bestimmte Bits gesetzt, wobei die restlichen Bits erhalten bleiben. Der OR-Befehl hat die gleichen Formen, wie der AND-Befehl.
Wahrheitstabelle
B A Q
0 0 0
0 1 1
1 0 1
1 1 1
Beispiel:
D1 = %01100101
ORI.B #%11001001,D1
D1 = %11101101
Das Exclusiv Oder wird auch Antivalenz genannt, weil im Ergebnis dann eine Eins erscheint, wenn die zu verknüpfenden Bits ungleich sind. Man kann es auch so interpretieren, daß die Aussage dann wahr (1) ist, wenn nur die eine oder die andere Bedingung wahr ist. Dieser Befehl wird in Zeichenprogrammen benutzt. Dadurch, daß man zwei Speicherbereiche mit EOR verknüpft, werden zwei überlappende Objekte auf dem Bildschirm sichtbar. Auch hier existieren die gleichen Formen wie vorausgegangen.
Wahrheitstabelle
B A Q
0 0 0
0 1 1
1 0 1
1 1 0
Beispiel:
D1 = %01100101
EORI.B #%11001001, D1
D1 = %10101100
Der NOT-Befehl bildet einfach das Einerkomplement. Dies macht er, indem er aus einer Eins eine Null und umgekehrt macht.
Wahrheitstabelle
A Q
0 1
1 0
Beispiel:
D1 = %01100101
NOT.B D1
D1 = %10011010
Die Tabelle für AND gilt ebenfalls für OR und EOR.
Für diese Ausgabe ist es wohl erst einmal genug. In der nächsten Ausgabe wird wieder ein Programm für Sie dabei sein. Ich hoffe Sie haben jetzt schon einiges gelernt und sich daraus etwas erarbeiten können.