Forum: Mikrocontroller und Digitale Elektronik Decompiler AVRstudio 6


von Michael L. (nightflyer88)


Lesenswert?

Hallo Leute

Kann mir jemand sagen wie ich in AVRstudio 6 eine *.hex oder *.bin Datei 
in Assembler decompiliere ?

Ich habe hier im Forum gelesen, dass man das einfach öffnen muss, aber 
das geht irgendwie nicht, es wird dann einfach die Datei angezeigt, ohne 
Assembler Decompilierung.

von Peter II (Gast)


Lesenswert?

Michael L. schrieb:
> Kann mir jemand sagen wie ich in AVRstudio 6 eine *.hex oder *.bin Datei
> in Assembler decompiliere ?

geht damit nicht. Es gibt eventuell ander tools die das können aber mit 
dem Studio geht es nicht. Außerdem wird man sehr viel zeit einplanen 
müssen und dann den ASM code zu verstehen. Es gibt dann keine Label oder 
Namen mehr. Man kann ja nicht mal sauber zwischen daten und code 
unterscheiden.

von Werner (Gast)


Lesenswert?


von Sebastian S. (sebastian_s50)


Lesenswert?

Bei den GNU-Binutils müsste auch so ein Teil dabei sein.

von Michael L. (nightflyer88)


Lesenswert?

Mein Problem ist folgendes:
Ich habe ein Programm das für ein Arduino Bord mit ATmega328P 
geschrieben ist. Ich will das Programm aber auf einen ATmega328 flashen.

Im Programm wird die serielle Schnittstelle angesteuert, wenn ich nun 
die *.hex Datei einfach auf den ATmega328 "draufwürge" stimmt die 
Baudrate der schnittstelle nicht ganz, ansonsten lauft das Programm 
einwandfrei.

Ich will nun im Assemblercode nur die zwei Register der Baudrate 
anpassen, dann wider compilieren und auf den ATmega328 flashen.

von klausr (Gast)


Lesenswert?

Probier' mal "objdump -d" von den gnutools.

von Peter II (Gast)


Lesenswert?

Michael L. schrieb:
> Ich will nun im Assemblercode nur die zwei Register der Baudrate
> anpassen, dann wider compilieren und auf den ATmega328 flashen.

dann mach es doch direkt im bin file. Suche dir die code sequenz für das 
setzen dieser Register und ändere sie. Wenn du glück hast gibt es sie 
nur einmal.

die Codesequenz kannst du ganz einfach mit einem kleinen Testprogramm 
und dem Studio ermitteln. (oder mit hilfe der Opcode doku)

von Sebastian S. (sebastian_s50)


Lesenswert?

Assemblercode ist ASCII-Text.
Jeder Editor liefert eine Suchfunktion mit.
Wenn Du weist wie das zugehörige Register heißt bzw. unter welcher 
Adresse es zu finden ist, ist die Suche und das anschließende Ändern 
kein Problem.
Musst Du allerdings komplette Befehlszeilen einfügen, so kommst Du nur 
mit einem Super-Komfort-Disassembler hin.

von Peter II (Gast)


Lesenswert?

Sebastian S. schrieb:
> Assemblercode ist ASCII-Text.
> Jeder Editor liefert eine Suchfunktion mit.

er hat aber nur die hex oder bin datei? Woher soll er denn den 
Assemblercode bekommen?

von Peter II (Gast)


Lesenswert?

klausr schrieb:
> Probier' mal "objdump -d" von den gnutools.

wie soll das denn gehen? Ohne die type von µC als parameter kann das 
niemals funktionieren.

von Spess53 (Gast)


Lesenswert?

Hi

Mit dem AVR Studio 4.19 geht das problemlos.

MfG Spess

von Peter II (Gast)


Lesenswert?

Spess53 schrieb:
> Hi
> Mit dem AVR Studio 4.19 geht das problemlos.
> MfG Spess

etwas technisch unmöglich soll damit gehen? Das kann ich nicht glauben. 
Ein Programm kann überhaupt nicht entscheiden ob es sich um irgendwelche 
Daten oder Programmcode handelt.  Es mag eventuell in einigen Fällen 
gehen aber nicht "problemlos".

von Michael L. (nightflyer88)


Angehängte Dateien:

Lesenswert?

... so sieht es momentan bei mir aus...

Ich muss das Register UBRRnL und UBRRnH ändern, nichts einfügen.
In der hex Datei sind aber nur Zahlen, Buchstaben da kommt ja kein 
Mensch draus...

Die hex datei ist ja eigentlich 1:1 Assembler, sollte nicht so schwierig 
sein dies zu decompilieren, oder täusche ich mich ?

von holger (Gast)


Lesenswert?

>Im Programm wird die serielle Schnittstelle angesteuert, wenn ich nun
>die *.hex Datei einfach auf den ATmega328 "draufwürge" stimmt die
>Baudrate der schnittstelle nicht ganz, ansonsten lauft das Programm
>einwandfrei.

Dann mach doch einen Quarz dran.

von Michael L. (nightflyer88)


Lesenswert?

geht nicht da das Bord schon fix fertig ist, und ich eine Serie von 
20Stk habe. Die Hardware ist also gegeben...

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Michael L. schrieb:

> Ich will nun im Assemblercode nur die zwei Register der Baudrate
> anpassen, dann wider compilieren und auf den ATmega328 flashen.

objdump liefert die ein Disassemby, jedoch kein Code, den du wieder in 
den Assembler füttern kannst.

Ja nach Code geht das was du vorhast nich so einfach.  Etwa dann wenn 
das UART-Register auf einen Wert gesetzt wird, der später nochmals 
verwendet wird.  Ändern des Wertes wird dann auch die anderen 
Verwendungen beeinflussen.  Schon mal gesehen sowas, ist also nicht rein 
theoretischer Natur.


Peter II schrieb:
> klausr schrieb:
>> Probier' mal "objdump -d" von den gnutools.
>
> wie soll das denn gehen? Ohne die type von µC als parameter kann das
> niemals funktionieren.

Den µC braucht man nicht, es genügt die Emulation bzw. eine kompatible 
Obermenge davon, etwa:

$ avr-objdump -m avr51 -D datei.hex

Und dann viel Spaß beim Aufdröseln was Daten sind und was nicht.

Vermutlich hat's folgendes Layout:

1) Vector-Tabelle (.vectors)
2) Daten (.progmem)
3) Code (.text)
4) Daten (.data, .rodata)

und evtl. noch anderes Zeugs wie Bootloader etc.

von Spess53 (Gast)


Lesenswert?

Hi

>etwas technisch unmöglich soll damit gehen? Das kann ich nicht glauben.
>Ein Programm kann überhaupt nicht entscheiden ob es sich um irgendwelche
>Daten oder Programmcode handelt.

Braucht es auch nicht. Das kann ich selbst. Aber das Problem war doch, 
das er gar nichts disassembliert bekommt. Im 4er Studio brauche ich nur 
die .hex zu öffnen.

MfG Spess

von Peter II (Gast)


Lesenswert?

Michael L. schrieb:
> Die hex datei ist ja eigentlich 1:1 Assembler, sollte nicht so schwierig
> sein dies zu decompilieren, oder täusche ich mich ?

nein ist sie nicht. weil in einem ASM programm auch Daten enthalten 
sind. z.b. irgendwelcher Text. Und dieser darf dann nicht in code 
umgewandelt werden.

> In der hex Datei sind aber nur Zahlen, Buchstaben da kommt ja kein
> Mensch draus...
mit ein wenig Übung ist das machbar. aber das sind leute aus einer 
andere Generation die sich nciht von ein paar hex zeichen abschrecken 
lassen.

von holger (Gast)


Lesenswert?

>geht nicht da das Bord schon fix fertig ist,

Selber schuld. Leb mit deinem Müll.
Das der interne RC Osci nicht für RS232 geeignet
ist kann man hier fast jeden Tag lesen.

von Reinhard Kern (Gast)


Lesenswert?

Michael L. schrieb:
> stimmt die
> Baudrate der schnittstelle nicht ganz

Wenn du einen Quarz verwendest, dann kannst du ja auch den Quarz 
entsprechend anpassen. Wenn du keinen dran hast, müsstest du jeden 
Prozessor einzeln abgleichen, das ist Blödsinn, dann hast du einfach 
unreparierbaren Schrott produziert.

Gruss Reinhard

von Thomas E. (thomase)


Lesenswert?

Michael L. schrieb:
> geht nicht da das Bord schon fix fertig ist, und ich eine Serie von
> 20Stk habe. Die Hardware ist also gegeben...
Da wirst du nicht drumherum kommen, dir 20 Quarze zu kaufen und die da 
ranzupfriemeln.
Das ist ja nicht nur die Toleranz. Dein Arduino-Code wurde für 16MHz 
kompiliert und jetzt hast du 8. Kannst aber mal probieren, auf dem PC 
die halbe Baudrate einzustellen.

mfg.

von Michael L. (nightflyer88)


Lesenswert?

Der Arduino Code wurde für 8Mhz geschrieben. Lade ich den Code in einen 
ATmega328P stimmt die Baudrate.

Lade ich den Code in einen ATmega328 ist die Baudrate etwa 2k baud zu 
hoch. Es ist bei jedem Prozessor gleich viel daneben.

Somit muss man dies nur einmal anpassen, und dann geht das immer.

von spess53 (Gast)


Lesenswert?

Hi

>Lade ich den Code in einen ATmega328 ist die Baudrate etwa 2k baud zu
>hoch. Es ist bei jedem Prozessor gleich viel daneben.

Die USART von ATMega328 und ATMega328P sind identisch. Bei gleichem Takt 
erzeugen beide bei einem identischen Wert von UBRR die gleiche Baudrate. 
Schon mal überlegt, woher eure Abweichung kommt?

MfG Spess

von MWS (Gast)


Lesenswert?

Michael L. schrieb:
> Somit muss man dies nur einmal anpassen, und dann geht das immer.

Unwahrscheinlich, da nicht das "P" den Unterschied macht, sondern die 
unterschiedliche Produktionscharge.

Abgesehen davon, dass man die Sache im Quellccode ändern könnte, wobei 
RC dann immer noch Krampf ist und nur für kleine Baudraten geht, man 
"könnte" schon...

AVR-Studio 4 nehmen, Hex laden, memory breakpoint auf das UBR, mit Glück 
wird kein nicht-simulierbarer, blockierender Code vor dem Setzen der 
Baudrate ausgeführt, im Disassemblat passend ändern und per 
Programmerdialog des Studios zurückschreiben. Alternativ die Adresse im 
Flash merken, die Bytesequenz dort ist einzigartig und danach lässt sich 
im Hex suchen, dann Hex editieren, die Checksumme am Ende der Zeile 
anpassen und fertisch. Wenn das Schreiben des UBR per 
Simulations-Breakpoint nicht zu finden ist, dann eben das komplette 
Disassemblat "zu Fuß" durchsehen.

Man könnte also - nur braucht's Kenntnisse in Assembler und ein bisserl 
weiteres Detailwissen. Allein die Fragestellung zeigt jedoch, dass davon 
nichts vorhanden ist.

Also frag' den Schreiber der Software, ob er Dir das hinmurkst, d.h. 
eine Möglichkeit einbaut das OSCCAL z.B. über ein Byte im EEProm zu 
setzen, damit kann dann der interne RC passend gezogen werden und das 
kann geschehen, ohne das Hex für's Flash ändern zu müssen.

Murks ist's trotzdem, aber für 1200 Baud o.ä. wird's laufen.

von Thomas E. (thomase)


Lesenswert?

Michael L. schrieb:
> Lade ich den Code in einen ATmega328 ist die Baudrate etwa 2k baud zu
> hoch. Es ist bei jedem Prozessor gleich viel daneben.
2K? 3200 statt 1200?

mfg.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

http://atmel.com/Images/doc8035.pdf
AVR512: Migration from ATmega48/88/168 to ATmega48P/88P/168P
Der neuere 328 wird noch nicht genannt. Hier sind die Unterschiede 
aufgelistet:
- "some register bits has been added..."
- "low frequency crystal driver strength is reduced..."
welche Registerbits das sind steht da leider nicht

aber im Datenblatt:
BODS and BODSE only available for picoPower devices 
ATmega48PA/88PA/168PA/328P
Also nach "picoPower" suchen. Da gibts auch noch den Unterschied A oder 
P oder PA, nur nicht beim 328

von Georg G. (df2au)


Lesenswert?


von Michael L. (nightflyer88)


Lesenswert?

Vielen Dank für eure Mühe und Tipps !!

Aber das Problem hat sich nun erledigt !
Die Baudrate sollte 125k sein, hatte aber immer 127k, und dachte das 
dies das Problem sei.

Nun hat sich herausgestellt das ein Fehlerhafter Spannungsregler die 
Ursache war. Er brachte zwar die 3.3V einwandfrei, hatte aber eine hohe 
Restwelligkeit die mir zum Verhängnis wurde.

An der Seriellen Schnittstelle hängt ein HF-Modul, das dann vom 
Spannungsregler gestört wurde, und somit nicht sauber arbeitete.

Der interne Oszillator des Atmega reicht allemal für diese Anwendung, 
auch wenn die Baudrate nicht ganz stimmt.

von wire (Gast)


Lesenswert?

Georg G. schrieb:
> Probier mal
> http://www.avrfreaks.net/index.php?module=Freaks%2...
>
> Die Ausgabe ist halbwegs brauchbar.

dieser Disassembler ist meiner Meinung nach brauchbarer, jedenfalls war 
ich damit wesentlich erfolgreicher:

http://avr.myluna.de/lib/exe/fetch.php?media=de:disassembler.jpg

wire

von MWS (Gast)


Lesenswert?

Michael L. schrieb:
> Die Baudrate sollte 125k sein,

125000 Baud halte ich mit dem internen R/C für ein Gerücht. Aber evtl. 
muss es ja nicht zuverlässig und dauernd funktionieren. Dann reicht 
vielleicht auch, dass es ein bisserl funktioniert, so wie'n Blinker eben 
;D

von Spess53 (Gast)


Lesenswert?

Hi

>125000 Baud halte ich mit dem internen R/C für ein Gerücht.

Ergibt bei genau 8 MHz einen Baudratenfehler von Null. Die 127kBd 
entsprechen einer Oszillatorfrequenz von ca. 8,128 MHz und einem Fehler 
von 1,6%. Etwes Luft ist da noch. Ob das auber unter allen Umständen so 
bleibt (Spannung, Temperatu, Toleranz der Gegenstelle und ...) kann 
niemand garantieren. Auf jeden Fall eine Fruzzellösung ohne Garantie.

MfG Spess

von MWS (Gast)


Lesenswert?

Spess53 schrieb:
> Auf jeden Fall eine Fruzzellösung ohne Garantie.

So sah ich das auch. Dass es mit idealen 8 MHz klappt war klar, aber 
nicht mit dem potentiell ungenauen und wandernden R/C. Da wird auch nix 
mit genau 8 MHz laufen, sondern ein wenig drunter oder drüber, kommen 
dann noch ein paar äußere Einflüsse dazu, wird bei einem der 
Baudratenfehler eben ein wenig kleiner, während's beim anderen soweit 
außer Toleranz kommt, dass es Ausfälle gibt. Aber das muss der TE selber 
wissen, handelt sich wahrscheinlich nur um Herzschrittmacher. Wenn 
einige der 20 Teilnehmer nur sporadisch reagieren, weiß er ja, wo er 
suchen muss.

von Spess53 (Gast)


Lesenswert?

Hi

>So sah ich das auch.

Wenn der TO früher mit dem eigentlichen Problem und den dazugehörenden 
Fakten herausgerückt hätte wäre die Diskussion ganz anders verlaufen.

In Puncto Kommunikation mit internen Oszillator habe ich auch meine 
schmerzlichen Erfahrungen gemacht. Fernsteuerung eines Gerätes (mit 
ATMEGA128 4MHz intern) mit simulierter Gegenstelle auf dem PC 
programmiert. Lief problemlos. Mit realer Gegenstelle (PIC mit Quarz) 
war es ein Lottospiel. Seit dem läuft nichts mehr ohne Quarz.

MfG Spess

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.