Ensamblador - Comparaciones en MIPS32 extrañas

   
Vista:

Comparaciones en MIPS32 extrañas

Publicado por Wismichu (5 intervenciones) el 07/11/2015 11:39:55
Hola a todos, estoy intentando resolver este ejercicio, pero no tengo ni idea de que hacer.

"El objetivo de este ejercicio es desarrollar una pequeña biblioteca de funciones escritas en
ensamblador que permiten trabajar con números representados en coma flotante según el
estándar IEEE 754 de 32 bits (variables de tipo float en C). Las funciones a implementar son
las siguientes. Tenga en cuenta que la correspondiente rutina en ensamblador debe tener el
mismo nombre.

• int iszero(float x): devuelve 1 si el número x es cero y 0 en caso contrario. La
implementación realizada NO puede comparar x con el valor 0.0.

• int isinfpos(float x): devuelve 1 si el número x es más infinito y 0 en caso
contrario. La implementación realizada NO puede comparar x con el valor Inf.

• int isinfneg(float x): devuelve 1 si el número x es menos infinito y 0 en caso
contrario. La implementación realizada NO puede comparar x con el valor –Inf.

• int isnan(float x): devuelve 1 si el número x es NaN y 0 en caso contrario. La
implementación realizada NO puede comparar x con el valor NaN.

• int isnormal(float x): devuelve 1 si el número x se corresponde con un número
normalizado y 0 en caso contrario.

• int isunnormal(float x): devuelve 1 si el número x se corresponde con un
número no normalizado y 0 en caso contrario.

• int split(float x, int *s, int *e, int *m): la función descompone los
32 bits del número x, devolviendo tres valores: el signo en s, el exponente almacenado
en el número e y la mantisa almacenada en m . El valor del signo se almacenará en el bit
menos significativo de s; el valor del exponente en los 8 bits menos significativos de e
y el valor de la mantisa en los 23 bits menos significativos de m. En la implementación a
realizar tenga en cuenta que esta función recibe un único parámetro de entrada y
devuelve tres valores (el signo, el exponente y la mantisas).

• int join(int s, int e, int m, float *x): la función construye un número
en coma flotante y lo devuelve en x, a partir del bit de signo s, del exponente a
almacenar e y de la mantisa a almacenar m. El bit de signo se encuentra en el bit menos
significativo de s; el exponente en los 8 bits menos significativos de e; y la mantisa en
los 23 bits menos significativos de m. En la implementación a realizar tenga en cuenta
que esta función recibe tres parámetro de entrada y devuelve un único valor de tipo float."

Pues esa es la duda, como se sabe si un numero es cero pero sin compararlo con cero? A este paso me voy a pegar un tiro D:
No se si alguien tiene alguna idea, creo que igual usando alguna máscara de bit en concreto o algo...pero tampoco controlo muy bien ese tema. Cualquier aportacion se agradecera. :D
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Comparaciones en MIPS32 extrañas

Publicado por Requeteprogramador (26 intervenciones) el 07/11/2015 21:24:13
Extrañas según se mire. De lo que se trata con esos ejecicios es que aprendas cómo funciona algo. En este caso, la codificación de números en coma flotante según el estándar IEEE 754. Para ver si es 0 un float comparándolo con 0.0 no te hace falta saber nada de estándares. Por eso te piden que no uses ese sistema, sino uno como por ejemplo sacar exponente y mantisa y comprobar su valor.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Comparaciones en MIPS32 extrañas

Publicado por Wismichu (5 intervenciones) el 09/11/2015 20:23:19
Los floats en MIPS32 se guardan en IEEE automaticamente y se supone que a un numero float como pueda ser 3.5 tenemos que aplicarle alguna máscara o algún procedimiento que nos diga si es cero o no. Pero no tenemos ni idea de cual es. Alguien que eche un cable pls XD
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Comparaciones en MIPS32 extrañas

Publicado por Requeteprogramador (26 intervenciones) el 09/11/2015 20:40:23
¿Pitorreo? ¿Quieres venir a contarme cómo se guardan o se dejan de guardar los floats? ¿Quieres contarme la arquirtectura del coprocesador matemático del mips? Me encanta que venga la gente a enseñarme lo que sé mejor que ellos. Creo que lo que te he dicho está bien claro. Lo que yo he entendido, parece que tú no, es que tienes que hacer esas comprobaciones con un float metido en memoria, no en un registro del coprocesador. Cuando yo empecé a hacer programas en ensamblador no había ni coprocesador. De lo que se trata es que aprendas el IEEE 754, no que te lo den ya hecho. Ale, que alguen eche una mano al colega.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Comparaciones en MIPS32 extrañas

Publicado por Wismichu (5 intervenciones) el 09/11/2015 20:46:05
Gracias por contestar y tener paciencia. Podrías explicar un poco mas lo de como mover los floats a memoria y trabajar con ellos? No nos han dado casi nada de ensamblador. No pretendía pitorrearme, sorry.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Comparaciones en MIPS32 extrañas

Publicado por Requeteprogramador (26 intervenciones) el 09/11/2015 21:39:47
Paciencia mucha.

Ya veo que la parte que no has entendido es esa. Los floats, como cualquier otro dato, se guardan en memoria. Sólo se pasan al coprocesador en el momento en que haya que operar con ellos. Entonces, de lo que se trata con ese ejercicio es que aprendas cómo se codifica en IEEE 754, que trabajes con floats como si no pudieras contar con un coprocesador, que partas de lo que se escribe en memoria cuando defines un float, y entiendas qué número representa

float a = 0.0 la posición de memoria [a] = 00 00 00 00, 4 bytes a 0.
float b = 1.0 la posición de memoria [b] = 00 00 80 3f , en little-endian, no big-endian.

Entonces yo diría que lo primero que tienes que implementar es la función int split(float x, int *s, int *e, int *m):

Una vez que la tengas, puedes comprobar si el float x es 0, infinito, negativo, o lo que sea no comparando x con 0, con infinito o comprobando si es mayor que 0, sino comprobando el valor del exponente, de la mantisa y del signo. Por ejemplo, puedes comprobar si es negativo o no dependiendo de si el bit menos significativo de s es 0 o 1.

¿Máscaras? Claro, para saber si el bit menos significativo de un int está a 0 o no se usa una máscara and con el valor 1, que es el valor del bit que quieres comprobar a uno y los demás a 0. Si el and devuelve 0 es que el bit ese está a 0, si no está a 1. Y para cambiar el estado de un bit de un valor también se usan máscaras.

Los procesadores de hoy tienen instrucciones que cambian el valor de bits, pero por lo visto quieren que uses máscaras, que aprendas a usarlas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Comparaciones en MIPS32 extrañas

Publicado por Wismichu (5 intervenciones) el 09/11/2015 23:46:32
Muchísimas gracias de verdad, a ver si con esto lo hacemos. :D
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Comparaciones en MIPS32 extrañas

Publicado por Felix Felix.arcos68@gmail.com (1 intervención) el 15/11/2015 01:52:28
Buenas, como ya supondrás soy Felix García, jefe de departamento de Estructura de computadores, ¿De verdad pensabas que no íbamos a buscar nuestro enunciado en google para ver si alguien hace trampas? No tenemos forma de saber que grupo sois, pero en función de estas respuestas nos podremos hacer una idea, te recomiendo venir a mi despacho este lunes 16 a las 17:00 para que podamos hablarlo y llegar a un acuerdo.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Comparaciones en MIPS32 extrañas

Publicado por Wismichu (5 intervenciones) el 15/11/2015 02:05:59
Hola, pediamos pistas para hacer este ejercicio y eso nos han dado, una explicacion detallada de que es una mascara de bit y como se aplican, en ningun momento nos han dado la respuesta con lo que viene a ser el codigo del ejercicio, y en ningun momento por tanto hemos cogido trabajo ajeno, y por tanto no se puede hablar de "trampa". Lo unico que hemos pedido es una pista de como saber si un numero es cero sin comparar con el cero, y los del foro nos han dado la pista de que comparemos los exponentes por ejemplo. No hemos plagiado codigo por tanto. Ni pretendiamos plagiar, ni pretendiamos que nos dieran todo hecho. Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Comparaciones en MIPS32 extrañas

Publicado por Requeteprogramador (26 intervenciones) el 15/11/2015 09:05:22
Ciertamente, no consideraría yo esto hacer trampas. Sí hay gente que pregunta y pretende conseguir el código entero, y muchas veces eso consigue, pero no creo que sea este el caso. Luego, en un despacho, en el cine, en la calle, o haciendo el pino, comprobar si alguien ha hecho trampas o no, o si alguien a entendido algo o no, que es de lo que se trata, es tan sencillo como pasarle por la prueba del

“Me lo contaron y lo olvidé. Lo vi y lo entendí. Lo hice y lo aprendí.”

o mejor la del

"No entiendes realmente algo a menos que seas capaz de explicárselo a tu abuela"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Comparaciones en MIPS32 extrañas

Publicado por Felix (1 intervención) el 15/11/2015 18:45:43
Buenas tardes,
Es cierto que no habéis conseguido el código completo, pero también es cierto que lo que preguntáis es lo único no trivial de la práctica. Insisto en que os paséis por mi despacho este Lunes sobre las 5 y lo comentamos. Os recuerdo que mi despacho es el 2-2-d15.

Un saludo y espero que podamos resolver esto sin la necesidad de tomar medidas disciplinarias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar