Esercizio su Programmazione in Linguaggio Macchina e Codici
Indice

Macchina virtuale, set di istruzioni
La nostra macchina virtuale ha un solo registro accumulatore (ACC), 100 celle di RAM: RAM[0], RAM[1], ...


 

Nel seguito scriveremo RAM[C] intendendo "il contenuto" della cella C della RAM, lo stesso per ACC.
Inoltre per descrivere l'effetto delle istruzioni useremo la notazione:
V'=EXPR  dove V' e' il nuovo valore ad es dell'accumulatore, ecc. ed EXPR e' un espressione con i valori correnti.
Es. ACC'=ACC+1 (incrementa ACC di 1), oppure ACC'=RAM[3]   (carica il valore RAM[3] in ACC).

Nomi delle istruzioni
Per semplicita' descriviamo le istruzioni utilizzando un nome simbolico invece che numerico.
As esempio, supponiamo che l'istruzione che somma il valore di una cella della RAM all'accumulatore abbia
codice 6. Se C e' il parametro, a lezione avremmo usato la notazione 6*1000+C.
Ad es. l'effetto di 6003 e' ACC'=ACC+RAM[3]
In questi esercizi useremo invece il nome mnemonico SUM al posto del codice istruzione:
Ad es. 6003 si puo' rappresentare con SUM 3  e cosi via.

Set di istruzioni
 
Codice  Specifica Effetto
0 READ  Muove un valore letto dall'input nel registro ACC (cancella il suo valore precedente)
1 MOVE  C Muove il valore contenuto nel registro ACC nella C-esima cella della RAM (cancella il valore precedente della cella)
2 LOAD  C Muove il valore contenuto nella cella C della RAM nel registro ACC (cancella il valore precedente di ACC)
3 INC Incrementa di uno il valore contenuto nel registro ACC
4 DEC Decrementa  di 1 il valored del reg. ACC
5 TEST L Se il valore del reg. ACC e' uguale  a ZERO  assegna al reg. PC il valore L ;   altrimenti va all'istruzione seguente
Nota: non modifica il  valore del reg. ACC
6 SUM Somma al valore contenuto nel reg. ACC il valore contenuto nella C-esima cella della RAM
7 GOTO  Assegna il valore  L al reg. PC 
8 END Termina il programma 

Siamo pronti ora per qualche esercizio di programmazione a livello macchina.


Es 1.
Scrivere un programma che dopo aver letto da input due valori N ed M calcola il loro prodotto N*M.
Potete usare un'area della RAM per memorizzare le costanti necessarie al programma. 
Es 2.
Qual e' il contenuto delle celle RAM[0-4] e ACC alla fine dell'esecuzione del seguente programma?
Intuitivamente qual e' l'effetto dell'esecuzione di questo programma?
Ricordatevi che l'istruzione e' codificata come 1000*Ni+C (dove Ni=Numero istruzione, es. Ni=0 per READ ecc; C=parametro).

RAM[0]= LOAD 0
RAM[1]= SUM 1
RAM[2]= DEC
RAM[3]= MOVE 4
RAM[4]= 0 


Es 3.
Scrivere un programma che legge N e quindi legge N numeri e li memorizza nella RAM in N celle adiacenti a partire dalla cella 21. 
Es 4.
Qual e' l'effetto del seguente programma?

RAM[0]= READ
RAM[1]= MOVE 11
RAM[2]= LOAD 9
RAM[3]= SUM 11
RAM[4]= MOVE 9
RAM[5]= LOAD 10
RAM[6]= SUM 11
RAM[7]= MOVE 10
RAM[8]= READ
RAM[9]=  MOVE 0
RAM[10]= GOTO 00 


Es 5.
Supponiamo di dover rappresentare le istruzioni della nostra macchina tramite sequenze di bit CODICE PARAMETRO,
dove CODICE= codifica in binario del numero d'ordine dell'istruzione e
PARAMETRO= codifica in binario del parametro.
Sia N il numero di celle della RAM che vogliamo indirizzare. Es 6.
Codificate i numeri  13 e -13 su 8 bit in rappresentazione a complemento a 1.
Eseguite poi la somma bit-a-bit (dimenticandovi del riporto generato dal
bit piu a sinistra) delle codifiche di 13  e -13 e poi la somma delle codifiche di -13 e -13.
Riconvertite quindi i risultati in decimale.

Es 7.
Codificate i numeri decimali 13 e 8 in base 4 e in base 7.
Applicate l'algoritmo di somma alle codifiche risultanti (prima in base 4 e poi in base 7).
Convertite infine i risultati in base decimale.


Soluzioni
Soluzioni degli esercizi più interessanti