martes, 20 de enero de 2015

Comparativa Fibonacci ARM/x86. Pros y contras.

Comparativa Fibonacci ARM/x86

Como se puede apreciar en las entradas anteriores. El uso de los registros y las operaciones es mucho más simple en ARM, por lo que este programa resulta mucho más sencillo programarlo en ARM que en x86

PROS:

ARM

- Más registros a utilizar.
- Operaciones más fáciles de realizar.
- Llamadas más sencillas a las subrutinas.

X86

- Mayor potencia gracias al uso de funciones de C
- No necesita el depurador para comprobar su funcionalidad.
- Se puede dividir un registro para que funcione como varios de menor capacidad.

CONTRAS:

ARM

- Hay que introducir la posición con el depurador
- Requiere mayor control del pc si dentro del blucle llama a otra subrutina, es necesario otro registro
   para controlarlo.


X86

- Pocos registros
- Hay que estar guardando y recuperando los registros cuando se hacen llamadas a funciones

   externas.

lunes, 19 de enero de 2015

Programa en x86 que se ejecute directamente en una máquina que tenga esa arquitectura

Mostrar por pantalla la tabla de multiplicar de un número dado y su longitud.

Start:
Imprimimos por pantalla el enunciado del problema con la instrucción,
Invoke puts, “Enunciado”
Pedir:
Pedimos por pantalla un número con el cual mostraremos su tabla de multiplicar, Leemos el valor introducido y lo almacenamos en la dirección de memoria de N, realizamos la misma operación con el siguiente invoke, pero esta vez pedimos la longitud de la tabla y la almacenamos en LONGI.
Invoke puts, “número”
Invoke scanf, "%d", Addr N
Invoke puts, “Enunciado”
Invoke scanf, "%d", Addr LONGI

Movemos el valor de [LONGI] al registro Eax, para acceder al contenido de una dirección de memoria, tanto para lectura como para escritura, lo indicaremos encerrando la dirección entre corchetes, sumamos 1 al registro Eax para que no haya desplazamiento y así me imprima la longitud de la cadena introducida, movemos el valor del registro Eax a [LONGI] en este caso 1, y movemos el valor 0 al registro Ebx.

Mov Eax, [LONGI]
add Eax, 1
Mov [LONGI], Eax
Mov Ebx, 0

BUCLE:

En la primera línea del subprograma “BUCLE”, utilizaremos la instrucción CMP junto con el registro EFLAGS, para llevar a cabo las comparaciones realiza la operación operando1 - operando2 y coloca las banderas en función del resultado, Jz salta si ZF = 1, Su valor es 1 si el resultado de la comparación es 0 y 0 en caso contrario.

En este caso como el resultado de la comparación es 1 no realiza el salto, y pasamos a la siguiente instrucción, movemos el contenido del registro [N] a Eax, PushAD introduce en la pila los ocho registros de propósito general, con la instrucción Push, decrementamos el valor del puntero de pila (en ESP) e introduce el operando fuente en la cima de la pila, con estos comandos anteriormente usados estamos usando la pila como un almacén de parámetros para los subprogramas, la instrucción Call consiste en meter en la pila la dirección de retorno y saltar a la primera dirección del subprograma.

El programa llamador(“BUCLE”) es el encargado de eliminar los parámetros que ha introducido en la pila puesto que las funciones de C admiten que el número de parámetros sea indefinido (por ejemplo, printf puede tener tantos parámetros como sea necesario). Para esto, en lugar de pop, utilizaremos la instrucción add, sumando a ESP 4 por cada parámetro introducido.

Es recomendable guardar los valores de aquellos registros que pueden ser modificados en la pila antes de introducir los parámetros del subprograma. En este punto, utilizamos la instrucción PopAD, que introduce y extrae, respectivamente, los ocho registros de propósito general.

Una vez hecho esto, procedemos a introducir los valores calculados en el subprograma fTabla, imprimiendo los resultados por pantalla, incrementamos Ebx en 1, de manera que cuando Ebx tenga el mismo valor que la longitud de nuestra tabla, de esta forma en la comparación inicial nos devolverá un ZF=1, así pues nuestra instrucción  Jz realizara un salto hacia el subprograma HECHO.

Cmp Ebx, [LONGI]
Jz > HECHO
Mov Eax, [N]
PushAD
Push Ebx
Call fTabla
Add Esp, 4
PopAD
Invoke printf, "%d x %d = %d", [N], Ebx, [RESULT]
Invoke puts, ""
Inc Ebx
Jmp BUCLE

fTabla:

Como bien he comentado anteriormente la instrucción Call consiste en meter en la pila la dirección de retorno y saltar a la primera dirección del subprograma anterior una vez ejecutado el bucle fTabla, el cual, al principio del subprograma se debe guardar el contenido de EBP en la pila y copiar el contenido de ESP en EBP. Esto se conoce como “prólogo del subprograma”, para acceder a los parámetros que han sido pasados al subprograma no los sacamos de la pila, sino que utilizaremos EBP, que tras el prólogo del subprograma apunta a la posición de la pila donde está guardado el valor anterior de EBP. Dado que en [EBP] se encuentra el contenido anterior del registro EBP y en [EBP+4] la dirección de retorno, tendremos en [EBP+8] el primer parámetro, en [EBP+12] el segundo, en [EBP+16] el tercero, etc, la siguiente instrucción MUL realiza una multiplicación con el primer dato de nuestra pila, a continuación movemos el registro Eax a [RESULT], al final del subprograma se debe sacar de la pila el valor anterior de EBP con la instrucción Pop (dejando en la cima la dirección de retorno) y almacenarlo de nuevo en EBP. A continuación se invocaría a la instrucción  RET. Esto se conoce como “epílogo del subprograma”, mediante la instrucción  Ret volvemos a nuestro programa llamador,”BUCLE”.

Push Ebp
Mov Ebp, Esp
Mov Ebx, [Esp + 8]
Mul Ebx
Mov [RESULT], Eax
Pop Ebp
Ret


HECHO:

En este subprograma creamos como un pequeño menú en el cual mediante una serie de invokes preguntamos al usuario cual es la siguiente opción que desea realizar, mediante un scanf tomamos el valor introducido el cual nos dirá la opción que desea realizar, movemos el dato introducido del registro OP a Eax, hacemos una comparación lo que quiere decir que restamos el dato introducido a 0, si nos devuelve 1 hacemos un jump al subprograma pedir, el cual volveremos a pedir un nuevo valor con el que trabajar, en caso contrario se finalizara el programa.

Invoke puts, "¿Que desea hacer?"
Invoke puts, "1.Volver a empezar"
Invoke puts, "0.Salir"
Invoke scanf, "%d", Addr OP
Mov Eax, [OP]
Cmp Eax, 0
Jz > salir

Jmp pedir


Isaac Acejo Peña.

domingo, 18 de enero de 2015

Profundizando en la placa base GA-970A-DS3

Algunas cuestiones básicas de la GA-970A-DS3

Situadas entre corchetes las referencias a la imagen que se encuentra haciendo clic aquí o al final de esta entrada.
El fabricante de esta placa base es GigaByte. Incorpora el socket AM 3+ [1], el cual soporta una gran cantidad de CPUs que se encuentran listadas en el siguiente enlace: http://www.gigabyte.com/support-downloads/cpu-support-popup.aspx?pid=4122 La GA-970A-DS3 lleva integrados ambos, North Bridge [2] (modelo AMD 970) y South Bridge [3] (modelo AMD SB950). En cuanto a la memoria RAM, soporta la tecnología dual channel y posee 4 zócalos [4] con soporte para módulos RAM DDR3 de las siguientes frecuencias: 2000(O.C.)/1866/1600/1333/1066 MHz. En el siguiente enlace se pueden encontrar todos los módulos compatibles: http://download.gigabyte.eu/FileList/Memory/mb_memory_ga-970a-ds3.pdf Tiene 7 ranuras PCI Express repartidas de la siguiente forma: 2 x PCI Express x16 [5], 3 x PCI Express x1 [6] y 2 x PCI [7]. Estos últimos permiten dar soporte a dispositivos con una cierta antigüedad. Sus dos ranuras PCI Express x16 [5] posibilitan el uso de la tecnología CrossFireX de AMD.
A continuación varios conectores, primero internos y luego externos de esta placa base:
  • 1 x Conector principal de corriente (24-pin ATX) [8]
  • 1 x Conector de corriente (12V) de 4 pines ATX. [9]
  • 6 x Conectores SATA 6Gb/s. [10]
  • 1 x Conector para el ventilador de la CPU. [11]
  • 2 x Conectores para ventiladores. [12]
  • 1 x Conector para el panel frontal de la torre. [13]
  • 1 x Conector para el audio del panel frontal. [14]
  • 3 x Conectores USB 2.0/1.1. [15]
  • 1 x jumper para resetear la CMOS. [16]

Seguimos con los conectores externos, no marcados en la imagen por la perspectiva de la misma:
  • 1 x Puerto PS/2
  • 6 x Puertos USB 2.0/1.1
  • 2 x Puertos USB 3.0/2.0
  • 3 x Conectores de audio

Por último resaltar la BIOS [17], que compuesta por 2 memorias Flash de 32 Mbit cada una, soporta la tecnología DualBios que permite que, en caso de que la primera memoria falle, la segunda, que es básicamente un backup de la primera, permita inicializar el sistema sin ningún problema. Soporta también las siguientes tecnologías:
  • PnP 1.0a (Plug and Play). Consiste en dar soporte a los dispositivos que se encuentren conectados a la placa base mediante ranuras "plug and play" tales como los USB antes del POST. Tras el POST (Power On Self Test) la administración de estos dispositivos pasa a ser responsabilidad del sistema operativo.
  • DMI 2.0 (Direct Media Interface), una tecnología de Intel que permite la comunicación entre los puentes norte y sur. La versión 2.0 de DMI lanzada en el 2011dobla la tasa de transferencia entre ambos dispositivos hasta los 20 Gbit/s a través de 4 canales. Actualmente existe la versión 3.0.
  • SM BIOS 2.4 (Sistema de gestión de la BIOS). Provee una serie de listados con diversas características del computador donde se encuentra implantado.
  • ACPI 1.0b (Advanced Configuration and Power Interface Specification). Gestiona la distribución de la corriente eléctrica a lo largo de la placa.


Ernesto Wulff Olea
Ana Sancho Callealta

viernes, 16 de enero de 2015

Programa Fibonacci en x86/ARM [x86]

Parte x86


Algoritmo para calcular el valor de la sucesión de Fibonacci de una posición dada

Elección de los registros:


-dh: Hará las funciones de contador del bucle para llegar a la posición

MOV dh, 2

-dl: Almacenará la posición dada por teclado.

pusha
Invoke scanf, "%d", ADDR posicion
add esp, 8
popa

MOV dl, [posicion]

-Eax: Contendrá el resultado, el número que ocupa la posición dada, y de registro auxiliar para
mover f(n-2) y f(n-1)

-Ebx: Será el registro que contenga el valor de f(n-2)

MOV Ebx, 0

-Ecx: Será el registo que contendrá el valor de f(n-1)

MOV Ecx, 1


Llamadas a las subrutinas:


En este caso, el selector se comportará como un switch, dependiendo de que posición queramos calcular.

-Case_1:

  MOV Eax, 0
  JP > Fin_Switch

En caso de querer calcular la posición primera, se irá al caso 1 del switch, donde pondrá el registro de la solución a 0 y saltará al final del switch.

CMP dl, 1
JNG > Case_1


-Case_2:

  MOV Eax, 1
  JP > Fin_Switch

Si se quiere conocer la segunda posición, se saltará al caso dos donde se pondrá el registro solución a 1 y se saltará al final del switch.

CMP dl, 2
JE > Case_2

-Case_3:

MOV dh, 2
MOV Eax, 0
MOV Ebx, 0
MOV Ecx, 1
while:
  CMP dh, dl
  JGE > Fin_Switch

ADD Ebx, Ecx
MOV Eax, Ebx
MOV ebx, ecx
MOV ecx, eax
ADD dh, 1
JMP < while

En caso de querer saber una posición mayor que la tercera, el algoritmo irá calculando el número desde la tercera posición, y actualizando el contador hasta llegar a la posición dada.

CMP dl, 2
JE > Case_2
JG > Case_3

El caso 3:

MOV dh, 2
MOV Eax, 0
MOV Ebx, 0
MOV Ecx, 1
while:
  CMP dh, dl
  JGE > Fin_Switch

ADD Ebx, Ecx
MOV Eax, Ebx
MOV ebx, ecx
MOV ecx, eax
ADD dh, 1
JMP < while


Lo primero que ocurre en este caso es que se inicializan los registros necesarios, tras ello entra en un bucle while.

MOV dh, 2
MOV Eax, 0
MOV Ebx, 0
MOV Ecx, 1
while:

Una vez dentro del bucle while, lo primero que hace es comprobar si se cumple la condición de parada, que la posición actual, dh, sea mayor o igual que la posición dada, dl. Sí es así salta al final del switch.

  CMP dh, dl
  JGE > Fin_Switch

De no cumplirse la condición de parada, entra en el cuerpo del bucle, realizando la suma de f(n-1) + f(n-2)
y actualizando los registros, f(n-2) será f(n-1) y f(n-1) será f(n-1) + f(n-2)

ADD Ebx, Ecx
MOV Eax, Ebx
MOV ebx, ecx
MOV ecx, eax

Una vez realizado el cálculo de la posición, se incrementa la posición actual en uno y se salta al inicio del while.

ADD dh, 1
JMP < while

Continuará así hasta que llegue a la posición dada.

Fin_Switch:

Una vez terminado el caso correspondiente se salta al final del switch.

-Fin_Switch:
 pusha
Invoke printf, "El numero que ocupa la posicion %d es : %d ", [posicion], Eax
add esp, 12
popa
Xor Eax, Eax
Invoke system, "pause"
Invoke ExitProcess, Eax

Aquí se guardarán lo registros para llamar a la funcion de printf de c que imprimirá por pantalla la posición dada y el número que ocupa dicha posición en la sucesión. Tras ello se recuperan los registros y se procede a finalizar el programa.

Damián Nimo Márquez

Programa Fibonacci en x86/ARM [ARM]

Parte ARM


Algoritmo para calcular el valor de la sucesión de Fibonacci de una posición dada

Elección de los registros:


- r0 contendrá el número, en hexadecimal, la posición de la sucesión de Fibonacci de la que se
  quiere calcular el valor.

- r1 al principio tendrá el valor de la primera posición de la sucesión, el valor 0, luego irá
  actualizando su valor a la posición n-2

MOV r1,#0

- r2 al principio contendrá el valor de la segunda posición de la sucesión, el valor 1, luego irá
  actualizando su contenido con la posición n-1

MOV r2,#1

- r3 será el encargad de hacer de contador del bucle para el programa, se inicializa con el valor 2,
  pues se calculará a partir de esa posición

MOV r3,#2

- r4 contendrá el resultado final del bucle

Llamadas a las subrutinas:

Hay tres subrutinas las que se puede llamar dependiendo de la posición que se desee calcular.

- FIB1:

FIB1 MOV r4,r1
MOV pc,r14

Pone en el registro de resultados el valor de la primera posición y actualiza el contador del programa.
Se llama cuando se quiere saber el valor de la posición primera de la sucesión

CMP r0,#1
BLEQ FIB1

- FIB2:

FIB2 MOV r4,r2
MOV pc,r14

Pone en el registro de resultado el valor de la segunda posición y actualiza el contador de programa.
Se llama cuando se quiere saber el valor de la posición segunda de la sucesión.

CMP r0,#2
BLEQ FIB2

- FIBR:

FIBR ADD r4,r2,r1
MOV r1,r2
MOV r2,r4
ADD r3,r3,#1
CMP r3,r0
BLT FIBR
MOV pc,14

Es la función que lleva el peso del algoritmo, calcula el número correspondiente a la posición y actualiza el contador de programa.
Se la llama cuando se quiere calcular una posición superior a la segunda.

CMP r0,#2
BLEQ FIB2
BLGT FIBR

Esta subrutina será explicada en profundidad en la siguiente entrada.

La subrutina FIB:

FIBR ADD r4,r2,r1
MOV r1,r2
MOV r2,r4
ADD r3,r3,#1
CMP r3,r0
BLT FIBR
MOV pc,r14

Lo primero que hace esta subrutina es sumar f(n-1) + f(n-2) con n >2, es decir, guarda en r4 la suma de r2 y r1.

ADD r4,r2,r1

Luego actualiza los registros, r1 contendrá el valor de r2.

MOV r1,r2

r2 se actualizará con el valor de r4.

MOV r2,r4

Se incrementa r3 en uno.

ADD r3,r3,#1

de está forma, al ser r3 n+1, r2 y r1 pasan a ser f(n-1) y f(n-2) respectivamente
A continuación se compara r3 con r0, repitiéndose el bucle mientras r3 sea menor que r0
CMP r3,r0
BLT FIBR

Al final el bucle se actualiza el contador de programa.

MOV pc,r14

Tras lo cual terminará el programa dejando el resultado en el registro r4.

Damián Nimo Márquez

miércoles, 14 de enero de 2015

Ordenador destinado a la concurrencia



Con un ajustado presupuesto de 800 euros nos planteamos si podría ser posible el diseñar un ordenador especialmente indicado al diseño y testeo de programas concurrentes. A continuación se encuentran enumerados los componentes que hemos considerado más adecuados junto a los por qué de dichas elecciones.


Procesador






En la búsqueda de un procesador económico y con la mayor cantidad de núcleos posible nos topamos con la familia de procesadores FX de AMD. Dentro de la misma encontramos el FX-9590, que por un precio de 225e nos ofrece 8 núcleos físicos, algo idóneo para la función que desempeñará en el contexto de nuestra configuración. La alternativa a esta elección eran los procesadores intel de 4 núcleos con hyperthreading, pero desgraciadamente el precio de uno de estos últimos ya eclipsaba al total de nuestro presupuesto.


A raíz de la elección de este procesador tuvimos que forzar la elección de una placa base que soportara el socket AM3+ y los 220W que requiere el FX9590 para operar, una fuente de alimentación bastante potente (650W) y de buena calidad y por último un sistema de refrigeración líquida capaz de disipar el tremendo calor que se generaría en nuestro equipo.


Modelo escogido: AMD FX 9590 [225link]



Disipador





Uno de los aspectos más polémicos del procesador que hemos escogido, el FX9590, es el calor que genera con sus 220W de consumo eléctrico en condiciones normales. Como la idea de esta configuración es forzarla para exprimir el máximo rendimiento nos decantamos por un sistema de refrigeración líquida. Gracias a esta elección deberíamos lograr mantener a una temperatura razonable el procesador a pesar de sus características.


Modelo escogido: Cooler Master Seidon 120 [51link]


Placa Base





La elección de la placa base vino dada por la compatibilidad de sockets del anteriormente mentado procesador FX-9590, el cual utiliza el socket AM3+, y por la confianza que destila una marca como es Gigabyte. Y como no, por el precio.

Profundice en la GA-970A

Modelo escogido: Gigabyte GA-970A-DS3P Socket AMD 3+ [75link]


Tarjeta gráfica





Llegados a este punto no pudimos sino pensar en la tecnología CUDA de nVidia, la cual permite dar uso a tantos núcleos como la gráfica en cuestión (que habrá de soportar dicha tecnología). Con el presupuesto pisándonos los talones dimos con la GTX 750, la cual proporciona una relación precio-rendimiento-calidad exquisita. Esta tarjeta pertenece a la versión 5.0 de la tecnología CUDA y nos ofrece 640 núcleos a una frecuencia estándar de 1020MHz cada uno. Además, al haber escogido la versión desbloqueada de esta gráfica podríamos llegar y sobrepasar la frecuencia boost, citada en 1085MHz según la web del fabricante.


Modelo escogido: Gigabyte GeForce GTX 750 OC [119link]


Fuente de alimentación





Dados los componentes elegidos para la configuración de esta computadora concurrente, hemos elegido esta fuente de alimentación de 650W.


Modelo escogido: Nox Urano VX 650W - Fuente [43€ link]



Almacenamiento





Al no ser el almacenamiento uno de los elementos fundamentales para la función que realizaríamos, hemos buscado un medio de almacenamiento rápido y no muy caro, ya que hemos dedicado la mayor parte del presupuesto a los componentes más importantes para nuestra labor.


Modelo escogido: Kingston SSDNow V300 120GB - Disco Duro SSD [55,95€ link]

Memoria RAM





Para nuestra función, hemos elegido dos módulos de RAM de 8 GB cada uno y por tanto, tenemos 16 GB. Realiza automáticamente un overclock a la frecuencia más alta publicada (hasta 1866 MHz). Por último, decir que nuestra placa base admite este tipo de formato (DDR3) hasta 32 GB.


Modelo escogido: Kingston HyperX Fury Blue DDR3 1866MHz 16GB 2x8GB CL10 - Memoria DDR3 [155€ link]


Torre






Escogimos esta torre especialmente por el precio y el diseño. Además, incluye un ventilador en la parte trasera y tener refrigeración de más nunca viene mal. Esta torre es compatible con placas base ATX, y la nuestra coincide con este formato.


Modelo escogido: AeroCool V2X USB 3.0 Verde - Caja/Torre [28link]






Presupuesto para este ordenador: 751,95€


En pos de la economía de nuestra maltrecha nación todas las hipotéticas compras las hemos realizado en PC Componentes.



Ana Sancho Callealta
Ernesto WUlff Olea

Comparativa x86/ARM





X86/ARM



Hablar de una comparativa entre x86 y ARM es casi como comparar los dos sets de instrucciones principales que nos podemos encontrar, CISC y RISC.

Con x86 nos encontramos el tipo de procesador mas usado en equipos de escritorios, el cual utiliza un set de instrucciones de tipo CISC (Complex instruction set computing), es decir, que posee soporte para un grupo de instrucciones más complejas, simultaneas y de ejecución más lenta, pero que al fin y al cabo da lugar a códigos menores al poseer menor uso de accesos a memoria (entrada/salida) y la simplificación de la estructura de la programación concurrente.


Por otro lado, nos encontramos con los procesadores que lideran con mano firme el mercado móvil, ARM. En este caso estamos ante el uso de un set de instrucciones de tipo RISC (Reduced intruction set computing), es decir, cambiamos totalmente lo que CISC buscaba y nos centramos en la simplificación de instrucciones, buscando siempre la máxima eficiencia por ciclo y organizar mejor las operaciones dentro del núcleo de procesamiento.








El que cada uno contenga un conjunto de instrucciones “casi opuesto” y dominen mercados “tan diferentes” no es precisamente una casualidad. Vamos a exponer las características principales que hacen a estos dos grandes de la computación actual los elegidos para cada unos de estos mercados.


X86:
-Retrocompatibilidad
-Pocos fabricantes (Intel, AMD, VIA)
-Amplio abanico de instrucciones, de alta complejidad.
-Alto rendimiento.
-Alto uso energético.


ARM:
-Amplio abanico de fabricantes, licencias.
-Simpleza, número “pequeño” de instrucciones.
-Rendimiento aceptable y en mejora.
-Bajo uso energético.



Vamos a detallar un poco más que quiere decir cada una de estas características:

-Cuando hablamos de retrocompatibilidad hacemos referencia a que es completamente compatible con programas y/o procesos creados para antiguos modelo. Esta característica es muy importante en el mundo de la computación de sobremesa, ya que la misma lleva mucho tiempo funcionando, y el ser compatible con lo ya previamente existente es un punto a favor tanto para el consumidor como para programador.

-La lucha por el mercado siempre es algo que tanto a la larga como al futuro más cercano favorece sin duda a los consumidores y a los productos. El que esté establecida esta lucha entre estas dos arquitecturas no deja más que dejar mejoras y avances en el terreno. Aún así, la cosa no se queda ahí. Ambas arquitecturas poseen a su vez varias marcas productoras de ellas que dan lugar a una pequeña “guerra civil”. En el caso de x86 la cosa no es tan grave,pues Intel dio pocas licencias, pero no quiere decir que no sea intensa. El número de empresas productoras de esta arquitectura las podemos contar con los dedos de una mano, siendo su número de 3, Intel, AMD y VIA, encontrándonos la gran lucha por el mundo del sobremesa entre dos empresas casi hermanas, Intel y AMD. Por otro lado, ARM, permite la compra a terceros de su licencia, dando lugar a un gran número de marcas productoras de esta arquitectura, cada cual ofreciendo nuevas mejoras, avances, y en general un mayor abanico de opciones para el consumidor.

-Visto por un programador, nos encontramos con dos ambientas bastantes opuestos, y visto por cada cual uno diría que uno es mejor que el otro. Cuando miramos a x86 nos encontramos con el modelo CISC, el cual nos brinda un abanico cuanto menos grande de instrucciones a la cual más compleja y que nos aportaran mejoras de tiempo, debido a las mejoras en las implementaciones de paralelismo, bucles, recursividad etc.. y un gran número de diferentes tamaños de registros, destinados a operaciones muy precisas, tales como procesamiento gráfico, instrucciones SIMD.



“Registers availables in the x86 instruction set”: http://en.wikipedia.org/wiki/X86


Sin embargo en el otro lado nos encontramos con una arquitectura de tipo RISC, ARM. En ella nos encontramos con un set de instrucciones mucho más pequeño, pero mucho más atómico, ¿qué quiere esto decir?. Pues esto quiere decir que las instrucciones se pueden prácticamente cambiar por instrucciones de tipo máquina, ahorrando tanto tiempo como energía en su traducción. Aparte de ello el que las instrucciones sean simples no quieren decir por defecto que sean malas, puesto que ayudan a su fácil comprensión y a su mejor implementación al ser más “fáciles de manejar”. En cuanto a los registros nos encontramos 37 registros de 32 bits:
*1 para el contador de programa
*1 para el registro de estado del programa actualmente
*5 para el registro de estado del programa guardado
*30 de propósito general



































-Cuando hablamos de potencia y eficiencia energética, al decir x86, nos estamos refiriendo a una arquitectura muy potente pero que dejo de lado un poco la eficiencia energética en sus inicios. El porque de que esta arquitectura sea así, viene impregnado en su diseño. El que sea CISC nos dice de principio que usa un conjunto de instrucciones complejo y que requiere para su ejecución varios ciclos de reloj, pero que al usarlas, nos aportan mejoras de eficacia. Además el procesamiento de datos se presenta en diversas fases, siendo algunas de estas la decodificación o la asignación de memoria, y el tener microcodes, responsables de interpretar las instrucciones y pasarlas a procesos físicos. Esto que hemos mencionado anteriormente conlleva a un gran desempeño pero aparte de ello un gran consumo energético. Sin embargo cuando nos enfocamos en ARM nos encontramos con RISC, y su “simpleza”. Estos buscan la mayor eficiencia por ciclo, aparte de ello dan lugar chips más pequeños y más simples, dando lugar a una mejora considerable en cuanto a eficiencia energética.


CONCLUSIÓN


Podemos decir que x86 lleva la batuta en cuanto al mundo del sobremesa y los servidores, debido a su gran desempeño. Aún así la eficiencia energética que aporta ARM esta llamando mucho la atención y están sustituyendo servidores de funcionamiento 24/7, debido a que la mejora de potencia no equipara el mayor gasto que conlleva tenerlos funcionando. Por otro lado el mundo móvil está siendo dominado por ARM, sobre todo el de los smartphones, con más de un 90% de cuota de mercado. Todo esto debido a su papel en el ahorro de energía, fundamental en las baterías, y su amplio abanico de productores, lo que da juego al mercado y mayores opciones al consumidor.



BIBLIOGRAFÍA

Varios pdfs de las prácticas de laboratorio:
-The ARM instruction set
-ARM: Documentación Nociones básicas sobre la arquitectura ARM y el lenguaje ensamblado

x86: Documentación Nociones básicas sobre la arquitectura x86 y el lenguaje ensamblador


Manuel Alba Caravaca