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