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