• Non ci sono risultati.

Architettura dei calcolatori (ex Fondamenti di Informatica II) 22 gennaio 2009 - Prova scritta

N/A
N/A
Protected

Academic year: 2021

Condividi "Architettura dei calcolatori (ex Fondamenti di Informatica II) 22 gennaio 2009 - Prova scritta "

Copied!
5
0
0

Testo completo

(1)

Università degli Studi di Udine

Corsi di laurea in Ingegneria Elettronica

Architettura dei calcolatori (ex Fondamenti di Informatica II) 22 gennaio 2009 - 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) Convertire in base 4 il numero 0.2

10

riportando tutti i passaggi effettuati.

0.03

4

x 4 .2 0 .8 3 .2 0 .8 3 .2 …

2. (3 punti) Sia dato il messaggio M(x) = 10010111. Se ne calcoli il CRC utilizzando come polinomio generatore G(x) = 101.

Illustrare tutti i passaggi effettuati.

1001011100 : 101 = ... (il quoziente viene ignorato) 101

--- 00110

101 --- 0111

101 --- 0101

101 --- 000100

101 ---

001 Æ CRC = 01

M x 2n

3. (3 punti) A cosa servono i codici a prefisso?

A codificare informazioni utilizzando un numero variabile di bit. Sono tipicamente utilizzati nelle tecniche di

compressione per associare ai dati più frequenti codifiche con un minore numero di bit rispetto ai dati meno

frequenti.

(2)

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

4. (10 punti) La tecnica del mosaico, spesso utilizzata per rendere irriconoscibili alcuni particolari di un’immagine, consiste nel suddividere l’immagine in aree quadrate (le tessere del mosaico) e sostituire ai valori originali RGB dei pixel di ogni area le rispettive medie dei valori RGB dell’area stessa.

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 in pixel delle tessere del mosaico.

Il programma deve scrivere nel file di uscita l’immagine del file di ingresso modificata secondo la tecnica sopra descritta.

Esempi:

Immagine originale Immagine modificata con dimensione tessere di 10 pixel

Immagine modificata con dimensione tessere di 30 pixel

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include "bmp.h"

void Mosaico (BITMAP bmp, int k);

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

FILE *fpin, *fpout;

BITMAP bmp;

if (argc != 4) {

printf ("USO: mosaico <bmp in> <bmp out> "

"<dimensione tessere (pixel)>\n");

exit (EXIT_FAILURE);

}

if ((fpin = fopen (argv[1], "rb")) == NULL) {

printf ("Error opening input file\n");

exit (EXIT_FAILURE);

}

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

(3)

{

printf ("Error opening output file\n");

exit (EXIT_FAILURE);

}

bmp = ReadBitmap (fpin);

Mosaico (bmp, atoi (argv[3]));

/* write the file */

WriteBitmap (bmp, fpout);

ReleaseBitmapData (&bmp);

fclose (fpin);

fclose (fpout);

return EXIT_SUCCESS;

}

void Mosaico (BITMAP bmp, int k) {

int row, col, i, j, cnt;

int rsomma, gsomma, bsomma, rmedia, bmedia, gmedia;

row = 0;

col = 0;

while (row < bmp.height) {

while (col < bmp.width) {

cnt = 0;

rsomma = gsomma = bsomma = 0;

for (i = 0; i < k && row + i < bmp.height; i++) for (j = 0; j < k && col + j < bmp.width; j++) {

rsomma += PIXEL(bmp, row + i, col + j).red;

gsomma += PIXEL(bmp, row + i, col + j).green;

bsomma += PIXEL(bmp, row + i, col + j).blue;

cnt++;

}

rmedia = rsomma / (double) cnt;

gmedia = gsomma / (double) cnt;

bmedia = bsomma / (double) cnt;

for (i = 0; i < k && row + i < bmp.height; i++) for (j = 0; j < k && col + j < bmp.width; j++) {

PIXEL(bmp, row + i, col + j).red = rmedia;

PIXEL(bmp, row + i, col + j).green = gmedia;

PIXEL(bmp, row + i, col + j).blue = bmedia;

}

col += k;

}

row += k;

col = 0;

} return;

}

(4)

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 traduca in linguaggio assembler e in linguaggio macchina il seguente frammento di codice, con le seguenti assunzioni:

• l’indirizzo della stringa s sia già stato memorizzato nel registro R10;

• la variabile ch venga memorizzata nel registro R11;

• la funzione toupper, della libreria standard del linguaggio C, sia disponibile all’indirizzo di memoria 00AA e preveda il passaggio dell’argomento nel registro R1 e la restituzione del risultato nel registro R0.

while ((ch = *s) != '\0') {

*s = toupper (ch);

s++;

}

LOOP: LDBR R11 R10 ; while ((ch = *s) != '\0') JMPZ CONTINUE ; {

MV R11 R1 ; *s = toupper (ch);

CALL TOUPPER STBR R0 R10

INC R10 ; s++;

JMP LOOP ; } CONTINUE: ...

BA | LOOP: LDBR R11 R10 ; while ((ch = *s) != '\0') 31 |

0C | JMPZ CONTINUE ; { C2 |

B1 | MV R11 R1 ; *s = toupper (ch);

04 |

00 | CALL TOUPPER C8 |

AA | 00 |

0A | STBR R0 R10 33 |

A0 | INC R10 ; s++;

48 |

F0 | JMP LOOOP ; } C1 |

00 | CONTINUE: ...

CF |

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)

(5)

6. (3 punti) Come è noto, in un sistema di memoria virtuale basato su paginazione ad ogni pagina è associata una entry nella page table. Quali informazioni contiene?

bit di presenza (in memoria centrale)

se è presente, l'indirizzo della pagina di memoria, altrimenti, l'indirizzo all'interno del page file informazioni di protezione (ereditate dal segmento di cui attualmente fa parte)

informazioni relative all'utilizzo e alla modifica del contenuto

Riferimenti

Documenti correlati

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 un programma in linguaggio C che riceva sulla riga di comando il nome del file principale e il nome del file di backup e stampi sullo schermo i comandi per

(5 punti) Si scriva un programma in linguaggio C che riceva sulla linea di comando il nome di un file bitmap di ingresso e il nome di un file bitmap di uscita. Il programma

(5 punti) Si scriva un programma in linguaggio C che riceva sulla linea di comando il nome di un file bitmap di ingresso e il nome di un file. bitmap

Si assumano gi` a disponibili la definizione del tipo struct Data (nel classico formato a tre campi) e la funzione int ComparaDate(struct Data d1, struct Data d2), che restituisce -1

Si scriva un programma in linguaggio C che riceva sulla linea di comando il nome di un file bitmap di ingresso e il nome di un file bitmap di uscita. Il programma deve scrivere