es el ensayo de examen resuelto.

Anuncio
NOMBRE:
ENSAYO DE EXAMEN FINAL DE EC1
5 de junio de 2001
El examen consta de 4 ejercicios que deben contestarse en las hojas que contienen el enunciado.
Poner el nombre en todas las hojas. La duración del examen es de 2 horas.
Las notas se entregarán en clase, el dia 7 de junio. La solución del examen se hará pública en el
web ese mismo dia.
PROBLEMA 1 (1,5 puntos)
Escribir el código necesario para cambiar el orden de los bits del registro AL. Inicialmente el
orden de los bits es (a,b,c,d,e,f,g,h) y al final deben qiuedar en el orden
(a,f,c,b,e,d,g,h).
MOV
MOV
AND
AND
SHR
OR
AND
SAL
OR
DL,AL
CL,AL
AL,10101011b
CL,01010000b
CL,2
AL,CL
DL,00000100
DL,4
AL,DL
;
;
;
;
;
;
;
a0c0e0gh
0b0d0000
000b0d00
a0cbedgh
00000f00
0f000000
afcbedgh
PROBLEMA 2 (1,5 puntos)
Se dispone de un registro de 8 bits como el de la figura. Un flanco ascendente en L hace que el
registro se carge con el valor de la entrada IN. Mientras OE está a 0, la salida OUT permanece en
alta impedancia. Cuando OE se pone a 1 la salida OUT toma el valor almacenado en el registro.
8
L
IN
OE
OUT
8
Indicar las conexiones necesarias para que el registro se lea cuando el procesador ejecute la
instrucción IN AL,29h, y para que el registro se escriba cuando el procesador ejecute la
instrucción OUT F0h,AL.
OUT -> D7:0
IN <- D7:0
OE <- A15:6 x A5 x A4 x A3 x A2:1 x A0 x M/P x R/W x AS
L <- A15:8 x A7:4 x A3:0 x M/P x R/W x AS
PROBLEMA 3 (3,5 puntos)
Suponer que tenemos las siguientes declaraciones de variables globales, procedimientos y funciones (todas las estructuras son de tipo C):
int j;
short v[100];
int m[50][100];
short f (int i; short v [100]; int j){…}
void accion (int k,p; int m[50][100]; short v [100]){
int mi_m [50][100];
short mi_v [100];
Traducir a TASM la siguiente sentencia de lenguaje de alto nivel, perteneciente al programa principal
if ((v[j] << 3) >= 10)
v[j] = f (j,v,m[j][j]);
MOV
MOV
SAL
CMP
JL
IMUL
ADD
PUSH
PUSH
LEA
PUSH
PUSH
CALL
ADD
MOV
seguir:
ESI,j
AX,v[ESI*2]
AX,3
AX,10
seguir
EDI,ESI,100
EDI,ESI
m[EDI*4]
DS
AX,v
AX
ESI
f
ESP,12
v[ESI*2],AX
-(100*2+
50*100*4)[EB
; v[j]
; v[j] << 3
mi_m
-100*2[EBP]
mi_v
; m[j][j]
EBP vell
@ retorn
Dibujar,a la derecha, el bloque de activación del procedimiento accion.
k
8[EBP]
p
12[EBP]
@m
16[EBP]
@v
20[EBP]
Traducir a TASM la siguiente sentencia de lenguaje de alto nivel, perteneciente al cuerpo del procedimiento accion.
for (int i=0; i < k ; i++)
mi_v[i] = m[5][i] * mi_m[i][5];
MOV
MOVZX
MOV
MOV
ECX,8[EBP]
EBX, word ptr 16[EBP]
ES,18[EBP]
ESI,0
; k
; m
NOMBRE:
for: CMP
JGE
MOV
IMUL
ADD
IMUL
MOV
INC
JMP
fin_for:
ESI,ECX
fin_for
EAX,ES:5*100*4[EBX+ESI*4]
EDI,ESI,100
EDI,5
EAX,-(100*2+5*100*4)[EBP+EDI*4]
-100*2[EBP+ESI*2],AX
ESI
for
; m[5][i]
; mi_m[i][5]
; mi_v[i]
PROBLEMA 4 (3,5 puntos)
En memoria tenemos un buffer de LONG_BLOC*10 bytes que queremos escribir en el disco, a
partir del sector 0 de la cara 3 de la pista 4. Consideramos que la información que hay en el buffer
está estructurada a nivel lógico como una serie de 10 bloques de tamaño LONG_BLOC cada uno,
almacenados de forma consecutiva. Sólo enviaremos al disco aquellos bloques en los que no hay
ningún byte con el valor 0. Debe tenerse en cuenta que pueden producirse errores en la escritura.
Por tanto, cuando acaba la escritura de un sector debe comprobarse si ha habido error. En caso de
afirmativo, se reintentará la escritura (suponer que siempre habrá un intento de escritura que tendrá éxito).
Escribir, en lenguaje de alto nivel, el código correspondiente al programa principal y a la rutina de
atención a las interrupciones del disco.
Controlador de disc amb capacitat de DMA (KdiscD) [nivell de prioritat 5, identificador 13]
32 bits
Radr_disc
Rpist_disc
Rcara_disc
Rsect_disc
permís funcionament
lectura / escriptura
Rcon_disc
permís interrupció
error
Rest_disc
disc preparat
declaracion de variables
byte BUFFER [LONG_BLOC*10]
byte sector,a;
int disco_ant;
int i,j;
boolean fin;
programa principal
disco_ant = modif_VI(13,@rsi_disco);
sector = 0;
for (i = 0; i<10; i++) {
j = i*LONG_BLOC;
while ((BUFFER[j] != 0) && (j < (i+1)*LONG_BLOC))
j = j+1;
; miramos si hay que imprimir el bloque
if (j==(i+1)*LONG_BLOC) {
fin = false;
out_d (Radr_disc,@FBUFFER[i*LONG_BLOC]);
out_b(Rsect_disc, sector);
out_b(Rcara_disc,3);
out_b(Rpista_disc,4);
a = in_b (Rcon_disc);
a = a | 00000111b;
out_b (Rcon_disc,a);
while (!fin) {};
}
}
disco_ant = modif_VI(13,disco_ant);}
rutina de atención a las interrupciones del disco
void interrupt rsi_disco () {
a = in_b (Rest_disc);
if ((a & 00000010b) != 0) {
; ha habido error
out_d (Radr_disc,@FBUFFER[i*LONG_BLOC]);
out_b(Rsect_disc, sector);
out_b(Rcara_disc,3);
out_b(Rpista_disc,4);
a = in_b (Rcon_disc);
a = a | 00000111b;
out_b (Rcon_disc,a);
}
else {
fin = true;
sector = sector + 1;
}
eoi();
}
Descargar