BuK-KA-RAM-Programm

Aus ProgrammingWiki

Inhaltsverzeichnis

Registermaschine

Geben Sie mind. ein RAM-Programm zur Berechnung der Funktion w : \N \mapsto \N mit w(n) = \left\lfloor \sqrt{n} \right\rfloor an.

RAM-Programm: (Jens Heider und Daniel Tasche)

NrMethodeBemerkung
|
0
R0 = 3R0 = n (Berechnung Wurzel von 3)
|
1
R2 = 1R2 = fixer Wert für Inkrement/Dekrement
|
2
R1 += R2R1 = aktuelle Testvariable
|
3
R3 = R1R3 = dekrementierter Wert bei Multiplikation
|
4
R4 = 0R4 = Summe bei Multiplikation
|
5
IFZERO R3 GOTO 9Quadratzahl des aktuellen Testwerts gebildet?
|
6
R4 += R1Aufsummierung für Multiplikation
|
7
R3 -= R2Dekrementierung des Multiplikation-Zählers
|
8
GOTO 5
|
9
R5 = R0Begin des Tests, ob gebildete Quadratzahl größer als n
|
10
IFZERO R5 GOTO 15Wenn n kleiner gleich gebildete Quadratzahl
|
11
IFZERO R4 GOTO 2gebildete Quadratzahl noch nicht groß genug. Mit nächsten Testkandidaten fortfahren
|
12
R4 -= R2gebildete Quadratzahl dekrementieren
|
13
R5 -= R2n dekrementieren
|
14
GOTO 10
|
15
IFZERO R4 GOTO 17Ist gebildete Quadratzahl = n, dann Ergebnis direkt erreicht.
|
16
R1 -= R2Ansonsten muss gebildete Quadratzahl "abgerundet" werden
|
17
R0 = R1Ergebnis in Rückgaberegister schreiben.

Test mit 4:

Sijeheid_RAM_Wurzel_4.jpg

Test mit 5:

Sijeheid_RAM_Wurzel_5.jpg

RAM-Programm (Stefan Scheumann)

BNrMethodeBemerkung
|
0
R0 = 25Berechnung Wurzel 25
|
1
R1 = 1R1 = aktueller Testwert
|
2
R2 = 0R2 = alter Testwert
|
3
R5 = 1Inkrement-Variable
|
4
R10 = R1Parameter für die Berechnung des Quadrats; Beginne Quadrierung
|
5
R11=R10Schleifenindex
|
6
IFZERO R10 GOTO 10
|
7
R12 += R10
|
8
R11 -= R5
|
9
GOTO 4
|
10
R3 = R12R3 = Quadrat von aktuellen Testwert; Ende Quadrierung
|
11
R20 =R0Vorbereitung Vergleich(Kopieren der Register) von gesuchten Wert mit Ergebnis der Quadrierung
|
12
R21 = R3
|
13
R20 -= R5Beginn Vergleich errechneten Wert <= gegebenen Wert; Aufbau: beide Variablen dekrementieren bis eine oder beide 0 sind.
|
14
R21 -= R5
|
15
IFZERO R20 GOTO 21R20(Gesuchter Wert) kleiner oder gleich R21(berechnetes Quadrat des aktuellen Testwertes)
|
16
IFZERO R21 GOTO 18R21 kleiner R20 => weitermachen mit neuen Testwerten
|
17
GOTO 13Wiederholen bis R20 oder R21 = 0
|
18
R2 = R1alter Testwert = aktueller Testwert
|
19
R1 += R2aktueller Testwert + 1
|
20
GOTO 4Mit neuen Testwert von vorn anfangen.
|
21
R0 = R2Ergebnis in Rückgaberegister schreiben.


RAM-Programm: (Robert Rosenberger)

| 1R0 = 25
|2R3 = 1
|3R1 += R3
|4R5 = R1
|5R5 -= R3
|6R6 = R1
|7FZERO R5 GOTO 11
|8R5 -= R3
|9R6 += R1
|10GOTO 7
|11R10 = R0
|12R10 -= R6
|13IFZERO R10 GOTO 15
|14GOTO 3
|15R15 = R6
|16R16 = R0
|17IF ZERO R16 GOTO 21
|18R16 -= R3
|19R15 -= R3
|20GOTO 17
|21IFZERO R15 GOTO 23
|22R1 -= R3
|23R0 = R1
|24STOP

RAM-Programm: (Tobias Salzmann und Ronald Krause)

  • Heron-Algorithmus

Ausgehend von x=n und y=1 wiederholt man x=\left\lbrack \frac{x+y}{2}\right\rbrack und y=\left\lbrack \frac{a}{x}\right\rbrack solange wie x>y ist.

Ist nach Austritt aus dieser Schleife x\leq y, so gilt x=\left\lbrack \sqrt{n} \right\rbrack


BefehlszählerBefehlBemerkung
|
1
R0 = n
|
2
R1 = ROX
|
3
R2 = 1Y
|
4
R20 = R1
|
5
R21 = R2
|
6
GOTO 36Größer/KleinerVergleich
|
7
IFZERO R23 GOTO 9
|
8
STOPErgebnis x in R1
|
9
R3 = 0
|
10
R3 += R10 + x
|
11
R3 += R2x + y
|
12
R4 = 2
|
13
R10 = 0Wert zur Überprüfen des Rücksprunges
|
14
GOTO 22Division
|
15
R1 = R5neues x in R1
|
16
R3 = R0n in R3
|
17
R4 = R1x in R4
|
18
R10 = 1Wert zur Überprüfung des Rücksprunges
|
19
GOTO 22Division
|
20
R2 = R5neues y in R2
|
21
GOTO 36Größer/Kleinervergleich


Ganzzahlige Division



BefehlszählerBefehlBemerkung
|
22
R9 = 1
|
23
R5 = 0
|
24
R6 = R3Zähler für 1.Zahl
|
25
R7 = R4Zähler für 2.Zahl
|
26
IFZERO R7 GOTO 31
|
27
R7 -= R9subtrahieren
|
28
IFZERO R6 GOTO 34
|
29
R6 -= R9subtrahieren
|
30
GOTO 26
|
31
R5 += R9addieren
|
32
R6 -= R7
|
33
GOTO 24
|
34
IFZERO R10 GOTO 15
|
35
GOTO 20


Größer/Kleinervergleich


BefehlszählerBefehlBemerkung
|
36
IFZERO R20 GOTO 41x
|
37
R20 -= R9
|
38
IFZERO R21 GOTO 42y
|
39
R21 -= R9
|
40
GOTO 36
|
41
R23 = 1
|
42
GOTO 7Wenn R23 = 1; dann ist x <= y und wenn R23 = 0, dann x > y