Sistemi di elaborazione - diegm - Università degli Studi di Udine

Transcript

Sistemi di elaborazione - diegm - Università degli Studi di Udine
Università degli Studi di Udine
Corsi di laurea in Ingegneria Elettronica e Ingegneria Gestionale
Architettura dei calcolatori / Fondamenti di Informatica II
15 febbraio 2016 - 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.
DA8 + BC9 = 971
(5 punti) La ALU di un processore a 12 bit ha eseguito l’operazione:
a)
Scrivere i valori (decimali) che sono stati sommati e il valore (decimale) che è stato ottenuto, riportando tutti i passaggi
effettuati
b) Scrivere che valore avrà assunto il flag OVERFLOW al termine dell’operazione e come tale valore è stato calcolato
______________________________________________________
c)
2.
Quindi, il risultato dell’operazione è corretto? ___________________
(3 punti) Un codice prevede di inserire due bit di parità per ogni byte: uno pari reativo ai primi
quattro bit del byte e l’altro relativo agli altri quattro bit. Si veda l’ esempio nel riquadro a lato.
Che valore ha la distanza di Hamming di tale codice?
Quanti bit errati può rilevare?
____________________
byte
parità
0000 0000 0 0
0111 0101 1 0
0000 0001 0 1
1111 1101 0 1
1111 1111 0 0
________________________
Quanti bit errati può correggere? ___________________________
Si consideri la libreria in linguaggio C per manipolare file bitmap vista a lezione, così definita:
typedef
typedef
typedef
unsigned char
unsigned short int
unsigned long int
#define BMPFILETYPE 0x4D42
typedef struct tagCOLORTRIPLE
{
byte blue;
byte green;
byte red;
} COLORTRIPLE;
3.
byte;
word;
dword;
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
void
BITMAP
void
ReadBitmap (FILE *fp);
WriteBitmap (BITMAP bitmap, FILE *fp);
CreateEmptyBitmap
(dword height, dword width);
ReleaseBitmapData (BITMAP *bitmap);
(12 punti) Si scriva un programma in linguaggio C che riceva sulla riga di comando il nome di un file bitmap di ingresso e
di uno di uscita e scriva nel file di uscita l’immagine del file di ingresso trasformata come nell’esempio del riquadro.
Come si può osservare, l’immagine risultante è racchiusa in una
cornice ellittica nera (dello spessore di N pixel, con N=10
nell’esempio) e la parte esterna a tale cornice è bianca.
Si ricorda che, detti a e b i due semiassi dell’ellisse e x e y le
coordinate cartesiane con origine nel centro dell’ellisse, i punti
interni all’ellisse soddisfano la proprietà (x/a)2 + (x/b)2 ≤ 1. I
pixel da annerire per disegnare la cornice sono quindi quelli
interni all’ellisse che ha semiassi pari a metà dei lati
dell’immagine ma non interni a quella che ha per semiassi i
medesimi valori diminuiti di N.
originale
modificata
(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:
assembly
inst. name
machine code
LDWI
LDWA
LDWR
LDBI
LDBA
LDBR
STWA
STWR
STBA
STBR
MV
PUSH
POP
SPRD
SPWR
load word
load word
load word
load byte
load byte
load byte
store word
store word
store byte
store byte
move
push
pop
read SP
write SP
00010000dddd0000
00100000dddd0000
00110000ddddaaaa
00010001dddd0000
00100001dddd0000
00110001ddddaaaa
00100010ssss0000
00110010ssssaaaa
00100011ssss0000
00110011ssssaaaa
00000100ssssdddd
00001000ssss0000
00001001dddd0000
00001101ssss0000
00001110ssss0000
add
subtract
bitwise NOT
bitwise AND
bitwise OR
bitwise XOR
increment
decrement
left shift
right shift
01000000ssssdddd
01000001ssssdddd
01000010rrrr0000
01000011ssssdddd
01000100ssssdddd
01000101ssssdddd
01001000rrrr0000
01001001rrrr0000
01001010rrrr0000
01001011rrrr0000
ADD
SUB
NOT
AND
OR
XOR
INC
DEC
LSH
RSH
d
d
d
d
d
d
s
s
s
s
s
s
d
d
s
s
s
r
s
s
s
r
r
r
r
4.
X
A
a
X
A
a
A
a
A
a
d
d
d
d
d
d
DATA(16)
ADDR(16)
DATA(8)
ADDR(16)
ADDR(16)
ADDR(16)
action
assembly inst. name
machine code
d <- X
d <- mem[A]
d <- mem[a]
d <- X
d <- mem[A]
d <- mem[a]
mem[A] <- s
mem[a] <- s
mem[A] <- s
mem[a] <- s
d <- s
push (s)
d <- pop ()
d <- SP
SP <- s
INW
INB
OUTW
OUTB
TSTI
10000000dddd0000
10000001dddd0000
10000010ssss0000
10000011ssss0000
1000010000000000
d
d
r
d
d
d
r
r
r
r
<<<<<<<<<<-
d + s
d - s
~r
d & s
d | s
d ^ s
r + 1
r + 1
r << 1
r >> 1
d
d
s
s
A
A
A
A
A
input word
input byte
out word
out byte
test input
action
IN_ADDR(16)
IN_ADDR(16)
OUT_ADDR(16)
OUT_ADDR(16)
IN_ADDR(16)
TSTO A
test output 1000010100000000 OUT_ADDR(16)
BR
JMP
JMPZ
JMPNZ
JMPN
JMPNN
JMPC
JMPV
CALL
RET
HLT
branch
jump
jump if zero
jump if not zero
jump if negative
jump if not neg.
jump if carry
jump if overflow
subroutine call
return from sub.
halt
A
F
F
F
F
F
F
F
A
d <- read[A]
d <- read[A]
out[A] <- s
out[A] <- s
if completed then Z <- 1
else Z <- 0
if completed then Z <- 1
else Z <- 0
1100000000000000 ADDR(16) PC <- A
11000001FFFFFFFF
PC <- PC + F
11000010FFFFFFFF
if (z == 1) PC <- PC
11000011FFFFFFFF
if (z == 0) PC <- PC
11000100FFFFFFFF
if (N == 1) PC <- PC
11000101FFFFFFFF
if (N == 0) PC <- PC
11000110FFFFFFFF
if (C == 1) PC <- PC
11000111FFFFFFFF
if (V == 1) PC <- PC
1100100000000000 ADDR(16) push (PC); PC <- A
1100100100000000
PC <- pop()
1100111100000000
halt
X:
Y:
word 0AAAA
word 0BBBB
START:
LDWI R15 0F000
SPWR R15
_________
; R1 = &X
_________
; R2 = &Y
CALL SCAMBIA
; scambia (&x, &y)
HLT
5.
(3 punti) Si completi la traduzione in linguaggio macchina
della funzione STRLEN riportata nel seguito
00
10
00
00
A1
30
__
__
10
48
00
48
__
__
00
C9
| STRLEN:
|
|
|
| LOOP:
|
|
|
|
|
|
|
|
|
| END:
|
6.
(3 punti) Si illustri lo schema di traduzione di indirizzi virtuali in indirizzi fisici in un sistema basato su paginazione
(svolgere sul retro)
LDWR R10 R1
F
F
F
F
F
F
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 punti) Facendo uso delle indicazioni presenti nei commenti,
si completi il programma in linguaggio assembly riportato a
lato, che scambia il contenuto delle variabili X e Y
LDWI R0 0
+
+
+
+
+
+
SCAMBIA: _____________
_____________
_____________
_____________
RET
;
;
;
;
R11
R12
*R2
*R1
=
=
=
=
*R1
*R2
R11
R12
JMPZ END
INC R1
INC R0
JMP LOOP
RET