Forum: Mikrocontroller und Digitale Elektronik 8031er Programm zurückholen.


von Stefan M. (hildesheimer)


Lesenswert?

Guten Abend liebe Freunde!

Vor mir liegend habe ich ein Bediengerät mit einem 8031 Mikroprozessor 
und einem guten alten Eprom (27C64) mit der entsprechenden Software. Das 
Programm hat zur damaligen Zeit mein Vater geschrieben und steuert eine 
kleine Textübertragung und Relaisschaltungen. Am Bedienpanel befinden 
sich einige Taster und LED's. Rückseitig ein paar Steuereingänge 
(Zustandsabfrage). So weit zur Hardware.

Leider ist es so, dass es den Quelltext nicht mehr gibt und ich meinen 
Vater nach diesem auch nicht mehr fragen kann. Das Gerät ist nach wie 
vor bei uns im Haus in Betrieb und ich möchte gerne den Programmcode, 
wenn auch bruchstückweise, zurückbekommen bzw. generell mal sehen.

Ich habe bei Google schon nach "Decompiler" etc. gesucht, aber mir 
fehlen dafür natürlich die richtigen Begriffe. Und ob die Möglichkeit so 
einfach überhaupt besteht, weiß ich auch gar nicht genau.

Meine Frage an Euch:

 - Was mache ich da am besten?



Schönen Abend!

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Du suchst einen 'Disassembler'. Dieser verwandelt ein BIN oder HEX File, 
das du aus dem EPROM ausgelesen hast, in ein Assembler Listing.

Die Chancen stehen recht gut, das dein Vater damals Assembler benutzt 
hat, ein Hochsprachen Kompilat wäre wesentlich schwerer zu verstehen.
DIS51 ist z.B. ein solches Programm für die MCS51 Familie.

von Olaf (Gast)


Lesenswert?

> Und ob die Möglichkeit so einfach überhaupt besteht, weiß ich
> auch gar nicht genau.

Sowas gibt es nicht. Aber immerhin ist die Wahrscheinlichkeit relativ 
gross das ein Programm fuer einen MCS51 in Assembler geschrieben wurde. 
Das koenntest du mit einem Dissassembler zurueckuebersetzen. Also so 
mehr oder weniger und nur falls du Assembler kannst. :)

Olaf

von Stefan M. (hildesheimer)


Angehängte Dateien:

Lesenswert?

Ich habe jetzt den Disassembler "D52" geladen und meine Binärdatei damit 
geladen und das Ergenmos im Anhang herausbekommen.

Bin ich in die richtige Richtung gegangen?
Sieht das "gut" aus? Ich spreche leider nicht Assemblish.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Stefan Müller schrieb:
> Ich spreche leider nicht Assemblish.

Dann kannst du eigentlich bereits aufhören. Ohne Assemblerkenntnisse 
kommst du mit dem Listing wirklich nicht klar.
Einen Tipp kann ich dir aber geben. Eine leere Speicherstelle im EPROM 
ist normalerweise auf 0xFF (oder FFh in Intel Syntax) das auch den 
Befehl 'mov r7,a' in MCS51 Assembler bedeutet, deswegen kommt dieser 
Befehl im Listing so oft vor.
Mit einem symbolischen Dissassembler kanst du nun schrittweise damit 
anfangen, Speicherzellen und Sprungvektoren Namen zu geben. (z.B. ist 
X0250 der Resetvektor)
Es wäre dann auch möglich, Daten und Programm voneinander zu trennen, 
dein derzeitiges Listing disassembliert eben auch einfach Texte und 
andere Konstanten als Maschinencode.
Ist aber kompliziert und lohnt sich wirklich nur dann, wenn du unbedingt 
auf einen vernünftigen Quellcode kommen musst.

von Wilhelm F. (Gast)


Lesenswert?

Matthias Sch. schrieb:

> Einen Tipp kann ich dir aber geben. Eine leere Speicherstelle im EPROM
> ist normalerweise auf 0xFF (oder FFh in Intel Syntax) das auch den
> Befehl 'mov r7,a' in MCS51 Assembler bedeutet, deswegen kommt dieser
> Befehl im Listing so oft vor.

Tja, das ist auch so ein Aufläufer, um auf die Nase zu fallen.

Ich setzte leere Speicherbereiche immer auf 0x00. 0xFF macht aber beim 
8031 auch nicht besonders viel, er macht da immer nur MOV R7,A.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Wilhelm F. schrieb:
> Ich setzte leere Speicherbereiche immer auf 0x00. 0xFF macht aber beim
> 8031 auch nicht besonders viel, er macht da immer nur MOV R7,A.

Bei kritischen EPROMs habe ich damals (hach, ja) in die leeren Stellen 
massenweise 'nop, nop, nop, ljmp 0000, nop, nop' usw. gebrannt, falls 
der Controller mal einen Glitch auf den Addressleitungen bekam. 
Ansonsten habe ich die FFs drin gelassen, damit die nicht unnötig 
gebrannt wurden.

Bei unbekannter Hardware würde ich jetzt vermutlich meinen 8031 Monitor 
in die Platine stecken, einen MAX an die UART machen und damit anfangen, 
das Board durchzuklingeln. Wie gesagt, das alles lohnt sich nur bei 
komplexerem Aufbau und wenn man dringend wissen muss, was da vor sich 
geht.
Wenn die Kiste sehr alt ist (sagen wir mal vor 1990) dann einfach mal in 
ein frisches EPROM brennen und gut is'.

von Georg G. (df2au)


Lesenswert?

Stefan Müller schrieb:
> Ich spreche leider nicht Assemblish.

Was hast du denn dann mit dem Code vor? Wie willst du ihn ändern, wenn 
du ihn nicht verstehst?

Für einen Anfänger ist es suboptimal, mit der Analyse eines 
Disassemblats zu beginnen. Hast du wenigstens ein komplettes Schaltbild 
und eine komplette Funktionsbeschreibung?

von Stefan M. (hildesheimer)


Lesenswert?

Okay, belassen wir es bei dem. Schaltbild und Funktionsbeschreibu ng ist 
nämlich vorhanden und dem nach kann man auch neu programmieren. Ich 
hatte bloß bedenken, da auch ein UART verwendet wird - wegen dem 
Datentransfer. Aber dort könnte man ja beispielsweise für Sender und 
Empfänger neue Firmware programmieren.

Eine andere Frage:
Im Eprom ist weit unter dem Hauptprogramm (mit großem Leerbereich FF) im 
unteren Speicherbereich ca. ab 01600 oder auch 001A00 ein kleiner 
Bereich mit irgendwelchen Nebensächlichkeiten/Konstanten abgelegt - der 
aber gar nicht zwingend notwendig ist. Wenn ich den Part lösche, gibt es 
keinerlei Funktionseinschränkung. Leider kenne ich den genauen 
Adressbereich gerade nicht auswendig, da ich auf die Binärdaten gerade 
nicht zugreifen kann.


--> Kann man aus dem Textfile des Disassemblers zufällig erkennen, ob 
der Inhalt aus diesem unteren Speicherbereich irgendwo aufgerufen wird - 
und wenn ja, ob und wie er verarbeitet wird?

von Oliver S. (phetty)


Lesenswert?

Vermutlich wird es einfacher, die gesamte Funktion der Schaltung zu 
dokumentieren und dieses dann in einem Atmel o.ä. nachzubilden.

von Wilhelm F. (Gast)


Lesenswert?

Matthias Sch. schrieb:

> Wilhelm F. schrieb:
>> Ich setzte leere Speicherbereiche immer auf 0x00. 0xFF macht aber beim
>> 8031 auch nicht besonders viel, er macht da immer nur MOV R7,A.
>
> Bei kritischen EPROMs habe ich damals (hach, ja) in die leeren Stellen
> massenweise 'nop, nop, nop, ljmp 0000, nop, nop' usw. gebrannt, falls
> der Controller mal einen Glitch auf den Addressleitungen bekam.

Ich machte auch komische Sachen, nach dem ich Literatur über 
Störungsmanagement las.

Z.B. leere 256Byte-Blöcke mit NOP, und an deren Ende jeweils:

CLR A
MOV SP, #7
PUSH ACC
PUSH ACC
RETI

;-)

Damit sollte er sich bei einem Absturz in leere Speicherblöcke mit einer 
gewissen Wahrscheinlichkeit schnell fangen.

Das mußte man auch nicht für jeden Block manuell machen, dafür gab es ja 
den tollen Makro-Assembler.

von hildesheimer (Gast)


Lesenswert?

Im Bereich von 1800 bis 18F6 bzw. mit FF bis 18FF sind im Eprom Daten 
hinterlegt, die nicht zum Hauptprogramm gehören und wo es keine Rolle 
spielt, ob sie im Eprom hinterlegt sind oder schlichtweg gar nicht 
vorhanden sind. Es gibt keine Einbußen im Programm oder sonstige 
Veränderung.

Daher ist meine Frage jetzt dringlich: Was hat es mit dem Part auf sich? 
Wird dieser Bereich oben im Assembler-Teil angefragt?

Vielleicht kann das ja jemand für mich ganz grob und schnell 
nachforschen.

von hildesheimer (Gast)


Lesenswert?

Ich sehe gerade selbst: Ja, der Bereich wird abgefragt
1
org  1800h


Kann mir sagen, ob und welche weitere Verarbeitung stattfindet? Es sieht 
aus wie ein Bitmuster o. ä., wird aber wie gesagt gar nicht zwingend 
benötigt und ich finde keinerlei Funktionseinfluss oder Einbuße bei 
nicht-vorhandenseins.


Grüße

von disassembler (Gast)


Lesenswert?

poste die .bin Datei

von Georg G. (df2au)


Lesenswert?

hildesheimer schrieb:
> Vielleicht kann das ja jemand für mich ganz grob und schnell
> nachforschen.

Das kann niemand. Du musst schon das gesamte Programm soweit sinnvoll 
zerlegen, dass es sich 1:1 wieder assemblieren lässt. Woher willst du 
sonst wissen, ob nicht in den 100 von dir als unwichtig eingestuften 
Bytes doch was wichtiges abgelegt ist. Das ist erst einmal Fleißarbeit. 
Das Hirnschmalz brauchst du, wenn du den Mnemonic Folgen dann Funktionen 
zuordnest.

von hildesheimer (Gast)


Angehängte Dateien:

Lesenswert?

Die 100 unwichtigen Bytes habe ich bereits im Eprom mit FF überschrieben 
gehabt und testweise gebrannt. Daher kann ich das sagen - das es eben 
keinen sichtbaren Einfluss unter Test aller Funktionen gibt.

Anbei die BIN.

Hier meine bekannten Bereiche:

Bereich 100 - 2FF = Bitmuster ASCII Zeichensatz
Bereich 500 - 6FF = Bitmuster ASCII Zeichensatz (andere Darstellform)
Bereich 800 - 1040 = Hauptprogramm
Bereich 1800 - 18F6 = Kurioser unwichtiger Teil (?)

von hildesheimer (Gast)


Lesenswert?

Die Bitmuster der Zeichensätze habe ich bereits erfolgreich 
entschlüsseln können. Dort gibt es keinen Fragebedarf. Das Hauptprogramm 
selbst könnte ich problemlos neu programmieren. Es geht jetzt nur noch 
um den letzten Part, was dieser bezwecken soll. Kurios finde ich eben, 
das dieser nicht zwingend benötigt wird.

von Thomas (Gast)


Lesenswert?

ich habe mal etwas in den Code etwas angeschaut. Alles in allem ist der 
Code etwas seltsam. Es fehlt z.B die Stackpointer Inititialisierung.
Das bedeutet der Stack steht auf 0x07. Dahinter kommt der 
Variablenbereich
Zusätzlich finden sich im Code diverse Stackmanipulationen (Parameter 
für
Funktionen). Was ich sagen kann ist, dass dies in keinem Fall in C 
geschrieben ist dann würde man den Startupcode finden.
Assembler würde ich bei der Struktur auch ausschliesen. Der Code sieht 
etwas nach diesem unseligen Elektor Pascal aus (Nili Pascal) aus.
Ein Assembler Programmierer würde den Code besser strukturieren.
Niemand würde z.B im Interrupt ohne Grund Funktionen aufrufen.

Ein kleines Beispiel was ein Assem Proger nie machen würde:

  mov a,scon
  anl a,#1
  jz  xxxx

in Assembler würde man das so machen:
  JNB RI,xxx

mit einem vernüftigen Disassembler würde man vermutlich bessere
Ergebnisse erzielen.

Thomas

von hildesheimer (Gast)


Lesenswert?

Was ich soweit sagen kann:

Die Programmierung stammt aus der Zeit um 1985 - 1990

von Wilhelm F. (Gast)


Lesenswert?

So, ich habe auch mal einen kurzen Blick ins Disassembly geworfen.

Timer 0 und serielle Schnittstelle werden mit Interrupt benutzt. Der 
Timer läuft anscheinend im 16-bit-Mode, weil er mit 25000 nach geladen 
wird. Bei 12MHz wäre das ein Interrupt alle 25ms.

Daß der Stackpointer auf 7 steht, macht aber nichts, wenn ein Programm 
die Registerbänke nicht verwendet, und dieser Platz aus reicht.

Der Flagbereich ab 20h wird verwendet. Dann hat der Stack immerhin 24 
Byte Platz.

Beim Programmstart wird ein Wert aus dem Akkumulator geholt, der da 
irgend wie hinein gekommen sein muß. Daraus wird dann ein Sprung über 
den DPTR erzeugt. Vielleicht ein Monitorprogramm?

Ja, das sieht schon seltsam aus, NiliPascal könnte es durchaus gewesen 
sein. Dann könnte das Programm etwa um den Zeitraum 1995 herum erstellt 
worden sein. Erschwingliche C-Compiler gabs fürs Hobby noch nicht, 
deswegen brasselte ich auch mal eine Weile mit dem NiliPascal herum.

Andererseits lese ich gerade 1985-1990. Was gab es denn da für Compiler 
für 8031?

Aber man sieht mal, wie ein Fremder mit unkommentiertem Code umgehen 
muß. Das ist noch ein schönes Stück Arbeit, die ganze Funktionalität zu 
entschlüsseln. Man wird wohl irgendwo im Disassembly beginnen müssen, 
und nach und nach die Funktionsteile entschlüsseln, und mit Kommentaren 
versehen, Liste mit Register- und Speicherbenutzung machen, usw. usf..

von hildesheimer (Gast)


Lesenswert?

Folgendes kann ich mal erklären:

- Prozessor ist mit 6 Mhz Quarz getaktet.

- Serielle Schnittstelle ist aktiv, auf 1200 Baud
  > ein 75138 steuert RX+TX mit Hilfe von Pin 4 des 8031

- AD-0 bis AD-7 sind durchläufig an die Registereingänge und Ausgänge 
mehrerer Flip-Flops und Latches zusätzlich natürlich auch am Eprom.
  > Die Ein-/Ausgangsregister steuern 8 Taster und

- A8 bis A12 geht ebenfalls an das Eprom

- P1-0 bis P1-2 funktionieren über ein 74HC02 als Steuerleitungen für 
die Schieberegister als Output enable und Clock.


Wenn mir jemand verraten kann, ob der untere Block ab 1800 eingebunden 
ist und was er tut - reicht mir das jetzt.

von hildesheimer (Gast)


Lesenswert?

Der Controller wertet stetig den seriellen Eingang aus auf 
Funktionskontrolle des Bediengerätes (Statusrückmeldung) und schaltet 
ggf. das Gerät ab.

von hildesheimer (Gast)


Lesenswert?

Bzgl. des Compilers kann ich sagen:

Mein Vater arbeitete zur damaligen Zeit als Programmierer und Entwickler 
in einer Elektronikfirma, welche Messgeräte hergestellt hat. Ich schätze 
ganz stark, das von dort aus auch Kleinigkeiten wie das Compilen des 
privaten Projektes gemacht wurden.

von hildesheimer (Gast)


Lesenswert?

Letzer Versuch/Aufruf:

Wer sagt mir, ob und wie das unbekannte Bitmuster im Bereich 1800 - 18F6 
verwendet wird?

Es besteht einfach nicht mehr die Möglichkeit, meinen Vater zu fragen. 
Es wäre total toll, wenn sich dort mal jemand reinhängen könnte. Wenn 
jetzt aber keiner möchte oder kann, ist aber auch in Ordnung. Ich 
verstehe den Aufwand.

Grüße

von Peter Pan (Gast)


Lesenswert?

hildesheimer schrieb:
> Es wäre total toll, wenn sich dort mal jemand reinhängen könnte.

Warum nicht selbst machen? Die Infos, die du brauchst,
um das Programm zu verstehen, sind zu genüge im Netz zu finden.

Warum ist dir der Inhalt so wichtig,
wenn das Ding scheinbar auch ohne funktioniert?
Hängt Leib und Leben (Herzschrittmacher deines Vaters?) daran?

Oder ist dir die Info so viel Wert,
dass du gar ordentlich dafür bezahlen würdest?

von Reinhard Kern (Gast)


Lesenswert?

Peter Pan schrieb:
> Oder ist dir die Info so viel Wert,
> dass du gar ordentlich dafür bezahlen würdest?

Die letzten Hilites hier in den Foren waren ein Kasten Bier für 
Softwareänderung und 15 Euro für ein Layout, oder so ähnlich, das ist 
der übliche Rahmen. Kein Anreiz sich "reinzuhängen", so ein 
Reengeneering kann viele Stunden kosten.

Gruss Reinhard

von Wilhelm F. (Gast)


Lesenswert?

hildesheimer schrieb:

> Letzer Versuch/Aufruf:
>
> Wer sagt mir, ob und wie das unbekannte Bitmuster im Bereich 1800 - 18F6
> verwendet wird?

Nein, das sind keine Bitmuster, sondern sieht aus wie wichtige 
Funktionen. Es gilt jetzt nur, mal anderswo im Programm zu suchen, von 
wo aus dieser Bereich angesprungen wird. Wenn die Adressen für die 
Sprünge im RAM liegen, oder sonst wo her wie z.B. serielle 
Schnittstelle, sieht man sie so direkt nicht, als wenn Konstanten 
geladen würden.

Bspw. war das beim EMON51 so, ein Monitorprogramm. Man gab die 
Startadresse an der PC-Tastatur ein, und drückte ENTER.

Schön wäre es gewesen, wenn irgend wo im Programm die folgende 
Befehlssequenz auftauchte:
1
    MOV     DPTR, #1800h
2
    JMP     @DPTR+A

Im Grunde muß man sich da mal eine Tabelle mit sämtlichen verwendeten 
Registern machen, und den Programmablauf mit Bleistift und Papier 
Schritt für Schritt von Hand abzugehen. Das kann wirklich tagelange 
mühsame Arbeit sein. Parallel dazu beschriftet man den Code nach und 
nach mit Kommentaren, oder benennt Register und Sprungadressen mit 
sinnvolleren Namen, alles, was man so heraus findet.

Ein Simulator könnte auch noch wertvoll sein, um die Handarbeit zu 
umgehen, die auch fehlerträchtig sein kann.

Aber sei froh, daß es "nur" 8051-Code ist, das ist noch einer der 
leichtesten, schönsten, übersichtlichsten.

von Michael_ (Gast)


Lesenswert?

Stefan Müller schrieb:
> Okay, belassen wir es bei dem. Schaltbild und Funktionsbeschreibu ng ist
> nämlich vorhanden und dem nach kann man auch neu programmieren. Ich
> hatte bloß bedenken, da auch ein UART verwendet wird - wegen dem
> Datentransfer. Aber dort könnte man ja beispielsweise für Sender und
> Empfänger neue Firmware programmieren.

Hier liegt das Problem!
Ansonsten hätte ich gesagt, Wilhelm mach das.
Aber wer und warum sollte da was neues programmieren? "Sender 
u.Empfänger"?
Das ist dann nicht mehr umsonst.
Bei kleinen AVR hab ich das auch schon gemacht. Den Re-Assembler 
Ausdruck dann mit Farbstiften bearbeitet. Sprünge engesetzt, Marken und 
Datenbereiche definiert usw.
Such auch mal nach Reassembler. Aber die Logik in einem Programm mußt du 
dir schon selbst erarbeiten.

von Jobst M. (jobstens-de)


Lesenswert?

Thomas schrieb:
> Ein kleines Beispiel was ein Assem Proger nie machen würde:
>
>   mov a,scon
>   anl a,#1
>   jz  xxxx
>
> in Assembler würde man das so machen:
>   JNB RI,xxx

Es befinden sich in dem Code so einige Merkwürdigkeiten, die ich 
allerdings ehr einem schlechten Programmierer, als einem 
Hochsprachencompiler zutrauen würde.
Es ist eigentlich schon zum scheitern verurteilt, wenn ein ASM-Noob 
daher kommt und versucht diesen Code zu verstehen.


> mit einem vernüftigen Disassembler würde man vermutlich bessere
> Ergebnisse erzielen.

Nein, das ist schon das, was geschrieben wurde. Ich kann mir nicht 
vorstellen, dass irgendjemand einen Disassembler schreibt, der so 
abgefahrene Dinge einfügt.


Gruß

Jobst

von Jobst M. (jobstens-de)


Lesenswert?

Ich bin ja schon beeindruckt, wie viele Möglichkeiten es gibt, um das 
LSB in einem Byte zu testen und danach zu verzweigen. Abgefahren, diese 
alle in einem Programm unterzubringen. Ich versuche immer bei einer 
Möglichkeit zu bleiben, da dies den Code einfacher macht.

Mein bisheriger Lieblingsteil ist aber dieser:
1
xch     a,r0      ; A <-> R0 austauschen (was ist in R0?)
2
mov     a,@r0     ; hole Byte aus Speicherstelle in R0 ((42h)+(43h)) in den Akku (und überschreibe das unbekannte R0 .. *facepalm*)

Sowas macht man doch nur, um einen Codeleser zu verwirren - oder?


Gruß

Jobst

von Georg G. (df2au)


Lesenswert?

Jobst M. schrieb:
> Sowas macht man doch nur, um einen Codeleser zu verwirren

Nö, gängiger Code für indiziert laden. Der Kommentar ist aber Murks. 
Stammt der von dir oder war das Original so?

von D. V. (mazze69)


Angehängte Dateien:

Lesenswert?

Vielleicht hilfts?

von Jobst M. (jobstens-de)


Lesenswert?

Georg G. schrieb:
> Nö, gängiger Code für indiziert laden.

Es geht um die Zeile darüber. Ein MOV wäre hier klarer gewesen.

> Der Kommentar ist aber Murks. Stammt der von dir oder war das Original so?

Der Kommentar ist von mir. Hättest Du Dir hier alles durchgelesen, 
wüsstest Du das. Und warum der Murks ist musst Du mir jetzt mal 
erklären. Vielleicht solltest Du Dich aber vorher mit dem Programm 
auseinander setzen.


Gruß

Jobst

von Jobst M. (jobstens-de)


Lesenswert?

D. V. schrieb:
> Vielleicht hilfts?

PRESS KEYPAD "+" TO EXPAND

und

jnb     ACC.3, code_845 ; Accumulator

sowie

code_82A:                               ; CODE XREF: code_7FA+CEj

                                        ; code_7FA+392j

sind wirklich keine Hilfe ...


Gruß

Jobst

von Georg G. (df2au)


Lesenswert?

Jobst M. schrieb:
> um das LSB in einem Byte...
Ein Byte hat kein LSB oder MSB. Ein Byte ist ein Byte. Du verwechselst 
das mit Word.

> xch     a,r0      ; A <-> R0 austauschen (was ist in R0?)
Ob MOV oder XCH, die Wirkung ist die gleiche. Der X51 hat nur zwei 
Indexregister, R0 und R1. Also nimmt man die selten bis nie als 
permanentes Register für laufend gebrauchte Variable. R0 und R1 sind 
"Schmierzettel". Was in R0 ist, interessiert hier nicht.

> mov     a,@r0     ; hole Byte aus Speicherstelle in R0 ((42h)+(43h)) in
> den Akku (und überschreibe das unbekannte R0 .. facepalm)

Falsch. Es wird das Byte, auf das R0 zeigt (R0 ist ein Byte breit, nix 
mit 42h und 43h) in den Akku geholt.

Die beiden Befehle sind equivalent zu "MOV A, @A", ein Befehl, den X51 
nicht kennt, den man aber des öfteren braucht.

: Bearbeitet durch User
von Jobst M. (jobstens-de)


Lesenswert?

Georg G. schrieb:
> Jobst M. schrieb:
>> um das LSB in einem Byte...
> Ein Byte hat kein LSB oder MSB. Ein Byte ist ein Byte. Du verwechselst
> das mit Word.

Nein, tue ich nicht. http://de.wikipedia.org/wiki/Bitwertigkeit#LSB


>> xch     a,r0      ; A <-> R0 austauschen (was ist in R0?)
> Ob MOV oder XCH, die Wirkung ist die gleiche. Der X51 hat nur zwei
> Indexregister, R0 und R1. Also nimmt man die selten bis nie als
> permanentes Register für laufend gebrauchte Variable. R0 und R1 sind
> "Schmierzettel". Was in R0 ist, interessiert hier nicht.

Ja, schon richtig. Aber wenn zwei Register (A und R0) miteinander 
getauscht werden, fragt man sich, was nun im Akku steht, wenn man nicht 
weiß, womit R0 vorher geladen war.


>> mov     a,@r0     ; hole Byte aus Speicherstelle in R0 ((42h)+(43h)) in
>> den Akku (und überschreibe das unbekannte R0 .. facepalm)
>
> Falsch. Es wird das Byte, auf das R0 zeigt (R0 ist ein Byte breit, nix
> mit 42h und 43h) in den Akku geholt.

Habe ich nie behauptet, dass es sich um 16-Bit handelt. Ich habe Dir 
doch gesagt, dass Du Dich bitte mit dem Code auseinander setzen sollst.
In R0 steht das Ergebnis der Addition der Werte aus den Speicherstellen 
42h und 43h. Aber zum zweiten Mal: Es geht gar nicht so sehr um diese 
Zeile.

> Die beiden Befehle sind equivalent zu "MOV A, @A", ein Befehl, den X51
> nicht kennt, den man aber des öfteren braucht.

Ach!? - Das ist mir schon klar.


Gruß

Jobst

von Niklas W. (wurstknifte)


Lesenswert?

Jobst M. schrieb:
> Georg G. schrieb:
>> Jobst M. schrieb:
>>> um das LSB in einem Byte...
>> Ein Byte hat kein LSB oder MSB. Ein Byte ist ein Byte. Du verwechselst
>> das mit Word.
>
> Nein, tue ich nicht. http://de.wikipedia.org/wiki/Bitwertigkeit#LSB

Wann wird die Menschheit endlich mal Case-Sensitiv und schreibt das B 
einfach klein wenn es um Bits geht...

Die Sache erinnert mich an einen frühen Versuch von mir, den EPROM eines 
8085-Systems mit einem AVR auszulesen. Der Disassembler hat mir auch so 
komische Sachen wie
1
  mov  27h,a
2
  mov  28h,a
3
  mov  29h,a
4
  mov  70h,a
5
  mov  45h,a
6
  mov  42h,a
7
  mov  43h,a
8
  mov  41h,a
9
  mov  46h,a
10
  mov  56h,a
11
  mov  4bh,a
12
  mov  4fh,a
13
  mov  52h,a
14
  ;hier geht es noch 53 Zeilen so weiter
rausgeschmissen. Am Ende hat sich herausgestellt das ich zwei 
Datenleitungen am EPROM vertauscht hatte. Ich würde vieleicht nochmal 
überprüfen ob der Speicher richtig ausgelsen wurde (sollte das Auslesen 
hier ebenfalls auf solch unkonvetionelle Weise erfolgt sein).

von Jobst M. (jobstens-de)


Lesenswert?

Niklas W. schrieb:
> Wann wird die Menschheit endlich mal Case-Sensitiv und schreibt das B
> einfach klein wenn es um Bits geht...

Die Menschheit ist Case-Sensitiv. Bits schreibt man groß ;-) - Du hast 
es ja auch groß geschrieben.

Edit: Wenn ich von dem LSB eines Bytes rede, sollte es allerdings auch 
klar sein ...


Niklas W. schrieb:
> Ich würde vieleicht nochmal
> überprüfen ob der Speicher richtig ausgelsen wurde

Dafür ergibt mir schon zu viel einen Sinn. Auch die von mir angemeckerte 
Zeile.


Gruß

Jobst

: Bearbeitet durch User
von hildesheimer (Gast)


Lesenswert?

Niklas W. schrieb:

> Am Ende hat sich herausgestellt das ich zwei
> Datenleitungen am EPROM vertauscht hatte. Ich würde vieleicht nochmal
> überprüfen ob der Speicher richtig ausgelsen wurde (sollte das Auslesen
> hier ebenfalls auf solch unkonvetionelle Weise erfolgt sein).


Eprom wurde auf jeden Fall korrekt ausgelesen. Direkt aus der Fassung 
des Gerätes in die Fassung des Epromer's. Das Eprom wurde auch schon 
mehrfach kopiert, alles einwandfrei.

von D. V. (mazze69)


Lesenswert?

Hallo Stefan,

das Disassembling via IDA Pro war nur ein erster Versuch meinerseits, 
dir einen ersten Eindruck vom Listing zu geben.
Jobst xy hat das ja eindeutig dokumentiert, danke dafür :-)

Wäre es möglich, den Schaltplan zu posten?
Ich verfüge über eine virtuelle Simulationsumgebung, in der ich das 
Verhalten des Codes nachempfinden kann, wenn ich weiß, welche Peripherie 
an dem 80x1 angeklemmt ist. Weitere Informationen kann ich dir dann via 
PM zukommen lassen.

Falls nicht, erwirb einen china-LA für 10 Öken und vollziehe das 
Verhalten der "black box" nach, falls du für die Zukunft gewappnet sein 
möchtest.

: Bearbeitet durch User
von Bernhard S. (b_spitzer)


Lesenswert?

Irgendwie passt für mich das disassemblierte Text-File nicht zum BIN.
In der Text-Datei steht am Anfang ljmp X0250, an der Zielmarke steht 
davor org 250h. Im Bin-File steht (zumindest nach Umwandlung mit bin2hex 
aus meinem Raisonance Compiler) der Maschinencode 02 08 00, also ein 
Sprung ljmp nach 0800h... Und vor der Adresse 800 stehen im BIN auch 
reichlich FFs, an 800 steht 75 81 60, also mov SP, #60h
Kann das jemand bestätigen?

: Bearbeitet durch User
von Bernhard S. (b_spitzer)


Angehängte Dateien:

Lesenswert?

So, hab mal die HEX-Datei durch den Dissassembler von MCU8051IDE laufen 
lassen. Das Ergebnis passt zumindest zu meiner Vermutung...

: Bearbeitet durch User
von D. V. (mazze69)


Lesenswert?

Bernhard Spitzer schrieb:
> So, hab mal die HEX-Datei vom Dissassembler von MCU8051IDE laufen
> lassen. Das Ergebnis passt zumindest zu meiner Vermutung...

Wo laufen lassen? Hast du ein CompuBoard dafür benutzt, oder hast du 
einen eigenen Simulator geschrieben?
Zeig mal dein Ergebnis bitte, worauf du dich beziehst.

von Wilhelm F. (Gast)


Lesenswert?

Dieses BIN-File weit oben konnte ich aber auch nicht vernünftig lesen.

Es wäre nett, wenn der TO das eingelesene EPROM gleich als Hex-File zur 
Verfügung stellte, damit diesbezüglich auch alle Mißverständnisse 
ausgeräumt sind. Ein EPROMMER kann in der Regel ein eingelesenes EPROM 
auch in anderen Formaten als BIN wieder geben, z.B. S1F oder Intel HEX. 
BIN ist nun wirklich das allerschlechteste Format, diese beiden letzt 
genannten ASCII-Formate wären erheblich besser.

von Bernhard S. (b_spitzer)


Angehängte Dateien:

Lesenswert?

Nö, ich habe die angehängte Datei mit Bin2Hex aus meinem Compiler 
umgewandelt und in FLIP geladen. Da war in der HEX-Ansicht in FLIP schon 
an den ersten 3 Bytes erkennbar, dass irgend was nicht mit dem zuerst 
geposteten Code übereinstimmt.
Auf der Suche nach einem Disassembler kam ich auf den Hinweis, das 
MCU850IDE bereits einen enthält (habe ich erst kurz installiert). Also 
dort auf Tools/Disassemble und dann die HEX-Datei disassembliert. 
Ergebnis hängt ja oben an.
Eben habe ich auch nochmal in MCU8051IDE mit Tools/Bin->Hex den selben 
Vorgang nochmal ausprobiert, selbes Ergebnis: der ljmp geht nach 0800h 
und dort steht mov SP, #60h

EDIT: im Anhang ist jetzt die umgewandelte HEX-Datei

: Bearbeitet durch User
von D. V. (mazze69)


Lesenswert?

Wilhelm F. schrieb:
> Es wäre nett, wenn der TO das eingelesene EPROM gleich als Hex-File zur
> Verfügung stellte

Warum? Nichts ist sauberer als ein Binary-File.
Die angeschlossene Peripherie ist weiterhin unbekannt.

: Bearbeitet durch User
von Jobst M. (jobstens-de)


Lesenswert?

Ich habe langsam den Eindruck, als wenn es sich um (mindestens) zwei 
verschiedene Programme handelt.

Der Speicherbereich um 60h ist bei dem 'anderen' Programm der UART 
Empfangsfifo (oder wie man das nennen möchte) ...

Ich kann mir nicht vorstellen, dass sich der Stack darauf bewegen soll 
...


Gruß

Jobst

von Wilhelm F. (Gast)


Lesenswert?

Bernhard Spitzer schrieb:

> EDIT: im Anhang ist jetzt die umgewandelte HEX-Datei

OK, die sieht auch einwandfrei aus.



D. V. (mazze69) schrieb:

Warum? Nichts ist sauberer als ein Binary-File.

Im Augenblick habe ich leider keinen Editor installiert, der BIN 
einwandfrei dar stellt. In Word Pad sieht es jedenfalls wie Mist aus. 
Werde ich mal nach holen.

Meine Frage nach Intel-Hex-Format kam deswegen, weil ich noch einen 
ollen Disassembler für 8051 irgendwo herum fliegen habe, aus dem Jahr 
1991, vom selben Hersteller (Ashling Microsystems), der für Intel selbst 
im Auftrag auch den ersten 8051-Makroassembler schrieb. Das Ding läuft 
wiederum nur über das Programm DOSbox, eine virtuelle DOS-Maschine, ist 
für heutige Maßstäbe nicht so komfortabel, und benötigt als Input eben 
genau das Intel-Hex-Format, kein BIN.

von Jobst M. (jobstens-de)


Lesenswert?

Jobst M. schrieb:
> Ich habe langsam den Eindruck, als wenn es sich um (mindestens) zwei
> verschiedene Programme handelt.
>
> Der Speicherbereich um 60h ist bei dem 'anderen' Programm der UART
> Empfangsfifo (oder wie man das nennen möchte) ...

Ach Quark habe ich geschrieben ... Der Fifo ist ab 3Ch - das sind 60 
dezimal ...


Gruß

Jobst

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

hildesheimer schrieb:
> Eprom wurde auf jeden Fall korrekt ausgelesen. Direkt aus der Fassung
> des Gerätes in die Fassung des Epromer's. Das Eprom wurde auch schon
> mehrfach kopiert, alles einwandfrei.

Sicher, dass das EEPROM auch korrekt an den Prozessor angeschlossen ist?
Einem EEPROM ist es egal, wie die Adressen und Daten angeschlossen sind.
A0 muss nicht zwingend A0 sein, sondern könnte am Prozessor auch an A7 
angeschlossen sein. Das gleicht gilt auch für die Daten.

Sowas wurde früher gerne als Ausleseschutz gemacht. Mit einem "normalen" 
Programmer bekommt man nur noch Zahlensalat, aber kein sinnvolles 
Programm.

von Reinhard Kern (Gast)


Lesenswert?

Christian H. schrieb:
> Mit einem "normalen"
> Programmer bekommt man nur noch Zahlensalat, aber kein sinnvolles
> Programm.

Naja, dann muss man halt für 8 Daten und 8 Adressen 20 billionenmal 
disassemblieren, und nimmt dann das sinnvollste. Ist so oder so ein 
Geduldspiel.

Gruss Reinhard

von Wilhelm F. (Gast)


Lesenswert?

Christian H. schrieb:

> hildesheimer schrieb:
>> Eprom wurde auf jeden Fall korrekt ausgelesen. Direkt aus der Fassung
>> des Gerätes in die Fassung des Epromer's. Das Eprom wurde auch schon
>> mehrfach kopiert, alles einwandfrei.
>
> Sicher, dass das EEPROM auch korrekt an den Prozessor angeschlossen ist?
> Einem EEPROM ist es egal, wie die Adressen und Daten angeschlossen sind.
> A0 muss nicht zwingend A0 sein, sondern könnte am Prozessor auch an A7
> angeschlossen sein. Das gleicht gilt auch für die Daten.

Man kann hardwareseitig die Adressen und auch Daten eines EPROM 
vertauschen, z.B. so daß keine Kreuzungen mehr auf der Platine sind. 
Technisch kein Problem. Die Arbeit hat man dann aber dem entsprechend 
anderweitig in der Umgestaltung der Brenndaten.

Ich sah bisher noch nie eine Platine, wo das mal so gemacht wurde.

von Jobst M. (jobstens-de)


Lesenswert?

Wilhelm F. schrieb:
> Ich sah bisher noch nie eine Platine, wo das mal so gemacht wurde.

Ich schon.

Aber das ist hier nicht der Fall!
Die Daten ergeben einen Sinn!


Gruß

Jobst

von Wilhelm F. (Gast)


Lesenswert?

Jobst M. schrieb:
> Wilhelm F. schrieb:
>> Ich sah bisher noch nie eine Platine, wo das mal so gemacht wurde.
>
> Ich schon.
>
> Aber das ist hier nicht der Fall!
> Die Daten ergeben einen Sinn!
>
>
> Gruß
>
> Jobst

Eben. Sonst würde bestimmt was ganz anderes dar gestellt, als 
8051-Assemblercode.

von Jobst M. (jobstens-de)


Lesenswert?

Wilhelm F. schrieb:
> Eben. Sonst würde bestimmt was ganz anderes dar gestellt, als
> 8051-Assemblercode.

Haha! :-)

Nein, ich meinte auch, dass die Zusammenhänge Sinn ergeben.


Gruß

Jobst

von Michael_ (Gast)


Lesenswert?

Wilhelm F. schrieb:
> Das Ding läuft
> wiederum nur über das Programm DOSbox, eine virtuelle DOS-Maschine, ist
> für heutige Maßstäbe nicht so komfortabel, und benötigt als Input eben
> genau das Intel-Hex-Format, kein BIN.

Die Umwandlung ist doch kein Problem!
Was wir hier benötigen ist ein ....Bin oder IntelHex File. Alles andere 
ist sinnlos.
Nein, den 8031 kenn ich noch nicht.
Aber Programmcode vom Müll zu trennen, trau ich mir noch zu.

von Thomas (Gast)


Lesenswert?

nun wir haben hier jetzt schon die unterschiedlichsten Versionen des 
Codes und auch noch mut unterschiedlichem Inhalt gesehen haben aber 
immer noch keinen Schaltplanauszug. Wieso sollte sich jemand der Ahnung 
von der Materie hat mit sowas beschäftigen?
Für mich ist jetzt solange Ende, solange kein Schaltplan und eine 
finlale Version des Eprom Inhalts im Bin Format (8k) für ein 2764 Eprom 
vorliegt.
Man vergleiche nur das 1. Disasm Listing mit den späteren Versionen.
Das ist doch alles nur Rätselraten.

Noch ein Hinweis:
LJMP 0800h beim Reset ist der typ Init für DemoVersionen z.B des Keil C 
compilers.

Mehr gibts erst nach vollständiger Info....

Thomas

von Georg G. (df2au)


Lesenswert?

Thomas schrieb:
> LJMP 0800h beim Reset ist der typ Init für DemoVersionen z.B des Keil C
> compilers.

Dagegen spricht zum einen, dass durchaus auf Code Bestandteile unterhalb 
0x800 zugegriffen wird und auch der Code sieht eher nicht nach Keil-C 
aus.

Aber mit dem Schaltbild hast du Recht. Ohne Kenntnis der Peripherie ist 
es Blödsinn, auch nur eine Stunde für den ReAsm zu verschwenden. 
Ansonsten sind die 2k oder so echter Code (vieles sind nur Tabellen) 
eine Fingerübung für einen Abend.

von Hildesheimer (Gast)


Lesenswert?

Schaltplan muss erst digitalisiert werden. BIN für 2764 8k ist oben 
bereits vorhanden, Schlaumeier.

von Wilhelm F. (Gast)


Angehängte Dateien:

Lesenswert?

So, ich habe 2017.HEX von Bernhard Spitzer mal in DISA51 geladen, und 
disassembliert. Heraus kam das Log-File 2017.LOG im Anhang, welches aber 
eine ganz normale Textdatei ist.

Die Darstellung sieht etwas anders aus, als im Disassembly 2017.TXT 
weiter oben.

Auch die Inhalte scheinen unterschiedlich zu sein, das werde ich mir 
später noch mal anschauen.

von hildesheimer (Gast)


Lesenswert?

Das sieht doch schön aus!

(Ich will hier gar keine komplette Aufschlüsselung ...)

Aber kann man jetzt ab 1800 bis 18F6 nicht erkennen, was dort "abgeht" ?

Grüße

von Thomas (Gast)


Lesenswert?

> bereits vorhanden, Schlaumeier.
ja ich bin ein Schlaumeier und weist du was dass Ding wäre schon lange 
gegessen, wenn du die Infos bereitstellen würdest. Wenn ich mich richtig 
erinnere bist es du doch der die Kiste nicht blickt oder?
Es gibt hier einige die von sowas Ahnung haben!
Wie hat jemand geschrieben: "Fingerübung für einen Abend".
Was mir schon so oft hier aufgefallen ist:
Die Frager glänzen durch grandiose Ignoranz und werden auch noch pampig 
wenn Ihnen manche Antworten nicht gefallen. Alles in allem halt 
Zeitverschwendung

Wie auch immer such dir doch die Infos selber zusammen.

@Wilhlem
ein Dissassember der keine Labels verwaltet braucht kein Mensch. Wie 
schon vorher geschrieben Disassember gibt es auch in richtig. Es muss ja 
nicht gleich IDA Pro sein.

Thomas

von Georg G. (df2au)


Lesenswert?

hildesheimer schrieb:
> Aber kann man jetzt ab 1800 bis 18F6 nicht erkennen, was dort "abgeht" ?

Es ist zumindest kein sinnloses Durcheinander von Bits. Der 
resultierende X51 Code sieht nach Überresten eines Debug Monitors aus, 
die beim Brennen des Eproms noch zufällig im RAM waren. Die Schnipsel 
enden alle mit Selbstmord, was darauf hin deutet, dass sie nicht zum 
"Wirkcode" gehören.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Hildesheimer schrieb:
> Schaltplan muss erst digitalisiert werden.

Einfach die Handzeichnung mit dem Scanner einlesen, schon ist der 
Schaltplan digitalisiert....

von Wilhelm F. (Gast)


Lesenswert?

Thomas schrieb:

> @Wilhlem
> ein Dissassember der keine Labels verwaltet braucht kein Mensch. Wie
> schon vorher geschrieben Disassember gibt es auch in richtig. Es muss ja
> nicht gleich IDA Pro sein.
>
> Thomas

Und ich glaubte schon, wir brauchten hier Leute, die behilflich sind. 
Nicht solche, die anderer Leute Dinge anmeckern.

;-)

von Wilhelm F. (Gast)


Lesenswert?

So, ich hatte das 2017.HEX inzwischen auch mal im Simulator, und einen 
Breakpoint bei 1800h gesetzt, dann einfach gestartet. Dieser Bereich 
wurde nach ein paar Minuten Laufzeit von selbst nie erreicht.

Zu Fuß bin ich den Code im Augenblick jetzt nicht mehr (bzw. noch nicht) 
durch gegangen. Drei Pins am P1 klapperten etwas, da hängt also außen 
bestimmt was dran. Es wäre noch möglich, daß eine äußere Beeinflussung 
an den Pins oder über die serielle Schnittstelle woanders hin verzweigt, 
aber so weit war ich noch nicht.

von hildesheim (Gast)


Lesenswert?

Danke!
Es ist für mich so wichtig, zu wissen, ob dieser Bereich in irgendeiner 
Weise "mal" im Programmablauf benötigt wird.

Wichtig deswegen, weil ich gerade eine neue Firmware schreibe und eben 
nach dem Schaltplan alles nachbilden kann. Aber ein "Bereich", der im 
Eprom gar nicht nötig ist - trotzdem aber Funktionales in sich hat, ist 
dann eben sehr interesant.

von Zweifler (Gast)


Lesenswert?

Es gibt keinen Schaltplan, noch was an den Pins hängt,
noch was das Ding eigentlich macht, nur eine mehrfache Aussage,
dass man den Vater (Ersteller des Programms?) nicht mehr fragen kann.
Realname Pustekuchen.

Warum werde ich das Gefühl nicht los, dass da jmd. nur
einen Dummen sucht, der für einen die Arbeit macht
oder sonst etwas faul an der Sache ist...

Demnächst wird das Gerät dann mit einer neuen, aktuellen Hardware
gewinnbringend vermarktet...

von Zweifler (Gast)


Lesenswert?

Realname stimmt nicht, war oben noch vorhanden,
ist dann aber dazwischen irgendwann verloren gegangen...

von Wilhelm F. (Gast)


Lesenswert?

hildesheim schrieb:

> Danke!
> Es ist für mich so wichtig, zu wissen, ob dieser Bereich in irgendeiner
> Weise "mal" im Programmablauf benötigt wird.

Noch ist ja längst nicht alles klar. Ein Schaltplan wäre nett, ansonsten 
hänge ich hier auch nur mit halber Kraft dran, wie ein Auto im Standgas 
bzw. Leerlauf, und ich habe keine Ahnung vom Ziel.

Übrigens brannte ich auch schon mal mehr als ein völlig unabhängiges 
Programm in ein EPROM. Die Programme waren dann mit einem Jumper oder 
DIP-Schalter auf der Platine auswählbar. Vielleicht ist dein Fall ja 
auch sowas.

von Jobst M. (jobstens-de)


Lesenswert?

hildesheim schrieb:
> Danke!
> Es ist für mich so wichtig, zu wissen, ob dieser Bereich in irgendeiner
> Weise "mal" im Programmablauf benötigt wird.

Der Bereich wird nur einmal im Jahr zum Jahreswechsel durch einen 
externen Interrupt von der HW-Uhr ausgeführt ... oder so ...


Gruß

Jobst

von Wilhelm F. (Gast)


Lesenswert?

Wir warten ja noch auf einen Schaltplan. ;-)

von Jobst M. (jobstens-de)


Lesenswert?

Das ist das, was ich damit sagen möchte ;-)

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.