• Non ci sono risultati.

Matricola __________________ Nome _____________________ Cognome __________________

N/A
N/A
Protected

Academic year: 2021

Condividi "Matricola __________________ Nome _____________________ Cognome __________________"

Copied!
3
0
0

Testo completo

(1)

Università degli Studi di Udine

Corsi di laurea in Ingegneria Elettronica

Architettura dei calcolatori / Fondamenti di Informatica II 22 febbraio 2012 - 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 una memory pen USB 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. (3 punti) Eseguire le seguenti conversioni (scrivendo il risultato sia in binario che in esadecimale), indicando eventualmente se non sono possibili.

-128 in modulo e segno su 8 bit ______________________________________

-128 in complemento a 2 su 8 bit ______________________________________

-255 in binario puro su 8 bit ______________________________________

-255 in binario puro su 16 bit ______________________________________

255 in binario puro su 16 bit ______________________________________

-1 in complemento a 2 su 64 bit ______________________________________

2. (2 punti) Indicare le associazioni corrette.

[ ] codifica entropica – controllo degli errori

[ ] codifica entropica – controllo e correzione degli errori [ ] RLE – compressione senza perdita

[ ] CRC – codici a prefisso

[ ] matrice di quantizzazione – compressione con perdita

Si consideri la libreria in linguaggio C per manipolare file bitmap vista a lezione, così definita:

typedef unsigned char byte;

typedef unsigned short int word;

typedef unsigned long int dword;

#define BMPFILETYPE 0x4D42

typedef struct tagCOLORTRIPLE {

byte blue;

byte green;

byte red;

} COLORTRIPLE;

typedef struct tagFILEHEADER {

word ImageFileType;

dword FileSize;

word Reserved1;

word Reserved2;

dword ImageDataOffset;

} FILEHEADER;

typedef struct tagBMPHEADER {

dword HeaderSize;

dword ImageWidth;

dword ImageHeight;

word NumberOfImagePlanes;

word BitsPerPixel;

dword CompressionMethod;

dword SizeOfBitmap;

dword HorizonalResolution;

dword VerticalResolution;

dword NumberOfColorsUsed;

dword

NumberOfSignificantColors;

} BMPHEADER;

typedef struct tagBITMAP {

dword width;

dword height;

COLORTRIPLE *pixel;

FILEHEADER fileheader;

BMPHEADER bmpheader;

} BITMAP;

#define PIXEL(image, row, column) \ image.pixel [(row( * image.width +

(column)]

BITMAP ReadBitmap (FILE *fp);

void WriteBitmap (BITMAP bitmap, FILE *fp);

BITMAP CreateEmptyBitmap

(dword height, dword width);

void ReleaseBitmapData (BITMAP *bitmap);

3. (12 punti) Nei montaggi video, l’effetto di dissolvenza (anche detto “crossfade”) consiste nel passare gradualmente da un’immagine ad un’altra. Ogni pixel durante la transizione tra le due immagini assume un valore ottenuto dalla media pesata dei valori dei due corrispondenti pixel delle immagini originali. Naturalmente, il peso varia da 100%:0% a 0%:100%

passando dalla prima alla seconda immagine. Si scriva un programma che generi i fotogrammi intermedi di una tale transizione. Il programma deve ricevere sulla riga di comando, nell’ordine, i seguenti parametri:

• nome del file contenente la prima immagine

• nome del file contenente la seconda immagine (di dimensioni identiche alla prima)

• numero N di fotogrammi da generare

Il programma deve generare N+1 file bitmap di uscita, di nome crossfade_0.bmp, crossfade_1.bmp, crossfade_2.bmp, ...

crossfade_N.bmp (dove N sarà il numero inserito sulla riga di comando), contenenti ciascuno una delle immagini

intermedie. Poiché la transizione risulta divisa in N intervalli, ad ogni passo il peso della prima immagine diminuirà di 1/N e quello della seconda aumenterà di 1/N. Il primo file generato (crossfade_0.bmp) conterrà la transizione con pesi

100%:0%, e sarà quindi uguale alla prima immagine, mentre l’ultimo file generato conterrà la transizione con pesi

(2)

0%:100%, e sarà quindi uguale alla seconda immagine.

La figura riporta un esempio di transizione con N = 3.

crossfade_0.bmp crossfade_1.bmp crossfade_2.bmp crossfade_3.bmp

Suggerimenti:

• si usi la funzione sprintf per generare i nomi dei file di uscita;

• si scriva una generica funzione che misceli due immagini in parti proporzionali ad un valore passato come argomento.

(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:

4. (5 punti) La funzione char *strstr(const char *S1, const char *S2) della libreria standard del linguaggio C cerca la stringa S2 in S1 e restituisce l’indirizzo dell’inizio della prima occorrenza di S2. Se S2 non è presente in S1 restituisce NULL (ovvero un puntatore di valore zero). Si assuma di avere già a disposizione la funzione STRNCMP che confronta due stringhe, i cui indirizzi sono contenuti nei registri R1 e R2, per una lunghezza massima di caratteri pari al valore contenuto nel registro R3. Se le due stringhe sono uguali almeno per i primi R3 caratteri la funzione restituisce zero, e un valore diverso da zero altrimenti. Si assuma infine che sia anche già disponibile la funzione STRLEN, che restituisce in R0 la lunghezza della stringa il cui indirizzo è passato nel registro R1.

Nel seguito è riportata una implementazione della funzione STRTR in linguaggio assembler, in cui l’indirizzo di S1 è passato nel registri R1 e quello di S2 in R2. La si completi.

(SEGUE SUL RETRO)

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)

(3)

STRSTR: _____________ ; salva nello stack l’indirizzo della stringa S1 _____________ ; salva nello stack l’indirizzo della stringa S2 MV R2 R1 ; prepara la chiamata a STRLEN

CALL STRLEN ; calcola la lunghezza della stringa S2 MV R0 R3 ; copia la lunghezza della stringa S2 in R3 _____________ ; ripristina l’indirizzo della stringa S1 in R1 _____________ ; ripristina l’indirizzo della stringa S1 in R2 L_STRSTR: CALL STRNCMP ; confronta S1, a partire da R1, con S2 per una

; lunghezza massima pari alla lunghezza di S2 (in R3) MV R0 R10 ; copia il risultato in R10

_____________ ; se ha restituito zero, STRNCMP ha trovato S2 in S1 INC R1 ; avanza con il puntatore in S1

_____________ ; leggi il carattere puntato da R1

_____________ ; se siamo alla fine di S1 salta all’uscita

JMP L_STRSTR ; ripeti la ricerca della sottostringa partendo da R1

FINE_STR: XOR R0 R0 ; azzera R0 RET

TROVATA: MV R1 R0 ; copia l’indirizzo in R0 RET

5. (4 punti) Quanto vale il registro R0 al termine dell’esecuzione del programma in linguaggio macchina riportato a fianco? Si scriva la traduzione in linguaggio assembler delle istruzioni.

6. (2 punti) Quali di queste informazioni sono contentue nella page table?

[ ] pagina accessibile solo in lettura

[ ] pagina presente/non presente in memoria centrale/nel page file [ ] indirizzo della pagina in memoria centrale o nel page file [ ] indirizzo della segment table

[ ] indirizzo del primo segmento della pagina [ ] indirizzo della linea in memoria centrale [ ] indirizzo della linea in memoria cache

7. (2 punti) Il seguente diagramma 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.

R0 = ______

00 | START: ___________

10 | 03 | 00 |

10 | __________________

10 | 05 | 00 |

00 | __________________

48 |

10 | __________________

49 |

FA | __________________

C3 |

00 | HLT CF |

Riferimenti

Documenti correlati

Determinare due vettori linearmente indipendenti che abbiano la stessa

Il foglio con il testo, compilato con cognome, nome e numero di matricola, va consegnato assieme alla bella copia.. Non si consegnano

Le particelle che hanno la stessa carica si respingono (ecco perché i neutroni tengono uniti i protoni nel nucleo), mentre le particelle di carica opposta si

Otteniamo come valori di delta E delle transizioni che sono delta E fra lo stato eccitato 1 e 2 corrispondente al valore di energia fornito durante l'esperimento 2, che quindi

[r]

[r]

Poich´ e l’intervallo massimale di esistenza ` e tutto R, non ci sono asintoti verticali.. Non ci sono

[r]