• Non ci sono risultati.

Matricola __________________ Nome _____________________ Cognome __________________

N/A
N/A
Protected

Academic year: 2021

Condividi "Matricola __________________ Nome _____________________ Cognome __________________"

Copied!
2
0
0

Testo completo

(1)

Università degli Studi di Udine

Corsi di laurea in Ingegneria Elettronica e Ingegneria Gestionale Architettura dei calcolatori / Fondamenti di Informatica II 17 febbraio 2014 - Prova scritta

Matricola __________________

Nome _____________________

Cognome __________________

ISTRUZIONI (da leggere attentamente)

1) Lo studente è tenuto a scrivere, correggere, compilare ed eseguire su computer (a casa o in laboratorio) gli esercizi di programmazione prima della prova orale. Alla prova orale lo studente deve portare un floppy disk contenente i sorgenti dei programmi corretti e le stampe dei relativi file.

2) Non è consentito l’uso di libri, appunti, calcolatrici, telefoni cellulari.

3) Rispondere sinteticamente negli spazi di fianco o seguenti le domande, oppure sul retro del foglio.

1. (4 punti) Una parola di memoria contiene il valore 3E000000

h

e rappresenta un numero reale in floating point, singola precisione. Si calcoli il valore rappresentato, riportando nel dettaglio tutti i passaggi.

(svolgere sul retro)

2. (3.punti) Si indichino con una X le associazioni corrette nella seguente tabella:

RLE MNP5 LZW DCT Matrice di

quantizzazione

Teorema del campionamento JPEG

Codici a lunghezza variabile Codici a lunghezza fissa Compressione senza perdita Codifica audio

Si consideri una libreria in linguaggio C per manipolare file audio così definita:

typedef unsigned char byte;

typedef unsigned short int word;

typedef unsigned long int dword;

#define SAMPLE(wave, channel, offset) \ wave.wavedata.sample \ [2 * (offset) + (channel)]

#define FMTPCM 1

#define SAMPLINGRATE 44100

#define CHANNELS 2

#define BITSPERSAMPLE 16

#define LEFT 0

#define RIGHT 1

#define RIFF_ID "RIFF"

#define WAV_ID "WAVE"

#define FMT_ID "fmt "

#define DATA_ID "data"

typedef struct tagRIFFHEADER {

char riffid[4];

dword FileSize;

char waveid[4];

} RIFFHEADER;

typedef struct tagFMTHEADER {

char fmtid[4];

dword fmtsize;

word format;

word channels;

dword SampleRate;

dword BytesPerSecond;

word BlockAlign;

word BitsPerSample;

} FMTHEADER;

typedef struct tagWAVEDATA {

char dataid[4];

dword DataSize;

signed short int *sample;

} WAVEDATA;

typedef struct tagWAVE {

RIFFHEADER riffheader;

FMTHEADER fmtheader;

unsigned long int numofstereosamples;

WAVEDATA wavedata;

} WAVE;

void WriteWave (WAVE wave, FILE *fp);

WAVE ReadWave (FILE *fp);

WAVE CreateEmptyCDaudioWave (unsigned long int numofstereosamples);

void ReleaseWaveData (WAVE *wave);

3. (10 punti) Si vuole costruire una melodia basandosi sul suono registrato di 12 campanellini (uno per nota musicale). Si ha a disposizione un vettore di strutture dati già inizializzato definito come riportato a lato.

Ogni elemento del vettore contiene quindi il nome della nota e la registrazione del relativo campanellino. I nomi delle note memorizzate nel vettore di strutture sono composti da una

singola parola. Per esempio: “do”, “sibemolle”, “solbemolle”, “re” (si considerano solo i “bemolle”, non i “diesis”).

La melodia è descritta da una sequenza di stringhe che identificano le note come sopra descritto. Ad esempio:

do do mibemolle mibemolle sol sol la sibemolle fa fa fa re re re do do do do

La durata di ogni nota della melodia è costante e vale 200 ms. La durata delle registrazioni dei campanellini è variabile, ma sempre inferiore a 200 ms.

Si scriva un programma in linguaggio C che riceva sulla riga di comando il nome di un file wave di uscita e la melodia nel formato sopra descritto. Il programma deve scrivere nel file la melodia in formato audio.

Si assuma già disponibile la funzione void carica_suoni (struct suoni campanelli[]) che inizializza il vettore.

NOTA: sul sito del corso saranno disponibili i file wave e il file C contenente la funzione carica_suoni.

(svolgere sul retro)

struct suoni {

char nome_nota[16];

WAVE suono_nota;

} campanellini[12];

(2)

Un elaboratore (il modello didattico SimCPU visto a lezione) dispone di CPU (a 16 bit) con 16 registri di uso generale (R0, R1, ..., R15) più il Program Counter, l’Instruction Register, lo Stack Pointer e 4 flag Z (zero), N (negative), C (carry) e V (overflow). Si ricorda che il linguaggio assembler di tale elaboratore dispone delle seguenti istruzioni:

4. (7 punti) Si completi la decodifica del programma in linguaggio macchina riportato a lato, scrivendo il corrispondente codice assembly. Che valori si otterranno, al termine dell’esecuzione, nei registri R0 e R1? Cosa calcola questo programma?

5. (4 punti) Si disegni lo schema di una memoria cache parzialmente associativa a due vie.

6. (2 punti) Si scriva un’espressione, da inserire nella cella A1 di un foglio elettronico, che richieda l’abilitazione della modalità di calcolo iterativo.

assembly inst. name machine code action

LDWI d X load word 00010000dddd0000 DATA(16) d <- X LDWA d A load word 00100000dddd0000 ADDR(16) d <- mem[A]

LDWR d a load word 00110000ddddaaaa d <- mem[a]

LDBI d X load byte 00010001dddd0000 DATA(8) d <- X LDBA d A load byte 00100001dddd0000 ADDR(16) d <- mem[A]

LDBR d a load byte 00110001ddddaaaa d <- mem[a]

STWA s A store word 00100010ssss0000 ADDR(16) mem[A] <- s STWR s a store word 00110010ssssaaaa mem[a] <- s STBA s A store byte 00100011ssss0000 ADDR(16) mem[A] <- s STBR s a store byte 00110011ssssaaaa mem[a] <- s MV s d move 00000100ssssdddd d <- s PUSH s push 00001000ssss0000 push (s) POP d pop 00001001dddd0000 d <- pop () SPRD d read SP 00001101ssss0000 d <- SP SPWR s write SP 00001110ssss0000 SP <- s

ADD s d add 01000000ssssdddd d <- d + s SUB s d subtract 01000001ssssdddd d <- d - s NOT r bitwise NOT 01000010rrrr0000 r <- ~r AND s d bitwise AND 01000011ssssdddd d <- d & s OR s d bitwise OR 01000100ssssdddd d <- d | s XOR s d bitwise XOR 01000101ssssdddd d <- d ^ s INC r increment 01001000rrrr0000 r <- r + 1 DEC r decrement 01001001rrrr0000 r <- r + 1 LSH r left shift 01001010rrrr0000 r <- r << 1 RSH r right shift 01001011rrrr0000 r <- r >> 1

assembly inst. name machine code action

INW d A input word 10000000dddd0000 IN_ADDR(16) d <- read[A]

INB d A input byte 10000001dddd0000 IN_ADDR(16) d <- read[A]

OUTW s A out word 10000010ssss0000 OUT_ADDR(16) out[A] <- s OUTB s A out byte 10000011ssss0000 OUT_ADDR(16) out[A] <- s

TSTI A test input 1000010000000000 IN_ADDR(16) if completed then Z <- 1 else Z <- 0

TSTO A test output 1000010100000000 OUT_ADDR(16) if completed then Z <- 1 else Z <- 0

BR A branch 1100000000000000 ADDR(16) PC <- A JMP F jump 11000001FFFFFFFF PC <- PC + F

JMPZ F jump if zero 11000010FFFFFFFF if (z == 1) PC <- PC + F JMPNZ F jump if not zero 11000011FFFFFFFF if (z == 0) PC <- PC + F JMPN F jump if negative 11000100FFFFFFFF if (N == 1) PC <- PC + F JMPNN F jump if not neg. 11000101FFFFFFFF if (N == 0) PC <- PC + F JMPC F jump if carry 11000110FFFFFFFF if (C == 1) PC <- PC + F JMPV F jump if overflow 11000111FFFFFFFF if (V == 1) PC <- PC + F CALL A subroutine call 1100100000000000 ADDR(16) push (PC); PC <- A RET return from sub. 1100100100000000 PC <- pop() HLT halt 1100111100000000 halt

LEGENDA:

- lettere minuscole = registri; lettere maiuscole = dati numerici - ‘r’ = registro letto e modificato

- ‘s’ = registro soltanto letto - ‘d’ = registro modificato

- ‘a’ = registro il cui contenuto è usato come indirizzo - FFFFFFFF = offset (in complemento a 2)

0008

54 | STR: byte 54 ; 'T' 65 | byte 65 ; 'e' 73 | byte 73 ; 's' 74 | byte 74 ; 't' 6F | byte 6F ; '0' 00 | byte 0 ; '\0'

61 | A: byte 61 ; codice ASCII di 'a' minuscola 7A | Z: byte 7A ; codice ASCII di 'z' minuscola A0 | START: LDBA R10 A

21 | 06 | 00 |

B0 | LDBA R11 Z 21 |

07 | 00 |

10 | LDWI R1 STR 10 |

00 | 00 |

00 | LDWI R0 0 10 |

00 | 00 |

21 | LOOP: LDBR R2 R1 31 |

12 | JMPZ FINE C2 |

10 | ________________

48 |

23 | ________________

04 |

A3 | ________________

41 |

F4 | ________________

C4 |

B3 | ________________

04 |

23 | ________________

41 |

EE | ________________

C4 |

00 | ________________

48 |

EA | ________________

C1 |

00 | FINE: HLT

CF |

Riferimenti

Documenti correlati

Si scriva un programma in linguaggio C che riceva sulla riga di comando il nome di un file nel formato sopra descritto e stampi sul monitor il nome e l’elenco dei concorrenti

Si scriva un programma in linguaggio C che riceva sulla riga di comando il nome di un file di dizionario nel formato dell’esempio sopra riportato e il nome di un file

Si scriva un programma in linguaggio C che riceva sulla riga di comando il nome di due file come quelli sopra descritti e stampi il numero delle repliche

Per fare questo, si scriva un programma in linguaggio C che riceva sulla riga di comando il nome di un file come sopra descritto e stampi l’elenco dei

Si scriva un programma in linguaggio C che riceva sulla riga di comando il nome del file principale e il nome del file di backup e stampi sullo schermo i comandi per

Si scriva un programma in linguaggio C che riceva sulla riga di comando il nome di un file contenente la tabella dei colori e il nome di un file contenente l’elenco degli oggetti

(5 punti) Si scriva un programma in linguaggio C che riceva sulla linea di comando il nome di un file bitmap di ingresso e il nome di un file bitmap di uscita. Il programma

Si scriva un programma in linguaggio C che riceva sulla linea di comando il nome di un file bitmap di ingresso e il nome di un file bitmap di uscita. Il programma deve scrivere