domingo, 16 de octubre de 2016

LENGUAJE ENSAMBLADOR

DEFINICIÓN

Resultado de imagen para lenguaje ensambladorEl lenguaje ensamblador, o assembler (en inglés assembly language y la abreviación asm) es un lenguaje de programación de bajo nivel.

Consiste en un conjunto de mnemónicos que representan instrucciones básicas para los computadores, microprocesadores, microcontroladores y otros circuitos integrados programables.

Implementa una representación simbólica de los códigos de máquina binarios y otras constantes necesarias para programar una arquitectura de procesador y constituye la representación más directa del código máquina específico para cada arquitectura legible por un programador.

Cada arquitectura de procesador tiene su propio lenguaje ensamblador que usualmente es definida por el fabricante de hardware, y está basada en los mnemónicos que simbolizan los pasos de procesamiento (las instrucciones), los registros del procesador, las posiciones de memoria y otras características del lenguaje. Un lenguaje ensamblador es por lo tanto específico de cierta arquitectura de computador física (o virtual).

Fue usado principalmente en los inicios del desarrollo de software, cuando aún no se contaba con potentes lenguajes de alto nivel y los recursos eran limitados. Actualmente se utiliza con frecuencia en ambientes académicos y de investigación, especialmente cuando se requiere la manipulación directa de hardware, alto rendimiento, o un uso de recursos controlado y reducido. 

También es utilizado en el desarrollo de controladores de dispositivo (en inglés, device drivers) y en el desarrollo de sistemas operativos, debido a la necesidad del acceso directo a las instrucciones de la máquina. Muchos dispositivos programables (como los microcontroladores) aún cuentan con el ensamblador como la única manera de ser manipulados.

CARACTERÍSTICAS
    Resultado de imagen para LENGUAJE ENSAMBLADOR
  • El código escrito en lenguaje ensamblador posee una cierta dificultad de ser entendido ya que su estructura se acerca al lenguaje máquina, es decir, es un lenguaje de bajo nivel.
  • Difícilmente portable, es decir, un código escrito para un microprocesador, puede necesitar ser modificado, para poder ser usado en otra máquina distinta. Al cambiar a una máquina con arquitectura diferente, generalmente es necesario reescribirlo completamente.
  • Los programas hechos por un programador experto en lenguaje ensamblador son generalmente mucho más rápidos y consumen menos recursos del sistema (memoria RAM y ROM) que el programa equivalente compilado desde un lenguaje de alto nivel. Al programar cuidadosamente en lenguaje ensamblador se pueden crear programas que se ejecutan más rápidamente y ocupan menos espacio que con lenguajes de alto nivel.
  • Con el lenguaje ensamblador se tiene un control muy preciso de las tareas realizadas por un microprocesador por lo que se pueden crear segmentos de código difíciles y/o muy ineficientes de programar en un lenguaje de alto nivel, ya que, entre otras cosas, en el lenguaje ensamblador se dispone de instrucciones del CPU que generalmente no están disponibles en los lenguajes de alto nivel.
  • También se puede controlar el tiempo en que tarda una rutina en ejecutarse, e impedir que se interrumpa durante su ejecución.

VENTAJAS - DESVENTAJAS

VENTAJAS
  • Como trabaja directamente con el microprocesador al ejecutar un programa, pues como este lenguaje es el mas cercano a la máquina la computadora lo procesa mas rápido.
  • Eficiencia de tamaño: Un programa en ensamblador no ocupa mucho espacio en memoria porque no tiene que cargan librerías y demás como son los lenguajes de alto nivel
  • Flexibilidad: Es flexible porque todo lo que puede hacerse con una máquina, puede hacerse en el lenguaje ensamblador de esta máquina; los lenguajes de alto nivel tienen en una u otra forma limitantes para explotar al máximo los recursos de la máquina. O sea que en lenguaje ensamblador se pueden hacer tareas especificas que en un lenguaje de alto nivel no se pueden llevar acabo porque tienen ciertas limitantes que no se lo permite

DESVENTAJAS
  • Tiempo de programación: Como es un lenguaje de bajo nivel requiere más instrucciones para realizar el mismo proceso, en comparación con un lenguaje de alto nivel. Por otro lado, requiere de más cuidado por parte del programador, pues es propenso a que los errores de lógica se reflejen más fuertemente en la ejecución.
  • Programas fuente grandes: Por las mismas razones que aumenta el tiempo, crecen los programas fuentes; simplemente requerimos más instrucciones primitivas para describir procesos equivalentes. Esto es una desventaja porque dificulta el mantenimiento de los programas, y nuevamente reduce la productividad de los programadores.
  • Peligro de afectar recursos inesperadamente: Que todo error que podamos cometer, o todo riesgo que podamos tener, podemos afectar los recursos de la maquina, programar en este lenguaje lo más común que pueda pasar es que la máquina se bloquee o se reinicie. Porque con este lenguaje es perfectamente posible (y sencillo) realizar secuencias de instrucciones inválidas, que normalmente no aparecen al usar un lenguaje de alto nivel.
  • Falta de portabilidad: Porque para cada máquina existe un lenguaje ensamblador; por ello, evidentemente no es una selección apropiada de lenguaje cuando deseamos codificar en una máquina y luego llevar los programas a otros sistemas operativos o modelos de computadoras.

INSTRUCCIONES - REGISTROS

INSTRUCCIONES


ARITMÉTICAS: Se usa para la realizar operaciones aritméticas sobre los operandos.
ADD: Suma los operandos y guarda el resultado en el operando destino.
SUB: Resta el operando fuente del destino.
DIV: El divisor puede ser un byte o palabra y es el operando que se la da instrucción.
IDIV: Consiste basicamente en lo mismo que la instrucción DIV, solo que esta ultima realiza la operación con signo.
MUL: El ensambldor asume que el multiplicando sera del mismo tamaño que el del multiplicador, por lo tanto multiplica el valor almacenado en el registro que se le da como operando por el que se encuentre contenido en AH si el multiplicador es de 8 bits o por AX si el multiplicador es de 16 bits.

LÓGICAS: Son utilizadas para realizar operaciones lógicas sobre los operandos.
AND: Con esta instrucción se lleva a cabo la operación "y" lógica de los dos operandos.
OR: Lleva a cabo, bit por bit, la disyunción inclusiva lógica de los dos operandos .
XOR: Su función efectuar bit por bit la disyunción exclusiva lógica de los dos operandos.
TEST: Realiza una conjunción, bit por bit, de los operandos, pero a diferencia de AND esta instrucción no coloca el resultado en el operando destino, solo tiene efecto sobre el estado de las banderas.
NEG: Esta instrucción genera el complemento a 2 del operando destino y lo almacena en este mismo operando.
NOT: Lleva a cabo la negación bit por bit del operando destino

TRANSFERENCIA: Son utilizadas para mover los contenidos de los operandos. Cada instrucción se puede usar con diferentes modos de direccionamiento.
MOV: Transferencia de datos entre celdas de memoria, registros y acumulador.
MOVS: Mover cadenas de bytes o palabras desde la fuente, direccionada por SI, hasta el destino direccionado por DI.

CARGA: Son instrucciones específicas de los registros. Son usadas para cargar en algún registro bytes o cadenas de bytes.
LODS: Toma la cadena que se encuentre en la dirección especificada por SI, la carga al registro AL (o AX) y suma o resta 1 (segun el estado de DF) a SI si la transferencia es de bytes o 2 si la transferencia es de palabras.
LAHF: Esta instrucción es útil para verificar el estado de las banderas durante la ejecución de nuestro programa.
LDS: El operando fuente debe ser una palabra doble en memoria. La palabra asociada con la dirección mas grande es transferida a DS, o sea que se toma como la dirección del segmento. La palabra asociada con la dirección menor es la dirección del desplazamiento y se deposita en el registro señalado como destino.
LEA: El operando fuente debe estar ubicado en memoria, y se coloca su desplazamiento en el registro índice o apuntador especificado en destino.
LES: El operando fuente debe ser un operando en memoria de palabra doble. El contenido de la palabra con la dirección mayor se interpreta como la dirección del segmento y se coloca en ES. La palabra con la dirección menor es la dirección del desplazamiento y se coloca en el registro especificado en el parámetro destino.

PILA: Estas instruciones permiten el uso de la pila para almacenar y extraer datos.
POP: Esta instrucción transfiere el último valor almacenado en la pila al operando destino, después incrementa en dos el registro SP.
POPF: Este comando transfiere bits de la palabra almacenada en la parte superior de la pila hacia el registro de banderas.
PUSH: La instrucción PUSH decrementa en dos el valor de SP y luego transfiere el contenido del operando fuente a la nueva dirección resultante en el registro recién modificado.
PUSHF: Decrementa en 2 el valor del registro SP y luego se transfiere el contenido del registro de banderas a la pila, en la dirección indicada por SP.

REGISTROS

Registros de uso general
AX: Acumulador (AL:AH)
BX: Registro base (BL:BH)
CX: Registro contador (CL:CH)
DX: Registro de datos (DL:DH)

Registros de segmento (Solo se pueden usar para los usos mencionados a excepción de ES)
DS: Registro del segmento de datos
ES: Registro del segmento extra
SS: Registro del segmento de pila
CS: Registro del segmento de código

Registros punteros (También pueden tener uso general)
BP: Registro de apuntadores base
SI: Registro índice fuente
DI: Registro ìndice destino

Registros especiales (Solo se pueden usar para los usos mencionados)
SP: Registro apuntador de la pila
IP: Registro apuntador de la siguiente instrucción
F: Registro de banderas (8 bits)

Bits del registro de banderas

Overflow
NV (Apagado): No hay desbordamiento
OV (Encendido): Si lo hay

Direction
UP: Hacia adelante
DN: Hacia atras

Interrupts
DI: Desactivadas
EI: Activadas

Sign
PL: Positivo
NG: Negativo

Zero
NZ: No es cero
ZR: Si lo es

Auxilary carry
NA: No hay acarreo auxiliar
AC: Hay acarreo auxiliar

Parity
PO: Impar
PE: Paridad par

Carry
NC: No hay acarreo
CY: Si lo hay


EJEMPLOS

Es un ejemplo del programa clásico Hola mundo escrito para la arquitectura de procesador x86 (bajo el sistema operativo DOS).

; ---------------------------------------------
; Programa que imprime un string en la pantalla
; ---------------------------------------------
	.model small              ; modelo de memoria

	.stack                    ; segmento del stack

	.data                     ; segmento de datos
	Cadena1 DB 'Hola Mundo.$' ; string a imprimir (finalizado en $)

	.code                     ; segmento del código

; ---------------------------------------------
; Inicio del programa
; ---------------------------------------------
	programa:
		; ----------------------------------------------------------------------------------------------------
		; inicia el segmento de datos
		; ----------------------------------------------------------------------------------------------------
		MOV AX, @data          ; carga en AX la dirección del segmento de datos
		MOV DS, AX             ; mueve la dirección al registro de segmento por medio de AX
		
		; ----------------------------------------------------------------------------------------------------
		; Imprime un string en pantalla
		; ----------------------------------------------------------------------------------------------------
		MOV DX, offset Cadena1 ; mueve a DX la dirección del string a imprimir
		MOV AH, 9              ; AH = código para indicar al MS DOS que imprima en la pantalla, el string en DS:DX
		INT 21h                ; llamada al MS DOS para ejecutar la función (en este caso especificada en AH)
		
		; ----------------------------------------------------------------------------------------------------
		; Finaliza el programa
		; ----------------------------------------------------------------------------------------------------
		INT 20h                ; llamada al MS DOS para finalizar el programa

	end programa

RESUMEN


El Lenguaje Ensamblador proporciona las herramientas para tomar control sobre todo lo que la computadora realiza físicamente.

Proporciona un control absoluto sobre la PC. Los programas en ensamblador son rápidos y compactos. Una instrucción mal interpretada o un error de lógica se vuele mas compleja.

Es un tipo de lenguaje de bajo nivel utilizado para escribir programas informáticos, y constituye la representación más directa del código máquina específico para cada arquitectura de computadoras legible por un programador.

SUMMARY

Assembler Language provides the tools to take control over everything that computer physically performed.

It provides complete control over the PC. Assembler programs are fast and compact. A misunderstood instruction or a logic error will fly more complex.

It is a type of low-level language used to write computer programs, and is the most direct representation of specific machine code for each computer architecture readable by a programmer.

CONCLUSIONES

El lenguaje ensamblador a pesar de ser mas rápido de cualquier otro lenguaje es también el mas complejo por eso es utilizado para complementar los limitantes de los lenguajes de programación de alto nivel. Pero existen ramas donde es imprescindible el uso de lenguaje ensamblador como lo es la electrónica donde los recursos de los aparatos son limitados y es necesario utilizar lenguaje ensamblador.

GLOSARIO DE TÉRMINOS

ASM: assembly language (Lenguaje emsamblador)

BIBLIOGRAFÍA O LINKOGRAFÍA
  • https://es.wikipedia.org/wiki/Lenguaje_ensamblador
  • http://www.monografias.com/trabajos14/lenguaje-ensamblador/lenguaje-ensamblador.shtml#ve
  • https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_lenguaje_ensamblador/Primeros_conceptos#Registros_de_la_CPU
  • http://html.rincondelvago.com/ensamblador.html
Video relacionado al tema


miércoles, 12 de octubre de 2016

PROGRAMACIÓN DE MICROCONTROLADOR

DEFINICIÓN

Procesador con su sistema mínimo en un chip (incluye memoria para programa y datos, periféricos de entrada / salida, conversores análogo – digital (AD) y digital – análogo (DA), módulos especializados en la transmisión y recepción de datos).

La compañía Microchip Technology ofrece una serie de circuitos integrados que denomina "controladores de interfaz de periféricos" o microcontroladores PIC. Combinan un microprocesador, la memoria y la interfaz en un solo chip, ofreciendo a los desarrolladores profesionales, técnicos y aficionados, una plataforma fácil de usar y de bajo costo para el desarrollo de sistemas electrónicos controlados por software. Los microcontroladores PIC vienen en una variedad de capacidades, desde simples unidades de 8 bits hasta sofisticados chips de más de 32 bits.

CARACTERÍSTICAS
  • Arquitectura Harvard, procesador segmentado.
  • Se aplica la técnica de segmentación ("pipe-line") en la ejecución de las instrucciones.
  • El formato de todas las instrucciones tiene la misma longitud.
  • Procesador RISC (Computador de Juego de Instrucciones Reducido).
  • Todas las instrucciones son ortogonales.
  • Arquitectura basada en un banco de registros.
  • Prácticamente todos los PIC se caracterizan por poseer unos mismos recursos mínimos.
  • Modelos de arquitectura cerrada y de arquitectura abierta.
  • Diversidad de modelos de microcontroladores.
  • Amplio margen de alimentación y corrientes de salida elevadas.
  • Herramientas de soporte potentes y económicas.
  • Compatibilidad software entre los modelos de la misma gama.
  • Sencillez de uso y herramientas de desarrollo sencillas y baratas.
  • Código compacto y rápido.
  • Poco consumo y amplio rango de voltajes de alimentación. 
  • Pequeño tamaño y gran variedad de encapsulados.

LENGUAJE DE PROGRAMACIÓN - PROTEUS | PIC C | LENGUAJE C | VISUAL BASIC | ASSEMBLER

PROTEUS

Es software de automatización de diseño electrónico, desarrollado por Labcenter Electronics Ltd, que consta de los dos programas principales: Ares e Isis, y los módulos VSM y Electra.
  • ISIS: permite diseñar el plano eléctrico del circuito que se desea realizar con componentes muy variados, desde simples resistencias, hasta alguno que otro microprocesador o microcontrolador, incluyendo fuentes de alimentación, generadores de señales y muchos otros componentes con prestaciones diferentes. Los diseños realizados en Isis pueden ser simulados en tiempo real, mediante el módulo VSM, asociado directamente con ISIS.
  • VSM: Es una extensión integrada con ISIS, con la cual se puede simular, en tiempo real, con posibilidad de más rapidez; todas las características de varias familias de microcontroladores, introduciendo nosotros mismos el programa que controlará el microcontrolador y cada una de sus salidas, y a la vez, simulando las tareas que queramos que lleve a cabo con el programa. Se pueden simular circuitos con microcontroladores conectados a distintos dispositivos, como motores eléctricos, pantallas de cristal líquido (LCD), teclados en matriz, etc.
  • ARES: Es la herramienta de enrutado, ubicación y edición de componentes, se utiliza para la fabricación de placas de circuito impreso, permitiendo editar generalmente, las capas superficial (Top Copper), y de soldadura (Bottom Copper).
  • ELECTRA: El cual, una vez colocados los componentes trazará automáticamente las pistas realizando varias pasadas para optimizar el resultado.

PIC C

Es una herramienta que permite programar un microcontrolador por medio de lenguaje C, a diferencia del lenguaje máquina o ensamblador (ASM) que se maneja por defecto, este hace los programas más fáciles de escribir, analizar y comprender. PIC C ha sido desarrollado por PIC CMU, y cuenta con una gran cantidad de librerías o drivers que permiten optimizar los programas en el momento de manejar dispositivos externos, tales como pantallas LCD, memorias, conversores, etc.

LENGUAJE C

Es uno de los lenguajes de programación estructurada más utilizados en nuestros días. El principal componente estructural de C es la función. En C, las funciones son bloques en los cuales ocurren las actividades de un programa. Esto nos permite separar los programas en tareas, lo que nos conduce a la programación modular. Otra forma de estructurar en C es usando bloques de códigos. Un bloque de código es un grupo de instrucciones conectadas lógicamente el cual es tratado como una unidad. Un bloque está construido por un conjunto de instrucciones colocadas entre llaves { }.

VISUAL BASIC
Es un lenguaje de programación dirigido por eventos, desarrollado por Alan Cooper para Microsoft.

Ha sido desarrollado con el objetivo de entregar a los usuarios de programación informática un paquete de utilidades simples y accesibles. Es por esto que el Visual Basic puede ser usado y fácilmente comprendido por expertos como también por usuarios principiantes. Su base parte del dialecto BASIC pero con componentes novedosos que lo adaptan a los lenguajes informáticos modernos. A esto se suma que el Visual Basic es además un lenguaje de programación guiado por eventos que permite mayor operatibilidad y mejores resultados.

ASSEMBLER
Es un programa que toma las instrucciones básicas de computación y las convierte en un patrón de bits (ceros y unos) que el procesador de la computadora puede utilizar para realizar sus operaciones básicas.

En el pasado, programadores tenían que hacer todos sus trabajado en un código que entendiera la computadora (es decir, binarios o ceros y unos). Con la introducción de los lenguajes en “assembly”, este aceleró el proceso de desarrollo siendo un intermediario entre el programador y el lenguaje en maquina (0s y 1s). Programación en “assembler” poco a poco a quedado en desuso, sólo utilizado cuando queremos ser eficiente en el control de las operaciones del procesador.

EJEMPLOS

PIC C

Un programa en PIC C se puede hacer de dos formas distintas, ya sea creando un proyecto o simplemente escribiendo el código completo directamente en un archivo con extensión ".C" (más adelante se tratará este tema), cualquiera que sea el caso que se vaya a usar, la estructura es prácticamente la misma:

Estructura programa C

LENGUAJE C

El siguiente programa imprime en pantalla la frase "Hola Mundo" (C99).

// necesario para utilizar printf() 
# include <stdio.h> 

 int main(void) { 
      printf("Hola Mundo\n"); 
      return 0; 
}

El siguiente escribe "Hola Mundo" en C89

/* comentarios con '//' no permitidos en C89, sí en C99 */ 
# include <stdio.h> /* necesario para utilizar printf */  

main() /* tipo 'int' de retorno implícito */ 
{ 
        printf ("Hola Mundo\n") ; 
        return 0; 
}

Estructura de control "else if"

if (condicion 1) { 
    sentencia 1 
} else if (condicion 2){ 
   sentencia 2 
} else if (condicion n){ 
   sentencia n 
} else { 
   sentencias por defecto 
}

VISUAL BASIC

El siguiente fragmento de código muestra un cuadro de mensaje, en una ventana, que dice "¡Hola, mundo!":

Private Sub Form_Load() 
     MsgBox ("¡Hola, mundo!") 
End Sub

ASSEMBLER

Un programa escrito en lenguaje ensamblador consiste en una serie de instrucciones que corresponden al flujo de órdenes ejecutables por un microprocesador.

Por ejemplo, en el lenguaje ensamblador para un procesador x86:

La sentencia: MOV AL, 61h

Asigna el valor hexadecimal 61 (97 decimal) al registro "AL".

El programa ensamblador lee la sentencia de arriba y produce su equivalente binario en lenguaje de máquina: Binario: 10110000 01100001 (hexadecimal: B61)

El mnemónico MOV es un código de operación u "opcode". El opcode es seguido por una lista de argumentos o parámetros, completando una típica instrucción de ensamblador. En el ejemplo, AL es un registro de 8 bits del procesador, al cual se le asignará el valor hexadecimal 61 especificado.

El código de máquina generado por el ensamblador consiste de 2 bytes. El primer byte contiene empaquetado la instrucción MOV y el código del registro hacia donde se va a mover el dato:


En el segundo byte se especifica el número 61h, escrito en binario como 01100001, que se asignará al registro AL, quedando la sentencia ejecutable como: 10110000 01100001

La cual puede ser entendida y ejecutada directamente por el procesador.

RESUMEN

El juego de instrucciones de un microprocesador o microcontrolador es el conjunto de entradas binarias que producen acciones definidas durante un ciclo de instrucción. Un juego de instrucciones es para el microcontrolador lo mismo que una tabla de verdad es para una puerta lógica, un registro de desplazamiento o un sumador. Por supuesto, las acciones que realiza un microcontrolador con cada instrucción, son más complejas que las que realizan los dispositivos y puertas.

Una instrucción es un patrón de dígitos binarios el cual debe estar a disposición del microcontrolador en el tiempo y forma que éste lo requiera.

SUMMARY

The instruction set of a microprocessor or microcontroller is the set of binary inputs that produce defined actions during one instruction cycle. A set of instructions for the microcontroller is the same as a truth table for a logic gate, a shift register or an adder. Of course, the actions taken by a microcontroller with each instruction, are more complex than those made devices and doors.

An instruction is a pattern of bits which must be available to the microcontroller in the time and manner it requires.

RECOMENDACIONES

Los micrconctoladores son computadores digitales integrados en un chip que cuentan con un Microprocesador o unidad de procesamiento central (CPU), una memoria para almacenar el programa, una memoria para almacenar datos y puertos de entrada salida. A diferencia de los microprocesadores de propósito general, como los que se usan en los computadores PC, los microcontroladores son unidades autosuficientes y más económicas. 

CONCLUSIONES

El funcionamiento de los microcontroladores está determinado por el programa almacenado en su memoria. Este puede escribirse en distintos leguajes de programación. Además, la mayoría de los microcontroladores actuales pueden reprogramarse repetidas veces. Por las características mencionadas y su alta flexibilidad, los microcontroladores son ampliamente utilizados como el cerebro de una gran variedad de sistemas embebidos que controlan maquinas, componentes de sistemas complejos, como aplicaciones industriales de automatización y robótica, domotica, equipos médicos, sistemas aeroespaciales, e incluso dispositivos de la vida diaria como automóviles, hornos de microondas, teléfonos y televisores.

APRECIACIÓN PERSONAL

Los microcontroladores están invadiendo el mundo. Están presentes en nuestra casa, en nuestro trabajo y en nuestra vida. Se pueden encontrar controlando los hornos microondas y los televisores de nuestro hogar, en los teclados y ratones de los computadores y en los automóviles. En el bolsillo llevamos unos cuantos entre los del teléfono móvil, los que tienen las modernas llaves del coche y los mandos a distancia del garaje y la alarma doméstica. Pero la invasión acaba de comenzar la conquista masiva de estos diminutos computadores, que gobernarán la mayor parte de los aparatos que fabricamos y usamos los humanos.

GLOSARIO DE TÉRMINOS

ISIS: Intelligent Schematic Input System (Sistema de Enrutado de Esquemas Inteligente)
VSM: El Virtual System Modeling (Sistema Virtual de Modelado)
ARES: Advanced Routing and Editing Software (Software de Edición y Ruteo Avanzado)
ELECTRA: Electra Auto Router

BIBLIOGRÁFICA O LINKOGRAFÍA
  • http://perso.wanadoo.es/pictob/micropic.htm#informacion_sobre_pic
  • https://www.ecured.cu/Microcontroladores_PIC.
  • http://edii.uclm.es/~miniesta/mc_pic_1.pdf
  • https://sites.google.com/site/incoelectronicasas/mini-tutos/-como-programar-un-microcontrolador-con-pic-c
  • http://fcqi.tij.uabc.mx/usuarios/palacios/Parte2.pdf
  • http://www.definicionabc.com/tecnologia/visual-basic.php
  • http://www.digitalika.com/2011/06/assembler-definicion-de-hoy/