Mit dem Befehl mov <Ziel>, <Quelle> wird der Inhalt (Wert) des Operanden
<Quelle> in das <Ziel> kopiert. Die Operanden adressieren entweder
einen konstanten Wert, eine Speicherzellen im internen RAM oder eine Speicherzelle im SFR.
Als <Ziel> darf A, ein Register (R0 - R7), eine
direkte Datenadresse (z.B. 043h) oder ein registerer indirekte Adresse
(@R0 oder @R1) stehen. Eine Konstante (immediate adressiert) ist als Ziel weder
sinnvoll noch möglich.
Eine Besonderheit als Ziel ist der DPTR (Data-Pointer), welchem eine 16-Bit Konstante zugewiesen werden kann.
Dies ist deshalb bemerkenswert, da dies der einzige Befehl ist, mit welchem 16-Bit auf einmal transportiert werden können.
Als <Quelle> ist neben A, einem Register (R0 - R7),
einer direkten Datenadresse oder ein registerer indirekte Adresse auch ein konstanter Wert erlaubt (z.B. #034h).
Der DPTR ist als Quelle nicht zulässig, auch sind die Kombinationen mov Ri, Ri
und mov @Ri, @Ri nicht möglich.
Unterscheidung von SFR und internem RAM
Das SFR geht von der Adresse 80h bis FFh und der interne RAM geht von 0h bis 0FFh. Somit gibt es die Adressen 80h bis FFh sowohl im SFR als auch
im RAM. Als Unterscheidung, ob man Daten aus dem SFR bzw. dem RAM lesen/schreiben will, dient hierbei die Adressierung: Ist eine direkte Adresse
gegeben, so verweist diese auf das SFR. Ist es hingegen eine indirekte Adresse, so verweist die Adresse auf den internen RAM.
Da die Adressen 0h-7Fh ausschließlich im internen RAM existieren, kann dieser Bereich sowohl indirekt als auch direkt adressiert werden.
SFR (80h-FFh) direkt
RAM (80h-FFh) indirekt
RAM (0h-7Fh) direkt und indirekt
Abb 1: Adressierungs- arten für SFR und internen RAM
Hier die Mov-Befehle für RAM und SFR in der Übersicht:
Mnemonic
Funktion
Bytes
MZ
Flags
MOV A,Rr
Lade den Akkumulator mit dem Inhalt von Rr.
1
1
P
MOV A,dadr
Lade den Akkumulator mit dem Inhalt von dadr.
2
1
P
MOV A,@Ri
Lade den Akkumulator mit dem Inhalt der internen Speicherzelle , die durch Ri adressiert wird.
1
1
P
MOV A,#konst8
Lade den Akkumulator mit der 8-Bit-Konstanten.
2
1
P
MOV Rr,A
Lade Register Rr mit dem Inhalt des Akkumulators.
1
1
-
MOV Rr,dadr
Lade Register Rr mit dem Inhalt von dadr.
2
2
-
MOV Rr,#konst8
Lade Register Rr mit der 8-Bit-Konstanten.
2
1
-
MOV dadr,A
Lade die interne Datenspeicherzelle mit dem Inhalt des Akkumulators.
2
1
-
MOV dadr,Rr
Lade die interne Datenspeicherzelle mit dem Inhalt des Registers Rr.
2
2
-
MOV dadr,dadr
Lade die interne Datenspeicherzelle dadr mit dem Inhalt der internen Speicherzelle dadr.
3
2
-
MOV dadr,@Ri
Lade die interne Datenspeicherzelle dadr mit dem Inhalt der intern. Speicherz.,die durch Ri adress. ist.
2
2
-
MOV dadr,#konst8
Lade die interne Datenspeicherzelle dadr mit der 8-Bit-Konstanten.
3
2
-
MOV @Ri,A
Lade in die interne Datenspeicherzelle, die durch Ri adressiert wird, den Inhalt des Akkumulators.
1
1
-
MOV @Ri,dadr
Lade in die interne Datenspeicherzelle, die durch Ri adressiert wird, den Inhalt von dadr.
2
2
-
MOV @Ri,#konst8
Lade in die interne Datenspeicherzelle, die durch Ri adressiert wird, die 8-Bit-Konstante.
2
1
-
MOV DPTR,#konst16
Lade den Daten-Pointer mit der 16-Bit-Konstanten.
3
2
-
You-Tube Video (Lauflicht mit mov dir, #const8)
Der Erweiterungsspeicher (MOVX)
Der Erweiterungsspeicher (eXtension MEMory kurz: XMem) wird extern an den Mikrocontroller angeschlossen. Er kann eine Größe von bis zu 64kB haben.
Manche Mikrocontroller besitzen bereits einen internen Erweiterungsspeicher und erlauben es, mit einem Bit im SFR zwischen internem und externem
Erweiterungsspeicher zu wechseln.
Mit dem Befehl movx A, @Ri und movx A, @DPTR kann aus dem XMem ausgelesen werden. Als Ziel ist nur der Akkumulator
möglich. Die Quelle wird indirekt über Register 0 oder Register 1 angesprochen. Da ein Register nur Werte von 0 bis 255 haben kann, sind damit
nur die ersten 256 Bytes des XMem adressierbar.
Verwendet man als zweiten Operanden @DPTR, so ist der Inhalt des DPTR die Adresse im XMem. Da der DPTR ein 16-Bit Register ist, können
hiermit alle 64kB des Erweiterungsspeichers angesprochen werden.
Mit movx @Ri, A und movx @DPTR, A wird der Inhalt des Akkumulators in den XMem geschrieben. Das Ziel der Zuweisung
im XMem wird indirekt über R0, R1 oder indirekt über den Datapointer adressiert.
Hier die Mov-Befehle für den Erweiterungsspeicher in der Übersicht:
Mnemonic
Funktion
Bytes
MZ
Flags
MOVX A,@Ri
Lade den Akkumulator mit dem Inhalt der externen Speicherzelle, die durch Ri adressiert wird.
1
2
P
MOVX A,@DPTR
Lade den Akku mit dem Inhalt der externen Datenspeicherzelle, die durch den Daten-Pointer adressiert wird.
1
2
P
MOVX @Ri,A
Lade die externe Datenspeicherzelle, die durch Ri adressiert wird, mit dem Inhalt des Akkumulators.
1
2
-
MOVX @DPTR,A
Lade die ext. Datenspeicherzelle, die durch den Daten-Pointer adressiert ist, mit dem Inhalt des Akkus.
1
2
-
Der Codespeicher (MOVC)
Der Programmcode steht bei einem 8051 Mikrocontroller im ROM. Da dieses zur Programmlaufzeit nur ausgelesen werden kann, existieren keine
Befehle um das ROM zu beschreiben, sondern nur movc-Befehle um daraus zu lesen.
Der Befehl movc A, @A+DPTR liest ein Byte vom ROM in den Akkumulator ein. Gelelesen wird aus der Adresse welche sich aus
A+DPTR ergibt. Es wird der Inhalt von A mit dem Inhalt des Data-Pointers addiert, der Wert an dieser Stelle im
ROM ausgelesen und im Akkumulator gespeichert.
Der Befehl movc A, @A+PC funktioniert wie der movc A, @A+DPTR Befehl, mit dem Unterschied, dass sich die ROM
Adresse aus der Summe von Akkumulator und Programm-Counter ergibt.
Hier die Mov-Befehle für den Codespeicher in der Übersicht:
Mnemonic
Funktion
Bytes
MZ
Flags
MOVC A,@A+DPTR
Lade den Akkumulator mit dem Inhalt der Programmspeicherzelle, die durch die Summe von Daten-Pointer und Akkumulator adressiert wird.
1
2
-
MOVC A,@A+PC
Lade den Akkumulator mit dem Inhalt der Programmspeicherzelle, die durch die Summe von Program-Counter und Akkumulator adressiert wird.
1
2
P
Weitere Datentransportbefehle
Mnemonic
Funktion
Bytes
MZ
Flags
PUSH dadr
Der Stack-Pointer wird um 1 erhöht und der Inhalt von dadr im Stack abgelegt.
2
2
-
POP dadr
D er Inhalt der durch den Stack-Pointer adressierten Adresse wird nach dadr transferiert und der Stack-Pointer um 1 erniedrigt.
2
2
-
XCH A,Rr
Vertausche die Inhalte des Akkumulators und des Registers Rr.
1
1
P
XCH A,dadr
Vertausche die Inhalte des Akkumulators und der internen Datenspeicherzelle dadr.
2
1
P
XCH A,@Ri
Vertausche die Inhalte des Akkus und der internen Datenspeicherzelle, die durch Ri adressiert wird.
1
1
P
XCHD A,@Ri
Vertausche die Inhalte der niederwertigen Halbbytes von Akku und der internen Datenspeicherzelle, die durch Ri adressiert wird.