• Non ci sono risultati.

Matricola __________________ Nome _____________________ Cognome __________________

N/A
N/A
Protected

Academic year: 2021

Condividi "Matricola __________________ Nome _____________________ Cognome __________________"

Copied!
4
0
0

Testo completo

(1)

Università degli Studi di Udine

Corsi di laurea in Ingegneria Elettronica

Architettura dei calcolatori / Fondamenti di Informatica II 16 luglio 2013 - 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. (4 punti) Si disegni e commenti lo schema di compressione Jpeg

(si vedano le dispense, la documentazione in rete e gli appunti delle lezioni)

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. (10 punti) Lo spazio dei colori, facendo uso di tre colori primari, è tridimensionale.

È possibile rappresentarne una proiezione sul piano eseguendo una trasformazione delle coordinate e fissando uno dei parametri, per esempio la luminosità dei pixel.

Si scriva un programma che riceva sulla riga di comando il nome di un file bitmap di uscita e la sua dimensione (una sola: l’immagine generata deve essere di forma quadrata) e produca un’immagine come quella a lato (ovviamente a colori, nonostante la fotocopia sia in bianco e nero...).

In tale immagine, lungo la coordinata Y il valore del colore rosso va da zero al massimo rappresentabile, lungo la coordinata X il valore del colore verde va da zero al massimo rappresentabile, mentre in ogni pixel il colore blu ha intensità pari alla differenza tra il massimo rappresentabile e la somma degli altri due colori. Se tale differenza diventa negativa, l’intensità del colore blu resta a zero.

(svolgere sul retro)

(2)

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <math.h>

#include "bmp.h"

void disegna_colori (BITMAP bmpout);

int main (int argc, char *argv[]) {

FILE *fpout;

BITMAP bmpout;

int n;

if (argc != 3) {

printf ("Errore negli argomenti: arcobaleno <file> <dimensione>\n");

exit (EXIT_FAILURE);

}

if ((fpout = fopen (argv[1], "wb")) == NULL) {

printf ("Errore di apertura del file\n");

exit (EXIT_FAILURE);

}

n = atoi (argv[2]);

bmpout = CreateEmptyBitmap (n, n);

disegna_colori (bmpout);

WriteBitmap (bmpout, fpout);

ReleaseBitmapData (&bmpout);

fclose (fpout);

return EXIT_SUCCESS;

}

void disegna_colori (BITMAP bmpout) {

int i, j;

double step, d_red, d_green, d_blue;

step = 255.0 / bmpout.height;

d_red = 0;

d_green = 0;

d_red = 0;

for (i = 0; i < bmpout.height; i++) {

d_green = 0;

for (j = 0; j < bmpout.width; j++) {

d_blue = 255 - (d_red + d_green);

if (d_blue < 0) d_blue = 0;

PIXEL(bmpout, i, j).red = (unsigned char) d_red;

PIXEL(bmpout, i, j).green = (unsigned char) d_green;

PIXEL(bmpout, i, j).blue = (unsigned char) d_blue;

d_green += step;

}

d_red += step;

}

return;

}

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

3. (4 punti) La seguente funzione esegue la copia di una stringa in formato C, il cui indirizzo è passato in R1, in una seconda stringa il cui indirizzo è passato in R2. La si completi.

STRCPY: _______ R10 R1 _______ R10 R2 JMP___ END_SCPY _____ R1

_____ R2 JMP STRCPY END_SCPY: RET

STRCPY: LDBR R10 R1 STBR R10 R2 JMPZ END_SCPY INC R1

INC R2 JMP STRCPY END_SCPY: RET

4. (4 punti) Si traduca in linguaggio macchina il seguente frammento di codice:

DIV: LDWI R0 0

MV R1 R15

L_DIV: MV R15 R3

SUB R2 R3

JMPN END_DIV

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)

(4)

SUB R2 R15

INC R0

JMP L_DIV

END_DIV: RET

00 | DIV: LDWI R0 0 10 |

00 | 00 |

1F | MV R1 R15 04 |

F3 | L_DIV: MV R15 R3 04 |

23 | SUB R2 R3 41 |

06 | JMPN END_DIV C4 |

2F | SUB R2 R15 41 |

00 | INC R0 48 |

F4 | JMP L_DIV C1 |

00 | END_DIV: RET C9 |

5. (4 punti) Si disegni lo schema a blocchi di una memoria cache a mappatura diretta

6. (4 punti) Si disegni il diagramma degli stati in cui può trovarsi un processo in un sistema multiasking basato su time

sharing, indicando gli eventi che determinano le transizioni di stato.

Riferimenti

Documenti correlati

Tra la fine del XIX e l’inizio del XX secolo, l’industria chimica tedesca inventò due nuovi pigmenti sintetici rossi: il rosso cadmio, che era il colore del vermiglio naturale, e

L’utilizzo di un indice di riferimento per la fissazione di un tasso fisso comporta la possibilità che, al momento della stipula del contratto, il tasso di interesse praticato

• d.2) stipulati successivamente al 31 dicembre 2000, per i quali la variazione della tipologia di tasso (dal fisso al variabile o viceversa) è

Il cliente rimborsa il credito con il pagamento periodico di rate, comprensive di capitale e interessi, secondo un tasso che può essere fisso, variabile, misto o di due tipi.. Le

Categoria Merceologica Elenco operatori economici da invitare alle procedure semplificate di affidamenti sotto soglia Valore massimo affidamento 15 Pulizia degli edifici.

L’utilizzo di un indice di riferimento per la fissazione di un tasso fisso comporta la possibilità che, al momento della stipula del contratto, il tasso di interesse praticato

Tasso di interesse di preammortamento Il tasso degli interessi dovuti sulla somma finanziata per il periodo che va dalla data di stipula del finanziamento alla data di scadenza

ma un'analisi approfondita che prende in considerazione i dati di cui ti ho parlato prima, grazie ad uno specific software verifica tutta la concorrenza nella tua zona e prende