domingo, 27 de noviembre de 2016

LENGUAJE ENSAMBLADOR


1.    Contenido
*    Definición
El 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). Esto está en contraste con la mayoría de los lenguajes de programación de alto nivel, que idealmente son portátiles.

Un programa utilitario llamado ensamblador es usado para traducir sentencias del lenguaje ensamblador al código de máquina del computador objetivo. El ensamblador realiza una traducción más o menos isomorfa (un mapeo de uno a uno) desde las sentencias mnemónicas a las instrucciones y datos de máquina. Esto está en contraste con los lenguajes de alto nivel, en los cuales una sola declaración generalmente da lugar a muchas instrucciones de máquina.

 


*    Caracteristicas
·      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.
·      El lenguaje ensamblador es 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
Tiempo de programación
Al ser de bajo nivel, el Lenguaje Ensamblador 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.
Por todo esto, es más lento el desarrollo de programas comparables en Lenguaje Ensamblador que en un lenguaje de alto nivel, pues el programador goza de una menor abstracción.
Programas fuentes 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
Tenemos la ventaja de que todo lo que se puede hacer en la máquina, se puede hacer con el Lenguaje Ensamblador (flexibilidad). El problema es que todo error que podamos cometer, o todo riesgo que podamos tener, podemos tenerlo también en este Lenguaje. Dicho de otra forma, tener mucho poder es útil pero también es peligroso.
Falta de portabilidad
Como ya se mencionó, existe un lenguaje ensamblador para cada máquina; 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. Si bien esto es un problema general a todos los lenguajes, es mucho más notorio en ensamblador: yo puedo reutilizar un 90% o más del código que desarrollo en "C", en una PC, al llevarlo a una RS/6000 con UNIX, y lo mismo si después lo llevo a una Macintosh, siempre y cuando esté bien hecho y siga los estándares de "C", y los principios de la programación estructurada. En cambio, si escribimos el programa en Ensamblador de la PC, por bien que lo desarrollemos y muchos estándares que sigamos, tendremos prácticamente que reescribir el 100 % del código al llevarlo a UNIX, y otra vez lo mismo al llevarlo a Mac.

*    Desventajas
Velocidad
El proceso de traducción que realizan los intérpretes, implica un proceso de cómputo adicional al que el programador quiere realizar. Por ello, nos encontraremos con que un intérprete es siempre más lento que realizar la misma acción en Lenguaje Ensamblador, simplemente porque tiene el costo adicional de estar traduciendo el programa, cada vez que lo ejecutamos.
De ahí nacieron los compiladores, que son mucho más rápidos que los intérpretes, pues hacen la traducción una vez y dejan el código objeto, que ya es Lenguaje de Máquina, y se puede ejecutar muy rápidamente. Aunque el proceso de traducción es más complejo y costoso que el de ensamblar un programa, normalmente podemos despreciarlo, contra las ventajas de codificar el programa más rápidamente.
Tamaño
Por las mismas razones que vimos en el aspecto de velocidad, los compiladores e intérpretes generan más código máquina del necesario; por ello, el programa ejecutable crece. Así, cuando es importante reducir el tamaño del ejecutable, mejorando el uso de la memoria y teniendo también beneficios en velocidad, puede convenir usar el lenguaje Ensamblador. Entre los programas que es crítico el uso mínimo de memoria, tenemos a los virus y manejadores de dispositivos (drivers). Muchos de ellos, por supuesto, están escritos en lenguaje Ensamblador.
Flexibilidad
Las razones anteriores son cuestión de grado: podemos hacer las cosas en otro lenguaje, pero queremos hacerlas más eficientemente. Pero todos los lenguajes de alto nivel tienen limitantes en el control; al hacer abstracciones, limitan su propia capacidad. Es decir, existen tareas que la máquina puede hacer, pero que un lenguaje de alto nivel no permite. Por ejemplo, en Visual Basic no es posible cambiar la resolución del monitor a medio programa; es una limitante, impuesta por la abstracción del GUI Windows. En cambio, en ensamblador es sumamente sencillo, pues tenemos el acceso directo al hardware del monitor.

*    Instrucciones-Registros
La mayoría de las CPU tienen más o menos los mismos grupos de instrucciones, aunque no necesariamente tienen todas las instrucciones de cada grupo. Las operaciones que se pueden realizar varían de una CPU a otra. Una CPU particular puede tener instrucciones que no tenga otro y viceversa. Los primeros microprocesadores de 8 bits no tenían operaciones para multiplicar o dividir números, por ejemplo, y había que hacer subrutinas para realizar esas operaciones. Otras CPU puede que no tengan operaciones de punto flotante y habría que hacer o conseguir bibliotecas que realicen esas operaciones.
Las instrucciones de la CPU pueden agruparse, de acuerdo a su funcionalidad, en:
Operaciones con enteros: (de 8, 16, 32 y 64 bits dependiendo de la arquitectura de la CPU, en los sistemas muy viejos también de 12, 18, 24, 36 y 48 bits)
Estas son operaciones realizadas por la Unidad aritmético lógica de la CPU
·  Operaciones aritméticas. Como suma, resta, multiplicación, división, módulo, cambio de signo
·  Operaciones booleanas. Operaciones lógicas bit a bit como ANDORXORNOT
·  Operaciones de bits. Como desplazamiento o shift lógico y rotaciones u Operadores a nivel de bits (hacia la derecha o hacia la izquierda, a través del bit del acarreo o sin él)
·  Comparaciones
Operaciones de mover datos:
Entre los registros y la memoria:
Aunque la instrucción se llama "mover", en la CPU, "mover datos" significa en realidad copiar datos, desde un origen a un destino, sin que el dato desaparezca del origen.
Se pueden mover valores:
·  Desde un registro a otro
·  Desde un registro a un lugar de la memoria
·  Desde un lugar de la memoria a un registro
·  Desde un lugar a otro de la memoria
·  Un valor inmediato a un registro
·  Un valor inmediato a un lugar de memoria
Operaciones de pila (stack, en inglés):
·  PUSH (escribe datos hacia el tope de la pila)
·  POP (lee datos desde el tope de la pila)
Operaciones de entrada/salida:
Son operaciones que mueven datos de un registro, desde y hacia un puerto; o de la memoria, desde y hacia un puerto
·  INPUT Lectura desde un puerto de entrada
·  OUTPUT Escritura hacia un puerto de salida
Operaciones para el control del flujo del programa:
·  Llamadas y retornos de subrutinas
·  Llamadas y retornos de interrupciones
·  Saltos condicionales de acuerdo al resultado de la comparaciones
·  Saltos incondicionales
Operaciones con números reales:
El estándar para las operaciones con números reales en las CPU está definido por el IEEE 754.
Una CPU puede tener operaciones de punto flotante con números reales mediante el coprocesador numérico (si lo hay), como las siguientes:
·  Operaciones aritméticas. Suma, resta, multiplicación, división, cambio de signo, valor absoluto, parte entera
·  Operaciones trascendentales
·   Operaciones trigonométricas. Senocosenotangentearcotangente
·   Operaciones con logaritmos, potencias y raíces
·  Otras
El lenguaje ensamblador tiene mnemónicos para cada una de las instrucciones de la CPU en adición a otros mnemónicos a ser procesados por el programa ensamblador (como por ejemplo macros y otras sentencias en tiempo de ensamblado).

*      Ejemplos

Ejemplo para la arquitectura x86
El siguiente es un ejemplo del programa clásico Hola mundo escrito para la arquitectura de procesador x86 (bajo el sistema operativo DOS).
Ejemplo para el computador virtual (POCA)
Una selección de instrucciones para una computadora virtual21 con las correspondientes direcciones de memoria en las que se ubicarán las instrucciones. Estas direcciones NO son estáticas. Cada instrucción se acompaña del código en lenguaje ensamblador generado (código objeto) que coincide con la arquitectura de computador virtual, o conjunto de instrucciones ISA.
Ejemplo para el µC Intel 8051
Código en lenguaje ensamblador para µC Intel 80C51:
Ejemplo para el Microchip PIC16F84
Código en lenguaje ensamblador para el microcontrolador 16F84 de Microchip:
 

 

 



  
2.    Resumen
Este lenguaje proporciona las herramientas para tomar control sobre todo lo que la computadora realiza físicamente.
Una de sus ventajas en Proporcionar un control absoluto sobre la PC. Los programas en ensamblador son rápidos y compactos.
Y una de sus desventajas es una instrucción mal interpretada o un error de lógica se vuele más compleja.
El lenguaje ensamblador 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.
El lenguaje ensamblador generalmente suelen aplicarse a microprocesadores y para la Creación de programas sencillos.
La unidad de manejo de memoria o unidad de gestión de memoria (de sus siglas en inglés: Memory Management Unit) es un dispositivo de Hardware formado por un grupo de circuitos integrados, responsable del manejo de los accesos a la memoria por parte de la Unidad de Procesamiento Central (CPU).
Cuando la CPU intenta acceder a una dirección de memoria virtual, la MMU realiza una búsqueda en una memoria caché especial llamada Buffer de Traducción Adelantada (TLB, Translation Lookaside Buffer), que mantiene una parte de la tabla de páginas usadas hace menos tiempo.

3.    Summary

This language provides the tools to take control over everything that computer physically performed. One of its advantages in providing complete control over the PC. Assembler programs are fast and compact. And one of its drawbacks is a misunderstood instruction or a logic error will fly more complex. Assembly language 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. Assembly language usually applied generally to microprocessors and to Creating simple programs. The unit memory management or memory management unit (its acronym: Memory Management Unit) is a hardware device consists of a group of integrated circuits, responsible for the management of memory accesses by the Unit Central Processing (CPU). When the CPU tries to access a virtual memory address, the MMU performs a search in a special cache called Translation Adelantada Buffer (TLB, Translation Lookaside Buffer), which maintains a portion of the page table used less time.

4.    Recomendaciones
·         Tener conocimientos básicos de programación (bucles, condiciones, etc.)
·         Disponer de tiempo, es un lenguaje que no se aprende rápido y cuesta adaptarse a él.
·         Para entender más en profundidad el lenguaje, se deberían tener conocimientos sobre la arquitectura de una CPU (registros, pila, etc)
·         Un ordenador con Linux instalado.
5.    Conclusiones
El lenguaje Ensamblador es un lenguaje en desuso y no permite la pórtabilidad del código, muchos se preguntarán para qué nos sirve aprenderlo.
La respuesta corta, podría ser que la utilidad es relativamente nula, no vais a encontrar trabajo por conocer este lenguaje, ni vais a programar día a día con él y puede que después de aprenderlo, se te olvide gran parte de su sintaxis. Ahora bien, al ser un lenguaje de bajo nivel, os va a ayudar a mejorar bastante en la creación de algoritmos y optimización del código. Esto es una cosa, que según vayaís progresando con el curso, lo vaís a notar, debido a que al tener que trabajar a bajo nivel, necesitaís escribir muchas líneas para hacer operaciones muy simples. Esto obliga al programador, a dedicar gran parte del tiempo, a optimizar el algoritmo para no dedicar muchas horas a escribir líneas.
6.    Apreciación del Equipo
El lenguaje ensamblador posee una cierta dificultad de ser entendido pero tiene una gran importancia ya que trabaja directamente con el microprocesador; por lo cual se debe de conocer el funcionamiento interno de este, tiene la ventaja de que en él se puede realizar cualquier tipo de programas que en los lenguajes de alto nivel no lo pueden realizar.
7.    Glosario de Términos
MNEMÓNICO: es una palabra que sustituye a un código de operación (lenguaje de máquina).
FLEXIBILIDAD: Capacidad para adaptarse con facilidad a las diversas circunstancias o para acomodar las normas a las distintas situaciones o necesidades.
UNIX :(registrado oficialmente como UNIX®) es un sistema operativo portable, multitarea y multiusuario; desarrollado, en principio, en 1969.
MACINTOSH abreviado como Mac, es la línea de computadoras personales diseñada, desarrollada y comercializada por Apple Inc.
GUI: es un programa informático que actúa de interfaz de usuario.
STACK: es una palabra inglesa, que significa pila de cosas o apilamiento, y que se emplea en español en ciertos ámbitos para referirse a: Pila (informática).
ISA: (en español: Arquitectura Estándar de la Industria), es una arquitectura de bus creada en 1980 por IBM, en Boca Ratón (Florida), para ser empleado en las computadoras IBM PC.
8.    Bibliografía o Linkografia

Ø  http://www.taringa.net/post/hazlo-tu-mismo/14201465/Lenguaje-Ensamblador-Lo-basico-con-ejemplos.html

LINK DE DESCAGA SLIDESHARE:  Lenguaje Assembler