26
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. Unida d: 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 y4.docx

Embed Size (px)

Citation preview

Page 1: Unidad 3 y4.docx

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:

3Tema

:Optimización

Competencia específica de la unidad Criterios de evaluación de la UnidadConocer 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)

Page 2: Unidad 3 y4.docx

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

Page 3: Unidad 3 y4.docx

necesita de compiladores especiales para realmente optimizar el código.

Page 4: Unidad 3 y4.docx

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 LocalLa 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 LocalLa 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.Cicloswhile(a == b){ int c = a; c = 5; …; }

Page 5: Unidad 3 y4.docx

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 creativopensamiento prejuicioso el pensamiento emocional el pensamiento intuitivoLa 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

Page 6: Unidad 3 y4.docx

•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

Page 7: Unidad 3 y4.docx

•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ón3.1.1 Locales

Reacondicionamiento de operadoresCambiar orden de evaluación aplicando propiedades conmutativa, asociativa y distributiva.V:= W * X *( Y + Z )=V := ( Y + Z ) * W * XCódigo no optimizado, con 7 líneas de código.1. MOV AX, W2. MUL AX, X3. MOV t1, AX4. MOV AX, Y5. ADD AX, Z6. MUL AX, t17. MOV V, AXCódigo optimizado a solo 5 líneas de código.1. MOV AX, Y2. ADD AX, Z3. MUL AX, W4. MUL AX, X5. MOV V, AX

3.1.2 Ciclos

Page 8: Unidad 3 y4.docx

Factorización de expresiones invariantesExpresiones invariantes de bucle: expresiones cuyo valor es constante durante toda laejecució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 implementarAlgunas optimizaciones son costosas en términos de tiempo de compilaciónLa 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 queen ocasiones la mejora obtenida puede verse no reflejada en el programa final pero siser perjudicial para el equipo de desarrollo.La optimización de una pequeña mejora tal vez tenga una pequeñaganancia en tiempoo 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 obtenidapuede 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 elprograma.

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

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

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

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

Page 9: Unidad 3 y4.docx

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

3.2.2 Criterios para mejorar el código

La mejor manera de optimizar el código es hacer vera los programadores queoptimicen su código desde el inicio, el problema radica en que el costo podría sermuy 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 desdeel código o de manera externa.Este proceso lo realizan algunas herramientas del sistema como los ofuscadorespara 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 podidosistematizar del todo.Existen algunas herramientas que permiten el análisis de los flujos de datos, entreellas tenemos:

DepuradorEs una aplicación que permite correr otros programas, permitiendo al usuario ejercercierto control sobre los mismos a medida que los estos se ejecutan, y examinar el estadodel sistema (variables, registros, banderas, etc.) en el momento en que se presente algúnproblema. El propósito final de un depurador consiste en permitir al usuario observar ycomprender 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 deopciones. Es muy importante entender el hecho de que un depurador trabajasobrearchivos ejecutables. Esto quiere decir que el mismo funciona de forma independiente allenguaje en que se escribió el programa original, sea éste lenguaje ensamblador o unlenguaje de medio o alto nivel como C.

DesambladorEs un programa de computadora que traduce el lenguaje de máquina a lenguajeensamblador, la operación inversa de la que hace el ensamblador. Un desensambladordifiere de de un decompilador, en que éste apunta a un lenguaje de alto nivel en vez deal lenguaje ensamblador.

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

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

Page 10: Unidad 3 y4.docx

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, UllmanAddison – 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 deAlicante

(PREZI)

Page 11: Unidad 3 y4.docx

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:

4Tema

:Generación de código objeto

Competencia específica de la unidadCriterios de evaluación de

la UnidadUtilizar 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)

Page 12: Unidad 3 y4.docx

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ísticasSe trabaja a nivel de instrucciones, es decir, su programación es al más fino detalle. Está orientado a la máquina.Primera generaciónEl 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

Page 13: Unidad 3 y4.docx

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,

Page 14: Unidad 3 y4.docx

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.

Page 15: Unidad 3 y4.docx

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.

Page 16: Unidad 3 y4.docx

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.

Page 17: Unidad 3 y4.docx

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 01100001para 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.

Page 18: Unidad 3 y4.docx

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.$’ .codeprograma:   mov ax, @data   mov ds, ax   mov dx, offset Cadena1   mov ah, 9   int 21hend 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:

Page 19: Unidad 3 y4.docx

• Registros de segmento• Registros de apuntadores de instrucciones• Registros apuntadores• Registros de propósitos generales• Registro índice• Registro de bandera.Registros de uso generalAX = 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.

Page 20: Unidad 3 y4.docx

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