
Vorbelegungen:
R0 = 0
R1 = 1
R24 <- Rückkehradresse
R25 <- x
R26 <- erg
fib CMP R9,R1
JMP LE,else
then SUB R9,R1,R25
CALL R24,fib ;f(x-1)
@1 ADD R0,R26,R16
SUB R25,R1,R25
CALL R24,fib ;f(x-2)
@2 ADD R16,R26,R10 ;f(x) = f(x-1) + f(x-2)
RET R8
else ADD R0,R9,R10 ;f(x) = x
RET R8
b) (3KB .png)
c)
Registeranzahl ohne glob. Register 80 ---------------------------------- = ----- = 5 Registerfenster Anz.'in'-Reg. + Anz.'loc'-Reg 8 + 8Zieht man ein Fenster für das aufrufende Programm ab, so bleiben 4 Fenster übrig. Außerdem wird ein Registerfenster als 'invalid' gekennzeichnet, da es sich mit dem aufrufenden Programm überschneidet -> es läßt sich maximal fib(3) berechnen. Für größere Rekursionstiefen müssen Fenster zwischengespeichert werden, z.B. durch
d)

fib CMP R9,R1
NOP
NOP
JMP LE,else
NOP
NOP
NOP
then SUB R9,R1,R25
NOP
CALL R24,fib
NOP
NOP
NOP
@1 ADD R0,R26,R16
SUB R25,R1,R25
NOP
CALL R24,fib
NOP
NOP
NOP
@2 ADD R16,R26,R10
NOP
RET R8
NOP
NOP
NOP
else ADD R0,R9,R10
NOP
RET R8
NOP
NOP
NOP
zusätzlich Umordnen der Befehle:
fib CMP R9,R1
ADD R0,R9,R16
SUB R9,R1,R25
JMP LE,else
ADD R0,R0,R26
NOP
NOP
then CALL R24,fib
NOP
NOP
NOP
@1 CALL R24,fib
ADD R0,R26,R16
SUB R25,R1,R25
NOP
else RET R8
ADD R16,R26,R10
NOP
NOP
Dabei basiert die Umordnung der Befehle auf folgendem Prinzip:
erg := max{b*b - 4*a*c,0}
2) NOP := ADD R0, R0, R0
max: LD b, R1
NOP
MUL R1, R1, R1
LD vier, R2
LD a, R3
NOP
MUL R2, R3, R2
LD c, R3
NOP
MUL R2, R3, R2
NOP
CMP R1, R2, R3
NOP
BGE R3, high
NOP
NOP
NOP
low: ADD R0, R0, R1
JMP join
NOP
NOP
NOP
high:SUB R1, R2, R1
NOP
join:ST R1, erg
3)max: LD b, R1
LD vier, R2
LD a, R3
MUL R1, R1, R1
MUL R2, R3, R2
LD c, R3
NOP
MUL R2, R3, R2
NOP
CMP R1, R2, R3
NOP
BGE R3, join
high:SUB R1, R2, R1
NOP
NOP
low: ADD R0, R0, R1
NOP
join:ST R1, erg
NOP
4)
max: LD vier, R2
LD a, R3
LD b, R1
MUL R2, R3, R5 ; R2 -> R5
LD c, R6 ; R3 -> R6
MUL R1, R1, R4 ; R1 -> R4
MUL R5, R6, R7 ; R2 -> R7
NOP
CMP R4, R7, R8 ; R3 -> R8
NOP
BGE R3, join
high:SUB R4, R7, R9 ; R1 -> R9
NOP
NOP
low: ADD R0, R0, R9
NOP
join:ST R9, erg
NOP