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...
>Oder sind die da gleich?? Ja! >Gibts irgendwo ne Befehlsliste?? Ja, im Datenblatt.
Kann sein, dass die vermeintlichen Sprungbefehle zu Datentabellen gehören. Poste halt mal den Code... Ralf
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...
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.
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
Es sieht sehr danach aus, als ob der Disassembler an der falschen Stelle aufsetzt. Daten mittendrin können einen Disassembler leicht durcheinander bringen.
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
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??
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...
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
>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.
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...
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?
>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.
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...
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
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....
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.
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??
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.