Frage zu Assembler-Code zeile (8051)

Gast #1397281
Hallo,

ich habe hier einen längeren Assembler Code denn ich gerne verstehen und 
dann in C neu schreiben möchte.
Das ganz ist auf nem 8051.

Allerdings verstehe ich eine Zeile von dem Code nicht:

;+++++++OUTCOM+++++++++++++++
OUTCOM:

  PUSH    DPH
  PUSH    DPL
  MOV     DPTR,   #$E000  <-was passiert hier???
  MOVX    @DPTR,  A
  NOP
  POP     DPL
  POP     DPH
  LCALL   WAIT40
  RET

Wenn ich das richtig verstanden habe wird hier A an ein Display 
geschickt, mir ist nur noch nicht klar wie das passiert und was dort das 
$ in der einen Zeile macht?
Kann mir da einer helfen?
Moderator (Firma: Titel) Persönliche Seite
> Wenn ich das richtig verstanden habe wird hier A an ein Display
> geschickt, mir ist nur noch nicht klar wie das passiert
Das Display hängt wohl am AD-Bus, und mit der Adresse E000 wird das Ding 
entweder selektiert oder entsprechende Signale auf dem Bus ausgegeben. 
Für eine genauere Analyse bräuchte man einen Schaltplan...

> was dort das $ in der einen Zeile macht?
Es bedeutet, dass eine Hex-Zahl folgt.
Gast
Der Wert in A wird an Adresse (hex=$) E000 geschrieben (wobei an Adresse 
E000 vermutlich Dein Display hängt).

Das muss beim 8051 über den DPTR (Data Pointer) gemacht werden, ist das 
einzige Register, was 16 Bit breit ist.

Gruss
Axel
Gast
PUSH    DPH ;Das High Byte des DPTR(Datenpointer)wird gesichert
  PUSH    DPL ;Das Low Byte ebenfalls
  MOV     DPTR,   #$E000  <-was passiert hier??? ;Der DPTR wird neu 
eingestellt. Leider hat der 8051 nur ein 16 bit Datenpointer
  MOVX    @DPTR,  A ';Externer Schreibzugriff z.b Ram , Display usw
  NOP ;No Operation
  POP     DPL ;Das gesicherte Low Byte zurückschreiben
  POP     DPH ;High Byte ebenfalls
  LCALL   WAIT40 ;Aufruf einer Subroutine (glaub ich zumindest ist ne 
weile her)
  RET (ende)

c.u
Commtel
>
>   PUSH    DPH
>   PUSH    DPL
>   MOV     DPTR,   #$E000  <-was passiert hier???
>   MOVX    @DPTR,  A
>   NOP
>   POP     DPL
>   POP     DPH

Hallo Svenk,

erst wird der Inhalt des 16bit Datapointer auf den Stack gerettet.
Dann wird die Adresse E000 (hexadezimal) in den Datapointer geschrieben.
Anschließend wird der Inhalt vom Akku an die im Datapointer beschriebene 
Adresse geschickt. Zum Schluss wrid der ursprüngliche Inhalt des 
Datapointer vom Stack zurückgeholt.

Viele Grüße, Frank

Nachtrag: Was in 10 min so alles passiert, so schnell kann ich nicht 
schreiben... ;)
Gast
Ah das erklärt dann einiges.

Hab gerade mal geguckt, das Display hängt über einem 74245 an Port0. 
Past also alles...

Vielen dank für die Antworten.
Gast
Interesant das das Display !NUR! an Port0 ist.
Da hätte ich es anders geschrieben

PUSH    R0
MOV     R0,   #$E0
MOVX    @R0,  A
NOP <--ist die Frage ob dies wirklich gebraucht wird
POP     R0
LCALL   WAIT40
RET

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.