Schlagwort-Liste: Simulator 4-Bit-Rechner - Re-Assembler - Dis-Assembler - allg. Beschreibung - Beispiel

    Re-Assembler REASS zu ERNA1

(Re- oder Dis-Assembler ist gebräuchlich)

Es kann schon vorkommen, dass nur noch das Maschinenprogramm vorhanden ist, man aber gern wieder ein Assemblerprogramm hätte! Solche Forderungen sind realisierbar.

Es gibt jedoch Probleme, die nur der Mensch lösen kann. Der Re-Assembler beginnt an der ihm angewiesenen Adresse und interpretiert den Wert, der dort steht. Da die Zahlen in unserem Fall nur Werte von 0 bis 15 annehmen können, gibt es immer eine Befehlsinterpretation. Werte auf Speicherplätzen,
z.B. mit kon
vereinbart, werden als Befehle erkannt. Die Aufgabe des Menschen ist es, aus dem Zusammenhang zu entscheiden, was Zahlenwerte und was Befehle sein könnten. Das ist bei jedem Re-Assembler ein Problem und keine Eigenart unseres Systems.
Der Unterschied ist nur, dass es bei 16 Bit Systemen sehr schwierig ist, diese Entscheidung zu treffen.
Unser System hat nur 16 Befehle, die man leicht übersehen kann.

Wir nehmen folgende Speicherbelegung als Beispiel:

01234567 89ABCDEF
000000000 00000000
140000000 00000000
200000000 00000000
313401E04 C0300000
4C2300000 00000000
500000000 00000000
6A07C0300 00000000
7B0000000 00000000
800000000 00000000
900000000 00000000
A00000000 00000000
B00000000 00000000
C00000000 00000000
D00000000 00000000
E00000000 00000000
F00000000 00000006

Der Speicher ist wenig belegt (so eine Übersicht kann man bei Prozessorsystemen mit größerer Wortbreite nicht haben).

Beginnt man vom Speicher-Anfang, so gibt es bei <10> den ersten Eintrag. Eine 4 bedeutet, dass eine Subtraktion durchgeführt werden soll. Das ist ein 3-Wort-Befehl, auf den folgenden Speicherplätzen steht die Adresse des Operanden, die wäre <00>. Die weitere Folge sieht nicht so aus, als wären es sinnvolle Befehle, wir lassen diesen Teil zunächst weg.
Die nächste Folge von Befehlen scheint bei <30> zu beginnen und endet bei <3A>. Auf <30> steht eine 1, das könnte wie folgt interpretiert werden:

1: LDK lade den Akku mit einer Konstanten (2-Wort-Befehl);
die Konstante steht auf dem folgenden Speicherplatz:
3-> der Akku wird mit 3 geladen

usw.

Der Re-Assembler kann das in gleicher Weise, er braucht aber zum Arbeiten genau wie wir oben immer eine Anfangs- und Endadresse, also den Bereich der rückübersetzt werden soll.
Schaut man die Zeile ab <30> an, so scheint sie bei <3A> zu Ende zu sein. mit diesen Angaben lassen wir den Re-Assembler arbeiten. Wir erhalten folgendes Ergebnis:

ORG30
;---------------------------------
m2:LDK3;30 1 3
SUB10;32 4 0 1
SPNm1;35 E 9 4
SPm2;38 C 0 3

Der 1.Befehl wird genau so ermittelt, wie wir es bereits getan haben. Der Re-Assembler setzt eine Marke hinzu, weil dieser Befehl als Ziel einer Sprunganweisung gilt (siehe Zeile 4). Als Kommentar wird rechts die Adresse und die Kodierung des Befehls ausgegeben.
Als zweiter Befehl wird eine Subtraktion ermittelt. Operand ist der Wert vom Speicherplatz <10>, damit hat sich das oben gestellte Problem geklärt.
Befehl 3 ist ein Sprungbefehl, der Re-Assembler gibt dazu eine Marke an. Aus dem Kommentar sieht man, dass die Sprungadresse <40> ist. Die Marke kann deshalb in diesem Abschnitt nicht vorhanden sein.
Befehl 4 ist der Sprung zum Befehl 1.

Aus dem Speicherbelegungsplan und an Befehl 3 ist zu sehen, dass ab Adresse <40> eine Interpretation vorgenommen werden muss. Endadresse ist <42>:

ORG40
;---------------------------------
 SPm1;40 C 2 3

Das ist nur ein Befehl, ein Sprung zur Marke m1. Die Marke m1 wird erneut vergeben, da dies ein erneuter Re-Assembler -Lauf ist und die Zählung wieder bei 1 beginnt. Wir wissen jedoch, dass der Befehl ab <32> gemeint ist.
Das ist offensichtlich der 2.Befehl des 1. Laufes. Das Setzen der Marken muss der Nutzer selbst vornehmen.

Der Speicher zeigt jedoch weitere Einträge, wir re-assemblieren sie einfach:

ORG60
;---------------------------------
 SUPm1;60 A 0 7
 SPm2;63 C 0 3

Befehl 1 ist ein Unterprogrammaufruf (die Marke ist unbekannt) ab Adresse <70>.
Der Befehl 2 ein Sprung zur Adresse <30>.

Ab Adresse <70> steht nur ein Rücksprung ins Hauptprogramm:

ORG70
;---------------------------------
 RUP;70 B

Nun ist jedoch der Mensch wieder gefragt. Die Programmteile sind entsprechend zu ordnen, Marken in Übereinstimmung zu bringen und die Startadresse zu vergeben. Die kann aus den Inhalten der Speicherplätze <FE> und <FF> ermittelt werden, also <60> in unserem Fall.

Das umgeformte Programm könnte folgendes Aussehen haben:

ORG10
kon4
ORG70
;--- UP ------------------------------
m1:RUP70
ORG60
;--- HP ------------------------------
SUPm1;60 A 0 7
SPm2;63 C 0 3
ORG30
;-------------------------------------
m2:LDK3;30 1 3
m4:SUB10;32 4 0 1
SPNm3;35 E 0 4
SPm2;38 C 0 3
ORG40
;-------------------------------------
m3:SPm4;40 C 2 3
ORGFF
kon6

Hinzugefügt wurde lediglich das Eintragen der Konstanten auf die Speicherplätze <10> und <FF>.
Nun könnte Einer auf die kluge Idee kommen und alles in einem Lauf zu re-assemblieren. Wir geben dazu als Anfangsadresse <02> und als Endadresse <70>. Damit entsteht folgendes Ergebnis:

ORG02
;-------------------------------------
LDA00;02 0 0 0
LDA00;05 0 0 0
LDA00;08 0 0 0
LDA00;0B 0 0 0
LDA40;0E 0 0 4<-?
LDA00;11 0 0 0
LDA00;14 0 0 0
LDA00;17 0 0 0
LDA00;1D 0 0 0
LDA00;20 0 0 0
LDA00;23 0 0 0
LDA00;26 0 0 0
LDA00;29 0 0 0
LDA00;2C 0 0 0
LDA31;2F 0 1 3<-?
SUB10;32 4 0 1<-0k
SPNm1;35 E 0 4<-0k
SPm2;38 C 0 3<-0k
LDA00;3B 0 0 0
LDAC0;3E 0 0 C<-?
SPA03;41 2 3 0<-?
LDA00;44 0 0 0
LDA00;47 0 0 0
LDA00;4A 0 0 0
LDA00;4D 0 0 0
LDA00;50 0 0 0
LDA00;53 0 0 0
LDA00;56 0 0 0
LDA00;59 0 0 0
LDA00;5C 0 0 0
LDA0A;5F 0 A 0<-?
XOR0C;62 7 C 0<-?
ADDC0;65 3 0 0<-?
LDA00;68 0 0 0
LDA00;6B 0 0 0
LDAB0;6E 0 0 B<-?

Das Ergebnis sollte zu denken geben. Auch wenn die Befehle LDA 00 gestrichen werden, so sind nur 3 Befehle richtig gefunden worden und diese auch nur bedingt, denn die Adressen für die Sprungbefehle gibt es nicht. Wenn man weiß, dass das Programm funktioniert, dann kann nur noch die Re-Assemblierung falsch sein, bzw. die Adressen.
Die Nutzung von Re-Assemblern fordert immer eine intensive Mitarbeit des Nutzers.

Nutzung des Re-Assemblers
--------------------------------------------

Nach dem Start des Re-Assemblers erscheint folgendes Bild:

Als erster Schritt muss mit <L>oad das Maschinenprogramm "name.SIM" geladen werden. In der linken oberen Bildschirmhälfte erscheint nun der Speicherbelegungsplan:

Als Beispiel dient wieder das oben genutzte Programm.

Nun können mit <A>dressen Anfangs und Endadresse eingegeben werden. Sollte die Eingabe falsch sein, so kann dieser Vorgang wiederholt werden.

Mit <R>eassembler wird nun das Re-Assemblieren in den angegebenen Adressen vorgenommen. Mit "fertig" meldet das System die Beendigung des Vorgangs.
Die Anzeige der ermittelten Befehle erfolgt in der Arbeitsart <D>arst.-BS. Zeile für Zeile (Enter-Taste) wird das Ergebnis in der rechten oberen Bildschirmhälfte ausgegeben. Mit <ET> quittiert der Nutzer jede Zeile. Wenn alle Zeilen angezeigt wurden, kommt wieder die Mitteilung "fertig":

Jede neue Re-Assemblierung beseitigt das vorhergehende Ergebnis, so dass beliebig oft probiert werden kann.
Hat man eine richtige Lösung (Teil-Lösung), so wird sie mit <S>ave abgespeichert. Wird nun das nächste Teilstück re-assembliert (siehe oben), kann dies ebenfalls sofort gespeichert werden. Wird der gleiche Namen gewählt, so kann man entscheiden, ob dieser Teil das bisherige überschreiben oder an den vorhandenen angefügt werden soll.
So entstand die oben beschriebene Gesamtdatei zum Programm. Die Datei sollte die Erweiterung ".ASI" erhalten, sie ist nun Quelldatei.

zurück zur Start-Seite