Codifica di algoritmi
linguaggio macchina
vs
programmazione strutturata
Lab Programmazione - turno 1
2005/2006
Linguaggi macchina e assembler
• Il set di istruzioni direttamente eseguibili dalla CPU di
un elaboratore è abbastanza limitato
• istruzioni di trasferimento dati tra RAM e registri CPU
• istruzioni aritmetico-logiche (che operano su dati trasferiti nei
registri CPU)
• istruzioni di controllo e salto (permettono di modificare
l’ordine sequenziale di esecuzione)
• linguaggi assembler: codifica mnemonica dei
linguaggi macchina (si usano nomi per denotare il
tipo di istruzione, i registri, e le locazioni di memoria
contenenti i dati)
AA
2005/06
2
Lab Programmazione
L. Capra
Un linguaggio assembler generico
• Faremo riferimento ad una generica CPU con 4 soli registri
(R1,R2,R3,R4) ed il seguente set di istruzioni:
• trasferimento dati CPU – RAM: LOAD, STORE, es.
LOAD R1 , x
% x ad es. denota la locazione n. 102 %
• aritmetico logiche: ADD,DIV,MUL,SUB: es.
ADD R1,R2
% risultato in R1%
• controllo/salto: JUMP,JZERO: es.
…
JZERO R2, alfa % se R2 == 0 salta all’etichetta alfa%
DIV R1,R2
…
alfa: …
AA
2005/06
3
Lab Programmazione
L. Capra
Un semplice algoritmo
{
• Esercizio: vogliamo calcolare xy, dove x,y: Int, y 0
• assumiamo che in due locazioni omonime si trovino i
valori corrispondenti
• Usiamo la definizione
1 se y = 0
xy =
x x…  x se y > 0
y volte
• Idea base: memorizziamo in un registro (R3) risultato
parziale della moltiplicazione
AA
2005/06
4
Lab Programmazione
L. Capra
Caricamento dati
LOAD R1, y % valore loc. y caricato in R1%
LOAD R2, x % valore loc. x caricato in R2%
LOAD R3, #1 % val. 1 memorizzato in R3%
LOAD R4, #1 % val. 1 memorizzato in R4 %
….
AA
2005/06
5
Lab Programmazione
L. Capra
Prima parte (caso y = 0)
LOAD R1, y % valore loc. y caricato in R1%
LOAD R2, x % valore loc. x caricato in R2%
LOAD R3, #1 % val. 1 memorizzato in R3%
LOAD R4, #1 % val. 1 memorizzato in R4 %
loop :JZERO R1, fine % se R1 = 0 vai a fine%
….
fine:PRINT R3
AA
2005/06
6
Lab Programmazione
L. Capra
Seconda parte (caso y > 0)
LOAD R1, y % valore loc. y caricato in R1%
LOAD R2, x % valore loc. x caricato in R2%
LOAD R3, #1 % val. 1 memorizzato in R3%
LOAD R4, #1 % val. 1 memorizzato in R4 %
loop :JZERO R1, fine % se R1 = 0 vai a fine%
JUMP loop
fine:PRINT R3
AA
2005/06
% ritorna a loop%
7
Lab Programmazione
L. Capra
Seconda parte (caso y > 0)
LOAD R1, y % valore loc. y caricato in R1%
LOAD R2, x % valore loc. x caricato in R2%
LOAD R3, #1 % val. 1 memorizzato in R3%
LOAD R4, #1 % val. 1 memorizzato in R4 %
loop :JZERO R1, fine % se R1 = 0 vai a fine%
MUL R3, R2 % moltiplica per x risultato parz.%
JUMP loop
fine:PRINT R3
AA
2005/06
% ritorna a loop%
8
Lab Programmazione
L. Capra
Seconda parte (caso y > 0)
LOAD R1, y % valore loc. y caricato in R1%
LOAD R2, x % valore loc. x caricato in R2%
LOAD R3, #1 % val. 1 memorizzato in R3%
LOAD R4, #1 % val. 1 memorizzato in R4 %
loop :JZERO R1, fine % se R1 = 0 vai a fine%
MUL R3, R2 % moltiplica per x risultato parz.%
SUB R1, R4
JUMP loop % ritorna a loop%
fine:PRINT R3
AA
2005/06
9
Lab Programmazione
L. Capra
Codifica algoritmo ad alto livello
• Usiamo uno pseudo-linguaggio di alto livello per implementare
lo stesso calcolo
• Strutture di controllo (sintassi)
• Selezione
SE condizione
ALLORA
istruzione1
ALTRIMENTI
istruzione2
FINESE
• Iterazione
QUANDO condizione ESEGUI
istruzione
RIPETI
AA
2005/06
10
Lab Programmazione
L. Capra
Codifica ad alto livello (1)
VAR x,y,r: INT
leggi x , y
r=1
QUANDO y > 0 ESEGUI
r=r*x
y = y – 1;
RIPETI
scrivi r
AA
2005/06
11
Lab Programmazione
L. Capra
Codifica ad alto livello (2)
VAR x,y,r: INT
leggi x , y
SE y < 0 oppure (x == 0 e y ==0)
ALLORA
scrivi “parametri non corretti”
ALTRIMENTI
r=1
QUANDO y > 0 ESEGUI
r=r*x
y = y – 1;
RIPETI
scrivi r
FINESE
AA
2005/06
12
Lab Programmazione
L. Capra