Examen: Parcial 2:2026_04_13:Robotica - myTeachingURJC/Arq-computadores-01 GitHub Wiki

Examen Parcial: 13 de abril de 2026. Datos

  • Titulación: Robótica
  • Fecha: 13 de abril de 2026
  • Tipo de examen: Presencial.

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
  • 9 preguntas tipo test
  • Las respuestas 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 a x31). La anchura de memoria es de 32 bits. La ordenación que usa es big endian. Para acceder a los datos de la memoria utiliza un direccionamiento indirecto. Puede acceder tanto a datos alineados como no alineados. Estas son algunas de las instrucciones disponibles:

  • li rd, valor: Carga del valor inmediato en el registro rd
  • addi rd, rs, valor: Suma el valor del registro rs más valor y lo almacena en el registro rd
  • lb rd, rs1: Leer un byte de memoria y guardarlo en rd
  • lh rd, rs1: Leer una media palabra de memoria y guardarla en rd
  • lw rd, rs1: Leer una palabra de memoria y guardarla en rd
  • ld rd, rs1: Leer una doble palabra de memoria y guardarla en rd
  • 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 0x10A0 y 0x10B0. Los valores están en HEXADECIMAL.

Dirección 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x10A0 1A 1B 1C 1D A1 A2 A3 A4 AA BB CC DD A0 1F 1E 1A
0x10B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Se pide:

a) Indicar el valor de los registros del x10 al x13 cuando se ejecutan estas instrucciones secuencialmente:


li x1, 0x10A6
li x2, 0x10A2
li x3, 0x10AB
lb x10, x1
lh x11, x2
lw x12, x3
addi x1, x1, 4
ld x13, x1

b) Suponiendo que inicialmente los registros del x21 al x24 contienen los siguientes valores:

  • x21=0x44332211DDCCBBAA
  • x22=0x2023
  • x23=0x1A2B3C4D
  • x24=0x22

Escribe el contenido de los 16 bytes de memoria situados desde la dirección 0x10B0 en adelante al terminar de ejecutarse las siguientes instrucciones:


li x1, 0x10B8
li x2, 0x10B2
li x3, 0x10B0
sd x21, x1
sh x22, x1
sw x23, x2
sb x24, x3

c) Indica el número de accesos a memoria que emplea cada instrucción de load o store de los dos apartados anteriores (no tengas en cuenta el acceso a memoria para leer la instrucción):

d) Si el procesador no permitiera acceder a datos no alineados, ¿qué instrucciones de los dos apartados anteriores darían error?

Solución al problema

a)

Analizamos las instrucciones de carga ejecutadas de forma secuencial. Al ser un sistema Big-Endian, el byte más significativo se encuentra en la dirección de memoria más baja.

  • lb x10, x1 (x1 = 0x10A6):

    • Se lee el byte en la posición 0x10A6. El valor de 0x10A6 corresponde a A3.
    • Resultado: x10 = 0xA3
  • lh x11, x2 (x2 = 0x10A2):

    • Se lee una media palabra (2 bytes) desde 0x10A2. Los bytes son 1C y 1D.
    • Resultado: x11 = 0x1C1D
  • lw x12, x3 (x3 = 0x10AB):

    • Se lee una palabra (4 bytes) desde 0x10AB. Los bytes consecutivos son DD, A0, 1F y 1E.
    • Resultado: x12 = 0xDDA01F1E
  • ld x13, x1 (x1 = 0x10AA tras el addi):

    • Se lee una doble palabra (8 bytes) desde 0x10AA. Los bytes son CC, DD, A0, 1F, 1E, 1A y los dos ceros iniciales de la siguiente fila 00, 00.
    • Resultado: x13 = 0xCCDDA01F1E1A0000

b)

Se muestra el estado de la memoria desde 0x10B0 tras ejecutar las instrucciones de almacenamiento. Inicialmente, esta zona estaba a cero.

  1. sd x21, x1 (x1 = 0x10B8): Almacena los 8 bytes de x21 (44332211DDCCBBAA) desde 0x10B8 hasta 0x10BF.
  2. sh x22, x1 (x1 = 0x10B8): Escribe 20 y 23 en 0x10B8 y 0x10B9, sobrescribiendo el inicio del dato anterior.
  3. sw x23, x2 (x2 = 0x10B2): Escribe 1A, 2B, 3C y 4D (4 bytes) a partir de 0x10B2.
  4. sb x24, x3 (x3 = 0x10B0): Escribe el byte 22 en 0x10B0.

Los valores en memoria quedan así:

Dirección 0x10B0 0x10B1 0x10B2 0x10B3 0x10B4 0x10B5 0x10B6 0x10B7 0x10B8 0x10B9 0x10BA 0x10BB 0x10BC 0x10BD 0x10BE 0x10BF
Valor 22 00 1A 2B 3C 4D 00 00 20 23 22 11 DD CC BB AA

c)

Número de accesos a memoria de datos para cada instrucción:

Instrucción Tipo Accesos Justificación
lb x10, x1 Load 1 Acceso simple a un byte.
lh x11, x2 Load 1 Media palabra alineada en dirección par.
lw x12, x3 Load 2 Palabra desalineada (dirección impar 0x10AB).
ld x13, x1 Load 3 Doble palabra que cruza tres fronteras de bus de 32 bits.
sd x21, x1 Store 2 Doble palabra (64 bits) en bus de 32 bits.
sh x22, x1 Store 1 Media palabra alineada.
sw x23, x2 Store 2 Palabra desalineada (0x10B2 no es múltiplo de 4).
sb x24, x3 Store 1 Acceso simple a un byte.

d)

Si el procesador prohibiera el acceso a datos no alineados, las siguientes instrucciones fallarían:

  • lw x12, x3: Intenta acceder a una palabra en 0x10AB (no es múltiplo de 4).
  • ld x13, x1: Intenta acceder a una doble palabra en 0x10AA (no es múltiplo de 8).
  • sw x23, x2: Intenta escribir una palabra en 0x10B2 (no es múltiplo de 4).

Autores

  • Miguel Ángel de Miguel
  • Juan Ignacio Pérez
  • Obijuan

Licencia

Enlaces