viernes, 17 de enero de 2014

PROGRAMA QUE CALCULA EL MÁXIMO COMÚN DIVISOR "PROGRAMA EUCLIDES"


FUNCIÓN DEL PROGRAMA
Mi programa consiste básicamente en calcular el máximo común divisor de dos números introducidos por teclado. Esto será posible hacerlo para que se ejecute en una máquina que tenga la arquitectura x86.

PROCESO SEGUIDO
Primero repasé teóricamente los documentos que nos han facilitado durante las clases y las transparencias. Luego hice el programa pero en lenguaje C (ya que manejo mejor este lenguaje) de manera que luego pudiera pasarlo sencillamente a x86. Me hizo falta mirar como se hacía el bloque if sin el else y el bucle while ya que el if me servía para intercambiar los números introducidos por teclado con la condición si el NUM1 era mayor que el NUM2.
Luego el primer bucle while me servía para hacer tantas veces una serie de instrucciones para ir calculando primeramente la división del numero mayor introducido entre el menor cambiándose estos valores cada vez que salgan del bucle asta que ese numero menor por que el que se divide sea igual a 0. En segundo bucle while que está dentro del anterior nos sirve para calcular el módulo de la división que vamos realizando de un numero por el otro.
Finalmente, una vez acabado estos bucles obtenemos el M.C.D. que lo imprimos por pantalla.

DIFICULTADES
La primera dificultad encontrada fue que para intercambiar dos números en el if no sabía como hacerlo, ya que no sabíamos si usar en el las variables declaradas o los registros. Al final, me di cuenta de que existía una función que intercambia números y ya no tuve problema.
Aún así mi programa me daba resultados erróneos y pensábamos que el problema estaba en el bucle while pero no fue así. Me di cuenta que al usar el API de C y usar el  Invoke scanf nos cambiaban  los valores de los registros y por ello los resultados erróneos.
Otra dificultad encontrada era como poner un bucle dentro de otro, ya que nos daba error al decirnos que el segundo while ya estaba declarado. Este error se debe a que while en esta arquitectura no trabaja como función sino como etiqueta y entonces por ello podemos llamarlo como queramos y así resolver el problema. En nuestro caso el segundo bucle dentro del primero lo llamamos módulo.

IMPLEMENTACIÓN EN OTRAS ARQUITECTURAS

Para completar he estado buscando cómo invocar programas ASM desde JAVA, incluyéndole las librerías a java a través del JNI.


Codigo Euclides
Ejecutable x86

ARM VS x86

En esta parte del blog presentaré un poco que hace el programa basado en ambas arquitecturas.
Que problemas he tenido y como los he solventado
Conclusiones propias y las características de ambas arquitecturas.

Principalmente comentare cual es el programa.

El programa es una sencilla cuenta-atrás nombrada con caracteres ( "_" "|"), la aplicación no ha sido de una dificultad muy alta pero lo suficiente para encontrar varias diferencias amplias entre ambas arquitecturas.
Por un lado la velocidad que tenia ARM era tanto una ventaja como un inconveniente ya que requería que el programa tuviera un pequeño delay de tiempo.
En x86 ese problema era muy fácil de solventar usando al api de windows
Una de las dificultades más grandes encontradas es tener que controlar en cada momento que registro contenía que y como usarlo.

Como opinión personal, yo usaría x86 por su facilidad a la hora de programar, o por lo menos por la posibilidad de solventar los problemas con la api de windows

Código ARM

Código x86

Características ARM y x86

ARM

Está basado en RISC
No es compatible con x86
Al ser más rápido, este fue dejado para el mundo móvil
No es fácil encontrar compilador
Se trata de una arquitectura de carga y almacenamiento
Opera registro a registro
Tiene un banco de 37 registros (16 disponibles) de 32 bits
Las instrucciones tienes un tamaño fijo y se ejecutan en un ciclo de reloj

X86

Está basado en CISC
No es compatible con ARM
Ejecutaba las ordenes mas lentas y fue usado para escritorio.
Longitud de instrucción variable
Dispone de 8 registros de propósito general de 32 bits, 6 de segmentos de 16 bits
registro EFLAGS 32 bits, un puntero 32 bits,
8 registros de coma flotante, 8 de MMX.

Tras ver las características podemos concluir en que:

- Están basados en diferentes arquitecturas computacionales
- No son compatibles entre sí
- ARM es mas rápido a la hora de ejecutar ordenes y fue destinado a móviles
- La longitud es contraria dependiendo del caso (ARM fija, x86 variable)
- ARM contiene más registros de propósito general
- x86 tiene registros de coma flotante.


jueves, 16 de enero de 2014

PLANIFICACIÓN

DICIEMBRE

Lu.

Ma.

Mi.

Ju.

Vi.

Sá.

Do.












1













2

3

4

5

6

7

8













9

10

11

12

13

14

15













16

17

18

19

20

21

22













23

24

25

26

27

28

29

30

31


ENERO

















1

2

3

4

5













6

7

8

9

10

11

12













13

14

15

16

17

18

19













20

21

22

23

24

25

26


         Asignación de cuestiones



        Planificación
         Realización de trabajos
         Decisión de que realizar en cada cuestion
         Publicación blog y revisión
         Realización de presentación
         Exposición del trabajo



Como solo coincidimos en Cádiz los jueves todos los componentes del grupo se ha decidido que nos reuniremos dicho día si hay algún inconveniente para subsanarlo.