Die Mathematik-Befehle dienen - nicht sehr überraschend - zum rechnen. Da der MCS51-Controller nur 8 Bit auf einmal verdaut, versucht diese Seite zugleich, ein paar Tips zur Erweiterung der Rechnungen auf zwei oder mehr Bytes zu geben. | ||||||||||||||||||||||||||||||||
ADD und ADDC |
||||||||||||||||||||||||||||||||
Die ADD-Befehle dienen dazu, zwei Bytes zu addieren. Dabei ist der eine Summand auf das A-Register festgelegt. Das Ergebnis der Addition wird ebenfalls im A-Register abgelegt, der ursprünglich in A gespeicherte Wert geht verloren. Findet ein Übertrag statt, wird das Carry-Flag gesetzt, anderenfalls gelöscht. Ein Übertrag entsteht beispielsweise, wenn man 250 + 10 addiert: das Ergebnis 260 läßt sich nicht mehr in einem Byte speichern, daher ist das C-Flag gesetzt und im A-Register der Wert 260-256=4. Im Dezimalsystem sieht das so aus, als wäre damit das Ergebnis nutzlos - im Binärsystem jedoch erkennt man, dass das Ergebnis durchaus korrekt ist und nur um ein 9. Bit - das C-Flag - erweitert wurde: 11111010b 250 + 00001010b + 10 =100000100b =1x28 + 1x22 = 260 Der Unterschied zwischen ADD und ADDC besteht nun darin, dass ADDC als zusätzlichen Input das C-Flag benutzt. Als Pseudocode für ADD gilt A=A+[Op]. Für ADDC gilt A=A+C+[Op]. Damit kann die Addition leicht auf 16 oder mehr Bit ausgeweitet werden, um größere Zahlenbereiche zur Verfügung zu haben.
Beispiel: ; 16 Bit-Addition R1:R0 + R3:R2 mov a,R2 ; Low-Byte add a,R0 ; addieren ohne Carry mov R0,a ; Ergebnis sichern mov a,R3 ; High-Byte addc a,R1 ; addieren mit Übertrag mov R1,a ; Ergebnis sichern zurück zum Anfang |
||||||||||||||||||||||||||||||||
SUBB |
||||||||||||||||||||||||||||||||
SUBB ist das 'natürliche Gegenstück' zu ADDC. Es wird ein Operator von A unter Berücksichtigung vom C-Flag subtrahiert und das Ergebnis in A abgelegt, zusammen mit einem eventuell wieder 'geborgten' Bit im C-Flag. Der Pseudocode sieht also so aus: A=A-[Op]-C. Auch hier dient also das C-Flag wieder zum leichten erweitern der Rechnung auf größere Zahlen. Einen Subtraktionsbefehl ohne Beachtung des Carry-Flags als direktes Gegenstück zu ADD gibt es jedoch nicht, darum ist unbedingt vor jeder Subtraktion das C-Flag zu löschen!
Eine 16 Bit-Subtraktion sieht so aus: ; 16 Bit-Subtraktion R1:R0 - R3:R2 clr c ; C löschen mov a,R0 ; 1. Subtraktion low subb a,R2 mov R0,a mov a,R1 ; 2. Subtraktion high subb a,R3 mov R1,a
Eine Subtraktion lässt sich auch ausgezeichnet zum Vergleichen missbrauchen:
Ist am Ende der Subtraktion das C-Flag gesetzt, so war der 2. Operand größer als A. Ist
das Flag gelöscht, so war der Operand kleiner oder gleich A.
|
||||||||||||||||||||||||||||||||
INC und DEC |
||||||||||||||||||||||||||||||||
INC und DEC incrementieren oder decrementieren den angegebenen Operanden. Das bedeutet, dass INC A das A-Register um 1 erhöht, und DEC A das A-Register um 1 verringert. INC und DEC unterscheiden sich nicht nur darin, dass der eine Befehl rauf- und der andere runterzählt. Zusätzlich hat INC einen möglichen Operator mehr: das 16bittige DPTR-Register. Damit wird die Flexibilität der basisrelativen Adressierung gesteigert, welche ja auf DPTR angewiesen ist.
zurück zum Anfang |
||||||||||||||||||||||||||||||||
MUL und DIV |
||||||||||||||||||||||||||||||||
MUL multipliziert A mit B. Die unteren 8 Bit (Bits 0 bis 7) des Ergebnisses werden im A-Register gespeichert, die oberen 8 Bit (8 bis 15) im B-Register. DIV dividiert A durch B. Das Ergebnis wird in A gespeichert. Da nur ganzzahlige Ergebnisse möglich sind, entsteht bei Divisionen oft ein nicht mehr teilbarer Rest. Dieser wird im B-Register abgelegt.
Im Gegensatz zu Additionen oder Subtraktionen ist es nicht so einfach, Multiplikationen oder gar Divisionen auf mehr als 8 Bit auszuführen. Aus diesem Grunde wird sich später eine zusätzliche Seite mit diesem Thema beschäftigen. |