You are on page 1of 20

Unidad 3.

Optimización

3.1 Tipos de optimización.
3.1.1 Locales.
3.1.2 Ciclos.
3.1.3 Globales.
3.1.4 De mirilla.
3.2 Costos.
3.2.1 Costo de ejecución. (memoria, registros, pilas)
3.2.2 Criterios para mejorar el código.
3.2.3 Herramientas para el análisis del flujo de datos.


Unidad: 3 Tema: Optimización


Competencia específica de la unidad

Criterios de evaluación de la Unidad
Conocer e Identificar los diferentes tipos de
optimización que permita eficientar el
código intermedio.
Cuadro comparativo: 25%
Investigación: 25%
Reporte de práctica: 40%


Actividades de aprendizaje

• Cuadro comparativo: Elaborar un cuadro comparativo acerca de los tipos de optimización
(Locales, Ciclos, Globales, de Mirilla).(elaborado en clase)

• Investigación: Saber cuántos recursos y cuánto tiempo consume cada instrucción de código
intermedio()

• Reporte de Practica: Integrar equipos de trabajo para analizar el código intermedio de su caso
de estudio y si aplica realizar la optimización correspondiente; asimismo, se podría realizar con
códigos intermedios existentes.(unir con la practica de la unidad 4)










Unidad 3. Optimización
(168897146-UNIDAD-III-OPTIMIZACION.pdf)
3.1 Tipos de optimización.
3.1.1 Locales.
3.1.2 Ciclos.
3.1.3 Globales.
3.1.4 De mirilla.
3.2 Costos.
3.2.1 Costo de ejecución. (memoria, registros, pilas)
3.2.2 Criterios para mejorar el código.
3.2.3 Herramientas para el análisis del flujo de datos.

Unidad 7 Optimizacion

7.1 Tipos Optimización

•La optimización va a depender del lenguaje de programación y es
directamente proporcional al tiempo de compilación; es decir, entre
más optimización mayor tiempo de compilación.
•Las optimizaciones pueden realizarse de diferentes formas. Las
optimizaciones se realizan en base al alcance ofrecido por el
compilador de programación y es directamente proporcional al
tiempo de compilación; es decir, entre más optimización mayor
tiempo de compilación.
•Como el tiempo de optimización es gran consumidor de tiempo
(dado que tiene que recorrer todo el árbol de posibles soluciones
para el proceso de optimización) la optimización se deja hasta la
fase de prueba final.
•Algunos editores ofrecen una versión de depuración y otra de
entrega o final.
•La optimización es un proceso que tiene a minimizar o maximizar
alguna variable de rendimiento, generalmente tiempo, espacio,
procesador, etc.
•Desafortunamente no existen optimizador que hagan un programa
más rápido y que ocupe menor espacio.
•La optimización se realiza reestructurando el código de tal forma
que el nuevo código generado tenga mayores beneficios. La
mayoría de los compiladores tienen una optimización baja, se
necesita de compiladores especiales para realmente optimizar el
código.
7.1.1 Locales Optimización

La optimización local se realiza sobre módulos del programa. En la
mayoría de las ocasiones a través de funciones, métodos,
procedimientos, clases, etc.
La característica de las optimizaciones locales es que sólo se ven
reflejados en dichas secciones.
Optimización Local
La optimización local sirve cuando un bloque de programa o
sección es crítico por ejemplo: la E/S, la concurrencia, la rapidez y
confiabilidad de un conjunto de instrucciones.
Como el espacio de soluciones es más pequeño la optimización
local es más rápida.
Locales Optimización
La optimización local se realiza sobre módulos del programa. En la
mayoría de las ocasiones a través de funciones, métodos,
procedimientos, clases, etc.
La característica de las optimizaciones locales es que sólo se ven
reflejados en dichas secciones.
Optimización Local
La optimización local sirve cuando un bloque de programa o
sección es crítico por ejemplo: la E/S, la concurrencia, la rapidez y
confiabilidad de un conjunto de instrucciones.
Como el espacio de soluciones es más pequeño la optimización
local es más rápida.

7.1.2 Bucles Optimización

•Los ciclos son una de las partes más esenciales en el rendimiento
de un programa dado que realizan acciones repetitivas, y si dichas
acciones están mal realizadas, el problema se hace N veces más
grandes.
•La mayoría de las optimizaciones sobre ciclos tratan de encontrar
elementos que no deben repetirse en un ciclo.
Ciclos
while(a == b)
{ int c = a; c = 5; …; }

En este caso es mejor pasar el int c =a; fuera del ciclo de ser
posible.
Ciclos
•El problema de la optimización en ciclos y en generalradica es que
muy difícil saber el uso exacto de algunas instrucciones. Asíque no
todo código de proceso puede ser optimizado. •Otros uso de la
optimización pueden ser el mejoramiento de consultas en SQL o en
aplicaciones remotas (sockets, E/S, etc.)

7.1.3 Globales Optimización

variables y eliminarlas toma su tiempo) pero consume más
memoria.
•Algunas optimizaciones incluyen utilizar como variables registros
del CPU, utilizar instrucciones en ensamblador.

7.1.4 De Mirilla Optimización

El pensamiento crítico es un elemento importante para el éxito en la
vida (Huitt, 1993; Thomas y Smoot, 1994). Una Definicion Propuesta:
El pensamiento critico debe ser contrastado con el pensamiento no-
critico. pensamiento habitual o rutinario.
la lluvia de ideas
pensamiento creativo
pensamiento prejuicioso el pensamiento emocional el pensamiento
intuitivo
La definicion de Huitt:
El pensamiento crítico es la actividad mental disciplinada de evaluar
los argumentos o proposiciones haciendo juicios que puedan guiar
el desarrollo de las creencias y la toma de acción to:
7.1.4 Optimización de Mirilla
•La optimización de mirilla trata deestructurar de manera eficiente el
flujo del programa, sobre todo en instrucciones de bifurcación como
son las decisiones, ciclos y saltos de rutinas.
•La idea es tener los saltos lo más cerca de las llamadas, siendo el
salto lo más pequeño posible.

7.2 Costos Optimización

•Los costos son el factor más importante a tomar en cuentaa la hora
de optimizar ya que en ocasiones la mejora obtenida puede verse no
reflejada en el programa final pero si ser perjudicial para el equipo
de desarrollo.
•La optimización de una pequeña mejora tal vez tenga una pequeña
ganancia en tiempo o en espacio pero sale muy costosa en tiempo
en generarla.
•Pero en cambio si esa optimización se hace por ejemplo en un
ciclo, la mejora obtenida puede ser N veces mayor por lo cual el
costo se minimiza y es benéfico la mejora.
•Por ejemplo: for(int i=0; i< 10000; i++); si la ganancia es de 30 ms
300s.



7.2.1 Costo de Ejecución Optimización

Los costos de ejecución son aquellos que vienen implícitos al
ejecutar el programa.
•En algunos programas se tiene un mínimo para ejecutar el
programa, por lo que el espacio y la velocidad del
microprocesadores son elementos que se deben optimizar para
tener un mercado potencial más amplio.
•Las aplicaciones multimedios como los videojuegos tienen un
costo de ejecución alto por lo cual la optimización de su desempeño
es crítico, la gran mayoría de las veces requieren de procesadores
rápidos (e.g. tarjetas de video) o de mucha memoria.
•Otro tipo de aplicaciones que deben optimizarse son las
aplicaciones para dispositivos móviles.
•Los dispositivos móviles tiene recursos más limitados que un
dispositivo de cómputo convencional razón por la cual, el mejor uso
de memoriay otros recursos de hardware tiene mayor rendimiento.
•En algunos casos es preferible tener la lógica del negocio más
fuerte en otros dispositivos y hacer uso de arquitecturas
descentralizadas como cliente/servidor o P2P.

7.2.2 Criterios para Mejorar Código

•La mejor manera de optimizar el código es hacer ver a los
programadores que optimicen su código desde el inicio, el problema
radica en que el costo podría ser muy grande ya que tendría que
codificar más y/o hacer su código mas legible.
•Los criterios de optimización siempre están definidos por el
compilador.
•Muchos de estos criterios pueden modificarse con directivas del
compilador desde el código o de manera externa.
•Este proceso lo realizan algunas herramientas del sistema como
los ofuscadores para códigomóvil y código para dispositivos
móviles.

7.2.3 Herramientas para Análisis del Flujo de Datos

•Existen algunas herramientas que permiten el análisis de los flujos
de datos, entre ellas tenemos los depuradores y desambladores.
•La optimización al igual que la programación es un arte y no se ha
podido sistematizar del todo.



Unidad 3. Optimización
3.1.1 Locales

Reacondicionamiento de operadores
Cambiar orden de evaluación aplicando propiedades conmutativa, asociativa y distributiva.
V:= W * X *( Y + Z )
=
V := ( Y + Z ) * W * X
Código no optimizado, con 7 líneas de código.
1. MOV AX, W
2. MUL AX, X
3. MOV t1, AX
4. MOV AX, Y
5. ADD AX, Z
6. MUL AX, t1
7. MOV V, AX
Código optimizado a solo 5 líneas de código.
1. MOV AX, Y
2. ADD AX, Z
3. MUL AX, W
4. MUL AX, X
5. MOV V, AX


3.1.2 Ciclos
Factorización de expresiones invariantes
Expresiones invariantes de bucle: expresiones cuyo valor es constante durante toda la
ejecución del bucle

>

incuyen constantes y/o variables no modi_cadas en el cuerpo del bucle

Principio: Mover expresiones invariantes desde el cuerpo hasta la cabeza del bucle
-> al sacarlas del bucle, pueden quedar dentro de otro bucle externo)
-> repetir proceso.


Ejemplos:
while (i
>

Algunas optimizaciones son difíciles de implementar
Algunas optimizaciones son costosas en términos de tiempo de compilación
La optimización más elaborada es difícil y costosa

Meta: Mejora Máxima con costo mínimo

Los costos son el factor más importante a tomar en cuenta a la hora de optimizar ya que
en ocasiones la mejora obtenida puede verse no reflejada en el programa final pero si
ser perjudicial para el equipo de desarrollo.
La optimización de una pequeña mejora tal vez tenga una pequeñaganancia en tiempo
o en espacio pero sale muy costosa en tiempo en generarla.
Pero en cambio si esa optimización se hace por ejemplo en un ciclo, la mejora obtenida
puede ser N veces mayor por lo cual el costo se minimiza y es benéfico la mejora.
Por ejemplo: for(int i=0; i < 10000; i++); si la ganancia es de 30 ms 300s

3.2.1 Costo de ejecución

Los costos de ejecución son aquellos que vienen implícitos al ejecutar el
programa.


En algunos programas se tiene un mínimo para ejecutar el programa, por lo que
el espacio y la velocidad de microprocesadores son elementos que se deben
optimizar para tener un mercado potencial más amplio.


Las aplicaciones multimedia como los videojuegos tienen un costo de ejecución
alto por lo cual la optimización de su desempeño es crítico, la gran mayoría de las
veces requieren de procesadores rápidos (e.g. tarjetas de video) o de mucha
memoria.


Otro tipo de aplicaciones que deben optimizarse son las aplicaciones para
dispositivos móviles.


Los dispositivos móviles tiene recursos más limitados que un dispositivo de
cómputo convencional razón por la cual, el mejor uso de memoria y otros recursos
de hardware tiene mayor rendimiento.


En algunos casos es preferible tener la lógica del negocio más fuerte en otros
dispositivos y hacer uso de arquitecturas descentralizadas como cliente/servidor
o P2P.

3.2.2 Criterios para mejorar el código

La mejor manera de optimizar el código es hacer vera los programadores que
optimicen su código desde el inicio, el problema radica en que el costo podría ser
muy grande ya que tendría que codificar más y/o hacer su código mas legible.
Los criterios de optimización siempre están definidos por el compilador

Criterios de optimización

Muchos de estos criterios pueden modificarse con directivas del compilador desde
el código o de manera externa.
Este proceso lo realizan algunas herramientas del sistema como los ofuscadores
para código móvil y código para dispositivos móviles.

3.2.3 Herramientas para el análisis del flujo de datos

La optimización al igual que la programación es un arte y no se ha podido
sistematizar del todo.
Existen algunas herramientas que permiten el análisis de los flujos de datos, entre
ellas tenemos:

Depurador
Es una aplicación que permite correr otros programas, permitiendo al usuario ejercer
cierto control sobre los mismos a medida que los estos se ejecutan, y examinar el estado
del sistema (variables, registros, banderas, etc.) en el momento en que se presente algún
problema. El propósito final de un depurador consiste en permitir al usuario observar y
comprender lo que ocurre "dentro" de un programa mientras el mismo es ejecutado.
En los sistemas operativos UNIX/LINUX, el depurador más comúnmente utilizado es gdb,
es decir el depurador de GNU. Éste ofrece una cantidad muy extensa y especializada de
opciones. Es muy importante entender el hecho de que un depurador trabajasobre
archivos ejecutables. Esto quiere decir que el mismo funciona de forma independiente al
lenguaje en que se escribió el programa original, sea éste lenguaje ensamblador o un
lenguaje de medio o alto nivel como C.

Desamblador
Es un programa de computadora que traduce el lenguaje de máquina a lenguaje
ensamblador, la operación inversa de la que hace el ensamblador. Un desensamblador
difiere de de un decompilador, en que éste apunta a un lenguaje de alto nivel en vez de
al lenguaje ensamblador.

Diagrama de flujo de datos
Es una herramienta de modelización que permite describir, de un sistema, la
transformación de entradas en salidas; el DFD también es conocido con el nombre de
Modelo de Procesos de Negocios (BPM, Business Process Model).

Diccionario de datos
El Diccionario de Datos es un listado organizado de todos los elementos de datos que
son pertinentes para el sistema, con definiciones precisas y rigurosas que le permite al
usuario y al proyectista del sistema tener una misma comprensión de las entradas, de
las salidas, de los componentes de los repositorios, y también de cálculos intermedios.

Bibliografía

Aho (2006), et. al. Compiladores: Principios y Técnicas. Segunda Edición.

Compiladores: Principios, técnicas y herramientas. Segunda Edición Aho, Lam, Sethi, Ullman
Addison – Wesley, Pearson Educación, México 2008

Diseño de compiladores. A. Garrido, J. Iñesta, F. Moreno y J. Pérez. 2002. Edita Universidad de
Alicante

(PREZI)









































UNIDAD 4. GENERACIÓN DE CÓDIGO OBJETO.

4.1 Registros.
4.2 Lenguaje ensamblador.
4.3 Lenguaje máquina.
4.4 Administración de memoria.

Unidad: 4 Tema: Generación de código objeto

Competencia específica de la unidad
Criterios de evaluación de
la Unidad
Utilizar un lenguaje de bajo nivel para traducir el
código construido a lenguaje máquina para su
ejecución.
Resumen : 25%
Reporte de Práctica: 25%
Generador de código
intermedio: 40%

Actividades de aprendizaje
• Resumen: Investigar y elaborar un resumen de: La estructura y funcionamiento del lenguaje
ensamblador. Las características principales del lenguaje maquina a fin de llevar un código
intermedio. Las técnicas de administración de memoria para el almacenamiento de un
programa en momento de ejecución.

• Reporte de Practica: Experimentar con simuladores de arquitectura de microprocesadores.

• Generador de código máquina: Diseñar y construir el generador de código máquina u objeto
para el lenguaje del caso de estudio.(unir a la unidad 3)
















UNIDAD 4. GENERACIÓN DE CÓDIGO OBJETO.

4.1 Registros.
4.2 Lenguaje ensamblador.
4.3 Lenguaje máquina.
4.4 Administración de memoria.

Lenguaje Maquina Características

Un lenguaje de programación de bajo nivel es el que proporciona
poca o ninguna abstracción del microprocesador de un ordenador.
Consecuentemente es fácilmente trasladado a lenguaje de máquina.
La palabra “bajo” no implica que el lenguaje sea inferior a un
lenguaje de alto nivel; se refiere a la reducida abstracción entre el
lenguaje y el hardware.
Uso: ventajas e inconvenientes. En general se utiliza este tipo de
lenguaje para programar controladores (drivers).
La programación en un lenguaje de bajo nivel como el lenguaje de la
máquina o el lenguaje simbólico tiene ciertas ventajas:
Mayor adaptación al equipo.
Posibilidad de obtener la máxima velocidad con mínimo uso de
memoria.
Pero también tiene importantes inconvenientes:
Imposibilidad de escribir código independiente de la máquina.
Mayor dificultad en la programación y en la comprensión de los
programas.
El programador debe conocer más de un centenar de intrucciones.
Es necesario conocer en detalle la arquitectura de la máquina.
Características
Se trabaja a nivel de instrucciones, es decir, su programación es al
más fino detalle. Está orientado a la máquina.
Primera generación
El lenguaje de programación de primera generación (por sus siglas
en inglés, 1GL), es el lenguaje de código máquina. Es el único
lenguaje que un microprocesador entiende de forma nativa. El
lenguaje máquina no puede ser escrito o leído usando un editor de
texto, y por lo tanto es raro que una persona lo use directamente.
Segunda generación
El lenguaje de programación de segunda generación (por sus siglas
en inglés, 2GL), es el lenguaje ensamblador. Se considera de
segunda generación porque, aunque no es lenguaje nativo del
microprocesador, un programador de lenguaje ensamblador debe
conocer la arquitectura del microprocesador (como por ejemplo las
particularidades de sus registros o su conjunto de instrucciones).





8.1.2 Direccionamiento Lenguaje Maquina

Es la forma en como se accede a la memoria. Recordar que un
programa no puede ejecutarse sino se encuentra en memoria
principal. La forma de acceder a la memoria depende del
microprocesador, pero en general existen dos tipos de
direccionamiento: directo e indirecto.
El direccionamiento directo también recibe el nombre de
direccionamiento absoluto y el acceso a las direcciones se hace de
manera directa. El direccionamiento indirecto también recibe el
nombre de direccionamiento relativo y se basa a partir de una
dirección genérica, generalmente el inicio del programa.
Para acceder a una dirección relativa se suma a la dirección base el
número de espacios de memorias necesarias. El direccionamiento
relativo hace a los programas relocalizables e independientes. Si la
dirección base es el inicio de la memoria fija el direccionamiento
pasa a ser un variante de direccionamiento absoluto.

8.2 Lenguaje Ensamblador Caracteristicas

El lenguaje Assembly 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.
Fue usado ampliamente en el pasado para el desarrollo de software,
pero actualmente sólo se utiliza en contadas ocasiones,
especialmente cuando se requiere la manipulación directa del
hardware o se pretenden rendimientos inusuales de los equipos.
Ensambladores [editar]Un ensamblador crea código objeto
traduciendo instrucciones mnemónicas a códigos operativos, e
interpretando los nombres simbólicos para direcciones de memoria
y otras entidades. El uso de referencias simbólicas es una
característica básica de los ensambladores, evitando tediosos
cálculos y direccionamiento manual después de cada modificación
del programa. La mayoría de los ensambladores también incluyen
facilidades para crear macros , a fin de generar series de
instrucciones cortas que se ejecutan en tiempo real, en lugar de
utilizar subrutinas[1] .
Los ensambladores son por lo general más fáciles de programar
que los compiladores de lenguajes de alto nivel, y han estado
disponibles desde la década de 1950. Los ensambladores
modernos, especialmente para arquitecturas basadas en RISC,
como por ejemplo MIPS, SPARC y PA-RISC optimizan las
instrucciones para explotar al máximo la eficiencia de segmentación
del CPU.
Los ensambladores de alto nivel ofrecen posibilidades de
abstracción que incluyen:
Control avanzado de estructuras. Procedimientos de alto nivel,
declaración de funciones. Tipos de datos que incluyen estructuras,
registros, uniones, clases y conjuntos. Sofisticado procesamiento
de macros.
Lenguaje [editar]Un programa escrito en lenguaje Assembly
consiste en una serie de instrucciones que corresponden al flujo de
órdenes ejecutables que pueden ser cargadas en la memoria de una
computadora. Por ejemplo, un procesador x86 puede ejecutar la
siguiente instrucción binaria como se expresa en código maquina:
Binario: 10110000 01100001 (Hexadecimal: 0xb061) La
representación equivalente en Assembly es más fácil de recordar:
mov al, 061h Esta instrucción significa:
Mueva el valor hexadecimal 61 (97 decimal) al registro “al”. El
mnemónico “mov” es un código de operación u “opcode” , elegido
por los diseñadores de la colección de instrucciones para abreviar
“move” (mover).- El opcode es seguido por una lista de argumentos
o parámetros, completando una instrucción de ensamblador típica.
La transformación del lenguaje Assembly en código máquina la
realiza un programa ensamblador, y la traducción inversa la puede
efectuar un desensamblador. A diferencia de los lenguajes de alto
nivel, aquí hay usualmente una correspondencia 1 a 1 entre las
instrucciones simples del ensamblador y el lenguaje máquina. Sin
embargo, en algunos casos, un ensamblador puede proveer
“pseudo instrucciones” que se expanden en un código de máquina
más extenso a fin de proveer la funcionalidad necesaria. Por
ejemplo, para un código máquina condicional como “si X mayor o
igual que” , un ensamblador puede utilizar una pseudoinstrucción al
grupo “haga si menor que” , y “si = 0″ sobre el resultado de la
condición anterior. Los ensambladores más completos también
proveen un rico lenguaje de macros que se utiliza para generar
código más complejo y secuencias de datos.
Cada arquitectura de computadoras tiene su propio lenguaje de
máquina, y en consecuencia su propio lenguaje Assembly. Los
ordenadores difieren en el tipo y número de operaciones que
soportan; también pueden tener diferente cantidad de registros, y
distinta representación de los tipos de datos en memoria. Aunque la
mayoría de las computadoras son capaces de cumplir
esencialmente las mismas funciones, la forma en que lo hacen
difiere, y los respectivos lenguajes Assembly reflejan tal diferencia.
Pueden existir múltiples conjuntos de mnemónicos o sintáxis de
Assembly para un mismo conjunto de instrucciones, instanciados
típicamente en diferentes programas ensamblador. En estos casos,
la alternativa más popular es la provista por los fabricantes, y usada
en los manuales del programa.
Código máquina (o lenguaje de máquina) [editar]El lenguaje de
máquina está formado por instrucciones sencillas, que -
dependiendo de la estructura del procesador- pueden especificar:
Registros específicos para operaciones aritméticas,
direccionamiento o control de funciones. Posiciones de memoria
específicas (offset). Modos de direccionamiento usados para
interpretar operandos. Las operaciones más complejas se realizan
combinando estas instrucciones sencillas, que pueden ser
ejecutadas secuencialmente o mediante instrucciones de control de
flujo.
Las operaciones disponibles en la mayoría de los conjuntos de
instrucciones incluye:
mover llenar un registro con un valor constante mover datos de una
posición de memoria a un registro o viceversa escribir y leer datos
de dispositivos computar sumar, restar, multiplicar o dividir los
valores de dos registros, colocando el resultado en uno de ellos o
en otro registro realizar operaciones binarias, incluyendo
operaciones lógicas (AND/OR/XOR/NOT) comparar valores entre
registros (mayor, menor, igual) afectar el flujo del programa saltar a
otra posición en el programa y ejecutar instrucciones allí saltar si se
cumplen ciertas condiciones (IF) saltar a otra posición, pero guardar
el punto de salida para retornar (CALL, llamada a subrutinas)
Algunas computadoras incluyen instrucciones complejas dentro de
sus capacidades. Una sola instrucción compleja hace lo mismo que
en otras computadoras puede requerir una larga serie de
instrucciones, por ejemplo:
salvar varios registros en la pila de una sola vez mover grandes
bloques de memoria operaciones aritméticas complejas o de punto
flotante (seno, coseno, raíz cuadrada ) El nivel de lenguaje
Assembly tiene aspectos importantes de los niveles de
microarquitectura, en los cuales se encuentra (ISA y sistema
operativo) estos dos se utilizan para la traducción en lugar de la
interpretación. Algunas características del lenguaje se describen a
continuación Los programas que sirven para traducir algún
programa para el usuario se llama traductores, el lenguaje en que
esta escrito el programa original se llama lenguaje fuente, el
lenguaje original que sea modificado se llama lenguaje objeto.
Se usa la traducción cuando se cuenta con un procesador (ya sea
hardware o un interprete) para el lenguaje objeto pero no para el
lenguaje fuente, Si la traducción se realiza correctamente, la
ejecución del programa traducido dará exactamente los mismos
resultados que habría dado la ejecución del programa fuente. Hay
dos diferencias entre traducción e interpretación, en la traducción
no se ejecuta directamente el programa original, en el lenguaje
fuente se convierte en un programa equivalente llamado programa
objeto o programa binario ejecutable y este funciona solo cuando se
ha acabado la traducción.
El código máquina, un simple patrón de bits, es hecho legible
reemplazando valores crudos por símbolos denominados
mnemónicos. Se inventó para facilitar la tarea de los primeros
programadores que hasta ese momento tenían que escribir
directamente en código binario. antes aún era peor, ya que el código
de ceros y unos (el programa) debía introducirse en una tarjeta
perforada. La posición ocupada por cada punto equivalía a un “1″ o
a un “0″ según hubiera un hueco o no. Lo cual suponía una forma
casi idéntica en la que hoy se escriben los datos binaros en
soportes tales como los CDs y DVDs.
Mientras que una computadora reconoce la instrucción de máquina
IA-32
10110000 01100001
para los programadores de microprocesadores x86 es mucho más
fácil reconocer dicha instrucción empleando lenguaje Assembly:
movb 0×61,%al
(que significa mover el valor hexadecimal 61 (97 decimal) al registro
„al‟.)
Cada instrucción de la máquina se transforma en una única
instrucción en código simbólico.
Pero además, para mejorar la legibilidad del programa, el código
simbólico introduce instrucciones adicionales, que no
corresponden a ninguna instrucción de la máquina y que
proporcionan información. Se llaman “pseudoinstrucciones”.
El código simbólico puede parecer de difícil acceso, pero es más
fácil de recordar e interpretar que el binario o el hexadecimal.
Los lenguajes simbólicos no resuelven definitivamente el problema
de cómo programar un ordenador de la manera más sencilla
posible. Para utilizarlos, hay que conocer a fondo el
microprocesador, los registros de trabajo de que dispone, la
estructura de la memoria, y muchas cosas más.
Además, el lenguaje Assembly está demasiado ligado al
microprocesador para que sea posible escribir programas
independientes de la máquina en que van a ejecutarse.
Este código simbólico no puede ser ejecutado directamente por un
ordenador, por lo que es preciso traducirlo previamente. Pero la
traducción es un proceso mecánico y repetitivo, que se presta a su
realización por un programa de ordenador.
Los programas que traducen código simbólico al lenguaje de
máquina se llaman ensambladores (“assembler”, en inglés), porque
son capaces de ensamblar el programa traducido a partir de varias
piezas, procedimientos o subrutinas a código binario (“1″ y “0″) que
entiende el procesador.
Ejemplos de lenguaje Assembly
Ejemplo 1 [editar]El siguiente es un ejemplo del programa clásico
Hola mundo escrito para la arquitectura de procesador x86 (bajo el
sistema operativo DOS ).
.model small .stack .data Cadena1 DB „Hola Mundo.$‟ .code
programa:
mov ax, @data
mov ds, ax
mov dx, offset Cadena1
mov ah, 9
int 21h
end programa

8.2.2 Almacenamiento Lenguaje Ensamblador

Una de las principales ventajas del uso del ensamblador, es que se
encarga de administrar de manera transparente para el usuario la
creación de memoria, las bifurcaciones y el paso de parámetros.
Además nos permite acceder directamente a los recursos de la
máquina para un mejor desempeño.

8.3 Registros Lenguaje Ensamblador

Los registros del procesador se emplean para controlar
instrucciones en ejecución, manejar direccionamiento de memoria y
proporcionar capacidad aritmética. Los registros son espacios
físicos dentro del microprocesador con capacidad de 4 bits hasta 64
bits dependiendo del microprocesador que se emplee. Los registros
son direccionables por medio de una viñeta, que es una dirección
de memoria. Los bits, por conveniencia, se numeran de derecha a
izquierda (15, 14, 13…. 3, 2, 1, 0), los registros están divididos en
seis grupos los cuales tienen un fin específico. Los registros se
dividen en:
• Registros de segmento
• Registros de apuntadores de instrucciones
• Registros apuntadores
• Registros de propósitos generales
• Registro índice
• Registro de bandera.
Registros de uso general
AX = Registro acumulador, dividido en AH y AL (8 bits cada uno).-
Interviene en las operaciones aritméticas y lógicas, después de la
operación arroja un resultado.
BX = Registro base, dividido en BH y BL.- Se utiliza en
transferencias de datos entre la memoria y el procesador.
CX = Registro contador, dividido en CH y CL.- Se utiliza como
contador en bucles(LOOP), en operaciones con cadenas(REP), y en
desplazamientos(CL).
DX = Registro de datos, dividido en DH y DL.- Se utiliza en
operaciones de multiplicación y división junto con Ax y en
operaciones de entrada y salida de puertos, su mitad inferior DL
contiene el número de puertos.
Registros de segmento.
Un registro de segmento se utiliza para alinear en un limite de
párrafo o dicho de otra forma codifica la dirección de inicio de cada
segmento y su dirección en un registro de segmento supone cuatro
bits 0 a su derecha.
Un registro de segmento tiene 16 bits de longitud y facilita un área
de memoria para direccionamientos conocidos como el segmento
actual. Los registros de segmento son: CS (código), DS (datos), SS
(pila), ES , FS y GS.
Registro Apuntador de instrucciones.(IP)
El registro apuntador de instrucciones (IP) de 16 bits contiene el
desplazamiento de dirección de la siguiente instrucción que se
ejecuta.
Registro índice.
Los registros SI y DI están disponibles para direccionamientos
indexados y para sumas y restas. Que son las operaciones de
punta.
Registro de bandera.
Los registros de banderas sirven parar indicar el estado actual de la
maquina y el resultado del procesamiento, Cuando algunas
instrucciones piden comparaciones o cálculos aritméticos cambian
el estado de las banderas.

8.3.1 Distribución Lenguaje Ensamblador

La distribución es el proceso en el que el programa generado puede
ejecutarse en otras máquinas. Con respecto al ensamblador, la
mayoría del direccionamiento se hace relativo para que el programa
sea relocalizable por un programa llamado cargador. En el caso de
programas compiladores se necesitan de las librerías, si son
estáticos se incluyen en el ejecutable por lo que el programa se
hace gráfico, si son dinámicas no pero el programa es más
pequeño. Debido a la complejidad del software actual se necesitan
de asistentes para poder instalar y ejecutar un programa.

8.3.2 Asignación Lenguaje Ensamblador

8.4 Administración Memoria Lenguaje Ensamblador

La administración de la memoria es un proceso hoy en día muy
importante, de tal
modo que su mal o buen uso tiene una acción directa sobre el
desempeño de memoria.
• En general un ensamblador tiene un administrador de memoria
más limitado que un compilador.
En la mayoría de los lenguajes de programación el uso de punteros
no estaba vigilado por lo que se tienen muchos problemas con el
uso de memoria.
• Los lenguajes más recientes controlan el uso de punteros y tienen
un programa denominado recolector de basura que se encarga de
limpiar la memoria no utilizada mejorando el desempeño.