Esempio esame codifica e linguiaggio macchina

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 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  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)
 
14
3

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
 
x1
x2

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



Esercizio 2

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