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