Impressum
< Adressierungsarten Inhalt arithmetische Befehle >

Der Mov-Befehl

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:

MnemonicFunktionBytesMZFlags
MOV A,RrLade den Akkumulator mit dem Inhalt von Rr.11P
MOV A,dadrLade den Akkumulator mit dem Inhalt von dadr.21P
MOV A,@RiLade den Akkumulator mit dem Inhalt der internen Speicherzelle , die durch Ri adressiert wird.11P
MOV A,#konst8Lade den Akkumulator mit der 8-Bit-Konstanten.21P
MOV Rr,ALade Register Rr mit dem Inhalt des Akkumulators.11-
MOV Rr,dadrLade Register Rr mit dem Inhalt von dadr.22-
MOV Rr,#konst8Lade Register Rr mit der 8-Bit-Konstanten.21-
MOV dadr,ALade die interne Datenspeicherzelle mit dem Inhalt des Akkumulators.21-
MOV dadr,RrLade die interne Datenspeicherzelle mit dem Inhalt des Registers Rr.22-
MOV dadr,dadrLade die interne Datenspeicherzelle dadr mit dem Inhalt der internen Speicherzelle dadr.32-
MOV dadr,@RiLade die interne Datenspeicherzelle dadr mit dem Inhalt der intern. Speicherz.,die durch Ri adress. ist.22-
MOV dadr,#konst8Lade die interne Datenspeicherzelle dadr mit der 8-Bit-Konstanten.32-
MOV @Ri,ALade in die interne Datenspeicherzelle, die durch Ri adressiert wird, den Inhalt des Akkumulators.11-
MOV @Ri,dadrLade in die interne Datenspeicherzelle, die durch Ri adressiert wird, den Inhalt von dadr.22-
MOV @Ri,#konst8Lade in die interne Datenspeicherzelle, die durch Ri adressiert wird, die 8-Bit-Konstante.21-
MOV DPTR,#konst16Lade den Daten-Pointer mit der 16-Bit-Konstanten.32-

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:

MnemonicFunktionBytesMZFlags
MOVX A,@RiLade den Akkumulator mit dem Inhalt der externen Speicherzelle, die durch Ri adressiert wird.12P
MOVX A,@DPTRLade den Akku mit dem Inhalt der externen Datenspeicherzelle, die durch den Daten-Pointer adressiert wird.12P
MOVX @Ri,ALade die externe Datenspeicherzelle, die durch Ri adressiert wird, mit dem Inhalt des Akkumulators.12-
MOVX @DPTR,ALade die ext. Datenspeicherzelle, die durch den Daten-Pointer adressiert ist, mit dem Inhalt des Akkus.12-

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:

MnemonicFunktionBytesMZFlags
MOVC A,@A+DPTRLade den Akkumulator mit dem Inhalt der Programmspeicherzelle, die durch die Summe von Daten-Pointer und Akkumulator adressiert wird.12-
MOVC A,@A+PCLade den Akkumulator mit dem Inhalt der Programmspeicherzelle, die durch die Summe von Program-Counter und Akkumulator adressiert wird.12P

Weitere Datentransportbefehle

MnemonicFunktionBytesMZFlags
PUSH dadrDer Stack-Pointer wird um 1 erhöht und der Inhalt von dadr im Stack abgelegt.22-
POP dadrD er Inhalt der durch den Stack-Pointer adressierten Adresse wird nach dadr transferiert und der Stack-Pointer um 1 erniedrigt.22-
XCH A,RrVertausche die Inhalte des Akkumulators und des Registers Rr.11P
XCH A,dadrVertausche die Inhalte des Akkumulators und der internen Datenspeicherzelle dadr.21P
XCH A,@RiVertausche die Inhalte des Akkus und der internen Datenspeicherzelle, die durch Ri adressiert wird.11P
XCHD A,@RiVertausche die Inhalte der niederwertigen Halbbytes von Akku und der internen Datenspeicherzelle, die durch Ri adressiert wird.11P
SWAP AVertausche die Bytehälften des Akkumulators11-