Saltar a contenido

Lab 6 - Utils

Objetivos

  • Continuar trabajando con C
  • Realizar más operaciones con bits
  • Dejar listas algunas funciones para el proyecto 2

Preparación

Obtenga sus archivos base aquí. Recuerden que deben aceptar la asignación de GitHub Classroom y se les creará automáticamente un repositorio con una extensión que termina con su usuario de GitHub. Cuando ya se haya creado el repositorio, pueden ejecutar los siguientes comandos abriendo una terminal (CTRL+T):

git clone <link del repositorio>

Utils

Para su proyecto 2 necesitará varias funciones auxiliares, cuyas tareas van relacionadas con reconstruir inmediatos. En este laboratorio trabajaremos tres de estas funciones: bitExtender, get_store_offset y get_branch_distance.

bitExtender

En el proyecto 2 estaremos trabajando con números de distintos tamaños. Esta función se encarga de realizar la extensión de signo, sin importar cuántos bits tenga nuestro número.

Note que en algunos casos se le estarán dando bits "extras" respecto a lo que size le indica. Considere todo lo que vaya más allá de size como dato basura y no lo tome en cuenta al momento de determinar el signo.

Revise estos ejemplos:

Me dan field = 0b110011 y size = 4
Me están diciendo que solo los 4 bits menos significativos me sirven
Mi valor en realidad es 0b0011, por lo que tiene signo positivo
Al realizarle la extensión de signo me queda 0b...00000011
(las casillas no mostradas están llenas de 0s porque es positivo)
Me dan field = 0b110011 y size = 5
Me están diciendo que solo los 5 bits menos significativos me sirven
Mi valor en realidad es 0b10011, por lo que tiene signo negativo
Al realizarle la extensión de signo me queda 0b...11110011
(las casillas no mostradas están llenas de 1s porque es negativo)

get_store_offset

Cuando hacemos la codificación de los store (tipo S) tenemos un inmediato de 12 bits con signo, sin embargo nos toca guardarlo en un espacio de cinco bits para la parte menos significativa, y un espacio de siete bits para la parte más significativa. En esta función su tarea es reconstruir ese número de 12 bits y luego aplicarle una extensión de signo (puede llamar a su función anterior) de modo que le queden 32 bits con signo.

A diferencia del ejemplo anterior, aquí no vienen bits basura adicionales. Vienen exactamente los cinco y siete bits que necesita.

Revise estos ejemplos:

Me dan seven = 0b1111111 y five = 0b00000
Primero debo concatenar esos dos números y obtengo 0b111111100000, el cuál es negativo
Luego le realizo la extensión de signo y mi respuesta final debería ser
0b...11111111111111100000
(las casillas no mostradas están llenas de 1s porque es negativo)
Me dan seven = 0b0000001 y five = 0b00001
Primero debo concatenar esos dos números y obtengo 0b000000100001, el cuál es positivo
Luego le realizo la extensión de signo y mi respuesta final debería ser
0b...00000000000000100001
(las casillas no mostradas están llenas de 0s porque es positivo)

get_branch_distance

Antes de continuar, asegúrese que entiende como codificar un branch (estudiantes de 2025: esta clase la tuvimos por Zoom, aproveche las grabaciones en su GES).

Al codificar un branch, por un breve momento teníamos un inmediato de 13 bits al cuál le pasabamos eliminando el cero menos significativo. Los 12 bits que nos quedaban iban partidos de forma especial...

Tengo 13 bits, es decir [12:0]
Elimino el cero menos significativo, me quedo con [12:1]

Tengo disponibles un espacio de siete bits y un espacio de cinco bits

En el espacio de siete bits debo colocar [12 | 10:6]
es decir, el bit 12 y concatenado a este van los bits [10:6]

En el espacio de cinco bits debo colocar [4:1 | 11]
es decir, los bits [4:1] y concatenado a estos va el bit 11

Su trabajo en esta función es reconstruir el inmediato, es decir, revertir el proceso anterior.

Me dan seven = 0bDBBBBBB y five = 0bAAAAC
(estaré usando algunas letras para hacer un ejemplo lo más genérico posible
cada una de esas letras representa un bit, no un hexadecimal)

Debo usar operaciones bitwise para llegar a esto
0bDCBBBBBBAAAA

Luego debo agregarle el cero que pasé eliminando antes
0bDCBBBBBBAAAA0

Finalmente, debo hacer extensión de signo para llegar a tener 32 bits
0b...DDDDDDDDCBBBBBBAAAA0
(note que el bit 12, es decir nuestra D del ejemplo, cumple con el trabajo
de ser el bit de signo)

Calificación

Puede probar su ejercicio haciendo make y luego ejecutando:

make utils
./utils

Cuando esté listo, puede obtener su nota con el check:

./check

En esta ocasion tenemos un solo ejercicio de 100 puntos en total, con crédito parcial.

Cada vez que realice un avance, suba su código a Github. Cuando termine el periodo o termine su laboratorio, suba el link de su repositorio al GES.