Examen: Parcial 2:2024_11_21:Teleco - myTeachingURJC/Arq-computadores-01 GitHub Wiki

Examen Parcial 2: 2024-11-21. Teleco

  • Tiempo: 50 minutos
  • Tipo de examen: Presencial. Realizado a través de Aula Virtual. Acceso a la wiki (Internet)
  • Temario: S5,S6,S7 y S8

Contenido

Enunciado

El examen se ha realizado a través de Aula virtual. Tiene dos partes: Test y un problema

Test (5 ptos)

  • Realizado a través de Aula virtual
  • 10 preguntas tipo test
  • Las respuesats incorrectas restan un 33% del valor de la pregunta
  • Solución disponible en Aula virtual

Problema (5 ptos): Ordenacion/alineamiento/direccionamiento

Tenemos un computador de 64-bits que dispone de 32 registros de propósito general (x0-x31). La ordenación que usa es little-endian. Para acceder a los datos de la memoria, utiliza un direccionamiento indirecto con desplazamiento. La anchura de memoria es de 32 bits. Puede acceder tanto a datos alineados como no alineados. Estas son algunas de las instrucciones disponibles:

  • li rs1, valor: Carga del valor inmediato en el registro rs1
  • addi rs1, rs valor: Suma el valor del registro rs más valor y lo almacena en el registro rs1
  • lb rs1, (rs1): Leer un byte de memoria y guardarlo en rs1
  • lh rs1, (rs1): Leer una media palabra de memoria y guardarla en rs1
  • lw rs1, (rs1): Leer una palabra de memoria y guardarla en rs1
  • ld rs1, (rs1): Leer una doble palabra de memoria y guardarla en rs1
  • sb rs1, (rs2): Almacenar en memoria el byte que hay en rs1
  • sh rs1, (rs2): Almacenar en memoria la media palabra que hay en rs1
  • sw rs1, (rs2): Almacenar en memoria la palabra que hay en rs1
  • sd rs1, (rs2): Almacenar en memoria la doble palabra que hay en rs1

Este es un volcado de la memoria, correspondiente a las direcciones que comienzan en 0xCAF0 y 0xBAC0. Los valores están en HEXADECIMAL.

Dirección 0 1 2 3 4 5 6 7 8 9 A B C D E F
0xCAF0 FF A8 18 73 10 20 30 40 CA FE BA CA DA BA CA CA
0xBAC0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Se pide:

a) Suponiendo que inicialmente los registros del x1 al x5 contienen los siguientes valores: x1=0,x2=0x73, x3=0xCAF0, x4=0x1801, x5=0xCACABADACABAFECA,

Escribe el contenido de los 16 bytes de memoria situados desde la dirección 0xBAC0 a la 0xBACF al ejecutar las siguientes instrucciones (secuencialmente):

li x1, 0xBAC2
sb x2, 3(x1)
sb x2, -1(x1)
sh x3, 6(x1)
sw x4, 0(x1)
sd x5, 0xA(x1)

b) Indica el número de accesos a memoria que provoca cada instrucción del apartado anterior

c) A continuación de las instrucciones del apartado a) se ejecutan estas instrucciones secuencialmente:

lb x2, 5(x1)
lh x1, 6(x1)
lw x3, 4(x1)
ld x4, 6(x1)

Indicar el valor de los registros del x1 al x4 tras la ejecución de dichas instrucciones

d) Las instrucciones del apartado anterior, ¿se podrían ejecutar en un RV64I? Justifica por qué.

Solución al problema

a)

El procesador usa ordenación little endian por lo que el byte guardado en la primera posición es el de menor peso

  • Inst 1: Cargar el valor inmediato 0xBAC2 en x1. Las instrucciones li no acceden a memoria

    x1 = 0xBAC2

  • Inst 2: Escribe el valor de x2 0x73 en la dirección de x1 0xBAC2 + 3 -> 0xBAC5.

Dirección 0 1 2 3 4 5 6 7 8 9 A B C D E F
0xBAC0 00 00 00 00 00 73 00 00 00 00 00 00 00 00 00 00
  • Inst 3: Escribe el valor de x2 0x73 en la dirección de x1 0xBAC2 -1 -> 0xBAC1.
Dirección 0 1 2 3 4 5 6 7 8 9 A B C D E F
0xBAC0 00 73 00 00 00 73 00 00 00 00 00 00 00 00 00 00
  • Inst 4: Escribe el valor de x3 0xCAF0 a partir de la dirección de x1 0xBAC2 + 6 -> 0xBAC8.
Dirección 0 1 2 3 4 5 6 7 8 9 A B C D E F
0xBAC0 00 73 00 00 00 73 00 00 F0 CA 00 00 00 00 00 00
  • Inst 5: Escribe el valor de x4 0x1801 en la dirección de x1 0xBAC2 + 0 -> 0xBAC2. Como estamos escribiendo una palabra, el valor completo que vamos a escribir es 0x00001801. Se sobreescribe por lo tanto el valor 73 de 0xBAC5 con un 0
Dirección 0 1 2 3 4 5 6 7 8 9 A B C D E F
0xBAC0 00 73 01 18 00 00 00 00 F0 CA 00 00 00 00 00 00
  • Inst 6: Escribe el valor de x5 0xCACABADACABAFECA en la dirección de x1 0xBAC2 + A -> 0xBACC. La doble palabra ocuparía desde 0xBACC hasta 0xBAD3, pero como sólo nos piden los valores hasta 0xBACF, no hace falta escribirlos
Dirección 0 1 2 3 4 5 6 7 8 9 A B C D E F
0xBAC0 00 73 01 18 00 00 00 00 F0 CA 00 00 CA FE BA CA

b)

  • Inst 1:

0 accesos. Las instrucciones li no acceden a memoria

  • Inst 2:

1 acceso a memoria. Las instrucciones sb siempre están alineadas y provocan 1 acceso.

  • Inst 3:

1 acceso a memoria. Las instrucciones sb siempre están alineadas y provocan 1 acceso.

  • Inst 4:

1 acceso a memoria. La dirección 0xBAC8 está alineadas para media palabra y provoca 1 acceso.

  • Inst 5:

2 accesos a memoria. La dirección 0xBAC2 no está alineada para palabra, por lo que provoca 2 accesos.

  • Inst 6:

2 accesos a memoria. La dirección 0xBACC no está alineada para doble palabra, por lo que provoca 2 accesos.

c)

  • Inst 1:

Como se indica que estas instrucciones se ejecutan a continuación del código anterior, x1 sigue valiendo 0xBAC2, por lo tanto se carga en x2 el byte de la dirección 0xBAC2 + 5 -> 0xBAC7.

x2 = F0

  • Inst 2:

Se carga en x1 la media palabra que hay en x1 0xBAC2 + 6 -> 0xBAC8

x1 = 0xBAC0

  • Inst 3:

Se carga en x3 la palabra que hay en x1 + 4. Mucho cuidado!!, x1 acaba de cambiar su valor. La dirección de la que se lee es por lo tanto 0xBAC0 + 4 -> 0xBAC4

x3 = 0x40302010

  • Inst 4:

Se carga en x4 la doble palabra que hay en x1 + 6 -> 0xBAC6

x4 = 0xBADACABAFECA4030

d)

El procesador que se describe en el enunciado tiene las mismas características que un RV64I (64 bits, little-endian, direccionamiento indirecto con desplazamiento, ...), salvo que este computador si permite acceder a datos no alineados (el RISC-V no lo permite). Por lo tanto, tenemos que comprobar si alguna de las instrucciones anteriores accede a datos no alineados. La instrucción ld x4, 6(x1) accede a la doble palabra situada en 0xBAC6, que no es una dirección alineada, por lo que un RV64I lanzaría un error al ejecutar esa instrucción.

Autores

Licencia

Enlaces