• Non ci sono risultati.

Architettura dei calcolatori (ex Fondamenti di Informatica II) 28 giugno 2011 - Prova scritta

N/A
N/A
Protected

Academic year: 2021

Condividi "Architettura dei calcolatori (ex Fondamenti di Informatica II) 28 giugno 2011 - Prova scritta "

Copied!
2
0
0

Testo completo

(1)

Università degli Studi di Udine

Corsi di laurea in Ingegneria Elettronica

Architettura dei calcolatori (ex Fondamenti di Informatica II) 28 giugno 2011 - 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 programmabili, telefoni cellulari.

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

1. (3 punti) Si svolga, utilizzando la rappresentazione in complemento a 2 su 16 bit, l’operazione 4096

10

– 4095

10

, riportando nel dettaglio tutti i passaggi.

2. (3 punti) Cos’è e come si calcola un CRC?

3. (2 punti) Cosa significa “codifica entropica”?

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);

(2)

4. (8 punti) Volete riprodurre, tramite la scheda audio del vostro computer, il contenuto di due file audio stereo in formato standard WAV (44.100 campioni/secondo, 16 bit per campione). Il primo file contiene del parlato mentre il secondo file contiene della musica da usare come sottofondo del parlato. I due file hanno durata differente e, se quella della musica di sottofondo è inferiore a quella del parlato, la riproduzione della musica deve ripartire dall’inizio ed essere ripetuta per quante volte è necessario per arrivare fino alla fine del parlato. La riproduzione simultanea dei due file audio avviene semplicemente miscelandoli in proporzioni uguali, cioè effettuando la media dei valori dei campioni provenienti dai due file.

Periodicamente il driver della scheda audio chiama la funzione

void load_buffer (signed short int *sample, int dim)

per “richiedere” al programma i campioni audio da riprodurre. La funzione riceve come argomenti un vettore di campioni (da riempire) e la sua dimensione (sempre pari, corrispondente a un numero intero di campioni stereo). Nel vettore i campioni stereo sono alternati: quelli di indice pari corrispondono al canale di sinistra e quelli dispari a quello di destra.

Supponendo che il programma preveda le seguenti variabili globali:

int posizione_parlato = 0;

int posizione_musica = 0;

WAVE audio_parlato;

WAVE audio_musica;

e che le due strutture di tipo WAVE siano già state caricate (ad opera del main) con il contenuto dei due file audio in oggetto, si scriva la funzione load_buffer. Il valore dei campioni successivi all’ultimo del parlato devono essere posti a zero.

(svolgere sul retro)

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:

5. (10 punti) Si scriva in linguaggio assembler la funzione DIVISIBILE che riceve in R1 ed R2 due numeri interi positivi e che restituisce in R0 il valore 1 se R1 è divisibile per R2, zero altrimenti.

(svolgere sul retro)

6. (4 punti) Si descrivano i supporti di memoria di massa magnetici e ottici e se ne giustifichino le differenze.

(svolgere sul retro)

7. (2 punti) Si discuta il significato e l’utilizzo del simbolo ‘$’ nelle espressioni di calcolo in un foglio elettronico.

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)

Riferimenti

Documenti correlati

 Per leggere dati da un file presente sul disco, Per leggere dati da un file presente sul disco, occorre dapprima costruire un oggetto di tipo occorre dapprima costruire un

Si scriva un programma in linguaggio C che riceva sulla riga di comando il nome di un file di ingresso, il nome di un file di uscita e un numero intero, rappresentante la dimensione

(11 punti) Se si rallenta la velocità di scorrimento di un nastro magnetico analogico (per esempio quello di una musicassetta), si diminuisce la tonalità della musica (cioè

(7 punti) Si scriva in linguaggio assembler la funzione STR_UPPC che riceve come argomento in R1 l’indirizzo di una stringa in formato C (quindi terminata da '\0') e ne converte

Si scriva una funzione che riceva una stringa e restituisca l’immagine bitmap contenente la rappresentazione del contenuto della stringa mediante il codice a barre sopra descritto..

• Il programma deve leggere da tastiera il nome del file nel formato sopra descritto, leggere tale file copiandone il contenuto nel vettore di struct in memoria e, infine,

La distanza è espressa in metri, il tempo in secondi, il valore di atleta è il numero di tessera della federazione di tipo string.. Devono essere memorizzati solo i

I seguenti studenti hanno raggiunto i 2/3 delle ore di frequenza richiesta, pertanto possono iscriversi agli appelli del corso... Elenco studenti che possono sostenere l’esame