Mathematik-Befehle

  ADD und ADDC   SUBB   INC und DEC   MUL und DIV
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.

ADD A,[Op]
ADDC A,[Op]
Operator
Rn @Rn Byte im RAM #Konstante
A X X X X

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!

SUBB A,[Op] Operator
Rn @Rn Byte im RAM #Konstante
A X X X X

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.
zurück zum Anfang

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.

INC [Op]
DEC [Op]
Operator
A Rn @Rn Byte im RAM #Konstante DPTR
INC X X X X X X
DEC X X X X X  

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.

MUL AB
DIV AB

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.


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