Università degli Studi di Udine Corsi di laurea in Ingegneria
Transcript
Università degli Studi di Udine Corsi di laurea in Ingegneria
Università degli Studi di Udine Corsi di laurea in Ingegneria Elettronica e Ingegneria Gestionale Architettura dei calcolatori / Fondamenti di Informatica II 5 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. (2 punti) Si svolga, utilizzando la rappresentazione in complemento a 2 su 16 bit, l’operazione 102410 – 102510, riportando nel dettaglio tutti i passaggi. (svolgere sul retro) 2. (3 punti) Indicare le associazioni tra tecniche e funzionalità ottenibili, riportando il numero ritenuto corretto: codifica entropica: ______ RLE: ____ matrice di quantizzazione: _____ codici di Hamming a 1 bit: _____ LZW: ______ MNP5: ______ codici polinomiali: _____ 1 - controllo degli errori 2 - controllo e correzione degli errori 3 - compressione senza perdita 4 - compressione con perdita Si consideri una libreria in linguaggio C per manipolare file audio così definita: typedef typedef typedef unsigned char unsigned short int unsigned long int byte; word; dword; #define SAMPLE(wave, channel, offset) \ wave.wavedata.sample \ [2 * (offset) + (channel)] #define #define #define #define #define #define #define #define #define #define FMTPCM 1 SAMPLINGRATE 44100 CHANNELS 2 BITSPERSAMPLE 16 LEFT 0 RIGHT 1 RIFF_ID "RIFF" WAV_ID "WAVE" FMT_ID "fmt " DATA_ID "data" typedef struct tagRIFFHEADER { char riffid[4]; dword FileSize; char waveid[4]; } RIFFHEADER; typedef struct tagWAVEDATA { char dataid[4]; dword DataSize; signed short int *sample; } WAVEDATA; typedef struct tagFMTHEADER { char fmtid[4]; dword fmtsize; word format; word channels; dword SampleRate; dword BytesPerSecond; word BlockAlign; word BitsPerSample; } FMTHEADER; typedef struct tagWAVE { RIFFHEADER riffheader; FMTHEADER fmtheader; unsigned long int numofstereosamples; WAVEDATA wavedata; } WAVE; void WAVE WAVE void 3. WriteWave (WAVE wave, FILE *fp); ReadWave (FILE *fp); CreateEmptyCDaudioWave (unsigned long int numofstereosamples); ReleaseWaveData (WAVE *wave); (10 punti) In molte situazioni, per dare continuità alla riproduzione di brani musicali distinti, si utilizza la tecnica del crossfade che consiste nel miscelare la parte finale di un brano con la parte iniziale del successivo. All’inizio del periodo di crossfade i volumi sonori del primo e del secondo brano sono rispettivamente 100% e 0%, alla metà 50% e 50%, al termine 0% e 100%, con andamento lineare nei punti intermedi. Si scriva il programma crossfade.c che brano_due.wav riceva sulla riga di comando i nomi di due file brano_uno.wav audio in formato WAV di ingresso e uno di uscita e un numero intero che rappresenti la durata del crossfade, in secondi. Il programma deve scrivere nel file di uscita la concatenazione dei due file audio in cui la porzione finale del primo file di ingresso (di durata pari alla durata del crossfade) si sovrappone alla porzione iniziale (di pari durata) del secondo file di ingresso. crossfade (3 secondi) A titilo di esempio, si consideri la figura a lato, che rappresenta l’elaborazione del comando crossfade brano_uno.waw brano_due.wav uscita.wav 3 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: assembly inst. name machine code LDWI LDWA LDWR LDBI LDBA LDBR STWA STWR STBA STBR MV PUSH POP SPRD SPWR load word load word load word load byte load byte load byte store word store word store byte store byte move push pop read SP write SP 00010000dddd0000 00100000dddd0000 00110000ddddaaaa 00010001dddd0000 00100001dddd0000 00110001ddddaaaa 00100010ssss0000 00110010ssssaaaa 00100011ssss0000 00110011ssssaaaa 00000100ssssdddd 00001000ssss0000 00001001dddd0000 00001101ssss0000 00001110ssss0000 add subtract bitwise NOT bitwise AND bitwise OR bitwise XOR increment decrement left shift right shift 01000000ssssdddd 01000001ssssdddd 01000010rrrr0000 01000011ssssdddd 01000100ssssdddd 01000101ssssdddd 01001000rrrr0000 01001001rrrr0000 01001010rrrr0000 01001011rrrr0000 ADD SUB NOT AND OR XOR INC DEC LSH RSH d d d d d d s s s s s s d d s s s r s s s r r r r X A a X A a A a A a d d d d d d DATA(16) ADDR(16) DATA(8) ADDR(16) ADDR(16) ADDR(16) action assembly inst. name machine code d <- X d <- mem[A] d <- mem[a] d <- X d <- mem[A] d <- mem[a] mem[A] <- s mem[a] <- s mem[A] <- s mem[a] <- s d <- s push (s) d <- pop () d <- SP SP <- s INW INB OUTW OUTB TSTI 10000000dddd0000 10000001dddd0000 10000010ssss0000 10000011ssss0000 1000010000000000 d d r d d d r r r r <<<<<<<<<<- d + s d - s ~r d & s d | s d ^ s r + 1 r + 1 r << 1 r >> 1 d d s s A A A A A input word input byte out word out byte test input action IN_ADDR(16) IN_ADDR(16) OUT_ADDR(16) OUT_ADDR(16) IN_ADDR(16) TSTO A test output 1000010100000000 OUT_ADDR(16) BR JMP JMPZ JMPNZ JMPN JMPNN JMPC JMPV CALL RET HLT branch jump jump if zero jump if not zero jump if negative jump if not neg. jump if carry jump if overflow subroutine call return from sub. halt A F F F F F F F A d <- read[A] d <- read[A] out[A] <- s out[A] <- s if completed then Z <- 1 else Z <- 0 if completed then Z <- 1 else Z <- 0 1100000000000000 ADDR(16) PC <- A 11000001FFFFFFFF PC <- PC + F 11000010FFFFFFFF if (z == 1) PC <- PC 11000011FFFFFFFF if (z == 0) PC <- PC 11000100FFFFFFFF if (N == 1) PC <- PC 11000101FFFFFFFF if (N == 0) PC <- PC 11000110FFFFFFFF if (C == 1) PC <- PC 11000111FFFFFFFF if (V == 1) PC <- PC 1100100000000000 ADDR(16) push (PC); PC <- A 1100100100000000 PC <- pop() 1100111100000000 halt + + + + + + F F F F F F 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) 4. (6 punti) Si completi la decodifica del seguente programma in linguaggio macchina scrivendo il corrispondente codice assembly. Che valori si otterranno, al termine dell’esecuzione, nei registri R0 e R1? Cosa calcola questo programma? 10 10 11 00 20 10 03 00 00 10 00 00 1A 04 2A 41 06 C4 21 41 00 48 F4 C1 00 CF | | | | | | | | | | | | | | | | | | | | | | | | | | 5. (4 punti) Si disegni lo schema di traduzione di un indirizzo virtuale in indirizzo fisico in un sistema basato su paginazione. START: LDWI R1 11 Al termine: R0 = _______ , R1 = ___________ LDWI R2 3 Il programma calcola ___________________________________ LDWI R0 0 ______________________ ______________________ ______________________ ______________________ ______________________ ______________________ ______________________ (svolgere sul retro) 6. (2 punti) Il diagramma in figura deve rappresentare gli stati in cui si può trovare un processo in un sistema multitasking basato su time sharing e le relative transizioni da uno stato all’altro. Lo si completi aggiungendo anche tutti gli archi e le etichette necessarie. 7. (3 punti) In un foglio elettronico (tipo Microsoft Excel) la cella A1 contiene il valore 1 e la cella A2 contiene il valore 2. Si scrive nella cella B1 l’espressione =$A1+A$1 e poi la si copia nelle celle C1, D1, B2, C2, e D2. A questo punto, quanto varrà l’espressione =SOMMA(A1:D2)?