lunes, 19 de enero de 2015

Presentación


Este blog, ha sido creado para la realización del trabajo la asignatura de Arquitectura de Computadores, de segundo curso del Grado en Ingeniería Informática de la Universidad de Cádiz

Los alumnos que han hecho posible la realización de este proyecto han sido:

    1. Verónica Mairena Oliva
    2. Teresa Melero Ligero
    3. Matías Díaz Aguirre
    4. Jose Miguel Outerelo Asencio
    5. María Martín Marín


Quiero aprovechar un párrafo aunque sea, para agradecer a mis compañeros el formidable trabajo que han hecho, restando no solo horas de sueño, sino también horas de estudio de otras asignaturas que nos "acechan" a la vuelta de la esquina. Sin vuestro trabajo, este blog no hubiese llegado a ninguna parte. Gracias

CONTENIDOS

El contenido del mismo hace referencia a las cuatro cuestiones que se ha planteado en las prácticas de la citada asignatura.

   Cuestión A: Estudio detallado que contraste las arquitecturas
               ARM / x86. (más aquí)

   Cuestión B: Idear un programa y codificarlo en ambas 
               arquitecturas ARM / x86. Identificar los pros y 
               contras. (más aquí)

   Cuestión C: Dispones de 800€ ¿Qué ordenador de sobremesa te
               comprarías? En este apartado el grupo deberá
               seleccionar los componentes del PC (sólo torre y
               elementos interiores); Explicar en detalle cada
               uno de los componentes (deberá incluir imágenes
               ilustrativas) y, en especial, explicar los elementos
               de la placa base; presentar presupuesto. (más aquí)

   Cuestión D: Idear un programa muy sencillo y codificarlo en ARM
               o x86 (a elegir) para que se ejecute directamente
               en una máquina que tenga esa arquitectura (no en un
               simulador como hemos hecho en las prácticas).
               Explicar el proceso seguido y las dificultades
               encontradas. (más aquí)


Esperamos que la finalidad de este blog sea la exigida por la asignatura, y que la existencia del mismo pueda ayudar, no solo a los actuales alumnos de la asignatura, sino a cualquier otro individuo interesado en la materia y con ganas de aprender.


sábado, 17 de enero de 2015

Cuestión A: Las arquitecturas ARM / x86 al detalle

Este post lo vamos a dedicar a saber y entender las principales diferencias que existen entre las arquitecturas ARM y x86.
Antes de hablar de las diferencias, vamos a hacer una pequeña introducción de lo que es "ARM" y "x86", para tener una pequeña base sobre ambas arquitecturas y ser capaces de asimilar y entender mejor las diferencias, de las que hablaremos al final de este post.



¿QUÉ ES ARM? 


ARM es una arquitectura RISC (Reduced Instruction Set Computer) de 32 bits, desarrollada por ARM Holdings. En sus albores, fue concebida por Acorn Computers para uso en ordenadores personales, de hecho, los primeros productos basados en ARM fueron los Acorn Archimedes (primer ordenador personal de propósito general, basado en su propia CPU RISC ARM de 32 bits) en 1987.



Acorn Archimedes, 1987


En la recta final de los 80, Acorn se encontraba evolucionando su tecnología, presentado las arquitecturas ARMv2 y preparando la ARMv3. Fue en ese momento cuando Apple, se interesó en colaborar con Acorn para diseñar un nuevo procesador para un dispositivo que presentarían años después, en 1993: Apple Newton (La primera PDA de la historia). En esos años se acabó el diseño de la arquitectura ARMv3 y se presentó la familia de procesadores ARM6.

Características

ARM nació como una arquitectura para uso en ordenadores y dispositivos de bolsillo con aquella primera Newton de Apple que ya hemos mencionado, y siendo este uno de los primeros grandes dispositivos en movilidad.


Los procesadores ARM poseen una arquitectura de muy bajo consumo energético, al menos en comparación con las alternativas existentes en el mercado. Muchas veces incluso podría pasar desapercibido respecto del consumo de otros componentes del mismo dispositivo, por ejemplo en un coche eléctrico. Además, la fabricación de estos chips es bastante barata.

ARM, a partir de su primera versión comercial en los años 80, ha ido evolucionando notablemente a lo largo del tiempo, y se han ido introduciendo instrucciones con cada nueva versión de la arquitectura, no solo para mejorar el rendimiento, sino para mejorar la seguridad.


Hay otros fabricantes que han creado sus arquitecturas basándose en las de ARM, como pro ejemplo Qualcomm, nVidia, Apple o Samsung.


Una de las principales características de ARM es que utiliza relativamente pocos transistores, o al menos, muchos menos que los procesadores de otras arquitecturas. Esta es una de las razones por la que ofrece un rendimiento aceptable con un consumo energético muy bajo, y no solo eso: fabricar un procesador ARM también es notablemente más barato, lo cual los hace ideales en muchos casos.


Diseño

Para mantener el concepto tradicional de RISC, se estableció la ejecución de una orden en un tiempo, por lo general, de un ciclo. La característica más interesante es el uso de los cuatro bits superiores como código de condición, haciendo que cualquier instrucción pueda ser condicional. Este corte reduce el espacio para algunos desplazamientos en el acceso a memoria, pero permite evitar perder ciclos de reloj en el pipeline al ejecutar pequeños trozos de código con ejecución condicional.

Otra característica única del juego de instrucciones es la posibilidad de añadir "shifts" y rotar en el procesamiento de datos. Por ejemplo, la instrucción en C:

a += (j << 2)

Puede ser mejorada como una única instrucción en ARM, permitiendo la reubicación del registro. Eso hace que necesitemos menos operaciones de carga y almacenamiento, mejorando, por ende, el rendimiento.

El procesador ARM, también posee otras características "raras" en otras arquitecturas consideradas también RISC, como el direccionamiento relativo, y el pre y post incremento en el modo de direccionamiento.

Futuro de ARM

En el actual panorama de crisis económica en el que vivimos y de interés por el cuidado de la naturaleza, ARM es una opción que se está estudiando para su uso en grandes centros de datos como sustituto de las actuales tecnologías. Su principal finalidad es la de abaratar los costes relacionados con el enorme consumo energético, no solo por los propios computadores sino también por los ingentes sistemas de ventilación y seguridad asociados.


ARM no solo consume menos energía, sino que también genera menos calor, otra característica muy importante en los datacenters. Ya existen varios ejemplos que han creado sistemas de unos cuantos cientos de procesadores, y si bien, no son los más potentes (no tenemos ningún ARM en el top500 de supercomputadores) si ofrecen un rendimiento más que digno para muchísimas de las tareas más profesionales de la actualidad. Puede ser cuestión de tiempo que ARM entre a formar parte de esta prestigiosa lista.



¿QUÉ ES x86?

Al igual que ARM, x86 es una arquitectura, pero en este caso de tipo CISC. Es una arquitectura poco limpia, el conjunto de instrucciones es titánico, pero a pesar de ello, la popularidad comercial de esta arquitectura (propia de Intel) hizo que muchos fabricantes comenzaran a fabricar en masa microprocesadores compatibles, compañías como AMD, Cyrix o NEC Corporation.


Procesador comercial Intel 4004


En 1971 Intel presenta su primer procesador comercial, el 4004. Es considerado como la primera piedra de todo lo que vino después. A él lo siguieron los Intel 8008 y 8080 en 1972 y 1974 respectivamente. Todos ellos diseñados para utilizarse en las calculadoras de la época. No fue hasta 1981 que Intel posicionó como su principal producto, tras una larga historia de éxitos, a la nueva familia de chips: los procesadores x86. Definidos así por usar el mismo juego de instrucciones que, si bien ha ido evolucionando con los años, sigue utilizando muchas de las características originales. El 8086 es considerado el primer x86 de la historia, aunque el que catapultó la fama de Intel fue su sucesor, el 8088. A él le siguieron los 80186, 80286, 80386 y 80486, presentados a lo largo de la década de los 80 y principios de los 90.


Características

La larga experiencia de Intel ha repercutido en la evolución y cambios de la arquitectura en muchos aspectos, que van desde la mejora en el tamaño de los buses de datos (16, 32 y ahora 64 bits) a muchísimas instrucciones nuevas que se han ido añadiendo a lo largo del tiempo.

Por ejemplo, el 8086 no disponía de operaciones en coma flotante. Y desde hace un par de décadas todos los procesadores x86 comerciales incluyen instrucciones para operar en coma flotante, con lo que no es necesario un coprocesador adicional (como lo era en tiempos del 8086) salvo en ciertos usos muy concretos en los que se necesite de una gran potencia de cálculo, como por ejemplo con sistemas NVidia Tesla.


Diagrama esquemático del Intel 8086


x86 también ha ido incluyendo nuevos sets de instrucciones y mayores registros para afrontar todo tipo de tareas. x86 dispone de cientos de instrucciones, muchas de ellas complejas que podrían subdividirse en varias instrucciones más pequeñas. Sin embargo, la filosofía de CISC es precisamente esta: proporcionar un amplio conjunto de instrucciones que pueden abarcar múltiples tareas más simples.




Futuro de x86


El rendimiento ha ido creciendo en gran manera con cada nueva generación de procesadores. El futuro de esta arquitectura, mezclará su negocio tradicional de equipos de sobremesa portátiles junto a esa nueva categoría de dispositivos "portátiles", móviles y tabletas principalmente.

Es aquí donde aparece su gran rival, ARM. Una arquitectura que en los últimos años creció de una manera sorprendente consiguiendo abrir mercado en los dispositivos pequeños. Son tremendamente eficientes y tienen un precio muy atractivo. Momento es ya de ver las diferencias entre ambas arquitecturas.



x86 vs ARM


Después de haber tomado cierto contacto con ambas arquitecturas, vamos a ver las diferencias entre ambas, lo mejor y lo peor de cada una de ellas cara a cara.


Tanto x86 como ARM son conjuntos de instrucciones o ISA (del inglés Instruction Set Architecture), básicamente se trata de la parte relacionada con la programación, el tipo de máquina o traductor que convierte las líneas de código en instrucciones ejecutables. Si alguien quiere ejecutar un programa fabricado para una de las dos arquitecturas, se encontrará que el otro procesador, no tiene ni la menor idea de como utilizarlo. Esto provoca que sea imposible la ejecución de programas x86 (juegos, sistema operativo Windows7 ...) en ARM.


El procesador más utilizado en equipos de escritorio es el x86, basado en arquitectura CISC, con soporte para operaciones complejas, simultáneas y de ejecución más lenta, que a pesar de simplificar la estructura de la programación, desemboca en un mayor consumo de energía (dada la complejidad de las instrucciones) y también de la necesidad de más espacio físico.


Por otro lado, los procesadores ARM están basados en arquitectura RISC (Reduced Instruction Set Computer); cuya propiedad más destacada e importante es que posee instrucciones de tamaño fijo y con pocos formatos, y que sólo las instrucciones de carga y almacenamiento acceden a la memoria de datos. El objetivo de diseñar máquinas con esta arquitectura es facilitar el paralelismo en la ejecución de instrucciones y permitir realizar tareas menores con procesos más cortos, lo que al final desemboca en una disminución de la energía empleada.


Intel y AMD son los dos grandes fabricantes que han hecho evolucionar los procesadores x86 en entornos de escritorio en su mayoría. Mientras que el desarrollo de los chips ARM ha sido gracias a distintos fabricantes, como Qualcomm, Texas Instruments, Apple o Samsung entre otros muchos. Esto es así porque ARM Holdings, la empresa que desarrolló ARM, decidió licenciarla haciéndola accesible a los diferentes fabricantes por unas pequeñas tasas.




Esto ha permitido que los procesadores ARM se encuentren en multitud de dispositivos de marcas diversas, mientras que la arquitectura x86 originaria de Intel, solo se encuentra en sus procesadores y en los de AMD.




Si hablamos de sistemas operativos, podemos clasificarlos en los que están orientados a x86 y los que lo están en ARM. La arquitectura ARM, al tener una eficiencia energética superior, está presente en sistemas como Android o iOS, pero recientemente, empresas como Microsoft se han dado cuenta de las restricciones que esto conlleva y están luchando contra esto con sistemas como Windows8 y sus aplicaciones Metro, diseñadas para ser ejecutadas por ambas arquitecturas.


Diferencias a nivel de hardware

A nivel de hardware, la diferencia principal entre ARM y x86 es que tienen distintos conjuntos de instrucciones. Por así decirlo, hablan un lenguaje distinto, lo que hace totalmente incompatible un sistema con el otro. Es decir, que no se pueden compartir binarios entre ambos sistemas.

Si pasamos a explorar cómo se comportan los procesadores, veremos que ARM tiene una gran ventaja sobre x86 en el consumo de energía. Al tener una estructura e instrucciones más sencillas, el ARM consume muchísima menos energía que los procesadores Intel normales. Como podréis imaginar, esto le hace el candidato perfecto para dispositivos móviles como teléfonos o tablets.

Sin embargo,los procesadores x86 son los que destacan en rendimiento. Esa arquitectura más compleja permite más optimizaciones que se hacen mientras se ejecuta la aplicación, como por ejemplo el intercambio de orden de instrucciones para mejorar el tiempo de ejecución.

A pesar de que tanto ARM como Intel trabajan para reducir esas ventajas de uno sobre el otro, las diferencias siguen siendo suficientemente notables para que cada procesador se use en un tipo distinto de computadoras: los Intel a los ordenadores, y los ARM a los móviles y tablets.

Diferencias trasladadas al software

En el punto anterior, decíamos que, debido a los diferentes conjuntos de instrucciones, los binarios no son compatibles entre ambas arquitecturas. Entonces, ¿por qué sí que se pueden ejecutar las mismas aplicaciones Metro en Windows8 y Windows RT?

La respuesta es que las aplicaciones Metro no son exactamente código binario. Normalmente, cuando estáis en un ordenador (Sea Windows, Max o Linux) y compilas un programa, se crea un archivo que contiene las instrucciones que se ejecutarán directamente en el procesador.

Sin embargo, las aplicaciones Metro se compilan en un lenguaje intermedio, MSIL, que es luego interpretado por el sistema. ¿Qué ventaja tiene? Que un mismo ejecutable funciona en cualquier arquitectura.

En cuanto al rendimiento, no podremos instalar un software potente como Mathematica o Visual Studio en un sistema con procesador ARM y pretender que funcione igual que en un procesador Intel.

También ARM restringe lo que podemos hacer en el ordenador. Por ejemplo, instalar Linux en un tablet ARM no será tan fácil como hacerlo con un ordenador Intel. No sólo por temas de drivers, sino porque necesitaríamos versiones específicas del sistema hechas para procesadores ARM. Tampoco podremos controlar el arranque del sistema y nos tendremos que olvidar de quitar el "Secure Boot" o de modificar los ajustes de la BIOS.

La conclusión en este punto es que ARM es un tipo de procesador dirigido especialmente a móviles y tablets y windows RT aprovecha las posibilidades que da. Más autonomía y un rendimiento más que suficiente para un sistema en el que la actividad que vayamos a desarrollar no sea demasiado grande.


Bibliografía.

Cuestión B: Codificando en ARM / x86. Pros y contras.

El programa que hemos propuesto, se trata de una calculadora de áreas.

La aplicación, inicialmente, mostrará un menú con tres opciones disponibles:

            Figuras:
            1. Cuadrado
            2. Rectángulo
            3. Triángulo

            Opción:


El usuario introducirá una opción [1-3] y posteriormente se le solicitarán por teclado los datos necesarios para calcular el área seleccionada.

El dato se mostrará por pantalla, y se le dará la oportunidad al usuario de introducir una nueva opción.

Este programa se presentará tanto en ARM, como para x86.

"ÁREAS" EN x86

En primer lugar vamos a ir viendo poco a poco las diferentes partes en las que se divide el código, y ver la función que desempeña cada una de ellas.

Como bien sabemos, un programa en x86, posee una estructura bien definida. Dicha estructura se divide en tres secciones: .DATA, .CODE y .CONST. Cada una de ellas tiene un propósito bien claro y definido. En lugar de dar una definición teórica de lo que son cada una de ellas, vamos a ir viéndolas paso a paso tomando como ejemplo nuestro programa.

Sección .DATA


.Data

operador DD 0, 0, 0
solucion DD 0
sino DD 's', 'n', 0



En esta sección, lo que vamos a hacer es incluir los datos que queremos definir en memoria. Definiremos tres etiquetas ('operador', 'solucion' y 'sino'), a través de las cuales, accederemos posteriormente al dato que contienen.

Todos los datos que hemos incluido en memoria tienen un tamaño de 32 bits, esto es muy importante, ya que se van a reservar en memoria tantos bits como hayamos designado. (DD = Doble palabra, 32 bits).


  • Operador: Es un vector de tres posiciones. Una para la opción seleccionada y las otras dos para almacenar los parámetros que vamos a necesitar por cada operación.
  • solucion: Dato donde albergaremos la solución.
  • sino: Variable de tipo "vector" con tres posiciones que utilizaremos para controlar si el usuario quiere salir de la aplicación o vuelve al menú principal para seleccionar otra opción.
Sección .CODE

En esta sección escribiremos el grueso de las operaciones que se van a llevar a cabo en esta práctica. Dado que es un código bastante extenso como para verlo en un solo bloque, vamos a ir desglosando la sección .Code en otras más sencillas para comprender mejor lo que se hace en el programa.


.Code

start:
     ;Inicio del programa principal.
     Invoke puts, "Figuras:"
     Invoke puts, "1 - cuadrado"
     Invoke puts, "2 - rectangulo"
     Invoke puts, "3 - triangulo"
     Invoke puts, ""
     Invoke printf, "Opcion: "
     Invoke scanf, "%d", Addr operador
 
     Jmp opciones
fin:
     Invoke puts, ""
     Invoke system, "pause"
     Xor Eax, Eax
     Invoke ExitProcess, Eax

     ;Fin del programa principal



En este código, se crea el menú principal. Para ello hemos hecho usode la pseudoinstrucción "Invoke". Con esta pseudoinstrucción, vamos a realizar llamadas a la API de C para utilizar sus funciones. Además de pasarle como parámetro la función que queremos utilizar, también hay que pasarle los parámetros (en el mismo orden en el que se pondrían en un programa de C) que esta función recibiría. 

Así, en el caso de "puts", también se le pasa la cadena que queremos que se pinte por pantalla. Lo mismo pasa con "printf" o con "scanf". Como caso especial, fijémonos en "scanf". Los parámetros que le pasamos son "%d" y "Addr operador". ¿Por qué usamos ADDR?. Porque si recordamos, "scanf" leía la dirección del dato que se pretende leer. 

Una vez leído el dato, pasaríamos a procesar la opción introducida por teclado, para posteriormente, ejecutar la subrutina asociada a dicha opción.



opciones:
     Mov eax, [operador]

     Cmp eax, 1
     Je > cuadrado

     Cmp eax, 2
     Je > rectangulo

     Cmp eax, 3
     Je > triangulo

     Invoke puts, "Elige una opcion valida."
     Jmp start



En el código de arriba, gestionamos la opción solicitada por el usuario. En primer lugar vamos a almacenar la opción en el registro EAX. Una vez que el dato ya está en el registro, vamos averiguar de que opción se trata. Comparamos si el dato almacenado en EAX (y que se corresponde con la opción seleccionada) es igual a 1, a 2 o a 3, para posteriormente hacer un salto a la subrutina asociada a dicha opción.

Una vez que la subrutina acabe su ejecución, el programa volverá al punto desde donde fue llamada dicha subrutina y se nos mostrará el menú de nuevo (Jmp start)

A continuación, vamos a ver el código que implementa las operaciones que se llevan a cabo en esta práctica:



cuadrado:
    Invoke printf, "Introduzca lado: "
    Invoke scanf, "%d", Addr operador + 4

    Xor eax, eax
    Add eax, [operador + 4]
    Mul D[operador + 4]

    Jmp sol

rectangulo:
    Invoke printf, "Introduzca ancho altura: "
    Invoke scanf, "%d %d", Addr operador + 4, Addr operador + 8

    Xor eax, eax
    Add eax, [operador + 4]
    Mul D[operador + 8]

    Jmp sol

triangulo:
    Invoke printf, "Introduzca base altura: "
    Invoke scanf, "%d %d", Addr operador + 4, Addr operador + 8

    Xor eax, eax
    Add eax, [operador + 4]
    Mul D[operador + 8]
    Shr eax, 1

    Jmp sol



En las tres subrutinas, vemos que utilizamos a "Invoke" tanto para escribir mensajes como para solicitar los datos necesarios para la correcta ejecución de las subrutinas. Veamos en detalle que hacemos en "Cuadrado", paso a paso:

  • Hacemos uso de la pseudoinstrucción Invoke para llamar a la función "printf" de la API de C pasándole, además, la cadena que queremos mostrar, en este caso "Introduzca lado:"
  • Volvemos a hacer uso de Invoke, en esta ocasión para leer el lado y almacenarlo en la segunda posición del vector "operador" (Addr operador + 4)
  • Inicializamos el registro EAX (Xor eax, eax). No queremos obtener resultados indeseados, así que borramos el contenido que tuviese antes el registro.
  • Añade el dato almacenado en [operador + 4] (segunda posición del vector) sobre el registro EAX y finalmente realiza la multiplicación (Mul D[operador + 4]), se multiplica el valor almacenado en EAX por el dato almacenado en [operador + 4].

Estos cuatro pasos son los que, a priori, se realizan en las cuatro subrutinas; lectura de datos, inicilización de registros y operar. Así mismo, al final de cada subrutina se hace un salto a la etiqueta "sol"; Esto se hace para mover el contenido del registro EAX (que almacena el resultado) a la variable "solucion", para posteriormente imprimirla por pantalla y volver pedir al usuario la opción de introducir una nueva operación de nuestra calculadora de áreas, o si prefiere salir, esto se hace en el siguiente código:



volver:
    Pusha
    Invoke scanf, "%c", Addr sino + 2
    Invoke printf, "Desea volver a calcular un area (s/n): "
    Invoke scanf, "%c", Addr sino + 2
    Popa

    Xor eax, eax
    Xor ebx, ebx

    Mov al, [sino + 2]
    Mov bl, [sino]
    Cmp eax, ebx
    Je start

    Mov bl, [sino + 1]
    Cmp eax, ebx
    Je fin

    Invoke puts, "Introduzca una opcion valida."
    Jmp volver



Una vez que el usuario obtiene el resultado, se le da la opción de seguir en la calculadora o volver a ejecutar una de las tres opciones disponibles inicialmente.

Finalmente, se presenta todo el código en un bloque:


;EasyCodeName=Module1,1
.Const

.Data

operador DD 0, 0, 0
solucion DD 0
sino DD 's', 'n', 0

.Code

start:
     ;Inicio del programa principal.
     Invoke puts, "Figuras:"
     Invoke puts, "1 - cuadrado"
     Invoke puts, "2 - rectangulo"
     Invoke puts, "3 - triangulo"
     Invoke puts, ""
     Invoke printf, "Opcion: "
     Invoke scanf, "%d", Addr operador
 
     Jmp opciones
fin:
     Invoke puts, ""
     Invoke system, "pause"
     Xor Eax, Eax
     Invoke ExitProcess, Eax

     ;Fin del programa principal

     ;Subprogramas:

opciones:
     Mov eax, [operador]

     Cmp eax, 1
     Je > cuadrado

     Cmp eax, 2
     Je > rectangulo

     Cmp eax, 3
     Je > triangulo

     Invoke puts, "Elige una opcion valida."
     Jmp start

sol:
     Mov [solucion], eax

     Pusha
     Invoke printf, "solucion: %d (unidad cuadrada)", [solucion]
     Invoke puts, ""
     Popa

     Xor eax, eax

     Jmp volver

volver:
    Pusha
    Invoke scanf, "%c", Addr sino + 2
    Invoke printf, "Desea volver a calcular un area (s/n): "
    Invoke scanf, "%c", Addr sino + 2
    Popa

    Xor eax, eax
    Xor ebx, ebx

    Mov al, [sino + 2]
    Mov bl, [sino]
    Cmp eax, ebx
    Je start

    Mov bl, [sino + 1]
    Cmp eax, ebx
    Je fin

    Invoke puts, "Introduzca una opcion valida."
    Jmp volver

cuadrado:
    Invoke printf, "Introduzca lado: "
    Invoke scanf, "%d", Addr operador + 4

    Xor eax, eax
    Add eax, [operador + 4]
    Mul D[operador + 4]

    Jmp sol

rectangulo:
    Invoke printf, "Introduzca ancho altura: "
    Invoke scanf, "%d %d", Addr operador + 4, Addr operador + 8

    Xor eax, eax
    Add eax, [operador + 4]
    Mul D[operador + 8]

    Jmp sol

triangulo:
    Invoke printf, "Introduzca base altura: "
    Invoke scanf, "%d %d", Addr operador + 4, Addr operador + 8

    Xor eax, eax
    Add eax, [operador + 4]
    Mul D[operador + 8]
    Shr eax, 1

    Jmp sol




"ÁREAS" EN ARM

A continuación vamos a ver el mismo programa, pero desarrollado en ARM y comentado exhaustivamente.



AREA  areas,CODE,READWRITE

SWI_EscrCar EQU &0   ; codigo de impresion de caracter (0) 
                         ; asignado a SWI_EscrCar
SWI_Salir EQU &11    ; codigo de impresion de salida del programa(11)
SWI_write0 EQU  &2
SWI_ReadC EQU  &4


 ENTRY               ; Punto de entrada del código
 
 ADRL r0, cad1       ; Obtenemos la direccion de la cadena
 SWI SWI_write0      ; Interrupcion de Soft. para mostrar la cadena
 SWI SWI_ReadC       ; Interrupcion de Soft. para leer un caracter de
                     ;teclado

 CMP r0, #49         ; tecla 1 ??
 BLEQ CUADR          ; Calcular area del cuadrado
 CMP r0,#50          ; tecla 2 ??
 BLEQ RECTA          ; Calcular area del rectangulo
 CMP r0,#51          ; tecla 3 ??
 BLEQ TRIAN          ; Calcular area del triangulo

              
DATO1 SWI SWI_write0 ; Interrupcion de Soft. para mostrar la cadena   
 ; poner punto de interrupcion en la linea siguiente
 MOV r1, r0          ; Movemos el valor introducido en r0 a r1
 MOV pc, r14
          
DATO2 SWI SWI_write0 ; Interrupcion de Soft. para mostrar la cadena
 ; poner punto de interrupcion en la linea siguiente
 MOV r2, r0          ; Movemos el valor introducido en r0 a r1
 MOV pc, r14



SALIR ADRL     r0, cad5  ; Obtenemos la direccion de la cadena
 SWI      SWI_write0     ; Interrupcion de Soft. para mostrar la cadena
 SWI      SWI_Salir      ; Sale del programa



CUADR ADRL  r0, cad2     ; Obtenemos la direccion de la cadena
 BL  DATO1               ; Pedimos el dato
 MUL  r3,r1,r1           ; lado * lado
 B  SALIR

RECTA ADRL  r0, cad3     ; Obtenemos la direccion de la cadena
 BL  DATO1               ; Pedimos el dato
 ADRL  r0, cad4          ; Obtenemos la direccion de la cadena
 BL  DATO2               ; Pedimos el dato
 MUL  r3,r1,r2           ; base * altura
 B  SALIR

TRIAN ADRL  r0, cad3     ; Obtenemos la direccion de la cadena
 BL  DATO1               ; Pedimos el dato
 ADRL  r0, cad4          ; Obtenemos la direccion de la cadena
 BL  DATO2               ; Pedimos el dato
 MUL  r4,r1,r2           ; dividendo = base * altura
 B  DIVID                ; dividimos entre 2

DIVID MOV  r2, #2        ; divisor = 2
 MOV  r3, #0             ; cociente = 0
 BL  DIVCOND             ; condicion
 B  SALIR                ; terminar

DIVBUC SUB  r4, r4, r2   ; dividendo = dividendo - divisor
 ADD  r3, r3, #1         ; cociente++
DIVCOND CMP  r4, r2      ; dividendo >= divisor
 BGE  DIVBUC             ; hacer bucle
 B  SALIR



cad0  = "", 0
cad1  = "Calcular area de:", &0a, &0d, "1. CUADRADO", &0a, &0d, 
        "2. RECTANGULO", &0a, &0d,"3. TRIANGULO", &0a, &0d, "Opcion: ",0
cad2 = &0a, &0d, "Introduce el lado en r0 y pulsa F5", &0a, &0d, 0
cad3  = &0a, &0d, "Introduce la base en r0 y pulsa F5", &0a, &0d, 0
cad4  = "Introduce la altura en r0 y pulsa F5", &0a, &0d, 0
cad5  = &0a, &0d, "Calculo terminado. Resultado en r3", &0a, &0d, 0

 END


PROS Y CONTRAS

Una de las cosas más atractivas de x86, es que nos da la posibilidad de poder utilizar funciones de C, usando la API de C mediante la pseudoinstrucción INVOKE. Al poder hacer esto, hemos podido "ahorrar" tiempo de desarrollo, ya que no hemos tenido que implementar dicha funcionalidad. En ARM no hemos podido llevar a cabo esta ventaja, en su lugar hay que utilizar interrupciones del sistema.

En cuanto al carácter "CISC" de la arquitectura x86, hace que esta tenga un amplio conjunto de instrucciones, y muchas de ellas son de gran complejidad, por lo cual las operaciones que realizan son mucho más completas. Es decir, lo que podemos ser capaces de hacer en x86 con una única instrucción, en ARM necesitaríamos varias líneas, lo cual hace una vez más a x86 como la opción más sencilla a la hora de elaborar un programa.

jueves, 15 de enero de 2015

Cuestión C: 800 € y un objetivo: Ordenador de sobremesa orientado para diseño y desarrollo web.



El objetivo que tenemos en este punto, es el de confeccionar un ordenador para un propósito en concreto. Deseamos un ordenador de sobremesa orientado al diseño y al desarrollo web. Los componentes no han sido seleccionados de manera arbitraria, sino que hemos tenido en cuenta siempre los objetivos que debemos cubrir, siempre dentro del presupuesto del que partimos, para que el ordenador cubra las necesidades de los futuros usuarios.

Lo primera pregunta que nos surge es: ¿Qué prestaciones debe tener mi ordenador si me quiero dedicar al diseño y al desarrollo web?

Ahora, para poder contestar a esta pregunta, subimos de nivel y tendríamos que preguntarnos: ¿Qué tipo de aplicaciones utilizará?

Aquí ya podemos dar una respuesta más clara y objetiva. Necesitaremos aplicaciones tales como:
  • Photoshop 
  • Ilustrator
  • Gimp
  • etc
Además de este software de tratamiento de imágenes, vectores ... también necesitaremos un software de desarrollo, como pudiera ser Dreamweaver. Pero centraremos toda nuestra atención en las primeras, puesto que son las que más van a exigir a nuestro flamante PC de sobremesa.

Partiendo ya de la premisa del software que voy a necesitar, podremos ir contestando a la pregunta inicial sobre qué prestaciones debe tener mi ordenador.

En principio, subyace la necesidad de tener un buen procesador, que aporte fluidez a las tareas del desarrolador, en otras palabras, necesitamos un procesador rápido. Por otro lado, cuando trabajamos con diseños en photoshop, suele ser normal que estos archivos contengan varias capas, vectores y texturas ... con lo que tenemos que hacer especial hincapié en la memoria RAM. De nada nos va a servir un buen procesador, si la memoria RAM es escasa. Tendremos que encontrar un equilibrio para ajustarnos al presupuesto de 800 € del que partimos.

Por otro lado, si vamos a realizar animaciones, la tarjeta gráfica debería tener memoria dedicada. Para este tipo de tareas, que requieren una cantidad importante de memoria, es prácticamente imprescindible que la tarjeta tenga esta cualidad para aportar fluidez a nuestros desarrollos web. 

EL PRESUPUESTO


El presupuesto que a continuación se muestra, lo hemos hecho mediante el configurador de la web de pcComponentes (clic aquí). Hemos decidido hacerlo mediante este configurador porque algunos componentes del grupo ya  lo conocían y por la sencillez y facilidad que te brinda a la hora de configurar una computadora por piezas.



Podemos ver que el presupuesto final asciende a 798.35 €. A continuación vamos ir explicando porque hemos seleccionado estos componentes y no otros, centrando nuestra mayor atención en los componentes más importantes que decidirán en mayor medida la eficiencia de nuestro ordenador de sobremesa.
PROCESADOR: Intel Core i5-3470 3.2GHz


Los procesadores Intel Core i5, proporcionan un rendimiento elevado. Esta familia de procesadores incluyen muchas tecnologías que proporcionan unas experiencias visuales sorprendentes. Como bien sabemos, existen procesadores en el mercado más eficientes que el que hemos seleccionado para nuestro presupuesto. Dado que nos tenemos que ceñir a un presupuesto, consideramos que este procesador en cuanto a calidad / precio, ofrece unas prestaciones más que aceptables.



Características:
  • Frecuencia del procesador: 3.2 GHz
  • Núcleos: 4
  • Modelo: i5-3470
  • Socket: Socket H
  • Modo: 64 bits.
Más información aquí

PLACA: Asus P8277-V LX



Hemos seleccionado esta placa porque soporta Dual Chanel. Como ya todos sabremos, Dual Channel es una tecnología para memorias que incrementa el rendimiento de éstas al permitir el acceso simultáneo a dos módulos diferentes de memoria. Esto se consigue mediante un segundo controlador de memoria en puente norte de la placa (NorthBridge).

Con esta tecnología, la gráfica puede acceder a un módulo de memoria y el sistema a otro. Vamos a notar un alto rendimiento en todas aquellas aplicaciones que hagan un alto uso de la memoria. En nuestro caso, utilizaremos entornos de desarrollo, tales como Dreamweaver, que hacen uso de memoria. Además, tendremos abiertas al mismo tiempo varias aplicaciones, por lo que esta tecnología hará más fluida la navegación en nuestro escritorio.

Además, esta placa incorpora una tarjeta de sonido de 8 canales, 2 puertos SATA de 6 Gb/s y 4 puertos SATA de 3 Gb. Esto nos permitirá realizar una expansión importante en materia de almacenamiento. Esto es importante,  ya que, manejaremos muchas imágenes, y muchas deberán estar en altas resoluciones. Es de predecir que necesitemos en algún momento ampliar la capacidad de datos.



Características más destacadas:


Intel Socket 1155 para procesadores de 3ª y 2ª generación.

Chipset Intel Z77
Memoria:
    -   4xDIMM. Max 32 GB, DDR3
    -   Soporta Dual Channel
    -   Soporta XMP

Gráficos:
    -   Procesador de gráficos integrado.
    -   Salida Multi-VGA. Puertos: HDMI/DVI/RGB
          1.Soporta HDMI. Resolución máxima de 1920 x 1200 @ 60 Hz.
          2.Soporta DVI. Resolución máxima 1920 x 1200 @ 60 Hz.
          3.Soporta RGB. Resolución máxima de 2048 x 1536 @ 75 Hz.
    -   Memoria compartida (máx. 1696 MB)
    -   Intel HD Graphics.
GPU
    -   Soporte para CrossfireX
Expansión:
    -   1 PCIe 3.0/2.0 x 16 (azul) * 2
    -   1 PCIe 2.0 x 16 (x4, negro)
    -   2 PCIe 2.0 x 1
    -   3 PCI
Almacenamiento:
    -   Intel Z77 chipset:
          1.   2 x SATA 6 Gb/s 
          2.   4 x SATA 3 Gb/s

Más información en la página web del fabricante


VENTILADOR: Arctic Alpine 11 GT Rev.2




Hemos optado por este ventilador, por sus prestaciones y su buena relación calidad / precio. Como dato de interés, su consumo es bastante aceptable: 75 W; Y dada la cantidad de horas que un diseñador / desarrollador puede pasar delante de su ordenador, nos hemos decantado por este Arctic por ser bastante silencioso.


Está dotado de unas juntas de goma que reducirán la transmisión de vibraciones de éste a la base.


Características más destacadas:

  • Material de aluminio
  • Velocidad (RPM) 500 - 2000 RPM
  • Nivel de ruido dB(A) 0.3 Sone
  • Regulación función PWM
Más información en la página web del fabricante


MEMORIA: Corsair Vengeance PC3-12800 DDR3 1600 4x4GB

A la hora de elegir una memoria para nuestro presupuesto, le hemos dado más prioridad que a la tarjeta gráfica. Vamos a utilizar programas que serán muy exigentes en cuanto al consumo de memoria, como Photoshop, sobre todo a la hora de trabajar con archivos de más de una capa, así que nos hemos decantado por cuatro módulos de 4GB (4x4GB), que hacen un total de 16 GB de memoria RAM.




Especificaciones:

  • Soporta Dual Channel
  • Tipo de memoria: DDR3
  • Latencia SPD: 9-9-9-24
  • Velocidad SPD: 1333MHz
  • Voltaje SPD: 1.5 V
  • Velocidad testeada: 1600 MHz
  • Tamaño: 8 GB Kit (2 x 4GB)
  • Garantía: De por vida
Más información en la página web del fabricante

HDD SO: Kingston SSDNow V300 120GB


En la configuración que hemos elegido, vamos a tener dos discos duros, dado que tenemos que "abaratar" costes, pero al mismo tiempo queremos un sistema eficiente, hemos optado por tener dos discos duros, uno de ellos (el que tratamos en este apartado), es específico para el sistema operativo y otras aplicaciones que se ejecutarán en el arranque de nuestra máquina. ¿Qué tiene de especial? Utiliza la tecnología SSD (Solid State Drive), lo cual los hace unos discos duros tremendamente rápidos.

De esta manera, conseguimos que el arranque del sistema se realice en muy poco tiempo. En este disco duro se instalarían las aplicaciones más importantes y que más se van a utilizar, (Photoshop, Corel Draw ...) De esta manera, las aplicaciones irán mucho más ligeras que si  las instalamos un disco duro que no disfrute de la tecnología SSD.


El tiempo de espera se verá reducido drásticamente. Además son discos duros robustos y fuertes, lo que les permite mantenerse estables  en condiciones extremas y así prolongar la vida de los mismos, y por ende, de nuestros datos.


Hemos considerado que con 120 GB tendríamos suficiente para las principales aplicaciones a utilizar.

Especificaciones:
  • Interfaz SATA Rev 3.0 (6 Gb/s) - Compatibilidad inversa con SATA Rev 2.0
  • Capacidad: 120 GB
  • Lectura secuencial: SATA Rev 3.0 hasta 450 MB/s
  • Escritura secuencial: SATA Rev 3.0 hasta 450 MB/s
  • Consumo: 0.640W (reposo) / 1.423W (lectura) / 2.052 W (escritura)
  • Temperatura de almacenamiento: -40 a 85 ºC
  • Temperatura de funcionamiento: 0 a 70 ºC
  • Espectativa de vida: 1 millón de horas MTBF
Más información en la página web del fabricante


HDD SATA: Seagate Barracuda 7200 14 1TB SATA3



Este será nuestro segundo disco duro, dedicado al almacenamiento masivo de datos, tales como: imágenes, desarrollos archivados, vídeos, tutoriales, información de proyectos ... y un largo etcétera.

La capacidad de este disco duro es de 1 TB, mucho más elevada que la del disco duro destinado a mejorar el arranque del sistema. 



Especificaciones:


  • Interfaz SATA 6 Gb/s
  • Caché 64 MB
  • Capacidad 1TB
  • Velocidad de giro: 7200 rpm
  • Latencia promedio: 4.16 ms
  • Tiempo de búsqueda de lectura aleatoria: < 8.5 ms
  • Tiempo de búsqueda de escritura aleatoria: < 9.5 ms
  • Porcentaje de errores: < 1%
TORRE: AEROCOOL V2X USB 3.0 Roja



La caja posee las dimensiones adecuadas para albergar todos los componentes seleccionados de manera óptima, con buena ventilación y al mismo tiempo con un diseño cuidado y moderno.









Características más importantes:
  • Chasis negro 
  • Tarjetas gráficas de hasta 320 mm
  • 2xUSB 2.0 + 1 x USB 3.0 + HD Audio y micro.
  • Ventilador 1x 92 mm trasero.
  • Anillo de bloqueo en el panel izquierdo.

FUENTE: APPROX Fuente alimentación 500W

Fuente de alimentación ATX 12V y V.23 con una potencia de 500W, incluye PFC pasivo y un ventilador silencioso de 12 cm. 
La fuente de alimentación cuenta con la suficiente potencia para alimentar a todos los componentes de la torre.





Características:



  • Fuente de alimentación.
  • Material: superficie metalizada.
  • Fuente de alimentación  ATX 12V, V2.3
GRÁFICA: ASUS GeForce GTX 760 DirectCU II 2GB GDDR5


    El tipo de aplicaciones que vamos a usar, y que son de interés a la hora de seleccionar una tarjeta gráfica, son, en nuestro caso, las aplicaciones de diseño de imágenes, que aprovechan tecnologías como CUDA u openCL.

    NVidia usa CUDA, de hecho es propia de NVidia. No obstante, cada vez está siendo más utilizada la API OpenCL,tanto es así, que también ofrece soporte a NVidia.

    La mayoría de las aplicaciones que vamos a                          usar, utilizan OpenCL: Photoshop, Gimp ...
    Dado que podemos pasar bastante tiempo haciendo uso de la gráfica, la tecnología DirectCU reduce la temperatura un 20% y ofrece un funcionamiento más silencioso que otros modelos anteriores.








    Especificaciones:

    • Motor gráfico: NVIDIA GeForce GTX 760
    • Bus: PCI Express 3.0
    • Memoria de Video: GDDR5 2GB
    • Núcleo CUDA: 1152
    Más información en la web del fabricante

    POR ÚLTIMO ...

    A continuación vamos a ver una imagen de la placa seleccionada, en la que podemos ver señalados los componentes más importantes del presupuesto.