Esercizio 1
Supponiamo di lavorare su una Macchina di Von Neumann avente le seguenti
caratteristiche:
RAM= 200 celle
PC = registro Program Counter
ACC = registro Accumulatore
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 uno il valored del reg. ACC |
5 | TEST L | Se il valore del reg. ACC e' uguale a ZERO assegna al
registro PC il valore L; altrimenti va all'istruzione seguente Nota: non modifica il valore del reg. ACC |
6 | SUM C | Somma al valore contenuto nel reg. ACC il valore contenuto nella C-esima
cella della RAM
(il valore precedente dell'accumulatore va perso) |
7 | GOTO L | Assegna il valore L al reg. PC
Nota: non modifica il valore del reg. ACC |
8 | END | Termina il programma |
Considerate ora il seguente programma in linguaggio macchina
RAM[0]=READ
RAM[1]=MOVE 13
RAM[2]=READ
RAM[3]=TEST 12
RAM[4]=DEC
RAM[5]=MOVE 14
RAM[6]=LOAD 13
RAM[7]=TEST 12
RAM[8]=DEC
RAM[9]=MOVE 13
RAM[10]=LOAD 14
RAM[11]=GOTO 3
RAM[12]=END
RAM[13]=0
RAM[14]=0
(1.1) Data la sequenza di input (ordinata da sinistra a
destra)
|
|
qual e' il valore delle celle RAM[13] e RAM[14] alla fine dell'esecuzione del programma?
Soluzione
RAM[13]=11
RAM[14]=0
(1.2) Piu' in generale data la sequenza di input
|
|
con x1, x2>=0 qual e' il valore delle celle RAM[13] e RAM[14] alla fine dell'esecuzione del programma?
Soluzione
Per x1>=0 e x2>=0
(a) Se x1 >= x2
RAM[13]=x1-x2
RAM[14]=0
(b) Se x1< x2
RAM[13]=0
RAM[14]=x2-x1-1
(1.3) Cosa succede se x2<0?
Se x1>=0
RAM[13]=0
RAM[14]=x2-x1-1
Se x1<0 il programma non termina
Considerate il seguente frammento di programma LP:
var x;
begin
read(x);
if (x=0) then x:=x+1 else x:=x-1
endif;
end.
(2.1)
Supponiamo di voler tradurre il precente programma in linguaggio macchina.
ll flusso del programma in linguaggio macchina e il suo effetto sulla
cella associata alla
variabile x devono essere equivalenti a quello del programma
LP.
Supponiamo di associare la cella 103 della RAM alla variabile x.
La cella 103 manterra' il valore corrente di x durante l'esecuzione.
Tenuto conto della precedente ipotesi, un possibile schema di traduzione
e'
RAM[0]=READ
RAM[1]=MOVE 103
RAM[2]=LOAD 103
RAM[3]=TEST ...
RAM[4]= ...
RAM[5]=GOTO ...
RAM[6]= ...
RAM[7]=MOVE 103
RAM[8]=END
Completate con i parametri e le istruzioni mancanti lo schema in modo
da simulare
il comportamento del programma originale.
Soluzione
RAM[0]=READ
RAM[1]=MOVE 103
RAM[2]=LOAD 103
RAM[3]=TEST 6
RAM[4]=DEC
RAM[5]=GOTO 7
RAM[6]=INC
RAM[7]=MOVE 103
RAM[8]=END
Nota: tutti e due i rami dell'istruzione condizionale convergono
al punto in cui si memorizza il valore di x (istruzione 7).
(2.2)
Rappresentate le prime 4 istruzioni del programma del punto (2.1) in
codifica binaria,
utilizzando un byte per il codice (vedi tabella) e un byte per il parametro
(=0 se non indicato)
Soluzione
00000000 00000000
00000001 01100111
00000010 01100111
00000101 00000110