• Non ci sono risultati.

Università degli Studi di Udine Corsi di laurea in Ingegneria Elettronica e Ingegneria Gestionale Architettura dei calcolatori (ex Fondamenti di Informatica II) 21 febbraio 2017 - Prova scritta Matricola __________________ Nome _____________________ Cogno

N/A
N/A
Protected

Academic year: 2021

Condividi "Università degli Studi di Udine Corsi di laurea in Ingegneria Elettronica e Ingegneria Gestionale Architettura dei calcolatori (ex Fondamenti di Informatica II) 21 febbraio 2017 - Prova scritta Matricola __________________ Nome _____________________ Cogno"

Copied!
2
0
0

Testo completo

(1)

Università degli Studi di Udine

Corsi di laurea in Ingegneria Elettronica e Ingegneria Gestionale Architettura dei calcolatori (ex Fondamenti di Informatica II) 21 febbraio 2017 - 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 memoria 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) Ad un messaggio della dimensione di un byte è stato aggiunto un codice di Hamming a quattro bit per il controllo e la correzione di errore. Il messaggio poi è stato trasmesso lungo una linea disturbata. Il messaggio ricevuto è

100011101000.

Si valuti se il messaggio ricevuto è corretto o no, eventualmente si effettui la correzione e e si scriva il valore del byte del messaggio originario.

Riportare tutti i passaggi effettuati.

2. (3 punti) Si esegua l’operazione -127

10

- 1

10

su 8 bit in complemento a 2 e si discuta la validità del risultato.

Riportare tutti i passaggi effettuati.

3. (2 punti) Indicare le associazioni ritenute corrette

codifica entropica [ ] compressione [ ] controllo errori [ ] correzione errori codici a prefisso [ ] compressione [ ] controllo errori [ ] correzione errori MNP5 [ ] compressione [ ] controllo errori [ ] correzione errori distanza di Hamming [ ] compressione [ ] controllo errori [ ] correzione errori

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

(2)

4. (12 punti) Una bitmap di 1000x1000 pixel deve rappresentare la porzione del primo quadrante del piano cartesiano di dimensioni 10x10 unità. Su di essa deve essere disegnata la funzione y = 5 + x  sin(x).

Si scriva un programma in linguaggio C che generi il file “plot.bmp” contenente un reticolo 10x10, dello spessore di 1 pixel in colore rosso, e il grafico della funzione in colore nero, il tutto su sfondo bianco.

Il programma deve generare l’immagine della figura a lato. Si osservi che la funzione assume anche valori al di fuori dello spazio disponibile per il disegno.

Suggerimento: per disegnare la funzione si calcoli il valore della variabile x corrispondente alla colonna del pixel in base al rapporto tra le dimensioni dell’immagine e il numero di uità rappresentate. Poi, utilizzando la funzione assegnata, si calcoli il valore della y. Infine si converta il valore della y nell’indice della riga procedendo in modo inverso rispetto a quanto fatto per la x.

Rispondere 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. (5 punti) Partendo dal codice macchina si disassembli la seguente funzione, cioè si scriva il corrispondente programma sorgente in linguaggio assembly.

10 | ABS:__________________________________

04 |

02 | ______________________________________

C4 |

06 | ______________________________________

C1 |

00 | ______________________________________

10 |

00 | ______________________________________

00 |

10 | ______________________________________

41 |

00 | ______________________________________

C9 |

6. (2 punti) Cosa calcola la funzione della domanda precedente?

7. (3 punti) Si disegni lo schema di traduzione degli indirizzi virtuali in fisici un un sistema basato su segmentazione.

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

Riferimenti

Documenti correlati

Si scriva una funzione che riceva come argomenti il nome del file di equivalenze sopra descritto, il nome di un file di grandezze (con i punti interrogativi) e il nome di un file

Si scriva una funzione in linguaggio C che riceva come argomenti il puntatore a un file di testo nel formato sopra descritto (il file è quindi già stato aperto dalla funzione

Al termine dell’esecuzione delle operazioni specificate nel file di ingresso il programma dovrà stampare i valori contenuti in tutte e sole le celle di memoria che

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

Poiché gli identificatori (numeri) delle tessere sono univoci e nella griglia è presente una sola posizione vuota, ogni mossa può semplicemente essere indicata

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

Successivamente, per ogni cifra del tentativo non ancora utilizzata si cerca lo stesso valore tra le cifre non ancora utilizzate del numero segreto e, se lo si trova,

Ogni elemento della matrice descrive una porzione quadrata di superficie (pari ad un numero di metri quadrati scritto nell’intestazione del file) mediante due