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 rs1addi rs1, rs valor
: Suma el valor del registro rs más valor y lo almacena en el registro rs1lb rs1, (rs1)
: Leer un byte de memoria y guardarlo en rs1lh rs1, (rs1)
: Leer una media palabra de memoria y guardarla en rs1lw rs1, (rs1)
: Leer una palabra de memoria y guardarla en rs1ld rs1, (rs1)
: Leer una doble palabra de memoria y guardarla en rs1sb rs1, (rs2)
: Almacenar en memoria el byte que hay en rs1sh rs1, (rs2)
: Almacenar en memoria la media palabra que hay en rs1sw rs1, (rs2)
: Almacenar en memoria la palabra que hay en rs1sd 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.