jueves, 23 de enero de 2014

CUESTION B: ARM oo x86

CUESTION B

En esta cuestión, debemos desarrollar un programa tanto en la arquitectura ARM como en la x86. Hemos escogido un programa sencillo, ya sea debido a algunos problemas a la hora de realizar el proyecto como a la dificultad que se nos ha presentado ante la programacion en ARM.

El programa es una simple calculadora del perímetro y superficie de un cuadrilátero, en el cual hemos incluido una rutina de selección múltiple, y varias llamadas al sistema.

En primer lugar el programa en ARM:

En la sección AREA, le damos atributos de CODE, y de lectura y escritura (READWRITE), de la misma forma que le damos un nombre al modulo en ensamblador.

Como vemos, antes de empezar con el código de programa, definimos etiquetas mediante la directiva EQU, que nos permite referenciar interrupciones o llamadas al sistema como para la escritura de un carácter (SWI_EscrCar) o su lectura (SWI_ReadC).

A partir de ahí, el código es simple, llamemos a la rutina ADR-SWI-MOV, como bloque1, el cual haremos 2 veces. ADR enviará la dirección de la cadena (en este caso, cad1) al regisro r0, impriéndola por pantalla gracias a la orden SWI &2(SWI SWI_write0, por medio de las etiquetas). Saltándonos la siguiente subrutina que simplemente imprime la cad3 y vuelve a pedir un valor, entramos de lleno en la subrutina de la selección múltiple (aunque en este caso se den solo dos 'casos').

La orden SWI &4, mandará una interrupción en la que leerá el registro r0, en el cual se ha guardado la opción del usuario y pasará a una orden de comparación entre dicho registro y unos valores. Segun el valor de la comparación (0 o 1) saltará a una subrutina de PERIMETRO o de SUPERFICIE.

Dentro de éstas, el método seguido es sencillo. En PERIMETRO multiplicamos por dos tanto los valores del ladoA(r1) y ladoB(r2), por medio de una operación de desplazamiento de bit a la izquierda [orden SHL(Shift Left)]. Luego una orden ADD efectuará la suma y la guardará en r3.

Por otro lado, la subrutina SUPERFICIE simplemente multiplica los lados (r1 y r2) guardando el resultado en r3.

Una vez explicado como funciona el programa en ARM, pasaremos al codigo en x86. Ya que es muy similar, me centraré en explicar sus diferencias con ensamblador ARM.


Como vemos, la simplicidad comparada con el código en ARM es enorme. No necesitamos definir ninguna etiqueta en la sección de datos puesto que recurriremos a una interrupción del sistema de forma directa como en ARM (recordemos SWI &2); rescatamos las funciones de la libreria de C con las que podremos imprimir por pantalla y a su vez pedir los valores al usuario.

Saltando el bloque de 'recogida de datos', llegamos a la subrutina de selección múltiple en el que, mediante la orden CMP, haremos una comparación del dato guardado en el registro de propósito general ECX (en el que hemos guardado la opción del usuario). Un salto condicional JE pasará a cualquiera de las dos subrutinas Superficie o Perímetro (Superficie en el caso de que la comparación de 1; Perímetro caso 0). Hemos añadido una subrutina Fin que simplemente llama a una interrupción del sistema con a ayuda de una funcion de la libreria de C y llama a la salida.

Es importante mencionar en las salidas de las subrutinas. En ARM, guardamos el contenido de r14, en el cual queda la dirección de la instrucción antes del salto a la subrutina, en el contador del programa, de modo que seguirá el programa por donde lo habíamos dejado, pasando a la subrutina de salida. En el caso del x86, aunque podríamos haber hecho algo parecido por medio de las instrucciones CALL y RET y pasando la subrutinas a un segundo plano con operaciones de los registros de la pila (segmento SS); hemos decidido simplificarlo y codificarlo linealmente mediante saltos condicionales (Obviamente esto es posible debido a la sencillez del programa).

Aunque no sea parte del proyecto, hemos añadido una sección en la que explicamos el uso de la pila, y el resto de registros de segmentos y en el que nos adentramos en el 80386 y 80387 con el uso de flotantes.

miércoles, 22 de enero de 2014

Cuestion A: Arquitecturas ARM y x86


Arquitectura ARM

El objetivo de diseñar máquinas con esta arquitectura es posibilitar la segmentación y el paralelismo en la ejecución de instrucciones y reducir los accesos a memoria

Características heredadas del RISC

La arquitectura ARM incorporo algunas características del diseño RISC aunque no todas, las que se mantuvieron son:


  • Arquitectura de carga y almacenamiento: Las instrucciones que acceden a memoria están separadas de las instrucciones que procesan los datos, ya que los datos están en registro. ARM no soporta operaciones de memoria a memoria, por lo que todas las instrucciones ARM se distingen en tres etapas:

               1.- Instrucciones que procesan datos: Solamente usan y modifican                       valores en los registros.

               2.- Instrucciones de transferencia de datos: Copian los datos de                         memoria en registros o de los registros a memoria.
               3.- Instrucciones de control de flujo: Ejecutan instrucciones                               ubicadas en direcciones de memorias consecutivas.

               

  • Instrucciones de longitud fija de 32 bits: Campos de instrucciones uniforme y de longitud fija, para simplificar la decodificación de las instrucciones.
  • Formatos de instrucción de 3 direcciones: "f" bits para el código de operación, "n" bits para especificar la dirección del primer operando, "n" bits para especificar la dirección del segundo operando y "n" bits para especificar la dirección del resultado.
                 


El formato de 3 direcciones de ARM se especifican por registros que se han cargado previamente con el contenido de las direcciones de memoria correspondientes.

Esta arquitectura no destructiva ya que el resultado de la operación no se escribe sobre alguno de los operandos, permite a los compiladores organizar las instrucciones de manera de optimizar el pipeline.


Características incorporadas por ARM

Características que luego agrego ARM:

  • Todas las instrucciones se ejecutan en un ciclo de reloj.
  • Modos de direccionamiento simples: El procesamiento de datos solo opera con contenidos de registros, no directamente en memoria.
  • Control sobre la ALU y el shifter en cada instrucción de procesamiento de datos para maximizar el uso de la ALU y del shifter.
  • Modo de direccionamiento con incremento y decremento automático de punteros 
  • Carga y almacenamiento de múltiples instrucciones: Para maximizar el rendimiento de datos.
  • Ejecución condicional de todas las instrucciones: Para maximizar el rendimiento de la ejecución.
  • Set de instrucciones ortogonal, regular o simétrico: No hay restricciones en los registros usados en las instrucciones
  • Pipeline: La próxima instrucción comienza antes de que la actual haya finalizado para economizar el tiempo.
  • Excepciones vectorizadas: son condiciones inusuales de una istrucción en particular.
  • Arquitectura Thumb: Consiste en usar un set de instrucciones de 16 bits que es una forma comprimida del set de instrucciones de ARM de 32 bits para mejorar la densidad de código.
Todas estas mejorar permite a los procesadores ARM adquirir un buen equilibrio entre alto rendimiento, escaso tamaño de código, bajo consumo y poca área de silicio.


Ventajas del RISC

  1. Menor desperdicio de área de silicio: Mas area libre para realizar mejoras de rendimiento como memoria cache, funciones de manejo de memoria, punto flotante, etc.
  2. Menor tiempo de desarrollo: Al ser un procesador simple tiene menor costo y menos esfuerzo de diseño.
  3. Mayor rendimiento: Al diseñar un procesador simple y luego se le agregan instrucciones complejas hará mas eficientes varias funciones de alto nivel pero también decaerá un poco el reloj.
Inconvenientes RISC

  1. No ejecuta códigos x86
  2. Tienen una pobre densidad de código comparada con CICS: En ausencia de memoria cache, la búsqueda de la instrucción necesita un aumento del ancho de banda de la memoria principal dando un mayor consumo.

Características del set de instrucciones ARM

Las instrucciones de ARM son de 32 bits y se alinean en bandas de 4 bytes en memoria, las características mas importantes son:

  • La arquitectura carga-almacenamiento
  • Instrucciones de procesamiento de datos de 3 direcciones
  • La ejecución condicional para cada instrucción
  • La inclusión de instrucciones muy potentes de carga y almacenamiento de múltiples registros
  • La habilidad de ejecutar una operación de desplazamiento y otra general ALU en una instrucción única que se ejecuta en un único ciclo de reloj
  • Extensiones abiertas del set de instrucciones a través del set de instrucciones del coprocesador
  • Arquitectura Thumb de 16 bits del set de instrucciones comprimida y compacta

Ejecución de instrucciones ARM

  • Una instrucción necesita dos operandos, uno siempre sera un registro y el otro un registro o un valor inmediato. 
  • El segundo operando pasa a través del registro de desplazamiento "barrel shifter" donde sufre un desplazamiento y luego se combina con el primer operando de la ALU.
  • Por ultimo el resultado de la ALU se escribe en el registro destino.
  • Todas las instrucciones tienen lugar en un ciclo de reloj
  • El valor del contador de programa PC se incrementa y se copia de nuevo en el registro de direcciones.
  • La próxima instrucción se carga al final del pipeline.
                     


El sistema de memoria

  • ARM tiene un estado de la memoria. La memoria se comprende de bytes numerados desde cero hasta 2^21-1. 
  • Los datos pueden ser bytes (8 bits), media palabra (16 bits) o palabras (32 bits)
  • Las palabras están siempre alineadas en bandas de 4 bytes, es decir, los 2 bits de direcciones menos significativos son cero porque son múltiplos de 4)
  • Las medias palabras están alineadas en bandas de bytes pares ya que son múltiplos de 2.


Existen dos organizaciones:

  • Little endian
               - La posición de cada byte tiene un único número.

               - Un byte puede ocupar cualquiera de estas posiciones de memoria

               - El tamaño de una palabra debe ocupar un grupo de posiciones de                  cuatro bytes que comienzan en una dirección que es múltiplo de                    cuatro y tiene los cuatro bits menos significativos en 0.

                            



  • Big-endian

               - Es la configuración utilizada por Motorola y por los protocolos                        TCP, en donde los bytes se escriben en el orden natural en el que                  se leen.

               - Al tener primero el byte de mayor peso se puede saber si el                          número es positivo o negativo comprobando el estado del bit mas                  significativo del primer byte.

               - Las rutinas de conversión entre sistemas de numeración son mas                  eficientes que little endian ya que la representación coincide con                    el orden en el que se escriben los números.

                         


Arquitectura x86

Características

La arquitectura x86 esta diseñada bajo la arquitectura de Von Neumann, que utiliza el mismo dispositivo de almacenamiento para las instrucciones y para los datos.


Algunas características importantes son:

  • Las instrucciones de x86 son de longitud variable de tipo registro de memoria y diseño CISC.
  • El espacio de direcciones lineal es de 4GB con acceso desalineado y almacenamiento little-endian
  • Dispone de 8 registros de propósito general de 32 bits
  • 6 Registros de segmento de 16 bits
  • Un registro de estado EFLAGS y un puntero de instrucción EIP de 32 bits ambos
  • Dispone de 8 registros de coma flotante de 80 bits
  • 8 registros MMX y XMM de 64 y 128 bits respectivamente para realizar operaciones SIMD.
  • Un conjunto de recursos para el manejo de la pila y subrutinas
  • El SO dispone de puertos E/S, registros de control de manejo de memoria, de depuración, monitorización, etc


Registros de la CPU

Almacenan posiciones de memoria debido a que el acceso a los registros es mucho mas rapido que los acceso a memoria. Hay 14 registros, segun su funcionalidad se dividen en:

Registros de propósito general:

  • AX (Registro acumulador): usado en operaciones aritméticas y como registro de propósito general.
  • BX (Registro base): Se usa para indicar las posiciones de memoria
  • CX (Registro contador): Contiene el valor para controlar el numero de veces que un ciclo se repite.
  • DX (Registro dato): Se usa como registro auxiliar en operaciones aritméticas y como contenedor de datos.


Todos los registros son de 16 bits, pero para realizar operaciones de tipo byte cada uno de estos cuatro registros se divide en dos subregistros de 8 bits a los que se puede acceder de forma independiente, obteniendo así instrucciones ensamblador que pueden operar con datos de 8 y 16 bits


Registros de segmento 

  • CS (Code Segment): Usado por el procesador con el registro IP para saber la ubicacion actual de la instrucción que esta siendo ejecutada.
  • DS (Data Segment): Indica donde están los datos del programa que esta siendo ejecutado.
  • SS (Stack Segment): Indica al procesador sonde esta la zona de memoria que se utilizara para el almacenamiento temporal de datos y direcciones
  • ES (Extra Segment): Apuntador de memoria auxiliar en operaciones complejas en las que se necesitan dos punteros de datos a la vez.
Los cuatro registros son de 16 bits


Registros de pila

  • SP(Stack Pointer): proporciona el valor de desplazamiento de la palabra actual que esta siendo procesada en la pila
  • BP (Base Pointer): Registro auxiliar que facilita la referencia de parámetros 
Ambos registros son de 16 bits


Registros Indice

  • SI (Source Index): Usado como puntero origen en operaciones de desplazamiento entre dos zonas de memoria
  • DI (Destination Index): Usado como puntero destino en operaciones de desplazamiento entre dos zonas de memoria



Registro Instrucción

  • IP (Instruction Pointer): Utilizado por la CPU para saber la posición a CS donde se encuentra la instrucción que se esta ejecutando.


Arquitectura x86-64


Es una arquitectura basada en el conjunto de instrucciones x86 pero para manejar direcciones de 64 bits, las caracteristicas mas importantes que introdujo fueron:

  • Nuevos registros: El numero de registros de proposito general aumenta de 8 a 16 y tambien el tamaño de estos registros de 32 a 64 bits. Por otro lado el numero de registros de 128 bits han aumentado de 8 a 16.
  • Espacio de direcciones mayor: Se pueden direccionar hasta 16 exabytes de memoria
  • Las instrucciones pueden hacer referencias relativas al puntero de instrucciones (registro RIP)
  • Llamadas al sistema mas rápidas ya que la segmentación no esta soportada en el modo de 64 bits.
  • El bit NX: Permite al SO prohibir la ejecucion del codigo en area de datos mejorando la seguridad.
  • Soportan otros juegos de instrucciones: SSE, SSE2, SSE3, y SSE4, además de x86 y MMX.

En resumen

La diferencia principal que presentan es que cada uno utiliza un conjunto de instrucciones distinto. Por lo que el primer gran inconveniente, y es que un software creado para un procesador x86 no es compatible con otro ARM, ya que el otro procesador no es capaz de traducir el lenguaje usado a lenguaje máquina.

Los procesadores x86 están basado en la arquitectura CISC, una arquitectura que permite ejecutar instrucciones complejas y paralelas, permitiendo un mayor rendimiento (procesadores más potentes) y con una consumición superior (lo que los hace menos viables para dispositivos móviles) y de ejecución más lenta.

Por otro lado, los procesadores ARM estan basados en la arquitectura RISC, un modelo de arquitectura donde las instrucciones se empaquetan en funciones de menor tamaño, por lo que resuelven con mayor facilidad y rapidez acciones más sencillas en paralelo, con menor gasto  y menos capacidad de máximo rendimiento en acciones complejas. Se preocupan en la simplificación de esas instrucciones, con la intención de alcanzar la máxima eficiencia por ciclo pudiendo realizar tareas menores con procesos más cortos y una mayor organización de las operaciones dentro del núcleo de procesamiento.

Conclusión

Ventajas:

1. Más batería: ARM está diseñado para consumir la mejor energía  posible. X86 no está diseñado para ello

2.  Precios bajos: Gracias a tantas licencias vendidas, la competencia es  mayor. Fabricarlos y diseñarlos es más barato que optar por  productos x86 de solo dos o tres fabricantes

3. Más seguridad: Existe poco malware para la plataforma ARM, a  diferencia de la que existe en x86 y Windows

Desventajas

1. Menos rendimiento: En aplicaciones comunes, x86 sigue siendo la mejor.

2. Pocos juegos: la arquitectura SoX mete todo lo necesario en la GPU, este último es poco complejo.

3. No hay 64 bit: no hay ningún diseño que permita usar un espacio de memoria mayor a 4GB, sin embargo la próxima versión de ARM tendría un controlador de memoria de 40 bit que permitirá acceder a 1TB


























CUESTIÓN D

En esta cuestion nuestro cometido es desarrollar un programa en arquitectura x86

Para este caso, he escogido un ejercicio simple que consiste en hallar tanto el MCM (minimo común múltiplo) como el MCD (máximo común divisor).
















































Como veis, es un programa bastante sencillo, no requerimos el uso de la pila para variables locales o temporales, ni la invocacion de rutinas de la libreria de C.

Partiendo desde la sección de .DATA  tenemos 5 etiquetas que actuarán como variables, a saber, un contador, uno para guardar tanto el MCM como el MCD y otras dos que serán los números de los que hallar MCD y MCM.

Ya en la sección de .CODE inicializamos el contador a 1 y de ahí pasamos a los bucles. Ya que hemos definido todas las variables como db (es decir, de tamaño de un byte), podemos usar los registros de 8 bits. Recordemos:


Antes de explicar paso a paso el código del programa, explicaré, que este programa busca el MCM comprobando que el contador es múltiplo de ambos números a la vez e incrementando en 1 en caso contrario volviendo a repetir la comprobación. Por este motivo no es adecuado para cifras muy altas. Sin embargo, nos viene bien para la descripción del ensamblador x86.

Como hemos dicho,  los bucles 1 y parte 1 sirven para la comprobación del MCM. El bucle divide el contador entre el primer numero, y la parte 1 hace lo suyo con el segundo numero. Esta division se lleva a cabo por medio de la orden DIV entre los registros AX y BX, guardandose en la parte baja (AL) el cociente y en la parte alta (AH) el resto. Al comparar el resto con 0, nos dará si es un multiplo o por el contrario, saltariamos por medio de un salto condicional al bucle de incremento en el que incrementamos el contador.

Llegados a este punto, la subrutina de la parte 2, guardará el MCM mientras que la parte 3, hallará el MCD mediante una simple formula:

MCD = N1*N2/MCM

Aplicada en esta subrutina.

martes, 21 de enero de 2014

CUESTIÓN C

En la cuestión 3 nos preguntas que qué ordenador de sobremesa nos compraríamos con un presupuesto limitado, en este caso el de 800€. Aparte de ello, explicar nuestra elección y sus componentes, centrándonos principalmente en los detalles de la placa base.

Antes de nada decir que optaremos por la opción de montar la torre por piezas en vez de elegir uno ya montado. El porque de esta elección es simple, precio y placer personal. Para ello usaremos la página de PcComponentes.com para tomar de ahí los precios, aunque se podría haber usado cualquier otra.
Aparte de lo dicho hasta ahora, como se nos pregunta el qué compraríamos nosotros, decir que como "gamers" que somos optaremos por sacar el máximo rendimiento a la parte gráfica y de velocidad de ejecución (rendimiento del procesador y cantidad de ram) con el presupuesto que tenemos.

TORRE/CAJA

Me decido a comenzar con la torre/caja de la máquina que compraremos. He optado por una Zalman Z12 Plus, una torre bastante normal estéticamente, la cual soporta todo lo que le incluiremos. Decir en este apartado que el tema de la elección de la caja, mientras que mantenga la compatibilidad con todos los componentes que le vayamos a instalar como con un poco de ojo al futuro, podemos fácilmente coger la caja que queramos por gusto estético simplemente.
Precio (69€)

PLACA BASE

Para la opción de la placa base hemos optado por la Gigabyte GA-Z77-DS3H. Esta elección viene dada por la elección anterior de elegir un socket intel frente uno amd, y como andamos regular de presupuesto y no podemos optar a los socket 2011 de intel, esta placa base de Gigabyte con socket 1155 de intel posee todo lo que buscamos a un precio no demasiado elevado.
Precio (94€)

PROCESADOR

Desde un inicio nos decidimos a optar por intel, a pesar de poseer un presupuesto un poco reducido como para irnos a una alta gama de los mismos, el procesador Intel Core i5-3330 3.0GH BOX, hará funcionar perfectamente a nuestra máquina y a nuestros juegos. Aquí dejo algunos datos del mismo: 
-Data width 64 bits              -Number of cores 4             - Floating Point Unit Integrated
-Level 1 cache size ? 4 x 32 KB                            - instruction caches2 x 32 KB data caches
-Level 2 cache size ? 4 x 256 KB                           - Level 3 cache size 6 MB shared caché
Precio (143€)

MEMORIA RAM

La selección de la RAM no es algo tan complicado, para ello debemos tener en cuenta que cantidad requerimos para el uso que le vamos a dar el pc y a que nivel de rendimiento. Por temas de presupuesto no podemos optar a algo genial pero tampoco nos haría falta. Con 8GB de DDR3 nos sobrará para casi cualquier cosa. Por ello la elección es la KINGSTOM VALUERAM DDR3 8GB 1333 PC3-10600 CL9
Precio (72€)

VENTILADOR DE LA CPU

Como no queremos tener ningún problema de refrigeración ni nada por el estilo al poner a máximo rendimiento a nuestro cpu, le añadiremos un ARTIC COOLING FREEZER A30 CPU COOLER, que no solventará cualquier tipo de sobrecalentamiento.
Precio (32€)

FUENTE DE ALIMENTACIÓN

Para que todo lo que vamos a usar tenga suficiente corriente, y por si en algún momento decidimos mejorar o ampliar componentes, hemos optado por los 600W que ofrece la COOLOR MASTER B-600 600W.
Precio (54€)

TARJETA GRÁFICA

Un componente que no puede faltar a día de hoy, y cada vez con un requerimiento mayor, sobre todo para jugar videojuegos. Nos hubiera encantado coger una de las grandes gráficas que ofrece el mercado, pero con 800€ de presupuesto no se puede tener todo. Aun así la gráfica que vamos a coger nos dará lugar a correr lo que queramos, tal vez no a ultra, pero si a un muy buen nivel. Esta es la GIGABYTE GEFORCE GTX 660 OC 2GB DDR5.
Precio (165€)

DISCO DURO

En el tema del almacenamiento, vamos a optar por la elección de dos almacenamientos, un SSD de 120GB  para el sistema operativo y programas que lo requieran (por tema de velocidad) y un disco duro normal de 1TB para almacenamiento masivo de datos. Hemos elegido estos: KINGSTOM SSDNOW V300 120GB y WD CAVIAR BLACK 1TB SATA 3 7200 RPM.
Precio (73,95€)
Precio (73,95€)

OTROS

Con el dinero sobrante, le vamos a añadir una grabadora de dvd, la 
Asus DRW-24F1ST Grabadora DVD 24X Negra.
Precio (16,50€)

EL PORQUE DE TODO

La elección de estos productos se acentúan principalmente en el problema de un presupuesto limitado. En un inicio me he elegido por optar por los procesadores de intel, frente a los de amd más que nada por malas experiencias pasadas con procesadores de amd. Aun así esto no quita que en la búsqueda de la relación calidad/precio un procesador amd nos hubiera solucionado más el dilema del rendimiento. Aun así creo que el procesador elegido es cuanto menos uno de los mejores que podríamos haber elegido para un socket 1155. La elección del socket y con ello la placa base fue ya descrita en un inicio, el precio. Hubiera sido genial poder haber optado por una placa base con socket intel 2011 y así haber elegido un i7 de la rama k con overcloking. Pero esto cuanto menos se acerca a lo que puede adquirir uno en la vida misma.
El resto de productos, sobre todo las memorias (discos duros y rams), se han elegido buscando eficiencia calidad precio y marcas que creo son de confianza para este tipo de productos. El optar por dos discos separados, un ssd y una hdd, no es mas por favorecer el rendimiento y la multitarea.
Pasemos a hablar de la gráfica, y de nuevo del dilema, en este caso nvidia-amd. Sigo en negarme a cambiarme a amd hasta que alguien me haga cambiar de idea, así que creo que la gtx 660 nos irá de perlas con lo que abramos en la computadora. 
Aún después de todo, sobraba algo de dinero y supongo que una lectora/grabadora sería necesaria, nada más lejos.

PRECIO TOTAL

El precio total queda en:                                                                              793,40€