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;


Sourcecode (Linux-i686, Linux-x86_64, Win32)

Datum Version Veränderungen
24.1.2013 0.07, Download
  • Wraparound für negative Target-Addressen modulo der Flash-Speicher-Größe
  • Ausgabe der Versionsnummer
25.7.2008 0.06, Download
  • Winzige Verbesserungen, -ansi -pedantic, Typos entfernt, Cross-Compilation für win32
23.7.2007 0.05
  • Coding Conventions jetzt (fast?) vollständig durchgezogen
  • Disassembler erzeugt jetzt equ-Statements um im reassemblierbaren Assembler-Output auch mnemonische Register (wie PORTD, PINB usw.) verwenden zu können
  • Optimierung einiger Datenstrukturen von O(n) nach O(log n)
  • Labelgenerator unterscheidet zwischen Funktionen und normalen Labels
22.7.2007 0.04
  • Code Cleanups
  • Bugfixes (sts-Anweisung im Pseudocode)
  • Verbesserte Ausgabe des Pseudocode
  • Tools-Skriptpackage zur einfachen Dis- und Reassemblierung
  • Unterstützung von Tagfiles zum einfachen Auflösen von Strings/Arrays/Labels
11.7.2007 0.03
  • Code Cleanups
  • Korrekte Benutzung und Auflösung von Symbolen (Registernamen etc.)
  • Spezifischste MNemonics werden bei clr, tst, rol, lsl verwendet (Danke an Kurt Binder!)
  • Korrekte Disassemblierung der sts-MNemonic (Danke an Kurt Binder!)
  • Unterstützung für Kompilierung unter Windows (Danke an Kurt Binder!)
13.11.2004 0.02
  • Unterstützung von Pseudocode
  • Je nach selektierter MCU werden die IO-Register mnemonisch angezeigt
6.11.2004 0.01
  • Erste Release

Win32-Version

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