Hallo Fragewurm,
Selbst gemacht hab ich es noch nicht.
Genau das merkt man 
Ein Assemblerprogramm wird 1 zu 1 in Binärcode gewandelt. Dh.
es gibt nur eine gültigen Binäre kombination der Bits. Genau
so kann man es 1 zu 1 zurück wandeln.
Kann man eben nicht so einfach.
Das Problem ist, dass man einer Bitkombination nicht ansieht ob es ein Opcode oder Daten sind.
Bei CISC-Prozessoren sind netterweise die Opcodes unterschiedlich lang. Bei der X86 Architektur gibt aus noch Prefixe.
Die Programme werden meist in einer Hochsprache geschrieben und Compiler machen dann auf Codeebene recht lustige Konstrukte.
Merfachverzeigunen werden oft mit Hilfe von Spungtabellen realisiert.
Du erhältst also Opcodes, dann folgen Adressen und dahinter liegt wieder Code. Hier synchronisiert der Disassembler nicht richtig, weil er schon die Adressen als Code decodiert.
Du erhälst also nur wirres Zeugs.
Beim 6503 oder 8080 gab es auch noch einen faulen Trick:
Es gab einen Spungbefehl „Branch Never“ mit einer 16 Bit Zieladresse. Als Zieladresse hat man dann eine 8-Bit immediate Ladebefehl rein gepackt, welcher 16 Bit lang war.
Also
LBL1: LDA #0
LBL2: BRA LDA #01
LBL3: BRA LDA #02
LBL4: BRA LDA #03
Springt man LBL1: an befindet sich in A = 0
Springt man LBL2:+1 an befindet sich in A = 1
Springt man LBL3:+1 an befindet sich in A = 2
Dein Disassembler bekommt so etwas nie gebacken.
Lustiges entsteht oft auch durch den Linker.
Je nach der Einstellung des Alignements, werden Module z.B. immer an eine restlos durch 4 Teilbare Adresse gepackt. Es müssen also 1-3 Bytes zum Füllen eingefügt werden. Da diese normalerweise NIE von der CPU verarbeitet werden, können diese Zufallswerte haben. Das weiss dein Disassembler aber nicht und er erzeugt was unsinniges.
MfG Peter(TOO)