1.
Contenido

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.

·
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.

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.

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.

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 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. Seno, coseno, tangente, arcotangente
·
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).

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