Forum: Compiler & IDEs 8051 Disassembler


von Thomas W. (weyerma)


Lesenswert?

Hallo zusammen

Ich wollte mal hier nachfragen ob jemand mit den 8051 disassemblern 
erfahrung hat. Konkret geht es um folgendes projekt: 
http://wp.visuanetics.nl/oled-display-for-alpha-juno-2/ ich habe aber 
die Alpha Juno 1 Version, daher müsste ich das selbe mit meiner Firmware 
machen um ein OLED Display verwenden zu können.
Das EEprom hab ich bereits eingelesen in ein bin file.
Dieses habe ich dann versucht mit dem d52 zu disassemblen. Jedoch habe 
ich dann weder richtige labels oder sonst was. Gibt es da einen 
einfacheren weg um die #0C0h Sprünge zu entfernen ?

Gruss,
Thomas

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Thomas W. schrieb:
> Jedoch habe ich dann weder richtige labels

Woher soll der Disassembler auch wissen, wie die heißen sollen?

von Georg G. (df2au)


Lesenswert?

Thomas W. schrieb:
> weg um die #0C0h Sprünge zu entfernen

Seit Jahrzehnten programmiere ich mit dem MCS51, aber ich gestehe, dass 
ich mit deiner Aussage nichts anfangen kann. Was ist ein #0c0h Sprung?

Generell gilt, dass nach dem ersten Disassembler Lauf etwa 0.1% der 
Arbeit erledigt sind. Das Rückwandeln in lesbaren Quelltext kostet viel 
Geduld und Einfühlungsvermögen.

von Peter D. (peda)


Lesenswert?

Viele Disassembler können keine konstanten Daten im Code erkennen, d.h. 
Werte und Texte werden in ein Befehlschaos umgewandelt, wobei die 
Synchronisation verloren gehen kann (8051: 1..3 Byte je Befehl).

von Georg G. (df2au)


Lesenswert?

Ein alternativr Weg wäre gewesen, das BIN-File hier zu posten, damit ein 
Mitleser "seinen" Disassembler darauf loslassen kann.

Es gibt Disassembler, die mehrere Durchläufe machen und damit interaktiv 
ein Steuerfile aufbauen, in dem diese "Stolperfallen" passend definiert 
werden. Disassemblieren ist immer ein mehrstufiger Prozess. Einfach mal 
ein Programm auf den Code loslassen und fertig ist Träumerei.

Beispiel "GD8051":
     :The 'controlfile' consists of entries of the form:-
     :# any line beginning with a '#' is a comment
     :Hd 1234 'header' -or- title of a subroutine
     :Cc 1234 this comment is tagged onto the line with this address
     :Cb 1234 this comment is written before the line with this address
     :Wc 1234:26     # defines word data, start address and count
     :Wo 1234        # defines word data
     :Wo 1234-1288   # defines range of word data
     :Lb 1234[,3456] # user defined label
     :Tx 1234,12     # defines text string and its length
     :Az 1234        # defines ascii zero terminated string
     :En 1234        # defines code entry address
     :En 1234[,2345] # defines list of code entry addresses
     :Er 1234;1256;3 # defines range of code entry addresses
     :Nw 1234 Word_Count  # defines name of ROM/external RAM address
     :Ni 56   Byte_Count  # defines internal RAM address name

von Amateur (Gast)


Lesenswert?

Alles, was einen textlichen Bezug hat: Also Die Namen von Funktionen, 
Bezeichnungen von Variablen und Konstanten oder auch von Sprungadressen 
sind nicht im Programm enthalten.
Oft muss (viel) von Hand noch nachgearbeitet werden, da nicht immer klar 
ist, ob der Teil, der gerade disassembliert wurde, überhaupt Code ist, 
oder textliche bzw. numerische Konstanten enthält.
Sisyphos lässt grüßen.

von Thomas W. (weyerma)


Angehängte Dateien:

Lesenswert?

Ok, vielen Dank für all eure Antworten.
Ich sehe schon, ich hab mir das wohl etwas zu einfach vorgestellt.
Ich dachte man könne einfach aus dem dissasemblierten code die werte 
entfernen, welche den Zeilensprung auf dem Display ausgeben und den code 
dann wieder assemblieren.
Ich habe sonst mal das BIN file angehängt.

Gruss,
Thomas

von Lothar (Gast)


Lesenswert?

Anderer Vorschlag:

Zunächst das BIN nach HEX konvertieren:

srec_cat JU-1_1-1.bin -binary -offset 0 -o JU-1_1-1.hex -intel

http://srecord.sourceforge.net/

Dann in einem Simulator ansehen: Scheint ja kein langes Programm zu sein

http://www.edsim51.com/

von Thomas W. (weyerma)


Lesenswert?

Hey vielen Dank Lothar :-)
Ich werde das mal so versuchen.

von (prx) A. K. (prx)


Lesenswert?

Georg G. schrieb:
> Das Rückwandeln in lesbaren Quelltext kostet viel
> Geduld und Einfühlungsvermögen.

Alternative: Die Einsprungstellen für den zu ändernden Code finden und 
auf den neuen Code in einem bisher ungenutzen Bereich vom ROM umleiten. 
Dann muss man den bestehenden Code nur so weit analysieren können, dass 
man diese Stellen findet. Zu echtem Quellcode umständlich 
rückzuübersetzen ist unnötig, im Binary patchen können reicht.

von reas (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe das mal durch den IdaPro geschoben und ihm dabei ein wenig auf 
die Sprünge geholfen. Sieht schon ganz gut aus, wobei es bestimmt noch 
Stellen gibt, bei denen Daten/Code zugeordnet sein können. Kann man 
durch viel Arbeit noch leserlicher machen, aber das hier hat schon lange 
genug gedauert.

von reas (Gast)


Lesenswert?

Mist, zu früh abgeschicket:

...bei denen Daten/Code falsch zugeordnet sein können....

Im Anhang ist das gezippte Listing, ich hoffe, es erleichtert die Arbeit 
etwas

von Route_66 H. (route_66)


Lesenswert?

reas schrieb:
> Mist, zu früh abgeschicket:

Wenn du keine Antworten bekommst liegt es wahrscheinlich daran, dass 
hier niemand gern ein fremdes ".ZIP" öffnet!

von reas (Gast)


Lesenswert?

Route 6. schrieb:
> Wenn du keine Antworten bekommst liegt es wahrscheinlich daran, dass
> hier niemand gern ein fremdes ".ZIP" öffnet!

Oh Gott, mir kommen gleich die Tränen.

Selbst wenn es ein Virus wäre, hast du nach dem Entpacken dann nur den 
entpackten Virus. Der tut, solange du ihn nicht ausführst, erstmal 
überhaupt nichts.
Wenn man allerdings nicht in der Lage ist, diese Zusammenhänge richtig 
zu verstehen, hat man allerdings ein Problem.

Entpackt sind es über 600kB, das muss man dem Server nicht antun

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Route 6. schrieb:
> dass hier niemand gern ein fremdes ".ZIP" öffnet!

Blödsinn.

von Route_66 H. (route_66)


Lesenswert?

Rufus Τ. F. schrieb:
> Route 6. schrieb:
>> dass hier niemand gern ein fremdes ".ZIP" öffnet!
>
> Blödsinn.

O.K. ich habe mich getraut, obwohl ich reas (Gast) nicht kenne.

Thomas W. schrieb:
> Dieses habe ich dann versucht mit dem d52 zu disassemblen. Jedoch habe
> ich dann weder richtige labels oder sonst was. Gibt es da einen
> einfacheren weg um die #0C0h Sprünge zu entfernen ?

Das Binary ist ein BASCOM8051 Kompilat.
Was ist jetzt genau deine Aufgabenstellung?
Was verstehst du unter "#0C0h Sprünge"? Der 8051 macht bei 0C0h einen 
PUSH ,bei Adresse 00C0h steht nicht wirklich ein sinnvoller 
Einsprungpunkt und wird auch nirgends im Binary augerufen.
Was willst du statt dessen?

gerade erst gesehen:
> Wenn man allerdings nicht in der Lage ist, diese Zusammenhänge richtig
> zu verstehen, hat man allerdings ein Problem.
Ich würde meine Hilfe gern zurückziehen, du A... (Eigenzensur)

: Bearbeitet durch User
von mads (Gast)


Lesenswert?

Thomas W. schrieb:
> Dieses habe ich dann versucht mit dem d52 zu disassemblen. Jedoch habe
> ich dann weder richtige labels oder sonst was. Gibt es da einen
> einfacheren weg um die #0C0h Sprünge zu entfernen ?

Du musst schon selbst identifizieren, was welche Funktion hat. Dann 
kannst du ein *.ctl-File schreiben und dem d52 übergeben, z.b. Zeilen 
wie:
1
l 193e tramp_dyn

lösen dir in der Disassembly die Labels auf und machen die Dinge 
lesbarer.
Google sonst mal nach 'dpf-ax', da wurde einiges an Reverse-Engineering 
betrieben (uinkl. Beispiele).

von Route_66 H. (route_66)


Lesenswert?

Route 6. schrieb:
> Das Binary ist ein BASCOM8051 Kompilat.

Korrektur: Stimmt nicht.
Ich weiss jetzt auch, was das #0C0h Problem ist.
Ich hätte es anders, nämlich genau einmal gelöst, und nicht überall im 
Quelltext verstreut.

: Bearbeitet durch User
von Peter (Gast)


Lesenswert?

Route 6. schrieb:
> Ich weiss jetzt auch, was das #0C0h Problem ist.

Und das wäre?

von Mario M. (thelonging)


Lesenswert?

Das Original-Display ist HD44780 kompatibel und dort ist #C0h der Befehl 
zum Adressieren der zweiten Zeile. Der TO möchte aber ein neues Display 
verwenden, bei dem die Adressen anders sind. Deshalb muss er jetzt bei 
allen Text-Ausgaben den Befehl in #88h ändern. Erschwerend kommt hinzu, 
dass teilweise auch andere Koordinaten über Berechnungen adressiert 
werden. Also muss man das Programm disassemblieren und verstehen, die 
entsprechenden Stellen finden und dann das Binary patchen oder auch das 
Disassemblat ändern und zurückübersetzen.

von Thomas W. (weyerma)


Angehängte Dateien:

Lesenswert?

Hi zusammen,

Vielen Dank für eure Antworten.
Ich habs jetzt mit der Hilfe von Georg hinbekommen, das binary mit dem 
GD8051 zu disassemblieren und mit dem as31 wieder zu assemblieren, das 
binary auf das Eeprom zu brennen und es läuft wieder.

Jedoch ist es genau so wie Mario schreibt... es ist wirklich Pain pur... 
das zeug ist über den ganzen code verstreut.
Ich habe schon beides probiert... einfach mal alle #C0h mit #88h zu 
ändern und auch die anderen Werte die #C0h überschreiten anzupassen um 
#38h kleiner.
Oder systematisch der Funktion für die Displayausgabe nachzugehen.
Das wäre hier O1153 und nur dort die werte anzupassen.

Mit der 1. Variante bin ich am weitesten gekommen, jedoch weiss ich 
nicht wirklich was ich sonst noch alles geändert habe ;-) mit der 2. 
funktioniert nur die hälfte der Displayausgabe richtig.
Ich finde das ist extrem verstreut. Ich hab das ASM file mal 
angehängt... die Änderungen sind mit ;-- kommentiert.

von Thomas W. (weyerma)


Lesenswert?

Mal noch eine andere Frage dazu, wüsste ev. jemand von euch ein mit dem 
originalen HD44780A00 kompatibles OLED welches ja auch ein 16x1 sein 
müsste aber wie ein 16x2 angesteuert wird ?
Dann würde ich nämlich einfach ein anderes Display nehmen.

Gruss,
Thomas

von Thomas W. (weyerma)


Lesenswert?

Thomas W. schrieb:
> müsste aber wie ein 16x2 angesteuert wird ?

Sorry ich meine natürlich ein 8x2...

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.