Forum: Mikrocontroller und Digitale Elektronik pic - wie aus hex-file asm code machen?


von uli (Gast)


Lesenswert?

Hallo,
Ich habe von einem Pic den code als hex-file.
Jetzt die grosse frage an die pic freunde:
Wie kann man daraus ein compilierbaren asm code machen?

Viele grüsse, uli

von Teo D. (teoderix)


Lesenswert?

Das Hexfile ist bereits ein compilierter Assembler Code.
Disasembling geht (irgend wie) im MPLAB X.....

von tommy (Gast)


Lesenswert?

Mit einem Disassembler

Google: Pic Disassembler

von michael_ (Gast)


Lesenswert?

Bin zwar kein Pic-Freund.

Aber das macht man mit einem Reassembler.
Wenn er in Assembler programmiert wurde, hast du reale  Chancen.

von c-hater (Gast)


Lesenswert?

michael_ schrieb:

> Aber das macht man mit einem Reassembler.
> Wenn er in Assembler programmiert wurde, hast du reale  Chancen.

Auch wenn das Teil in in einer Hochsprache programmiert wurde, kann ein 
richtiger Assemblerprogrammierer natürlich mit dem Disassemblat etwas 
anfangen.

Lustig ist: der Code wirklicher Assemblerprogrammierer ist in vielen 
Aspekten genau so "unleserlich" wie der angeblich "optimierte" Code der 
Compiler. Nur eben trotzdem deutlich schneller...

von W.S. (Gast)


Lesenswert?

uli schrieb:
> Wie kann man daraus ein compilierbaren asm code machen?

Garnicht. Assemblercode wird assembliert und nicht compiliert. Das ist 
ein Unterschied im Grundsatz: zu jedem Assemblerbefehl gibt es genau 
einen Maschinenbefehl - bei allem, was compiliert wird, gibt es so eine 
Zuordnung nicht.

Und um aus einem Hexfile einen Assembler-Quellcode zu machen, schreibst 
du dir einfach einen Disassembler. Sind ja nur etwa 35 verschiedene 
Befehle.

Ja, als Programmierer sollte man sowas können - jedenfalls für eine 
übersichtliche Architektur wie die der kleinen PIC's (vorausgesetzt, du 
meinst PIC16xxx oder PIC18xxx und keine PIC32...)

W.S.

von uli (Gast)


Lesenswert?

Hat der wirklich nur 35 befehle? Ist der aber mal einfachgebaut!

Da könnte ich mir wirklich einen disasembler schreiben.
Wenn ich es jetzt richtig gesehen habe dann kostet das teil für die  pic 
18 ja was, nicht schön.
Wenn es keine andere möglichkeit gibt ist selber schreiben angesagt.
Habe zumglück sowas für einen 8048 oder 8051 mal gemacht, nur wo das 
ganze ist?  Wird eine nette suche.
Vg, uli

von uli (Gast)


Lesenswert?

Mist habe doch die freien tools übersehen.
Muss nun einige davon testen.

von Wolfgang (Gast)


Lesenswert?

W.S. schrieb:
> Garnicht. Assemblercode wird assembliert und nicht compiliert. Das ist
> ein Unterschied im Grundsatz: zu jedem Assemblerbefehl gibt es genau
> einen Maschinenbefehl - bei allem, was compiliert wird, gibt es so eine
> Zuordnung nicht.

Sagt wer? Steht irgendwo geschrieben, dass ein Compiler keine 1:1 
Umsetzung des Codes in Maschinenbefehle machen darf?

von Ömer (Gast)


Lesenswert?

Wolfgang schrieb:
> W.S. schrieb:
>> Garnicht. Assemblercode wird assembliert und nicht compiliert. Das ist
>> ein Unterschied im Grundsatz: zu jedem Assemblerbefehl gibt es genau
>> einen Maschinenbefehl - bei allem, was compiliert wird, gibt es so eine
>> Zuordnung nicht.
>
> Sagt wer? Steht irgendwo geschrieben, dass ein Compiler keine 1:1
> Umsetzung des Codes in Maschinenbefehle machen darf?

Was schreibst du jetzt von Code - Maschinenbefehl? W.S.  schrieb von 
Assemblerbefehl- Maschinenbefehl.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

W.S. schrieb:
> zu jedem Assemblerbefehl gibt es genau einen Maschinenbefehl - bei
> allem, was compiliert wird, gibt es so eine Zuordnung nicht.
Dann sind Makroassembler also eigentlich Compiler...

@uli: ein Disassembler macht aus dem Hexfile zwar wieder einen 
Assemblertext, aber den kann dann nur ein langjähriger 
Assemblerprogrammierer mit Aufwand wieder entschlüsseln,  weil natürlich 
alle lesbaren und klingenden Namen für Variablen, Unterprogramme, 
Sprungmarken usw. durch nichtssagende Buchstaben-Zahlen-kombinationen 
ersetzt wurden.
Und das mag noch gehen, wenn ein Mensch das programmiert hat. Wenn es 
aber das Ergebnis eines Compiliers ist: vergiss es.

: Bearbeitet durch Moderator
von Klaus (Gast)


Lesenswert?

Lothar M. schrieb:
> Dann sind Makroassembler also eigentlich Compiler...

Wenn man es so nennen will, ja. So auf dem Niveau Bascom. Am Anfang war 
C++ auch nur Preprozessor Macros

MfG Klaus

von Wolfgang (Gast)


Lesenswert?

Ömer schrieb:
> Was schreibst du jetzt von Code - Maschinenbefehl?

Nenn es von mir aus Assembler-Code. Das sind human-readable 
Bezeichnungen für die (binären) Maschinenworte mit einer Syntax für 
Adressierungsart, Argumente, Sprungziele, Einsprungstellen usw. ;-)
Auch stehen im Assembler Code eher keine absouluten Adressen, d.h. 
zwischen Assembler-Code und in den Programmspeicher des Prozessor 
geladene Binärdaten passiert noch ein bisschen was.

Sprachlich wird "assemble" auch als Synonym für "compile" angegeben
http://www.thesaurus.com/browse/compile

von Wolfgang (Gast)


Lesenswert?

W.S. schrieb:
> Das ist ein Unterschied im Grundsatz: zu jedem Assemblerbefehl gibt es
> genau einen Maschinenbefehl

Wo hast du das gelesen oder was meinst du mit "Maschinenbefehl"?

Je nach Adressierungsart kann der Binärcode zu ein und dem selben 
Assemblerbefehl deutlich unterschiedlich aussehen.

Beispiel 6502:
Assemblerbefehl LDA,
Binärcode je nach Adressierungsart
$A9, $A5, $B5, $AD, $BD, $B9, $A1 oder $B1)

http://www.6502.org/tutorials/6502opcodes.html#LDA

von nopic-noanswer (Gast)


Lesenswert?

Guten Morgen,

ich entschuldige mich für die offenen Worte, aber ihr, die bisherigen 
Antworter, habt ein ganz schönes Ding an der Klatsche, wenn ich das mal 
so sagen darf! Nur Selbstdarsteller!

Statt hier einfach den Namen eines vorzugsweise kostenlosen 
pic-Dissassemblers zu nennen, mit dem ihr vielleicht gute Erfahrungen 
gemacht habt, oder dessen Fehlleistungen, Schwächen ihr kennt und 
benennen könnt, kommt hier nur nutzloses geschwurbel.

Ulli hat

uli schrieb:
> zumglück sowas für einen 8048 oder 8051 mal gemacht

damit wird er wohl wissen was er tut und die Fragestellung war nur 
anfangs etwas unspezifisch formuliert.

Mit Wortklauberei, die letztendlich zu der richtungweisenden Erkenntnis 
führt, daß ein Makroassembler so etwas wie ein Bascomcompiler ist, ist 
doch wirklich niemandem geholfen, oder was?


ps ja ich habe schlecht geschlafen, die Nacht war schliesslich viel zu 
kurz...

von Ömer (Gast)


Lesenswert?

Wolfgang schrieb:
> Sprachlich wird "assemble" auch als Synonym für "compile" angegeben
> http://www.thesaurus.com/browse/compile

Neben 28 anderen Möglichkeiten.

Wolfgang schrieb:
> Je nach Adressierungsart kann der Binärcode zu ein und dem selben
> Assemblerbefehl deutlich unterschiedlich aussehen.
>
> Beispiel 6502:
> Assemblerbefehl LDA,
> Binärcode je nach Adressierungsart
> $A9, $A5, $B5, $AD, $BD, $B9, $A1 oder $B1)

Genau und mit unterschiedlichen Adressen gibt es noch viel mehr 
Binärcodes, oder?

nopic-noanswer schrieb:
> Mit Wortklauberei, die letztendlich zu der richtungweisenden Erkenntnis
> führt, daß ein Makroassembler so etwas wie ein Bascomcompiler ist, ist
> doch wirklich niemandem geholfen, oder was?

Wortklauberei hilft Wolfgang den Tag zu überstehen. Ich halte mich an

https://de.wikipedia.org/wiki/Compiler oder
https://de.wikipedia.org/wiki/Assembler_(Informatik) bzw
https://de.wikipedia.org/wiki/Assemblersprache

von Volker S. (vloki)


Angehängte Dateien:

Lesenswert?

Teo D. schrieb:
> Disasembling geht (irgend wie) im MPLAB X.....

File->Import Hex
dann
Window->PIC Memory Views->Program Memory

von Bernd K. (prof7bit)


Lesenswert?

Lothar M. schrieb:
> durch nichtssagende Buchstaben-Zahlen-kombinationen
> ersetzt wurden.
> Und das mag noch gehen, wenn ein Mensch das programmiert hat. Wenn es
> aber das Ergebnis eines Compiliers ist: vergiss es.

Das hängt immer vom Skill-Level des Reverse-Engineers ab und den 
Werkzeugen die er zur Verfügung hat, es gibt extrem mächtige 
Softwaretools die einen dabei unterstützen auch aus einem 
undurchdringlich scheinenden Dickicht aus asm wieder Schritt für Schritt 
die Struktur der Abläufe herauszuarbeiten, die interessanten Stellen zu 
finden, Funktionen und Variablen mit sinnvollen Namen zu dokumentieren 
und sogar teilweise wieder sowas ähnliches wie lesbaren äquivalenten 
C-Code daraus zu generieren.

von Heinz V. (heinz_v)


Lesenswert?

Wolfgang schrieb:
> Auch stehen im Assembler Code eher keine absouluten Adressen, d.h.
> zwischen Assembler-Code und in den Programmspeicher des Prozessor
> geladene Binärdaten passiert noch ein bisschen was.

Der Assembler übersetzt die Opcodes und hartcodierten Werte/Konstanten 
und generiert ein Objekt File (manche Assembler können auch direkt .bin 
(Startaddresse 0h) oder auch .com (Startaddresse 0100h) Files 
schreiben), die Addressen sind im .obj noch Symbole, im Linker werden 
die zu absoluten Addressen umgerechnet.

zum Thema:

http://www.chip.de/downloads/IDA-Pro-Free-Letzte-Freeware-Version_29744270.html

schau da mal rein.

von B. P. (skorpionx)


Angehängte Dateien:

Lesenswert?

http://www.sprut.de/electronic/soft/usburn/usburn.htm

Mit usburn vom sprut geht das auch.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Bernd K. schrieb:
> Das hängt immer vom Skill-Level des Reverse-Engineers ab
Schrieb ich ja auch schon. Und einer wie uli, der fragt "ob das geht" 
hat überaus wahrscheinlich nicht die nötige Erfahrung...

von Thomas E. (picalic)


Lesenswert?

B. P. schrieb:
> Mit usburn vom sprut geht das auch.

Daran hatte ich auch gleich gedacht - nur kann man damit ohne eine 
angeschlossenen Brenner-Hardware offenbar nichts machen, nicht mal ein 
Hex-File einladen! Oder habe ich was übersehen?

von B. P. (skorpionx)


Lesenswert?

Thomas E. schrieb:
> Daran hatte ich auch gleich gedacht - nur kann man damit ohne eine
> angeschlossenen Brenner-Hardware offenbar nichts machen, nicht mal ein
> Hex-File einladen! Oder habe ich was übersehen?

Das Programm kann man mit mehrere Optionen starten. Du muss in der
Beschreibung vom Brenner nachschauen. Vielleicht geht das dann ...

von Thomas E. (picalic)


Lesenswert?

B. P. schrieb:
> Du muss in der
> Beschreibung vom Brenner nachschauen.

Muss ich nicht - Du hast behauptet, daß es mit USBURN geht, also musst 
Du auch schreiben, wie... ;)

von B. P. (skorpionx)


Lesenswert?

Thomas E. schrieb:
> Muss ich nicht - Du hast behauptet, daß es mit USBURN geht, also musst
> Du auch schreiben, wie... ;)

Du kannst den Brenner bauen...

von Thomas E. (picalic)


Lesenswert?

B. P. schrieb:
> Du kannst den Brenner bauen...

Könnte ich, muss ich aber auch nicht, weil ich den schon habe. Nützt 
aber dem TO nichts...

von Uli (Gast)


Lesenswert?

Oh Leute was soll das ganze hier?

Ja ein Assembler Code wird nicht durch einen C Compiler gejagt sondern 
durch einen Assembler. Mal abgesehen das ich nie was von C oder so 
gesagt hatte ist das eigentlich nur eine Haarspalterei und absolut 
unnütz.

Warum stellt man eine Frage nach einem Konverter, logischerweise weil 
man einen fertigen sucht und nicht viel Zeit investieren will noch einen 
zu machen.

Es wird schon schwer genug im Code einen Fehler zusuchen, da muss ich 
nicht noch erst den Disassembler bauen.

VG, Uli

von Volker S. (vloki)


Lesenswert?

Uli schrieb:
> Es wird schon schwer genug im Code einen Fehler zusuchen, da muss ich
> nicht noch erst den Disassembler bauen.

Kleine Ergänzung zu der MPLABX Lösung. Da kann man dann sogar den 
Simulator benutzen...

von Pandur S. (jetztnicht)


Lesenswert?

So ganz nebenbei.. das Disassemblat besteht nur aus kryptischem Zeug. 
Also zB

 Label0 :
     LD   Reg0,#123
     MOV  $X,Reg0

Es sind keine Variablennahmen dabei, woher auch. Dh man muss eine sehr 
gute Idee haben worum's geht.

von Volker S. (vloki)


Lesenswert?

Sapperlot W. schrieb:
> So ganz nebenbei.. das Disassemblat besteht nur aus kryptischem Zeug.

Das steht jetzt wirklich schon zur genüge weiter oben.
Lasst ihn doch einfach mal machen.
Der Aufwand ist gering und man sieht sofort das Ergebnis.

Volker S. schrieb:
> Window->PIC Memory Views->Program Memory

von Helfer (Gast)


Lesenswert?

Ich veruch hier mal mein Vorgehen zu beschreiben:
- Mit MPLabX über FILE->IMPORT->Hex/ELF das Hex-File mit dem 
dazugehörigen µC importieren
- Mit WINDOW->PIC-MemoryViews->ProgramMemory den Speicherinhalt aufrufen
- In dem "ProgramMemory"-Fenster rechte Maustaste -> "OutputToFile" 
erzeugt ein Assembler-Ähnliches Textfile
- Mit einem passenden Editor deiner Wahl (Notepad++ geht da z.B.) die 
ersten Spalten löschen und man hat den rohen Assenblercode
- Ab hier viel Spass beim "verstehen" des Codes

Gruß Helfer

von W.S. (Gast)


Lesenswert?

Uli schrieb:
> Es wird schon schwer genug im Code einen Fehler zusuchen, da muss ich
> nicht noch erst den Disassembler bauen.

OK. Wenn das so ist, dann schreib einen Brif an Ilfak Gulfanov und kaufe 
dir ne Vollversion von IDA.

Ach, ist dir etwa zu teuer? Dann schreib dir was selber, ist ja nicht 
gar so schwer. Aber denke nicht, daß die Straßen der Stadt voll sind von 
Programmierern, die speziell das Schreiben und Veröffentlichen von 
PIC-Reassemblern zu ihrem Lebensinhalt gemacht haben.

Mit anderen Worten: Das ist zu exotisch.

Und nochwas zu dem Falsch-Verständnis einiger Leute hier betreffend 
Assembler versus Compiler:

Ein Compiler ist etwas, das aus einer maschinenunabhängigen Sprache ein 
zu einer Zielplattform geeignetes Maschinenprogramm macht. Das bedeutet, 
daß der Input eben NICHT den Maschinen-Befehlssatz der Zielplattform 
widerspiegelt - im Gegensatz zum Assembler.

Nun klaro? Wenn jeder die Begriffe nach seinem momentanen Gusto und 
Tagesform mißverwendet, dann gibt es nur noch babylonische 
Sprachverwirrung und keiner versteht mehr, was der andere eigentlich 
sagen wollte.

W.S.

von Volker S. (vloki)


Lesenswert?

W.S. schrieb:
> und keiner versteht mehr, was der andere eigentlich
> sagen wollte.

Manchmal ist es sogar schon schwer zu verstehen, warum so viele 
überhaupt unbedingt was sagen wollen/müssen ;-)

von Bernd K. (prof7bit)


Lesenswert?

W.S. schrieb:
>> nicht noch erst den Disassembler bauen.
>
> OK. Wenn das so ist, dann schreib einen Brif an Ilfak Gulfanov und kaufe
> dir ne Vollversion von IDA.

Eine flüchtige Google-Suche nach "PIC Disassembler" liefert viele 
Treffer, ich glaube nicht daß IDA der einzige ist. Es ist zwar 
unstrittig der beste (und teuerste) aber ich kann nicht glauben daß es 
der der einzige.ist, so exotisch ist diese Plattform ja nun auch wieder 
nicht.

Ich sehe nicht wo das Problem liegt.

von c-hater (Gast)


Lesenswert?

Bernd K. schrieb:

> Ich sehe nicht wo das Problem liegt.

Bei der Kompetenz des TO natürlich.

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Huhu Uli,
hast Du Lust das Thema nochmal anzugehen?

Wir wissen mittlerweile, dass wir das HEX-File in eine 
Entwicklungsumgebung laden können und dort das Disassembly anzeigen 
lassen können.

Alles entscheidende Frage, deren Antwort ich hier im Rauschen nicht 
finden konnte: welcher PIC und wie groß ist das HEX-File?

Cheerio,
 marcus

von Pic Assemblant (Gast)


Lesenswert?

Lothar M. schrieb:

> weil natürlich
> alle lesbaren und klingenden Namen für Variablen, Unterprogramme,
> Sprungmarken usw. durch nichtssagende Buchstaben-Zahlen-kombinationen
> ersetzt wurden.

hast du jemals ein Pic asm disassembliert?

deine "nichtssagende" Buchstaben-Zahlen-kombinationen sind 
Speicherzellen.
Im Falle vom Pic also von $20 - $xxx (RAM)
Der Rest sind Sprungmarken zu Speicherstellen bzw. PC bei indirekter 
Adressierung.
Wer also Disassembliert weiß ganz genau was er wo findet.
Und nachdem man den Aufbau einigermaßen Verstanden hat 
(Init,ISR,Start,Routinen) geht man an die Bennennung der Identifizierten
Speicherstellen, so das man es im weiteren Verlauf einfacher hat.
Das ist alles eine Frage des Fleiß und Verständniss.
One Klick oder Arduino Schlau Lib "Copy and Paste" führen natürlich 
nicht zum Ziel. UND es hilft auch nicht beim erlernen (!) es macht die 
Benutzer
nur noch mehr Abhängig von Arduino, weshalb ich das auch nicht so dolle 
finde.


Und zum Fragesteller, hier mal eine möglichkeit:
http://www.hagi-online.org/picmicro/picdisasm_en.html

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.