Institut für Rechnerentwurf und FehlertoleranzProf. Dr. Th. UngererSebastian WilhelmiSommersemester 1998 |
| R0 | 0 |
| R1 | 1 |
| R8 | Rücksprungadresse vom Aufrufer |
| R9 | n vom Aufrufer |
| R10 | k vom Aufrufer |
| R11 | Ergebnis für Aufrufer (b) |
| R24 | Rücksprungadresse für Unteroutine |
| R25 | n für Unteroutine (n_u) |
| R26 | k für Unteroutine (k_u) |
| R27 | Ergebnis von Unterroutine (b_u) |
Das entsprechende Programm sieht dann so aus:
bin: CMP R10, R0 ; ST = k - 0
JMP Z, ret1 ; if ( ST == 0 ) goto ret1
CMP R9, R10 ; ST = n - k
JMP LT, ret0 ; if ( ST < 0 ) goto ret0
SUB R9, R1, R25 ; n_u = n - 1
ADD R10, R0, R26 ; k_u = k
CALL R24, bin ; b_u = bin( n_u, k_u )
ADD R27, R0, R11 ; b = b_u
SUB R26, R1, R26 ; k_u--
CALL R24, bin ; b_u = bin( n_u, k_u )
ADD R27, R11, R11 ; b += b_u
RET R8 ; return
ret0: ADD R0, R0, R11 ; b = 0
RET R8 ; return
ret1: ADD R1, R0, R11 ; b = 1
RET R8 ; return
Dieses Programm geht natürlich davon aus, daß der Prozessor hardwaremäßig in der Lage ist, Daten- und Kontrollkonflikte aufzulösen.
| IO | L | IO | L | IO | L | IO | L | IO |
| ? | ? | 2 1 ? | ||||||
| 2 1 ? | ? | 1 1 ? | ||||||
| 1 1 ? | ? | 0 1 ? | ||||||
| 0 1 0 | ? | ? | ||||||
| 1 1 0 | ? | 0 0 0 | ||||||
| 0 0 1 | ? | ? | ||||||
| 1 1 1 | ? | 0 0 1 | ||||||
| 2 1 1 | ? | 1 0 1 | ||||||
| 1 0 1 | ? | ? | ||||||
| 2 1 2 | ? | 1 0 1 | ||||||
| ? | ? | 2 1 2 |
Das Ergebnis lautet also 2.
(01) CMP R10, R0 12345 (02) JMP Z, ret1 12345 (03) CMP R9, R10 12345 (04) JMP LT, ret0 12345 (05) SUB R9, R1, R25 12345 (06) ADD R10, R0, R26 12345 (07) CALL R24, bin 12345 (08) ADD R27, R0, R11 12345 (09) SUB R26, R1, R26 12345 (10) CALL R24, bin 12345 (11) ADD R27, R11, R11 12345 (12) RET R8 12345 (13) ADD R0, R0, R11 12345 (14) RET R8 12345 (15) ADD R1, R0, R11 12345 (16) RET R8 12345 (17) ?? 12345
bin: CMP R10, R0
NOP
NOP
JMP Z, ret1
NOP
NOP
NOP
CMP R9, R10
NOP
NOP
JMP LT, ret0
NOP
NOP
NOP
SUB R9, R1, R25
ADD R10, R0, R26
NOP
CALL R24, bin
NOP
NOP
NOP
ADD R27, R0, R11
SUB R26, R1, R26
NOP
CALL R24, bin
NOP
NOP
NOP
ADD R27, R11, R11
NOP
RET R8
NOP
NOP
NOP
ret0: ADD R0, R0, R11
NOP
RET R8
NOP
NOP
NOP
ret1: ADD R1, R0, R11
NOP
RET R8
NOP
NOP
NOP
(00) LOAD b, R2 12345 (01) MUL R2, R2, R2 12345 (02) LOAD vier, R3 12345 (03) LOAD a, R4 12345 (04) MUL R3, R4, R3 12345 (05) LOAD c, R4 12345 (06) MUL R3, R4, R3 12345 (07) CMP R2, R3 12345 (08) JMP GE, high 12345 (09) ADD R0, R0, R2 12345 (10) JMP T, join 12345 (11) SUB R2, R3, R2 12345 (12) STORE R2, erg 12345
Dementsprechend wird das Codefragment dann mit NOPs ergänzt:
max: LOAD b, R2
NOP
MUL R2, R2, R2
LOAD vier, R3
LOAD a, R4
NOP
MUL R3, R4, R3
LOAD c, R4
NOP
MUL R3, R4, R3
NOP
CMP R2, R3
NOP
JMP GE, high
NOP
NOP
NOP
low: ADD R0, R0, R2
JMP T, join
NOP
NOP
NOP
high: SUB R2, R3, R2
NOP
join: STORE R2, erg
max: LOAD vier, R3
LOAD a, R4
LOAD b, R2
MUL R3, R4, R3
LOAD c, R4
MUL R2, R2, R2
MUL R3, R4, R3
NOP
CMP R2, R3
NOP
JMP GE, join
SUB R2, R3, R2
NOP
NOP
low: ADD R0, R0, R2
NOP
join: STORE R2, erg