Está en la página 1de 6

DEPARTAMENTO DE SISTEMAS Y COMPUTACIÓN

ISIS1304
FUNDAMENTOS DE INFRAESTRUCTURA TECNOLÓGICA
Proyecto 2 – 2019-2

Este proyecto vale 15% de la nota del curso.


Debe ser elaborado en grupo (3 integrantes).
No se permite ningún tipo de consulta entre grupos.
Se debe entregar por Sicua a más tardar el 1 de diciembre de 2019 a las 23:59

Si tienen alguna duda sobre el enunciado o el desarrollo del proyecto pueden comunicarse
con los profesores del curso o los monitores:

 Laura Prieto – lv.prieto@uniandes.edu.co


 Santiago Salazar – s.salazara@uniandes.edu.co
 Camila Pantoja – c.pantoja@uniandes.edu.co

A. OBJETIVOS
▪ Practicar el lenguaje Ensamblador y desarrollar un programa de complejidad pequeña.
▪ Conocer las operaciones de Ensamblador para el manejo de bits.
▪ Aplicar lo anterior en un programa que permita calcular el CRC de un archivo.
B. DESCRIPCIÓN DEL PROBLEMA
La verificación por redundancia cíclica, conocida por sus siglas en inglés CRC (Cyclic
Redundancy Check), se refiere a un código utilizado para detección de errores basado en el
residuo de una división. Se utiliza como suma de verificación en la detección de alteración de
datos tanto en su transimisión como en su almacenamiento. Es típicamente utilizado en
dispositivos de almacenamiento y redes digitales. Su popularidad se debe tanto a su efectividad
como a su fácil implementación.
Para utilizar este tipo de verificación sobre un bloque datos se requiere un divisor (llamado
polinomio generador) de tamaño n, el cual debe ser conocido por quienes estén interesados en
dicha verificación. Por un lado, para la generación del CRC se requiere anexar n-1 ceros al final
del bloque de información y dividir todo el bloque por el divisor. Finalmente, se reemplazan los
ceros por el residuo de la división. Por otro lado, la verificación consiste en dividir todo el bloque
de información que contiene el código de CRC al final por el divisor y comprobar que el residuo
de esta nueva división sea 0.
En nuestro caso, solo calcularemos el CRC; no lo agregaremos a los datos.

División módulo 2
El proceso de división está descrito en las notas de clase (sección 3.7). Pero, en nuestro caso,
para simplificar el proceso, la división se debe implementar como se describe a continuación.
DEPARTAMENTO DE SISTEMAS Y COMPUTACIÓN
ISIS1304
FUNDAMENTOS DE INFRAESTRUCTURA TECNOLÓGICA
Proyecto 2 – 2019-2

MÉTODO DE DIVISIÓN
Dados un vector de k bytes (k*8 bits), y un divisor de n bits (de máximo 8 bits, y empezando por
1):
k bytes (k*8 bits)
Byte 0 Byte 1 ... Byte k-1
n bits
1 b1...bn-1
Se agrega un byte en ceros al final de los datos (aunque solo se usan n-1 ceros, los otros son
“relleno” para completar el byte; atención: n-1 ceros, no n):
k bytes (k*8 bits) n-1 ceros resto del byte
Byte 0 Byte 1 ... Byte k-1 00...0 0...0
n bits
1 b1...bn-1
Se alinean los n bits del divisor a la izquierda de los datos:
n-1 ceros 8-(n -1) ceros
d0d1...dn-1dn...d7 Byte 1 ... Byte k-1 00...0 0...0
1 b1...bn-1
Si d0 = 1, se efectúa el xor con los bits del divisor (llamemos al resultado xi = di  bi):

0x1...xn-1dn...d7 Byte 1 ... Byte k-1 00...0 0...0


1b1...bn-1
Note que como d0 = 1 y el divisor empieza por 1, el primer bit será 1  1 = 0
En cambio. si d0 = 0, no se hace ninguna operación:

0d1...dn-1dn...d7 Byte 1 ... Byte k-1 00...0 0...0


1b1...bn-1
Note que el bit examinado siempre queda en cero.
En cualquiera de los dos casos, se corre el divisor una posición a la derecha y se repite toda la
operación. Llamando ti al resultado de la operación anterior (cualquiera que haya sido):

0t1...tn-1dn...d7 Byte 1 ... Byte k-1 00...0 0...0


b0b1...bn-1
Se repite la operación hasta llegar al final de los ceros agregados:

00000000 00000000 ... 0000000tk*8-1 s1s2 ... 0 0...0


b0 b1b2...bn-1
Para obtener el resultado final:
DEPARTAMENTO DE SISTEMAS Y COMPUTACIÓN
ISIS1304
FUNDAMENTOS DE INFRAESTRUCTURA TECNOLÓGICA
Proyecto 2 – 2019-2

00000000 00000000 ... 00000000 r1r2 ... rn-1 0...0


El residuo es r1r2...rn
Como puede ver, el vector debe quedar todo en ceros, excepto el último byte; en este, los n-1
primeros bits son el residuo, y los 8 - (n - 1) restantes son cero.
NOTA: puede usar la hoja de cálculo anexa para generar y estudiar ejemplos concretos del
método de cálculo.
Particularidades del programa
Bloque de datos:
Se requiere que el programa sea capaz de calcular el CRC de un bloque de datos de
cualquier tamaño. Es decir, debe leer cualquier archivo y calcular el CRC de su
contenido. Por supuesto, será un número entero de bytes, o sea que el número de bits
es siempre múltiplo de 8.
Polinomio generador:
Existen muchos polinomios generadores sugeridos para distintos usos los cuales han
sido resultado de estudios con el fin de hacerlos más eficientes. No obstante, la
escogencia del mismo está fuera del alcance del proyecto. Por lo tanto, se requiere
poder usar cualquier polinomio generador cuyo tamaño esté entre 3 y 8 bits. El dígito
más significativo siempre debe ser 1
Procedimiento:
1. A los datos se le agregan n-1 ceros, siendo n el tamaño del polinomio generador
ingresado. Esto ya lo realiza el programa en el esqueleto entregado.
2. Realizar un XOR sucesivamente entre el polinomio generador y los datos,
corriéndolo, cada vez, un lugar hacia la derecha hasta cubrir todos los datos
(incluyendo los ceros agregados).
Nota: se requiere que este procedimiento se haga sobre los datos. Esto
quiere decir que el vector de datos leído se debe ir reemplazando con el
resultado del XOR. Ojo, esto de ninguna manera significa que se debe
cambiar el contenido del archivo en memoria.
3. Los primeros n-1 bits del byte del final son el CRC del bloque de datos (los restantes
deben ser cero).

Resultado:
Se imprime en consola el contenido del vector (incluyendo el CRC calculado) byte por
byte en hexadecimal. Todo debe estar en cero, excepto el último byte (como se explicó
en 3).
DEPARTAMENTO DE SISTEMAS Y COMPUTACIÓN
ISIS1304
FUNDAMENTOS DE INFRAESTRUCTURA TECNOLÓGICA
Proyecto 2 – 2019-2

Estructura Informacion
La estructura que se utiliza para facilitar el manejo de la información se describe a continuación:

typedef struct informacion {

int longitudContenido;

unsigned char * contenido;

} Informacion;
Aquí, longitudContenido guarda la longitud de la información que se leyó del archivo
originalmente y *contenido es un apuntador que referencia el lugar en memoria donde se
encuentra la información leída más un byte de ceros al final, donde deberá quedar el CRC.

El programa
En el archivo adjunto (“esqueleto(ASM).c”), encuentra el esquema del programa. El
programa se invoca por línea de comando.
El programa ya tiene definidos: el procedimiento main()y un procedimiento para leer y cargar
los datos de un archivo. Estos procedimientos son ya usados en el programa. Estos
procedimientos no deben ser modificados.
El procedimiento main()debe recibir los siguientes argumentos de comando:
1. La ruta (path) del archivo sobre el cual se desea calcular el CRC.
2. Una cadena de caracteres que representa el patrón de bits a utilizar como
polinomio generador. Es decir, una cadena de ‘1’ y ‘0’ (de mínimo tres y máximo 8
caracteres y empezando por ‘1’). Por ejemplo “1011”.
Los procedimientos que el grupo debe completar son los siguientes:
 unsigned char calcularByte(unsigned char * entrada):
Esta función se encarga de calcular el byte correspondiente al polinomio generador a
partir de la cadena de caracteres que entra como argumento. Se recomienda que el
patrón de bits esté contenido en los bits más significativos del resultado de este
método. Por ejemplo, la cadena “1011” debería retornar el unsigned char
10110000 (es decir, 0xB0 o 176 decimal).
Nota: En este procedimiento se permite el uso de nombres simbólicos en su
implementación. Es decir, se pueden declarar variables en C antes de la etiqueta de
ensamblador y se pueden usar, junto con los parámetros.
 void calcularCRC(Informacion * datos, int lonDiv, unsigned char
divisor):
Esta función se encarga de calcular el CRC. Finalmente, el resultado que se va a
imprimir, el cual contiene solo ceros y el CRC en el último byte, tiene que estar en
datos -> contenido. Entre sus parámetros recibe:
DEPARTAMENTO DE SISTEMAS Y COMPUTACIÓN
ISIS1304
FUNDAMENTOS DE INFRAESTRUCTURA TECNOLÓGICA
Proyecto 2 – 2019-2

o El apuntador a la estructura que almacena la información necesaria según se


explicó en la sección de “Estructura información”.
o La longitud del divisor (polinomio generador) con el cual se calculará el CRC.
Esta indica la cantidad de bits ingresados.
o El divisor (polinomio generador) con el cual se realiza el cálculo.
Nota: En este procedimiento NO se permite el uso de nombres simbólicos en su
implementación. Es decir, solamente es posible hacer uso de la pila de ensamblador
para acceder a los parámetros y demás.
Para desarrollar el programa pueden crear las funciones adicionales (escritas en
ensamblador) que necesiten, las cuales deben estar debidamente comentadas y
documentadas. Se podrán usar nombres simbólicos en dichas funciones adicionales.

C. ESPECIFICACIONES
▪ Los programas se deben escribir en ensamblador.
Nota importante: los programas se calificarán únicamente usando el ambiente de
Visual de las máquinas virtuales. Si el programa no compila en este ambiente, se
considerará que no corre (así compile en otros ambientes). Refierase a los videos
tutoriales publicados en Sicua para compilar sus programas.
▪ Legibilidad del programa: indentar el programa; escribir comentarios coherentes
explicando el código de manera que sea comprensible para el evaluador.
▪ Debe respetar la estructura del código entregado. En particular, debe usar los
procedimientos y variables del esqueleto.

D. CONDICIONES DE ENTREGA
▪ Entregar el código fuente junto con el ejecutable en un archivo *.zip. Al
comienzo del archivo fuente escriba los nombres de los miembros, sus códigos
y correos, de lo contrario no será evaluado (ver esqueleto). Si su programa no
funciona o si su solución tiene particularidades, puede enviar un archivo .docx o
.pdf explicando por qué cree que no funciona o qué fue lo que hizo.
▪ El trabajo se realiza en grupos de 3 personas. No debe haber consultas entre grupos.
▪ El grupo responde solidariamente por el contenido de todo el trabajo, y lo elabora
conjuntamente (no es trabajo en grupo repartirse puntos o trabajos diferentes).
▪ Se puede solicitar una sustentación a cualquier miembro del grupo sobre cualquier
parte del trabajo. Dicha sustentación puede afectar la nota de todos los miembros.
▪ El proyecto debe ser entregado en Sicua+ por un solo integrante.
▪ Se debe entregar por Sicua+ a más tardar el 1 de diciembre de 2019 a las 23:59
DEPARTAMENTO DE SISTEMAS Y COMPUTACIÓN
ISIS1304
FUNDAMENTOS DE INFRAESTRUCTURA TECNOLÓGICA
Proyecto 2 – 2019-2

E. CASOS DE PRUEBA
Adjuntos al proyecto encontrarán tres archivos de ejemplo con los valores de entrada y archivos
con las respectivas cadenas que se espera que impriman. Pueden utilizar los archivos de
entrada para verificar que sus programas estén funcionando correctamente, pero es altamente
recomendado que generen sus propias pruebas.

F. CRITERIOS DE CALIFICACIÓN PARA LOS PROGRAMAS


La calificación consta de dos partes:
● Ejecución (50%). Para las funciones propuestas se harán 5 pruebas: tres de los casos
de prueba entregados y otros dos nuevos. Para cada caso se revisará si la salida es
correcta o no según los requerimientos establecidos en el enunciado. Cada una de
las pruebas vale 10%.
● Inspección del código (50%). Se consideran tres aspectos:
o 10% - legibilidad (nombres dicientes para variables, comentarios e
indentación)
o 20% - direccionamiento y manejo de la pila en ensamblador.
o 20% - uso del lenguaje ensamblador (evaluación de expresiones y control).

G. RECOMENDACIONES
▪ Recuerden que los trabajos hechos en grupo y entregados individualmente (o en
grupos diferentes al original) son una forma de fraude académico.

También podría gustarte