Un certo processore ha 10 registri e può accedere a una memoria RAM di 1000 parole. Ogni registro e ogni parola della RAM possono contenere un intero a tre cifre compreso tra 0 e 999 (in base 10). Le istruzioni sono codificate tramite interi a tre cifre memorizzati nella RAM. La codifica delle istruzioni è la seguente (Rx
indica il contenuto del registro x; mem[Rx]
indica la parola in memoria il cui indirizzo è contenuto nel registro x):
100
: halt (interrompi l'esecuzione)2dn
: imposta il contenuto del registro d al valore n compreso tra 0 e 9 (Rd <- n
)3dn
: somma n al contenuto del registro d (Rd <- Rd + n
)4dn
: moltiplica per n il contenuto del registro d (Rd <- Rd * n
)5ds
: imposta il registro d al valore contenuto nel registro s (Rd <- Rs
)6ds
: somma al contenuto del registro d il valore nel registro s (Rd <- Rd + Rs
)7ds
: moltiplica il registro d per il valore nel registro s (Rd <- Rd * Rs
)8da
: copia nel registro d il valore in memoria all'indirizzo contenuto nel registro a (Rd <- mem[Ra]
)9sa
: imposta il valore della parola in memoria il cui indirizzo è contenuto nel registro a al valore del registro d (mem[Ra] <- Rd
)0ds
: se il registro s ha valore diverso da zero, salta all'istruzione il cui indirizzo è contenuto nel registro d; altrimenti non fare nulla (if (Rs != 0) then Pc <- Rd
)I risultati di tutte le operazioni aritmetiche vanno ridotti modulo 1000; ad esempio, nell'istruzione 6ds
(Rd <- Rd + Rs
), se Rd + Rs è maggiore di 999, il risultato memorizzato in Rd sarà (Rd + Rs) mod 1000 (dove "mod" è l'operatore modulo, ossia restituisce il resto della divisione intera di tra Rd + Rs e 1000).
Tutti i registri contengono inizialmente il valore 000, come pure le parole della RAM. All'avvio, la CPU inizia ad eseguire le istruzioni partendo dall'indirizzo 0 in memoria.
Si consideri il seguente programma memorizzato a partire dall'indirizzo di memoria 0. Quante istruzioni vengono eseguite complessivamente (inclusa l'istruzione halt
finale)? (la risposta dovrebbe essere 16).
299
492
495
399
492
495
399
283
279
689
078
100
000
000
000
Al termine dell'esecuzione, il contenuto dei registri dovrebbe essere:
R0=0 R1=0 R2=0 R3=0 R4=0 R5=0 R6=0 R7=9 R8=0 R9=999