Registermaschinen

PPhilipp

Grünschnabel
Ich habe hier ein paar Schwierigkeiten mit 2 Registermaschinen:

R1:

LOAD2
if c0 = 0 GOTO 10
LOAD 1
CADD 1
STORE 1
LOAD 2
CSUB 1
STORE 2
GOTO 2
END


R2:

LOAD 2
CSUB 5
if c0 = 0 GOTO 8
LOAD 2
MULT 1
STORE 1
GOTO 11
LOAD 2
ADD 1
STORE 1
END

Wie bekomme ich daraus die jeweilige Funktion?
 
Wenn Du die Funktion erhalten möchtest, solltest Du zuerst einmal die Befehlsfolge von 1 bis n durchnummerieren.

Danach musst Du die Registermachine vorbelegen.
zB: c1 mit x und c2 mit y (c0 ist in der Startkonfiguration immer unbelegt, auf c0 werden alle arbeiten ausgeführt, der Rest der Register kann nur in c0 geladen werden oder mit den Wert von c0 gefüllt/gespeichert werden)

1:LOAD2 -> lade Inhalt von Register c2 in den Akkumulator (c0 = Arbeitsregister)
2:if c0 = 0 GOTO 10 -> ist der Wert in c0 jetzt gleich 0 ? Wenn ja springe zu Befehl 10, sonst mach mit dem nächsten Befehl weiter
3:LOAD 1 -> lade Inhalt von c1 in c0
4:CADD 1 -> addiere die Konstante 1 zu c0 hinzu
5:STORE 1 -> speichere c0 in c1
6:LOAD 2 -> lade c2 in c0
7:CSUB 1 -> subtrahiere von c0 die Konstante 1
8:STORE 2 -> speicher c0 in c2
9:GOTO 2 -> gehe zu Befehl 2
10:END -> Beende das Programm

Wenn Du das jetzt auf einen Zettel mit c1=x und c2=y durchrechnest, und die verschiedenen IF-Zweige beachtest, müsstest Du auf c1 = x +1 +1 +1 +... (y-mal "+1") kommen.
Daraus ergibt sich dann c1 = c1 + c2 , im Beispiel also x+y

Zu R2 nur soviel: Mult 1 heisst in c0 das Ergenis aus c0*c1 schreiben.
Beim If ist zu beachten, dass beim abziehen einer grösseren Zahl von einer kleineren immer Null das Ergebnis ist.
Die Lösung ist einfach durch aufschreiben und auszuprobieren zu erhalten:

c1 = {
c2 + c1, wenn c2 =< 5
c2 * c1, sonst



PS: im Java-Forum bist Du damit aber eigentlich etwas Falsch.
 

Neue Beiträge

Zurück