Simulazione di una CPU

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):

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