• Non ci sono risultati.

Architettura dei calcolatori (ex Fondamenti di Informatica II) 13 luglio 2010 - Prova scritta

N/A
N/A
Protected

Academic year: 2021

Condividi "Architettura dei calcolatori (ex Fondamenti di Informatica II) 13 luglio 2010 - Prova scritta "

Copied!
2
0
0

Testo completo

(1)

Università degli Studi di Udine

Corsi di laurea in Ingegneria Elettronica

Architettura dei calcolatori (ex Fondamenti di Informatica II) 13 luglio 2010 - 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. (4 punti) Si converta il numero -0.5 in binario, notazione floating point in singola precisione (32 bit) con esponente in notazione eccesso 127. Si scrivano tutti i passaggi effettuati e si riporti il risultato finale in binario (indicando il significato delle diverse parti del numero ottenuto) e in esadecimale.

2. (4 punti) Si descriva la tecnica di compressione RLE.

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. (11 punti) Un semplice tipo di codice a barre permette di codificare i caratteri della tabella ASCII scrivendone i valori binari come successione di barre verticali nere (rappresentanti le cifre binarie a uno) e bianche (rappresentanti le cifre binarie a zero). Ogni barra verticale è larga 10 pixel e l’altezza dell’etichetta contenente il codice a barre è 100 pixel. Di conseguenza, un codice a barre rappresentante 4 caratteri sarà alto 100 pixel e largo 4x8x10=320 pixel.

Si scriva una funzione che riceva una stringa e restituisca l’immagine bitmap contenente la rappresentazione del contenuto della

stringa mediante il codice a barre sopra descritto.

(2)

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. (10 punti) Un programma rappresenta una traiettoria in un piano mediante coppie di valori interi rappresentanti le coordinate x e y dei suoi punti. Una traiettoria è memorizzata in un vettore di punti; per ciascun punto è memorizzata prima la coordinata x e poi la coordinata y.

Si scriva la funzione assembler INVERTI_TRAIETTORIA che riceve in R1 l’indirizzo dell’inizio del vettore rappresentante la traiettoria e in R2 il numero di punti in essa contenuti. La funzione deve invertire l’ordine dei punti nella traiettoria (in pratica, per poterla percorrere a ritroso).

5. (3 punti) Cos’è e quando si verifica un page fault?

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

È proprio a questo livello che si inserisce ed acquista interesse l’elaborato di tesi: si studierà la dinamica di una stringa elementare in maniera consistente con la

cost = 20; // estero ancora più

cost = 10; // Hawaii più costoso else // NON FUNZIONA. cost = 20; // estero ancora

cost = 20; // estero ancora più

•  Accoda il contenuto della stringa passata come secondo parametro nella stringa passata come primo parametro int main () {.

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

La funzione deve restituire il numero di persone presenti nel file la cui residenza corrisponde alla provincia e al CAP passati come argomenti alla funzione. Per il file di esempio,

Si considerino dei file bitmap organizzati come segue: la prima riga contiene, nell’ordine, i due numeri interi N e M che rappresentano il numero di righe e il numero di colonne