EXAMEN FINAL D`EC1 Divendres, 19 de gener de 2007

Anuncio
COGNOMS:
GRUP:
NOM:
EXAMEN FINAL D’EC1
Divendres, 19 de gener de 2007
L’examen consta de 7 problemes. Tots s’han de contestar als mateixos fulls de l’enunciat, excepte
el problema 3, que es contesta en fulls a part. Els temps són sols estimatius. No oblidis posar el
teu nom i cognoms a tots els fulls de l’enunciat. La duració de l’examen és de 180 minuts. Les
notes i la solució es publicaran el dia 29 de gener, i la revisió tindrà lloc el dia 31.
Pregunta 1. (2,5 punts, temps = 30’)
Donada la següent declaració de dades en C:
struct tupla {
char
string[5];
int
num;
int
*pint;
};
struct tupla elem, matriu[10][20];
int u;
char *v;
struct tupla *q;
register struct tupla *p;
;es troba a R1
register int i;
;es troba a R2
a) Indica el desplaçament en bytes que s’ha de sumar a l’adreça inicial d’una tupla de tipus
"tupla" per accedir a l’inici de cada un dels seus camps:
despl. a “string”=
despl. a “num”=
despl. a “pint”=
Indica també la mida total en bytes que ocupen en memòria les variables:
“elem”=
“matriu”=
la declaració de dades sencera =
b) Tradueix el següent codi en C a llenguatge assemblador (recorda que R1 conté p i R2 conté i):
p = &matriu[i][5];
-1-
c) Tradueix el següent codi en C a assemblador (recorda que R1 conté p i R2 conté i):
if (i == 0 || i == u)
i++;
else
i--;
d) Tradueix el següent codi en assemblador a una única sentència en C:
$MOVEI
LD
ADDI
MOVI
ADD
ST
R3, matriu + 660
R4, 8(R3)
R4, R4, 2
R5, 210
R3, R3, R5
8(R3), R4
e) El següent codi realitza un recorregut seqüencial de la columna 4 de la matriu "matriu",
per tal d’inicialitzar amb el valor 53 el camp "num" de tots els seus elements. Completa la
definició de les tres constants perquè el codi realitzi la tasca que s’ha descrit:
constant_1 =
constant_2 =
constant_3 =
for:
fi:
$MOVEI
$MOVEI
MOVI
MOVI
$CMPLT
BZ
MOVI
ST
ADD
ADDI
BNZ
HALT
R0, constant_1
R1, constant_2
R2, 0
R3, 10
R4, R2, R3
R4, fi
R4, 53
constant_3(R1), R4
R1, R1, R0
R2, R2, 1
R2, for
-2-
COGNOMS:
GRUP:
NOM:
Pregunta 2. (1 punt, temps = 15’)
El següent fragment de programa pretén escriure el valor d’una variable entera "var" (de mida
word) a la posició de memòria indicada per R1:
main:
...
$MOVEI
LD
ST
...
R2, var
R2, 0(R2)
0(R1), R2
No obstant, en el cas que R1 contingui un valor senar, el programa realitza un accés a memòria no
alineat i genera una excepció. Sabent que en el SISP-F:
• El vector d’excepcions és global i rep el nom d’"exceptions_vector"
• L’excepció d’accés no alineat té l’identificador=1 i és no emmascarable
• El registre S3 conté l’adreça efectiva de l’accés no alineat
a) Escriu en assemblador el codi que hauria d’aparèixer al principi del programa principal per tal
que quan es produeixi l’excepció d’accés no alineat s’invoqui una RSE anomenada
"RSE_alineacio":
main:
b) Programa la “RSE_alineacio” en assemlador per tal que copiï el contingut de la variable “var”
(1 word) a l’adreça indicada pel registre S3 (adreça senar!), i aturi l’execució del programa:
RSE_alineacio:
-3-
Pregunta 3. (2,5 punts, temps = 40’)
Realiza un programa en alto nivel que copie un fichero de 1024 bytes del disco A (id=5) al
disco B (id=6). El fichero en A se encuentra en sectores consecutivos de la misma pista, a
partir de (cara=0, pista=0, sector=0) y lo tenéis que guardar en B en sectores consecutivos de
la misma pista a partir de (cara=1, pista=0, sector=0). El tamaño de bloque del disco A es de
64 bytes y el del disco B de 256 bytes. El programa sólo dispone de un búffer de 256 bytes en
memoria para almacenar bloques del fichero. Debido a que el disco A se recalienta, debéis
dejarlo inactivo un mínimo de 10 segundos entre lectura y lectura de bloque. La sincronización con los discos debe hacerse por interrupciones.
Puedes suponer que:
• No se producen errores en las transferencias por DMA.
• Dispones de las acciones ya programadas lanzar_dmaDiscoA() y
lanzar_dmaDiscoB() cuya cabecera y especificación es la que se ha explicado en
clase. No obstante, si quieres utilizar otra acción lanzar_dma diferente a la estudiada
en clase deberás escribir el código de ésta. En tal caso, considera que los registros correspondientes se encuentran en las direcciones de E/S: Radr_discA, Radr_discB,
Rcara_discA, Rcara_discB, etc.
(CONTESTA ESTA PREGUNTA EN UNA HOJA APARTE)
-4-
COGNOMS:
GRUP:
NOM:
Pregunta 4. (1,50 punts, temps = 30’)
Donades les següents declaracions en C, tradueix a assemblador la subrutina examen:
int vg[100];
char funcio(char a, long *b, int c);
int examen(char *p, long *q, int t)
{
*p = funcio(*p, q+1, vg[t]);
return 1;
}
examen:
Pregunta 5. (0,50 punts, temps = 15’)
Quin és el valor del registre F3, en hexadecimal, després d'executar la instrucció ADDF F3,F1,F2,
suposant que F1=0x4CF0 i F2=0x4A20 ?
F3 =
Pregunta 6. (0,75 punts, temps = 20’)
Suposem un processador anàleg al SISP-F però amb 64 bits de dades i 64 bits d’adreces. El seu
repertori d’instruccions inclou instruccions del tipus load i store de dades de mides 1, 2, 4 i 8
bytes, on les adreces han de ser respectivament, múltiples de 1, 2, 4 i 8 bytes o altrament es produeix una excepció per adreça no-alineada. Volem dissenyar un mòdul de memòria RAM de 1
Mbyte (220 bytes), de manera anàloga als mòduls estudiats del SISP-F. És a dir, un mòdul format
per 8 bancs amb adreces entrellaçades pels bits de menor pes i amb senyals byte-enable. A més a
més dels senyals de 1 bit CSRAM i R/WRAM i del senyal de 64 bits DRAM, el mòdul té els següents
senyals:
-5-
•
•
•
LRAM i-1:0
BERAM j-1:0
ARAM k-1:0
Longitud de la dada, de i bits
Byte-Enable, de j bits
Índex per seleccionar la dada dins del mòdul, de k bits
a) Quants bits han de tenir els senyals LRAM, BERAM i ARAM ?
i=
j=
k=
b) Quina és l’expressió booleana que defineix el senyal CSRAM en funció dels senyals del bus,
per tal que les dades del mòdul estiguin mapejades a partir de l’adreça 0xC00000 de
l’espai de memòria (recorda que el bus d’adreces és de 64 bits)?
CSRAM =
Pregunta 7. (1,25 punts, temps = 30’)
Dados los dos fragmentos de código siguientes en C:
; Código (ii)
; Código (i)
int A[N][M];
int W[M];
main()
{
•••
for (j=0; j<M-1 ; j++)
W[j] = 0;
int A[N][M];
int W[M];
main()
{
•••
for
(j=0; j<M-1 ; j++)
// bucle 1
W[j] = 0;
// bucle 1
for (k=0; k<N ; k++)
// bucle 2
for (j=0; j<M-1 ; j++)
W[j] = W[j] + 3*A[k][j];
for (j=0; j<M-1 ; j++)
// bucle 2
for (k=0; k<N ; k++)
W[j] = W[j] + 3*A[k][j];
}
}
a) Suponiendo que N=16 y M=4; que el SISP-F tiene una caché como la estudiada en clase; y
que la matriz A se almacena a partir de la dirección 0x2000. Calcula, para cada código y
para cada bucle por separado, el número de hits y misses en los accesos a W y a A. Supondremos que al principio de cada código la cache está vacía, pero antes del bucle 2 de cada
código ésta contiene lo que resulte de la ejecución del bucle 1. También supondremos que
las instrucciones no se guardan en la cache.
Variable
Código (i)
hits
misses
Código (ii)
hits
misses
bucle 1 :W
bucle 2 :W
bucle 2: A
b) Si hacemos N = 32, la tasa de aciertos de accesos a A disminuye con respecto al apartado
anterior. ¿A qué es debido? Razona tu respuesta con menos de 20 palabras.
-6-
Descargar