Forum: Mikrocontroller und Digitale Elektronik 8051, 8052 und 89C52 Befehle


von Dennis I. (tsubasa)


Lesenswert?

Hallo,

Is ne ziemliche Anfänger Frage, aber irgenwie komme ich nicht weiter.
Sind die Befehlscodes für 8051 und 8052 gleich?Wo sind die
Unterschiede?

Gibt da irgendwo Listen?
Ich habe nur die bei www.8052.com gefunden.
Gibts sowas auch für den 8051?
Oder sind die da gleich??

Und ich würde gerne wissen ob mein Atmel 89C52 wirklich auf dem 8052
Code basiert. Denn ich habe eine Binär Datei mit einem 52er
Disassembler laufen lassen und da sind jede Menge Sprünge mitten in
Oparationen.
Und das das so sinn ist kann ich mir nicht vorstellen.
Gibts irgendwo ne Befehlsliste??

Vielen Dank schon jetzt für die Antworten...

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Oder sind die da gleich??

Ja!

>Gibts irgendwo ne Befehlsliste??
Ja, im Datenblatt.

von Ralf (Gast)


Lesenswert?

Kann sein, dass die vermeintlichen Sprungbefehle zu Datentabellen
gehören.
Poste halt mal den Code...

Ralf

von Dennis I. (tsubasa)


Lesenswert?

Also in meinem Datenblatt von Atmel ist kein spezieller Befehl 
verzeichnet.
Heißt das das es keinen speziellen Befehl gibt, oder das ich ein 
unvollständiges Datenblatt habe??

Habs von www.alldatasheet.com

Ne Datentabelle hatte ich auch schon überlegt. Aber die Sprüngbefehle 
die mitten in die Operationen gehen liegen im Startbereich an x0000h und 
folgende...

von Dennis I. (tsubasa)


Lesenswert?

Under Code fängt so an...

org  0

ljmp  X1bfd    ; 0000   02 1b fd
ljmp  X0d72    ; 0003   02 0d 72
ret      ; 0006   22
ret      ; 0007   22
ret      ; 0008   22
ret      ; 0009   22
ret      ; 000a   22
ljmp  X0d97    ; 000b   02 0d 97
clr  p2.3    ; 000e   c2 a3
ret      ; 0010   22
mov  r7,a    ; 0011   ff
mov  r7,a    ; 0012   ff
ljmp  X0d7d    ; 0013   02 0d 7d

und die ersten beiden Sprünge iritieren mich sehr, da Adresse x1bfd 
mitten in einer Operation ist.

X1bfa:  inc  r0    ; 1bfa   08
  inc  r1    ; 1bfb   09
  inc  78h    ; 1bfc   05 78
  mov  r7,#0e4h  ; 1bfe   7f e4


Und irgendwie kann das ja nicht sein, oder was denke ich da falsch...
Is bestimmt was ganz banales das so einfach und offensichtlich ist das 
ichd arauf mal wieder nicht komme.

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Wenn schon einen Atmel-Chip benutzt, sollte man vielleicht auch mal auf 
deren Internet-Site gucken:
http://www.atmel.com/dyn/products/product_card.asp?family_id=604&family_name=8051+Architecture&part_id=1931

Nicht wahr?
Befehlsliste (Istruction Set):
http://www.atmel.com/dyn/resources/prod_documents/doc0509.pdf


Woran allerdings dein Fehler liegt, kann ich so auf Anhieb auch nicht 
sagen.
Wobei der Byte-Code 78h auch für "MOV R0,#data" steht.
Somit würde nach einem Reset R0 mit 7Fh befüllt werden...
Es kommt ja darauf an, an welcher Stelle der Disassembler mit seiner 
Arbeit beginnt.

Somit würde dein Code (ab 1BFDh) so aussehen:
MOV R0, 7Fh
CLR A

von A.K. (Gast)


Lesenswert?

Es sieht sehr danach aus, als ob der Disassembler an der falschen Stelle 
aufsetzt. Daten mittendrin können einen Disassembler leicht 
durcheinander bringen.

von Peter D. (peda)


Lesenswert?

Dennis Iss wrote:
> ...Denn ich habe eine Binär Datei mit einem 52er
> Disassembler laufen lassen und da sind jede Menge Sprünge mitten in
> Oparationen.
> Und das das so sinn ist kann ich mir nicht vorstellen.

Doch, das macht Sinn.

Es sind warscheinlich konstante Daten (Tabellen, Texte).
Der Disasembler kann das aber nicht wissen (kann ja nicht denken) und 
somit versucht er die Daten in Befehle zu übersetzen.

Alle 8051 haben den gleichen Befehlssatz.

Nur manche neuere haben zusätzliche Befehle, um linear >64kB adressieren 
zu können. Meist wird dazu der unbenutzte Code 0xA5 verwendet.


Peter

von Dennis I. (tsubasa)


Lesenswert?

Ok, das Datenblatt das ich hatte war das richtige...nur das Instruction 
Set hatte ich nicht gefunden...danke für den Link...

Das Problem ist das ich nur noch das bin File habe. Und ich nicht weiß 
wo der Assembler ansetzen soll...

Darum habe ich ihn ab 0000h anfangen lassen.
Oder meinst du an welcher Stelle die Datentabelle aufhört damit dann der 
richtige Code gelesen werden kann??

Wie finde ich sowas raus??
Ich dachte immer man schreibt Datentabellen ans Ende und nicht an den 
Anfang eines Codes??

von Dennis I. (tsubasa)


Lesenswert?

Ah, jetzt verstehe ich wie ihr das meint...

Also der erste Teil mit dem ersten Sprung ist wohl richtig 
gelesen...aber ab dem Sprung ist es falsch weil er durch Daten mitten 
drin den Faden verloren hat...

Und der nächste Befehl nach dem Sprung halt der 78h ist??
Hab ich das richtig verstanden??
Das würde mich ja eminent weiter bringen...

von Peter D. (peda)


Lesenswert?

Dennis Iss wrote:

> Ich dachte immer man schreibt Datentabellen ans Ende und nicht an den
> Anfang eines Codes??

Nö.

Z.B. "MOVC A,@A+PC" braucht die Daten direkt hinter dem Befehl.

Und oftmals werden Daten auch hinter dem Call abgelegt. Die aufgerufene 
Funktion popt sich dann einfach die Returnadresse (POP DPH, POP DPL) und 
nimmt sie als Zeiger auf die Daten.

Der Keil C51 macht das z.B. bei switch-Anweisungen (Zeiger auf 
Sprungtabelle).


Peter

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Wie finde ich sowas raus??
Du kannst dir sämtliche Sprungmarken heraussuchen.
Von dort aus geht es linear im Programmablauf weiter.
Unterbrochen wird dieser Ablauf nur durch Sprungbefehle.
Wenn man am Ende eines Abschnittes ankommt, springt man enweder zu einem 
bestimmten Punkt vorher zurück (Schleife), oder in einen anderen 
Programmteil (RET/RETI)

>Ich dachte immer man schreibt Datentabellen ans Ende und nicht an den
>Anfang eines Codes??
Das kommt wohl auf den Compiler an.

Lass den Dissassembler (falls möglich) von der Sprungmarke loslaufen.
Der Disassembler macht auch nichts anderes als die Bytes in ihm bekannte
Assembler-Befehle zu übersetzen bzw. für Menschen lesbar macht.
Wenn man die gleiche Datei durch einen AVR-Disassembler jagen würde, 
würde was ganz anderes herauskommen...

"Intelligente" Disassembler (Gibt's sowas überhaupt?) übersetzen auch 
nicht nur den Code in eine lesbare Form, sondern analysieren auch noch 
die Sprungmarken etc. und übersetzen dann an der richtigen Stelle.

von Dennis I. (tsubasa)


Lesenswert?

Leider kann ich meinen Dissassembler nicht von einer beliebigen Adresse 
loslaufen lassen...

Bleibt mir wohl nichts anderes übrig als das von Hand auseinander zu 
klamüsern....
Aber der erste Sprungbefehl muss dann ja stimmen...und dann mache ich 
von da ab stück für Stück weiter...bin ja mal gespannt was dabei rum 
kommt...
Vielleicht nen etwas klarerer Programm als das was der Dissassembler 
bisher ausgespuckt hat...

von Dennis I. (tsubasa)


Lesenswert?

Aber das Programm startet doch immer bei x0000, oder denke ich da jetzt 
falsch?

In meinen alten Assembler Kursen hatten wir immer mit nem Start Befehl 
das Programm ans lafen bekommen und dabei auch eine Startadrese 
vergeben.

Aber bei einem Programm das auf einem Chip in einer Maschine läuft gehts 
doch immer bei x0000 los, oder?

Und ne andere Frage...
Ich habe mir das Instruction Set bei Atmel geladen. Bei einigen Befehlen 
steht dabei das der PC um 2 erhöhlt wird....Beispielsweise DJNZ und dann 
der PC = PC + relative adresse ist.

Also alle Befehle wo nichts bei "Oparation" was mit dem PC steht erhöhen 
den nicht?
Oder erhöht jeder Befehl den PC?

Mir stellt sich nämlich die Frage wo mein DJNZ hinspringt. Entweder hat 
der LJMP den PC gesetzt und der wird nur von einigen Befehlen erhöht 
oder jeder Befehl erhöht den und ich springe woanders hin...

Könnt ihr meiner Beschreibung folgen?

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>In meinen alten Assembler Kursen hatten wir immer mit nem Start Befehl
>das Programm ans lafen bekommen und dabei auch eine Startadrese
>vergeben.

Das wird die Möglichkeit des 8051 ausgenutzt haben, Programme auch aus 
dem RAM zu starten (kombiniertes Daten- und Programm-RAM).
Da hat man dann auf dem PC ein Programm entwickelt, dieses per 
(onboard-)Terminal ins RAM geladen und dann ab einer bestimmten 
Speicherzelle gestartet.

>Aber bei einem Programm das auf einem Chip in einer Maschine läuft gehts
>doch immer bei x0000 los, oder?
Ja.

von Dennis I. (tsubasa)


Lesenswert?

Danke Rahul, da hab ich doch richtig gedacht....hatte mich schon für 
verrückt erkläen wollen...

Jetzt nur noch das Problem mit dem PC und ich weiß wo mein DJNZ 
hinspringt...

von Pieter (Gast)


Lesenswert?

moin moin,

beim einlesen des Befehls wird der PC doch weitergezählt und erst danach 
eventuell gesprungen.

Beispiel:
   DJNZ A, -2 ;solange A>0 springe auf sich selber

Etwas Sinnlos:
   DJNZ A, 0  ;egal was A für einen Wert hat
              ;mache in der nächsten Zeile weiter


MfG
Pieter

von Dennis I. (tsubasa)


Lesenswert?

Ja, wird der PC denn bei jedem Befehl weiter gezählt?
Auch bei "clr a" oder "inc dtpr" und so Sachen?

Wohin springt mir der Befehl:
jz  x????

Wenn er im Programm so steht:
x1c4b   60 bc

Ich gehe davon aus er springt nach "x1d09"?!
Außer wenn bei einigen Befehlen vorher der PC nicht weitergezählt worden 
wäre...dann wäre es nen anderes Ziel...

Ich frage mich das nur weil in dem Instruction Set bei einigen Befehlen 
der PC +2 steht...also da und bei anderen zum PC gar nichts steht.

Also entweder verstehe ich das so das jeder Befehl den PC um 1 
erhöht..nur da wo es bei steht halt 2 oder 3....
Oder das da wo nichts bei steht der PC nicht erhöht wird sondern nur bei 
den Befehlen wo etwas dabei steht?!

Das ist meine Überlegung....

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Vielleicht solltest du dir das "Mikrocontroller Kochbuch" von Andreas 
Roth besorgen. Das ist quasi die 8051er-Bibel. Und auf Deutsch ist das 
Buch auch noch...

Der PC (= program counter) wird natürlich bei jedem Befehl um die 
entsprechende Anzahl (1, 2 oder 3) erhöht, sodass auch der nächste 
Befehl "getroffen" wird.
Bei Sprüngen wird er so manipuliert, dass die CPU dann an der 
entsprechenden Stelle weiter macht. Bei Funktionsaufrufen (call) wird 
der PC auf dem Stack gesichert (ge"push"ed), um sich die letzte Position 
im Programm zu merken. Wurde die Subroutine bearbeitet, wird der PC 
wieder von Stack ge"pop"t.

von Dennis I. (tsubasa)


Lesenswert?

Hab mir das Buch sofort zur Ansicht bei der Mayerschen bestellt...
Mal schauen wie das so ist...wenn dann kauf ich mir das sofort...

Danke für die vielen Hinweise....das mit dem Push und Pop weiß ich noch 
von früher...aber ich war mir halt mit dem PC nicht mehr so sicher ob 
der wirklich bei jedem Befehl mitzählt...und meine unsicherheit wurde 
noch geschürt weil in dem Instruction Set das bei einigen Befehlen stand 
und bei anderen wieder nicht...

Also würde der Befehl:
x1c4b   60 bc

Ein:
jz x1d09
auslösen.

Woran erkenne ich denn wenn der Befehl zurück springen soll??

von Peter D. (peda)


Lesenswert?

Die CPU muß sich ja den kompletten Befehl erst reinziehen, d.h. der PC 
zeigt bei der Sprungberechnung schon auf den nächsten Befehl.

Um ganz genau zu sein, der 8051 holt sich sogar schon das nächte Byte 
aus dem Flash und wenn es nicht gebraucht wird (bei Sprüngen und Calls), 
verwirft er es. Steht aber alles schön in der Hardwarebeschreibung 
erklärt.



Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.