Hier will ich eigentlich nur kurz ein kleines Projekt von mir vorstellen, avrdisas. Es ist ein Disassembler für AVR-Mikrocontroller, der sehr flexibel ist (z.B. in der Eingabe der Opcodes) und leicht auch für andere Architekturen verwendet werden könnte. Alles steht unter der GNU General Public License.
Nur kurz ein Beispiel, damit man sich das ein bischen vorstellen kann... mein Programm wandelt so etwas hier (roher Opcode, sehr schwer von Menschen zu verstehen):
0000000 c00f 0000 0000 0000 efdf efef 95ea 30e0 0000010 f7e9 95da 30d0 f7c9 95fa 30f0 f7a9 9508 0000020 efff bbf7 e1f4 bbf8 ec18 dfee e0fc bbf8 0000030 e614 dfea cff7 cff4
In folgendes um (disassembliertes Programm, von Leuten, die AVR-Assembler lesen können schon recht gut zu verstehen):
; Disassembly of AsmExample.bin (avr-gcc style) .text main: rjmp Label4 nop nop nop ; Referenced from offset 0x1c by brne ; Referenced from offset 0x2a by rcall ; Referenced from offset 0x32 by rcall Label1: ser r29 ; Referenced from offset 0x16 by brne Label2: ser r30 ; Referenced from offset 0x10 by brne Label3: dec r30 cpi r30, 0x00 ; 0 brne Label3 dec r29 cpi r29, 0x00 ; 0 brne Label2 dec r31 cpi r31, 0x00 ; 0 brne Label1 ret ; Referenced from offset 0x00 by rjmp ; Referenced from offset 0x36 by rjmp Label4: ser r31 out DDRB, r31 ; Referenced from offset 0x34 by rjmp Label5: ldi r31, 0x14 ; 20 out PORTB, r31 ldi r17, 0xc8 ; 200 rcall Label1 ldi r31, 0x0c ; 12 out PORTB, r31 ldi r17, 0x64 ; 100 rcall Label1 rjmp Label5 rjmp Label4
Mit der Unterstützung von sogenannten Tag-Files kann man die Labels bennenen, wie man mag (und es wird von Disassemblierungsvorgang zu Vorgang gespeichert) und zusätzlich dem Disassembler mitteilen, was für Speicherbereiche im Flash er nicht als Code, sondern als Daten (z.B. Konstante Bytes, Words oder Strings) interpretieren soll. Im Reverse-Modus wird damit sehr gut lesbarer Assembler-Code erzeugt.
Ein weiteres Feature ist die Erzeugung von Pseudocode, der für jedermann, der einiges an C versteht sehr leicht zu lesen ist - hier an einem Beispiel gezeigt, das ein Paar Labels beinhaltet, die mit Hilfe der Tagfiles erzeugt wurden:
TransmitString: ; Parameter r24:r25 push r28 push r29 r31 = r25; r30 = r24; r0 = Flash[r30:r31]; r24 = r0; (r24 == 0) || (r24 < 0); ; test r24 if (c1 == c2) goto StringDone; r28 = r30; r29 = r31; ; Referenced from offset 0x112 by brne NextCharacter: TrasmitChar(); ; Parameter r24 [r29:r28] += 0x01; ; 1 r31 = r29; r30 = r28; r0 = Flash[r30:r31]; r24 = r0; (r24 == 0) || (r24 < 0); ; test r24 if (c1 != c2) goto NextCharacter; ; Referenced from offset 0xfe by breq StringDone: pop r29 pop r28 return;
Datum | Version | Veränderungen |
---|---|---|
24.1.2013 | 0.07, Download |
|
25.7.2008 | 0.06, Download |
|
23.7.2007 | 0.05 |
|
22.7.2007 | 0.04 |
|
11.7.2007 | 0.03 |
|
13.11.2004 | 0.02 |
|
6.11.2004 | 0.01 |
|
Auf Nachfrage werde ich hier auch einen Win32-Version als Binary einstellen. Diese Version ist gegen MinGW32 gelinkt und wurde von mir unter Linux mit dem i686-mingw32-gcc übersetzt. Ich bitte zu berücksichtigen dass alle folgenden Dateien vollständig ungetestet sind, da ich über kein Windows-Betriebssystem verfüge. Zwar laufen die Executables mit wine, aber ich kann nicht garantieren dass irgendeine der folgenden Dateien tatsächlich auch mit einem nativen Microsoft Windows funktioniert. Deshalb markiere ich die Windows-Versionen ausdrücklich als hochexperimentell. Bugreports nehme ich natürlich trotzdem gerne entgegen.
Datum | Version |
---|---|
25.7.2008 | 0.06-win32, Download |