Unidad 3 y4.docx

July 31, 2017 | Author: inggafabifi | Category: Assembly Language, Computer Program, Programming Language, Program Optimization, Compiler
Share Embed Donate


Short Description

Download Unidad 3 y4.docx...

Description

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:

Competencia específica de la unidad Conocer e Identificar los diferentes tipos de optimización que permita eficientar el código intermedio.

Optimización

Criterios de evaluación de la Unidad 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 nocritico. 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 Utilizar un lenguaje de bajo nivel para traducir el código construido a lenguaje máquina para su ejecución.

Criterios de evaluación de la Unidad 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.

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF