Monografias.com > Sin categoría
Descargar Imprimir Comentar Ver trabajos relacionados

Traductores de bajo nivel (página 2)



Partes: 1, 2, 3, 4

De ahí nacieron los compiladores, que son mucho más rápidos que los intérpretes, pues hacen la traducción una vez y dejan el código objeto, que ya es Lenguaje de Máquina, y se puede ejecutar muy rápidamente. Aunque el proceso de traducción es más complejo y costoso que el de ensamblar un programa, normalmente podemos despreciarlo, contra las ventajas de codificar el programa más rápidamente.

Sin embargo, la mayor parte de las veces, el código generado por un compilador es menos eficiente que el código equivalente que un programador escribiría. La razón es que el compilador no tiene tanta inteligencia, y requiere ser capaz de crear código genérico, que sirva tanto para un programa como para otro; en cambio, un programador humano puede aprovechar las características específicas del problema, reduciendo la generalidad pero al mismo tiempo, no desperdicia ninguna instrucción, no hace ningún proceso que no sea necesario.

Para darnos una idea, en una PC, y suponiendo que todos son buenos programadores, un programa para ordenar una lista tardará cerca de 20 veces más en Visual Basic (un intérprete), y 2 veces más en C (un compilador), que el equivalente en Ensamblador. Por ello, cuando es crítica la velocidad del programa, Ensamblador se vuelve un candidato lógico como lenguaje.

Ahora bien, esto no es un absoluto; un programa bien hecho en C puede ser muchas veces más rápido que un programa mal hecho en Ensamblador; sigue siendo sumamente importante la elección apropiada de algoritmos y estructuras de datos. Por ello, se recomienda buscar optimizar primero estos aspectos, en el lenguaje que se desee, y solamente usar Ensamblador cuando se requiere más optimización y no se puede lograr por estos medios.

Tamaño Por las mismas razones que vimos en el aspecto de velocidad, los compiladores e intérpretes generan más código máquina del necesario; por ello, el programa ejecutable crece. Así, cuando es importante reducir el tamaño del ejecutable, mejorando el uso de la memoria y teniendo también beneficios en velocidad, puede convenir usar el lenguaje Ensamblador. Entre los programas que es crítico el uso mínimo de memoria, tenemos a los virus y manejadores de dispositivos (drivers). Muchos de ellos, por supuesto, están escritos en lenguaje Ensamblador. Flexibilidad Las razones anteriores son cuestión de grado: podemos hacer las cosas en otro lenguaje, pero queremos hacerlas más eficientemente. Pero todos los lenguajes de alto nivel tienen limitantes en el control; al hacer abstracciones, limitan su propia capacidad. Es decir, existen tareas que la máquina puede hacer, pero que un lenguaje de alto nivel no permite. Por ejemplo, en Visual Basic no es posible cambiar la resolución del monitor a medio programa; es una limitante, impuesta por la abstracción del GUI Windows. En cambio, en ensamblador es sumamente sencillo, pues tenemos el acceso directo al hardware del monitor.

Resumiendo, la flexibilidad consiste en reconocer el hecho de que Todo lo que puede hacerse con una máquina, puede hacerse en el lenguaje ensamblador de esta máquina; los lenguajes de alto nivel tienen en una u otra forma limitantes para explotar al máximo los recursos de la máquina.

Tiempo de programación Al ser de bajo nivel, el Lenguaje Ensamblador requiere más instrucciones para realizar el mismo proceso, en comparación con un lenguaje de alto nivel. Por otro lado, requiere de más cuidado por parte del programador, pues es propenso a que los errores de lógica se reflejen más fuertemente en la ejecución.

Por todo esto, es más lento el desarrollo de programas comparables en Lenguaje Ensamblador que en un lenguaje de alto nivel, pues el programador goza de una Programas fuente grandes Por las mismas razones que aumenta el tiempo, crecen los programas fuentes; simplemente, requerimos más instrucciones primitivas para describir procesos equivalentes. Esto es una desventaja porque dificulta el mantenimiento de los programas, y nuevamente reduce la productividad de los programadores.

Peligro de afectar recursos inesperadamente Tenemos la ventaja de que todo lo que se puede hacer en la máquina, se puede hacer con el Lenguaje Ensamblador (flexibilidad). El problema es que todo error que podamos cometer, o todo riesgo que podamos tener, podemos tenerlo también en este Lenguaje. Dicho de otra forma, tener mucho poder es útil pero también es peligroso.

En la vida práctica, afortunadamente no ocurre mucho; sin embargo, al programar en este lenguaje verán que es mucho más común que la máquina se "cuelgue", "bloquee" o "se le vaya el avión"; y que se reinicialize. ¿Por qué?, porque con este lenguaje es perfectamente posible (y sencillo) realizar secuencias de instrucciones inválidas, que normalmente no aparecen al usar un lenguaje de alto nivel.

En ciertos casos extremos, puede llegarse a sobreescribir información del CMOS de la máquina (no he visto efectos más riesgosos); pero, si no la conservamos, esto puede causar que dejemos de "ver" el disco duro, junto con toda su información.

Falta de portabilidad Como ya se mencionó, existe un lenguaje ensamblador para cada máquina; por ello, evidentemente no es una selección apropiada de lenguaje cuando deseamos codificar en una máquina y luego llevar los programas a otros sistemas operativos o modelos de computadoras. Si bien esto es un problema general a todos los lenguajes, es mucho más notorio en ensamblador: yo puedo reutilizar un 90% o más del código que desarrollo en "C", en una PC, al llevarlo a una RS/6000 con UNIX, y lo mismo si después lo llevo a una Macintosh, siempre y cuando esté bien hecho y siga los estándares de "C", y los principios de la programación estructurada. En cambio, si escribimos el programa en Ensamblador de la PC, por bien que lo desarrollemos y muchos estándares que sigamos, tendremos prácticamente que reescribir el 100 % del código al llevarlo a UNIX, y otra vez lo CPU Y SUS COMPONENTES PRINCIPALES Un elemento importante del hardware de la PC es la unidad del sistema, que contiene una tarjeta de sistema, fuente de poder y ranuras de expansión para tarjetas opcionales. Los elementos de la tarjeta de sistema son un microprocesador, memoria de solo lectura (ROM) y memoria de acceso aleatorio (RAM).

El cerebro de la PC y compatibles es un microprocesador basado en la familia 8086 de Intel, que realiza todo el procesamiento de datos e instrucciones. Los procesadores varían en velocidad y capacidad de memoria, registros y bus de datos. Un bus de datos transfiere datos entre el procesador, la memoria y los dispositivos externos.

Aunque existen muchos tipos de computadoras digitales según se tenga en cuenta su tamaño, velocidad de proceso, complejidad de diseño físico, etc., los principios fundamentales básicos de funcionamiento son esencialmente los mismos en todos ellos.

Se puede decir que una computadora está formada por tres partes fundamentales, aunque una de ellas es subdividida en dos partes no menos importantes. En la figura 2.1 se muestran dichas partes, llamadas genéricamente unidades funcionales debido a que, desde el punto de vista del funcionamiento, son independientes.

Monografias.com

Figura 2.1. Unidades funcionales de una computadora.

El nombre de cada parte nos indica la función que realiza. Así, la Unidad Central de Proceso (CPU) es la que coordina el funcionamiento conjunto de las demás unidades y realiza los cálculos necesarios; por eso la podemos subdividir en una Unidad de Control (UC) y en una unidad de cálculo o Unidad Aritmético-Lógica (UAL).

La unidad de Memoria Principal (MP) se encarga de almacenar las instrucciones que realizará la Unidad de Control al ejecutar un programa y los datos que serán procesados. La Unidad de Entradas y Salidas será la encargada de la comunicación con el exterior a través de los periféricos. Estos periféricos pueden ser: de entrada, como los teclados; de salida, como los tubos de rayos catódicos, y de entrada y salida, como los discos magnéticos.

Unidad Central De Proceso. La CPU constituye el cerebro de una computadora digital, pues realiza todas las operaciones aritméticas y lógicas sobre los datos y además controla todos los procesos que se desarrollan en la computadora. Por ejemplo, para que se ejecute un a instrucción, ésta debe estar en el interior de la CPU, concretamente en la UC y si hay que realizar cálculos, interviene la UAL. Veamos como funciona cada una de ellas.

Unidad de Control. Para realizar su tarea la UC necesita conocer, por un lado, la instrucción y, por otro, una serie de informaciones adicionales que deberá tener en cuenta para coordinar, de forma correcta, la ejecución de la instrucción. El resultado de la interpretación de dichas informaciones son una serie de órdenes a los diferentes elementos de la computadora.

La UC no emite todas las órdenes a la vez, sino siguiendo una determinada secuencia. Para ello utiliza un elemento que le va indicando el instante en que debe ejecutar una determinada fase de la instrucción. A este elemento se le denomina Reloj, y se dice que sincroniza las acciones de la UC; cuanto más rápido marque el tiempo, más rápida será la ejecución de la instrucción. Sin embargo, hay un limite, ya que, si marca excesivamente rápido, es posible que no puedan cumplir adecuadamente las órdenes de los diferentes elementos, por lo que se producirán errores.

En la figura 2.2 se esquematiza el conjunto de señales que utiliza la UC y las que genera. Como informaciones adicionales a las instrucciones podemos ver los impulsos de reloj y los indicadores de estado. Los indicadores de estado son una serie de bits que se modifican según resultados de las operaciones anteriores guardando una memoria histórica de los acontecimientos precedentes para que, en función de dichos acontecimientos, pueda la UC tomar decisiones.

Monografias.com

Figura 2.2. Señales que intervienen en la UC.

La unidad de control esta formada, básicamente por un elemento que interpreta las instrucciones y varios elementos de memoria denominados registros. Uno de estos registros almacena la instrucción mientras el intérprete está traduciendo su significado, por lo que se denomina Registro de Instrucción (RI). El resto de las instrucciones permanecen en la memoria, esperando que les toque su turno de ejecución.

La UC por otra parte deberá conocer cuál es la dirección de la próxima instrucción, para poder ir a buscarla una vez que finaliza la ejecución de la instrucción en curso; dirección que guarda el registro llamado Contador de Programa (CP).

Los indicadores de estado están agrupados en un registro denominado Registro de Estado (RE).

La Figura 2.3 muestra los elementos que acabamos de nombrar.

Monografias.com

Figura 2.3. Elementos básicos de la Unidad de Control.

Unidad Aritmético – Lógica. La unidad Aritmético – Lógica (UAL) es la encargada de realizar los cálculos. Los datos sobre los que se realizan la operaciones se denominan operandos. Al elemento encargado de ejecutar las operaciones se le denomina operador, y esta formado por una serie de circuitos electrónicos que son capaces de sumar dos números binarios o hacer las operaciones lógicas elementales: disyunción, conjunción y negación; incluso algunos operadores son también capaces de multiplicar, dividir y realizar otras operaciones mas complejas.

Para que el operador realice la operación, los operandos se llevan a la UAL y se guardan en unos registros denominados registros de trabajo. El resultado de la operación se guarda también en un registro antes de ser llevado a la memoria o a la Unidad de Entradas y Salidas. Frecuentemente se utiliza un mismo registro para guardar uno de los operandos y, también, el resultado, denominado registro Acumulador.

El operador, además de calcular el valor de la operación, modifica el registro de estado según el resultado de la operación. Así, si el resultado es un valor negativo, se modifica un bit de dicho registro, llamado bit negativo o bit N, poniéndose a 1; por el contrario, el bit N permanecerá en estado 0 mientras el contenido del acumulador no sea negativo. De igual forma indicara la UAL a la UC si el resultado ha sido cero, o si ha producido algún acarreo, etc.

En la figura 2.4 se muestran los elementos de la UAL y las señales que intervienen.

Monografias.com

(a) UAL con tres registros: 2 para los operandos y 1 para el resultado.

Monografias.com

(b) UAL con acumulador.

Figura 2.4. Elementos y señales de la AUL.

Unidad De Memoria Principal La memoria principal esta formada por un conjunto de unidades llamadas palabras. Dentro de cada una de estas palabras se guarda la información que constituye una instrucción o parte de ella (puede darse el caso de que una sola instrucción necesite varia palabras), o un dato o parte de un dato (también un dato puede ocupar varias palabras).

A la cantidad de palabras que forman la MP se le denomina capacidad de memoria. De este modo, cuanto mayor sea el numero de palabras mayor será el numero de instrucciones y datos que podrá almacenar la computadora.

Una palabra esta formada a su vez de unidades mas elementales llamadas bits, del mismo modo que en el lenguaje natural una palabra esta formada por letras. Cada bit solo puede guardar dos valores, el valor 0 o el valor 1; por eso se dice que son elementos binarios.

El numero de bits que forman una palabra se llama longitud de palabra. Por regla general, las computadoras potentes tienen memorias con longitud de palabra grande, mientras que las computadoras pequeñas tienen memorias con longitud de palabra menor.

En la figura 2.5 se muestra como se puede estar organizada una Memoria Principal.

Monografias.com

Figura 2.5. Organización de una unidad de memoria.

Las palabras forman una matriz de 10 filas y 10 columnas. La primera palabra corresponderá con la dirección 00, la segunda con la 01, y la ultima, con la 99. La capacidad de la memoria será de 10 * 10 = 100 palabras. También se muestra la longitud de la palabra 38, que es de 8 bits, al igual que las demás, y la información que contiene, que es el valor binario 10011010.

Las palabras se distinguen entre si por la posición que ocupan en la MP, y se puede guardar una información y luego recuperarla indicando el numero de dicha posición. A los números que señalan las posiciones de memoria se les da el nombre de direcciones de memoria.

La acción de guardar una información en una palabra de la memoria se llama acceso de escritura, y la acción de recuperarla, acceso de lectura. Los accesos son coordinados por la UC. La secuencia de ordenes que debe generar la UC se indica en la tabla 2.1.

En la tabla 2.1 (a) se muestra un acceso de escritura. Obsérvese que la UC debe indicar, además de la posición donde se debe guardar el dato, el valor del dato y las indicaciones de control que le digan a la memoria que se desea guardar el dato y el momento en que debe iniciarse la operación de escritura.

Esta ultima orden la dará la UC cuando este segura de que los datos anteriores han llegado correctamente a la MP. Después de esta ultima orden, la UC espera un tiempo para asegurar que se ha escrito la información en la MP.

En la tabla 2.1 (b) se muestra como se realiza un acceso de lectura. En este caso, la UC no indica el dato, puesto es precisamente lo que espera recibir. Los demás pasos son idénticos a los del acceso de escritura.

Desde que se inicia la secuencia hasta que finaliza transcurre un tiempo, denominado tiempo de acceso, cuya duración depende de la tecnología con que esta fabricada la MP.

Tabla 2.1. Secuencia de acceso a la memoria.

Monografias.com

(a) Acceso de escritura.

(b) Acceso de lectura.

REGISTROS DEL PROCESADOR. Los registros del procesador se emplean para controlar instrucciones en ejecución, manejar direccionamiento de memoria y proporcionar capacidad aritmética. Los registros son direccionables por medio de un nombre. Los bits por convención, se numeran de derecha a izquierda, como en:

… 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Registros de segmento Un registro de segmento tiene 16 bits de longitud y facilita un área de memoria para direccionamiento conocida como el segmento actual.

Registro CS. El DOS almacena la dirección inicial del segmento de código de un programa en el registro CS. Esta dirección de segmento, mas un valor de desplazamiento en el registro apuntador de instrucción (IP), indica la dirección de una instrucción que es buscada para su ejecución.

Registro DS. La dirección inicial de un segmento de datos de programa es almacenada en el registro DS. En términos sencillos, esta dirección, mas un valor de desplazamiento en una instrucción, genera una referencia a la localidad de un byte especifico en el segmento de datos.

Registro SS. El registro SS permite la colocación en memoria de una pila, para almacenamiento temporal de direcciones y datos. El DOS almacena la dirección de inicio del segmento de pila de un programa en le registro SS. Esta dirección de segmento, mas un valor de desplazamiento en el registro del apuntador de pila (SP), indica la palabra actual en la pila que esta siendo direccionada.

Registros ES. Alguna operaciones con cadenas de caracteres (datos de caracteres) utilizan el registro extra de segmento para manejar el direccionamiento de memoria. En este contexto, el registro ES esta asociado con el registro DI (índice). Un programa que requiere el uso del registro ES puede inicializarlo con una dirección de segmento apropiada.

Registros FS y GS. Son registros extra de segmento en los procesadores 80386 y posteriores.

Registros de propósito general. Los registros de propósito general AX, BX, CX y DX son los caballos de batalla del sistema. Son únicos en el sentido de que se puede direccionarlos como una palabra o como una parte de un byte. El ultimo byte de la izquierda es la parte "alta", y el ultimo byte de la derecha es la parte "baja". Por ejemplo, el registro CX consta de una parte CH (alta) y una parte Cl (baja), y usted puede referirse a cualquier parte por su nombre.

Registro AX. El registro AX, el acumulador principal, es utilizado para operaciones que implican entrada/salida y la mayor parte de la aritmética. Por ejemplo, las instrucciones para multiplicar , dividir y traducir suponen el uso del AX. También, algunas operaciones generan código mas eficiente si se refieren al AX en lugar de a los otros registros.

Monografias.com

Registro BX. El BX es conocido como el registro base ya que es el único registro de propósito general que puede ser índice para direccionamiento indexado. También es común emplear el BX para cálculos.

Monografias.com

Registro DX. El DX es conocido como l registro de datos. Alguna operaciones de entrada/salida requieren uso, y las operaciones de multiplicación y división con cifras grandes suponen al DX y al AX trabajando juntos.

Monografias.com

Pude usar los registros de propósito general para suma y resta de cifras de 8, 16 o 32 bits.

Registro de Apuntador de Instrucciones. El registro apuntador de instrucciones (IP) de 16 bits contiene el desplazamiento de dirección de la siguiente instrucción que se ejecuta. El IP esta asociado con el registro CS en el sentido de que el IP indica la instrucción actual dentro del segmento de código que se esta ejecutando actualmente. Los procesadores 80386 y posteriores tienen un IP ampliado de 32 bits, llamado EIP.

En el ejemplo siguiente, el registro CS contiene 25A4[0]H y el IP contiene 412H. Para encontrar la siguiente instrucción que será ejecutada, el procesador combina las direcciones en el CS y el IP:

Segmento de dirección en el registro CS: 25A40H Desplazamiento de dirección en el registro IP: + 412H Dirección de la siguiente instrucción: 25E52H

Registros Apuntadores. Los registros SP (apuntador de la pila) Y BP (apuntador de base) están asociados con el registro SS y permiten al sistema accesar datos en el segmento de la pila.

Registro SP. El apuntador de la pila de 16 bits esta asociado con el registro SS y proporciona un valor de desplazamiento que se refiere a la palabra actual que esta siendo procesada en la pila. Los procesador es 80386 y posteriores tienen un apuntador de pila de 32 bits, el registro ESP. El sistema maneja de forma automática estos registros.

En el ejemplo siguiente, el registro SS contiene la dirección de segmento 27B3[0]H y el SP el desplazamiento 312H. Para encontrar la palabra actual que esta siendo procesada en la pila, la computadora combina las direcciones en el SS y el SP:

Monografias.com

Registro BP. El BP de 16 bits facilita la referencia de parámetros, los cuales son datos y direcciones transmitidos vía pila. Los procesadores 80386 y posteriores tienen un BP ampliado de 32 bits llamado el registro EBP.

Registros Indice. Los registros SI y DI están disponibles para direccionamiento indexado y para sumas y restas.

Registro SI. El registro índice fuente de 16 bits es requerido por algunas operaciones con cadenas (de caracteres). En este contexto, el SI esta asociado con el registro DS. Los procesadores 80386 y posteriores permiten el uso de un registro ampliado de 32 bits, el ESI.

Registro DI. El registro índice destino también es requerido por algunas operaciones con cadenas de caracteres. En este contexto, el DI esta asociado con el registro ES. Los procesadores 80386 y posteriores permiten el uso de un registro ampliado de 32 bits, el EDI.

Registro de Banderas. De los 16 bits del registro de banderas, nueve son comunes a toda la familia de procesadores 8086, y sirven para indicar el estado actual de la maquina y el resultado del procesamiento. Muchas instrucciones que piden comparaciones y aritmética cambian el estado de las banderas, algunas cuyas instrucciones pueden realizar pruebas para determinar la acción subsecuente. En resumen, los bits de las banderas comunes son como sigue:

OF (Overflow, desbordamiento). Indica desbordamiento de un bit de orden alto (mas a la izquierda) después de una operación aritmética.

DF (dirección). Designa la dirección hacia la izquierda o hacia la derecha para mover o comparar cadenas de caracteres.

IF (interrupción). Indica que una interrupción externa, como la entrada desde el teclado, sea procesada o ignorada.

TF (trampa). Permite la operación del procesador en modo de un paso. Los programas depuradores, como el DEBUG, activan esta bandera de manera que usted pueda avanzar en la ejecución de una sola instrucción a un tiempo, para examinar el efecto de esa instrucción sobre los registros de memoria.

SF (signo). Contiene el signo resultante de una operación aritmética (0 = positivo y 1 = negativo).

ZF (cero). Indica el resultado de una operación aritmética o de comparación (0 = resultado diferente de cero y 1 = resultado igual a cero).

AF (acarreo auxiliar). Contiene un acarreo externo del bit 3 en un dato de 8 bits para aritmética especializada.

PF (paridad). Indica paridad par o impar de una operación en datos de 8 bits de bajo orden (mas a la derecha).

CF (acarreo). Contiene el acarreo de orden mas alto (mas a la izquierda) después de una operación aritmética; también lleva el contenido del ultimo bit en una operación de corrimiento o de rotación.

Las banderas están en el registro de banderas en las siguientes posiciones:

Monografias.com

Las banderas mas importantes para la programación en ensamblador son O, S, Z y C, para operaciones de comparación y aritméticas, y D para operaciones de cadenas de caracteres. Los procesadores 80286 y posteriores tienen algunas banderas usadas para propósitos internos, en especial las que afectan al modo protegido. Los procesadores 80286 y posteriores tienen un registro extendido de banderas conocido como Eflags.

UNIDAD DE ENTRADAS Y SALIDAS.

Ya se ha visto en las secciones precedentes como funcionan la CPU y la MP, pero puede decirse que es necesaria la comunicación entre el interior de la computadora y su entorno o periferia. Esta comunicación se consigue a través de dispositivos de muy diversos tipos, como son: teclados, impresoras, pantallas, discos magnéticos, etc. Es estos dispositivos se les conoce con el nombre genérico de periféricos.

En la figura 2.6 se muestran algunos periféricos conectados a la Unidad de E/S, la cual hace de intermediaria entre los periféricos y la CPU. Las flechas indican el sentido en que fluye la información.

Monografias.com

Figura 2.6. La unidad de E/S hace de intermediaria entre la UCP y los periféricos.

La coordinación de la comunicación entre los periféricos y la CPU la realiza la Unidad de E/S. Obsérvese que esta no es un periférico sino un dispositivo que gestiona a los periféricos siguiendo las ordenes de la CPU; es decir, la Unidad de E/S recibe de la Unidad de Control información sobre el tipo de transferencia de datos que debe realizar (si es de entrada o de salida) y periférico que debe de utilizar; si es de salida recibirá también el dato que debe enviar y el momento de la operación.

Entonces, la Unidad de E/S seleccionara el periférico y ejecutara la operación teniendo en cuanta las características propias de cada periférico. Una vez ejecutada la orden avisara a la UC de la terminación de la transferencia.

Cada periférico o parte de un periférico tendrá asignado un numero o dirección que servirá para identificarlo. Cuando la UC quiera seleccionarlo enviara dicho numero a la Unidad de E/S.

Para solucionar el problema de la imposibilidad de saber cuanto tiempo durara una transferencia de información con un periférico se han desarrollado diversas técnicas de comunicación entre la CPU y los periféricos.

Lo mas sencillo es que la CPU, cuando desee hacer una transferencia de información con un periférico, pregunte a la Unidad de E/S si dicho periférico se encuentra disponible. Si no lo esta, debe repetir la pregunta una y otra vez hasta obtener una respuesta afirmativa, en cuyo caso se inicia la transferencia de información.

Si se desea obtener mayor rendimiento del ordenador, se puede emplear otro método que se denomina sincronización mediante interrupción. La característica de este método es que la CPU, en lugar de dedicarse a preguntar a la Unidad de E/S por el periférico que desea utilizar, lo que hace es indicar a la Unidad de E/S que desea hacer una transferencia con el periférico, y seguidamente, si no esta el periférico preparado, empieza otra tarea, olvidándose momentáneamente del periférico.

Cuando este preparado, la Unidad de E/S indicara a la CPU que puede realizarse la transferencia; entonces, la CPU interrumpirá la tarea que esta realizando y atenderá al periférico. De esta forma, la CPU no pierde tiempo esperando al periférico.

Qué es… la memoria RAM? La memoria principal o RAM (Random Access Memory, Memoria de Acceso Aleatorio) es donde el computador guarda los datos que está utilizando en el momento presente. El almacenamiento es considerado temporal por que los datos y programas permanecen en ella mientras que la computadora este encendida o no sea reiniciada.

Monografias.com

Se le llama RAM por que es posible acceder a cualquier ubicación de ella aleatoria y rápidamente Físicamente, están constituidas por un conjunto de chips o módulos de chips normalmente conectados a la tarjeta madre. Los chips de memoria son rectángulos negros que suelen ir soldados en grupos a unas plaquitas con "pines" o contactos:

La diferencia entre la RAM y otros tipos de memoria de almacenamiento, como los disquetes o los discos duros, es que la RAM es mucho más rápida, y que se borra al apagar el computador, no como los Disquetes o discos duros en donde la información permanece grabada.

Tipos de RAM Hay muchos tipos de memorias DRAM, Fast Page, EDO, SDRAM, etc. Y lo que es peor, varios nombres. Trataremos estos cuatro, que son los principales, aunque mas adelante en este Informe encontrará prácticamente todos los demás tipos. DRAM: Dinamic-RAM, o RAM DINAMICA, ya que es "la original", y por tanto la más lenta.

Usada hasta la época del 386, su velocidad típica es de 80 ó 70 nanosegundos (ns), tiempo éste que tarda en vaciarse para poder dar entrada a la siguiente serie de datos. Por ello, es más rápida la de 70 ns que la de 80 ns.

Físicamente, aparece en forma de DIMMs o de SIMMs, siendo estos últimos de 30 contactos.

Fast Page (FPM): a veces llamada DRAM (o sólo "RAM"), puesto que evoluciona directamente de ella, y se usa desde hace tanto que pocas veces se las diferencia. Algo más rápida, tanto por su estructura (el modo de Página Rápida) como por ser de 70 ó 60 ns.

Usada hasta con los primeros Pentium, físicamente aparece como SIMMs de 30 ó 72 contactos (los de 72 en los Pentium y algunos 486).

EDO: o EDO-RAM, Extended Data Output-RAM. Evoluciona de la Fast Page; permite empezar a introducir nuevos datos mientras los anteriores están saliendo (haciendo su Output), lo que la hace algo más rápida (un 5%, más o menos).

Muy común en los Pentium MMX y AMD K6, con velocidad de 70, 60 ó 50 ns. Se instala sobre todo en SIMMs de 72 contactos, aunque existe en forma de DIMMs de 168.

SDRAM: Sincronic-RAM. Funciona de manera sincronizada con la velocidad de la placa (de 50 a 66 MHz), para lo que debe ser rapidísima, de unos 25 a 10 ns. Sólo se presenta en forma de DIMMs de 168 contactos; es usada en los Pentium II de menos de 350 MHz y en los Celeron.

PC100: o SDRAM de 100 MHz. Memoria SDRAM capaz de funcionar a esos 100 MHz, que utilizan los AMD K6-2, Pentium II a 350 MHz y computadores más modernos; teóricamente se trata de unas especificaciones mínimas que se deben cumplir para funcionar correctamente a dicha velocidad, aunque no todas las memorias vendidas como "de 100 MHz" las cumplen.

PC133: o SDRAM de 133 MHz. La más moderna (y recomendable). SIMMs y DIMMs Se trata de la forma en que se juntan los chips de memoria, del tipo que sean, para conectarse a la placa base del ordenador. Son unas plaquitas alargadas con conectores en un extremo; al conjunto se le llama módulo.

El número de conectores depende del bus de datos del microprocesador, que más que un autobús es la carretera por la que van los datos; el número de carriles de dicha carretera representaría el número de bits de información que puede manejar cada vez.

SIMMs: Single In-line Memory Module, con 30 ó 72 contactos. Los de 30 contactos pueden manejar 8 bits cada vez, por lo que en un 386 ó 486, que tiene un bus de datos de 32 bits, necesitamos usarlos de 4 en 4 módulos iguales. Miden unos 8,5 cm (30 c.) ó 10,5 cm (72 c.) y sus zócalos suelen ser de color blanco.

Los SIMMs de 72 contactos, más modernos, manejan 32 bits, por lo que se usan de 1 en 1 en los 486; en los Pentium se haría de 2 en 2 módulos (iguales), porque el bus de datos de los Pentium es el doble de grande (64 bits).

DIMMs: más alargados (unos 13 cm), con 168 contactos y en zócalos generalmente negros; llevan dos muescas para facilitar su correcta colocación. Pueden manejar 64 bits de una vez, por lo que pueden usarse de 1 en 1 en los Pentium, K6 y superiores. Existen para voltaje estándar (5 voltios) o reducido (3.3V).

Y podríamos añadir los módulos SIP, que eran parecidos a los SIMM pero con frágiles patitas soldadas y que no se usan desde hace bastantes años, o cuando toda o parte de la memoria viene soldada en la placa (caso de algunos ordenadores de marca).

Otros tipos de RAM BEDO (Burst-EDO): una evolución de la EDO, que envía ciertos datos en "ráfagas". Poco extendida, compite en prestaciones con la SDRAM.

Memorias con paridad: consisten en añadir a cualquiera de los tipos anteriores un chip que realiza una operación con los datos cuando entran en el chip y otra cuando salen. Si el resultado ha variado, se ha producido un error y los datos ya no son fiables.

Dicho así, parece una ventaja; sin embargo, el ordenador sólo avisa de que el error se ha producido, no lo corrige. Es más, estos errores son tan improbables que la mayor parte de los chips no los sufren jamás aunque estén funcionando durante años; por ello, hace años que todas las memorias se fabrican sin paridad. ECC: memoria con corrección de errores. Puede ser de cualquier tipo, aunque sobre todo EDO-ECC o SDRAM-ECC. Detecta errores de datos y los corrige; para aplicaciones realmente críticas. Usada en servidores y mainframes.

Memorias de Vídeo: para tarjetas gráficas. De menor a mayor rendimiento, pueden ser: DRAM -> FPM -> EDO -> VRAM -> WRAM -> SDRAM -> SGRAM Memoria rom ROM (memoria inalterable): Los ordenadores contienen casi siempre una cantidad pequeña de memoria de solo lectura que guarde las instrucciones para iniciar el ordenador. En la memoria ROM no se puede escribir.

PROM (memoria inalterable programable): Un PROM es un chip de memoria en la cual usted puede salvar un programa. Pero una vez que se haya utilizado el PROM, usted no puede reusarlo para salvar algo más. Como las ROM, los PROMS son permanentes.

EPROM (memoria inalterable programable borrable): Un EPROM es un tipo especial de PROM que puede ser borrado exponiéndolo a la luz ultravioleta. EEPROM (eléctricamente memoria inalterable programable borrable): Un EEPROM es un tipo especial de PROM que puede ser borrado exponiéndolo a una carga eléctrica.

ROM, siglas para la memoria inalterable, memoria de computadora en la cual se han grabado de antemano los datos. Una vez que los datos se hayan escrito sobre un chip ROM, no pueden ser quitados y pueden ser leídos solamente.

Distinto de la memoria principal (RAM), la ROM conserva su contenido incluso cuando el ordenador se apaga. ROM se refiere como siendo permanente, mientras que la RAM es volátil.

La mayoría de los ordenadores personales contienen una cantidad pequeña de ROM que salve programas críticos tales como el programa que inicia el ordenador. Además, las ROM se utilizan extensivamente en calculadoras y dispositivos periféricos tales como impresoras láser, cuyas fuentes se salvan a menudo en las ROM.

Una variación de una ROM es un PROM (memoria inalterable programable). PROM son manufacturados como chips en blanco en los cuales los datos pueden ser escritos con dispositivo llamado programador de PROM.

CONCEPTO DE INTERRUPCION. Una interrupción es una operación que suspende la ejecución de un programa de modo que el sistema pueda realizar una acción especial. La rutina de interrupción ejecuta y por lo regular regresa el control al procedimiento que fue interrumpido, el cual entonces reasume su ejecución.

TABLA DE SERVICIO DE INTERRUPCION Cuando la computadora se enciende, el BIOS y el DOS establecen una tabla de servicios de interrupción en las localidades de memoria 000H-3FFH. La tabla permite el uso de 256 (100H) interrupciones, cada una con un desplazamiento:segmento relativo de cuatro bytes en la forma IP:CS.

El operando de una instrucción de interrupción como INT 05H identifica el tipo de solicitud. Como existen 256 entradas, cada una de cuatro bytes, la tabla ocupa los primeros 1, 024 bytes de memoria, desde 000H hasta 3FFH. Cada dirección en la tabla relaciona a una ruina de BIOS o del DOS para un tipo especifico de interrupción. Por lo tanto los bytes 0-3 contienen la dirección para la interrupción 0, los bytes 4-7 para la interrupción 1, y así sucesivamente:

Monografias.com

TIPOS DE INTERRUPCIONES. Las interrupciones se dividen en dos tipos las cuales son: Externas y Internas. Una interrupción externa es provocada por un dispositivo externo al procesador. Las dos líneas que pueden señalar interrupciones externas son la línea de interrupción no enmascarable (NMI) y la línea de petición de interrupción (INTR).

La línea NMI reporta la memoria y errores de paridad de E/S. El procesador siempre actúa sobre esta interrupción, aun si emite un CLI para limpiar la bandera de interrupción en un intento por deshabilitar las interrupciones externas. La línea INTR reporta las peticiones desde los dispositivos externos, en realidad, las interrupciones 05H a la 0FH, para cronometro, el teclado, los puertos seriales, el disco duro, las unidades de disco flexibles y los puertos paralelos.

Una interrupción interna ocurre como resultado de la ejecución de una instrucción INT o una operación de división que cause desbordamiento, ejecución en modo de un paso o una petición para una interrupción externa, tal como E/S de disco. Los programas por lo común utilizan interrupciones internas, que no son enmascarables, para accesar los procedimientos del BIOS y del DOS.

INTERRUPCION DE BIOS.

El BIOS contiene un extenso conjunto de rutinas de entrada/salida y tablas que indican el estado de los dispositivos del sistema. El dos y los programas usuarios pueden solicitar rutinas del BIOS para la comunicación con los dispositivos conectados al sistema. El método para realizar la interfaz con el BIOS es el de las interrupciones de software. A continuación se listan algunas interrupciones del BIOS.

INT 00H: División entre cero. Llamada por un intento de dividir entre cero. Muestra un mensaje y por lo regular se cae el sistema.

INT 01H: Un solo paso. Usado por DEBUG y otros depuradores para permitir avanzar por paso a través de la ejecución de un programa.

INT 02H: Interrupción no enmascarare. Usada para condiciones graves de hardware, tal como errores de paridad, que siempre están habilitados. Por lo tanto un programa que emite una instrucción CLI (limpiar interrupciones) no afecta estas condiciones.

INT 03H: Punto de ruptura. Usado por depuración de programas para detener la ejecución.

INT 04H: Desbordamiento. Puede ser causado por una operación aritmética, aunque por lo regular no realiza acción alguna.

INT 05H: Imprime pantalla. Hace que el contenido de la pantalla se imprima. Emita la INT 05H para activar la interrupción internamente, y presione las teclas Cltr + PrtSC para activarla externamente. La operación permite interrupciones y guarda la posición del cursor.

INT 08H: Sistema del cronometro. Una interrupción de hardware que actualiza la hora del sistema y (si es necesario) la fecha. Un chip temporizador programable genera una interrupción cada 54.9254 milisegundos, casi 18.2 veces por segundo.

INT 09H: Interrupción del teclado. Provocada por presionar o soltar una tecla en el teclado.

INT OBH, INT OCH: Control de dispositivo serial. Controla los puertos COM1 y COM2, respectivamente.

INT 0DH, INT OFH: Control de dispositivo paralelo. Controla los puertos LPT1 y LPT2, respectivamente.

INT 0EH: Control de disco flexible. Señala actividad de disco flexible, como la terminación de una operación de E/S.

INT 10H: Despliegue en vídeo. Acepta el numero de funciones en el AH para el modo de pantalla, colocación del cursor, recorrido y despliegue.

INT 11H: Determinación del equipo. Determina los dispositivos opcionales en el sistema y regresa el valor en la localidad 40:10H del BIOS al AX. (A la hora de encender el equipo, el sistema ejecuta esta operación y almacena el AX en la localidad 40:10H).

INT 12H: Determinación del tamaño de la memoria. En el AX, regresa el tamaño de la memoria de la tarjeta del sistema, en términos de kilobytes contiguos.

INT 13H: Entrada/salida de disco. Acepta varias funciones en el AH para el estado del disco, sectores leídos, sectores escritos, verificación, formato y obtener diagnostico.

INTERRUPCION DEL DOS. Los dos módulos del DOS, IO.SYS y MSDOS.SYS, facilitan el uso del BIOS. Ya que proporcionan muchas de las pruebas adicionales necesarias, las operaciones del DOS por lo general son mas fáciles de usar que sus contrapartes del BIOS y por lo común son independientes de la maquina.

IO.SYS es una interfaz de nivel bajo con el BIOS que facilita la lectura de datos desde la memoria hacia dispositivos externos.

MSDOS.SYS contiene un administrador de archivos y proporciona varios servicios. Por ejemplo, cuando un programa usuario solicita la INT 21H, la operación envía información al MSDOS.SYS por medio del contenido de los registros. Para completar la petición, MSDOS.SYS puede traducir la información a una o mas llamadas a IO.SYS, el cual a su vez llama al BIOS. Las siguientes son las relaciones implícitas:

Monografias.com

INTERUPCIONES DEL DOS. Las interrupciones desde la 20H hasta la 3FH están reservadas para operaciones del DOS. A continuación se mencionan algunas de ellas.

INT 20H: Termina programa. Finaliza la ejecución de un programa .COM, restaura las direcciones para Cltr + Break y errores críticos, limpia los bufer de registros y regresa el control al DOS. Esta función por lo regular seria colocada en el procedimiento principal y al salir de el, CS contendría la dirección del PSP. La terminación preferida es por medio de la función 4CH de la INT 21H.

INT 21H: Petición de función al DOS. La principal operación del DOS necesita una función en el AH.

INT 22H: Dirección de terminación. Copia la dirección de esta interrupción en el PSP del programa (en el desplazamiento 0AH) cuando el DOS carga un programa para ejecución. A la terminación del programa, el DOS transfiere el control a la dirección de la interrupción. Sus programas no deben de emitir esta interrupción.

INT 23H: Dirección de Cltr + Break. Diseñada para transferir el control a una rutina del DOS (por medio del PSP desplazamiento 0EH) cuando usted presiona Ctlt + Break o Ctlr + c. La rutina finaliza la ejecución de un programa o de un archivo de procesamiento por lotes. Sus programas no deben de emitir esta interrupción.

INT 24H: Manejador de error critico. Usada por el dos para transferir el control (por medio del PSP desplazamiento 12H) cuando reconoce un error critico (a veces una operación de disco o de la impresora).Sus programas no deben de emitir esta interrupción.

INT 25H: Lectura absoluta de disco. Lee el contenido de uno o mas sectores de disco.

INT 26H: Escritura absoluta de disco. Escribe información desde la memoria a uno o mas sectores de disco.

INT 27H: Termina pero permanece residente (reside en memoria). Hace que un programa .COM al salir permanezca residente en memoria.

INT 2FH: Interrupción de multiplexion. Implica la comunicación entre programas, como la comunicación del estado de un spooler de la impresora, la presencia de un controlador de dispositivo o un comando del DOS tal como ASSIGN o APPEND.

INT 33H: Manejador del ratón. Proporciona servicios para el manejo del ratón.

PROGRAMA DEBUG COMANDOS PRINCIPALES * Q (Quit): permite abandonar el programa y volver al DOS.

* D [ [numbytes]] (dump): visualiza el contenido de la memoria. SYMDEB permite además visualizarla en palabras (DW), dobles palabras (DD), coma flotante …

* A [] (assemble): permite ensamblar a partir de CS:IP si no se indica una dirección concreta. Se admiten las directivas DB y DW del ensamblador. Las instrucciones que requieran indicar un registro de segmento, con DEBUG hay que ponerlas en una sola línea. Por ejemplo:

XLAT CS: ; mal ensamblado con DEBUG (no así con SYMDEB) MOV WORD PTR ES:[100],1234 ; error en DEBUG (sí vale con SYMDEB) CS: ; bien emsamblado con ambos XLAT ES: ; y esto también MOV WORD PTR [100],1234 Los saltos inter-segmento deben especificarse como FAR (ej., CALL FAR [100]) a no ser que sea evidente que lo son (ej. CALL 1234:5678).

* E [] (enter): permite consultar y modificar la memoria, byte a byte. Por ejemplo, con E 230 1,2,3 se introducirían los bytes 1, 2 y 3 a partir de DS:230. Si no se indica , se visualizará la memoria byte a byte, pudiéndose modificar los bytes deseados, avanzar al siguiente (barra espaciadora) o retroceder al anterior (signo -). Para acabar se pulsa RETURN.

* U [[]] (unassemble): desensambla la memoria. Como ejemplos válidos: U ES:100, U E000:1940 … si se indica rango, DEBUG desensamblará ese número de bytes y SYMDEB ese número de líneas. Por defecto se emplea CS: como registro de segmento.

* R [] (register): permite visualizar y modificar el valor de los registros. Por ejemplo, si se ejecuta la orden 'rip', se solicitará un nuevo valor para IP; con RF se muestran los flags y se permite modificar alguno:

Monografias.com

Monografias.com

* G [= [,,…]] (go): ejecuta código desde CS:IP (a menos que se indique una dirección concreta). Si se trabaja sobre memoria ROM no debe indicarse la segunda dirección. Para que el flujo del programa se detenga en la 2ª dirección o posteriores debe pasar necesariamente por ella(s). Se puede indicar hasta 10 direcciones donde debe detenerse.

* T [] (trace): ejecuta una instrucción del programa (a partir de CS:IP) mostrando a continuación el estado de los registros y la siguiente instrucción. Ejecutar T10 equivaldría a ejecutar 16 veces el comando T. Si la instrucción es CALL o INT, se ejecutará como tal introduciéndose en la subrutina o servidor de interrupciones correspondiente (SYMDEB no entra en los INT 21h).

* P [] (proceed): similar al comando T, pero al encontrarse un CALL o INT lo ejecuta de golpe sin entrar en su interior (ojo, ¡esto último falla al tracear sobre memoria ROM!).

* N (name): se asigna un nombre al programa que está siendo creado o modificado. Se puede indicar la trayectoria de directorios.

* L [] (load): carga el fichero de nombre indicado con el comando N. Si es ejecutable lo prepara adecuadamente para su inmediata ejecución. En BX:CX queda depositado el tamaño del fichero (BX=0 para ficheros de menos de 64 Kb). Por defecto, la dirección es CS:100h.

* L (load): carga sectores de la unidad 0, 1, … (A, B, …) a memoria. Se trata de sectores lógicos del DOS y no los sectores físicos de la BIOS. Las versiones antiguas de SYMDEB dan errores en particiones de más de 32 Mb.

* W [] (write): graba el contenido de una zona de memoria a disco. Si no se indica la dirección, se graba desde CS:100h hasta CS:100h+número_bytes; el número de bytes se indica en BX:CX (no es una dirección segmentada sino un valor de 32 bits). Si se trata de un EXE no se permitirá grabarlo (para modificarlos, hay que renombrarles para cambiarles la extensión, aunque de esta manera no serán montados al cargarlos).

* W (write): graba sectores de la memoria a disco en la unidad 0, 1, … (A, B, …). Se trata de sectores lógicos del DOS y no los sectores físicos de la BIOS. Las versiones antiguas de SYMDEB dan errores en particiones de disco duro de más de 32 Mb.

* S (search): busca una cadena de bytes por la memoria. Para buscar la cadena "PEPE" terminada por cero en un área de 512 bytes desde DS:100 se haría: S 100 L 200 "PEPE",0 (por defecto se busca en DS:). No se encontraría sin embargo "pepe" (en minúsculas).

* F (fill): llena la zona de memoria especificada con repeticiones de la lista de bytes indicada. Por ejemplo, para rellenar códigos 0AAh 100h bytes a partir de 9800h:0 se ejecutaría F 9800:0 L 100 AA; en vez de AA se podría haber indicado una lista de bytes o cadenas de caracteres.

* C (compare): compara dos zonas de memoria mostrando las diferencias. Por ejemplo, para comparar 5 bytes de DS:100 y DS:200 se hace: C 100 L 5 200.

* M (move): Más que mover, copia una zona de memoria en otra de manera inteligente (controlando los posibles solapamientos de los bloques).

* I (input): visualiza la lectura del puerto de E/S indicado.

* O (output): envia un valor a un puerto de E/S.

* H (hexaritmetic): muestra la suma y resta de valor1 y valor2, ambos operandos de un máximo de 16 bits (si hay desbordamiento se trunca el resultado, que tampoco excede los 16 bits).

Intruciones logicas La lógica booleana es importante en el diseño de circuitos y tiene un paralelo en la lógica de programación. Las instrucciones para lógica booleana son AND, OR, XOR, TEST y NOT, que pueden usarse para poner bits en 0 o en 1 y para manejar datos ASCII con propósitos aritméticos. El formato general para las operaciones booleanas es:

Monografias.com

El primer operando se refiere a un byte o palabra en un registro o memoria y es el único valor que es cambiado. El segundo operando hace referencia a un registro o a un valor inmediato. La operación compara los bits de los dos operandos referenciados y de acuerdo con esto establece las banderas CF, OF, PF, SF y ZF.

AND. Si ambos bits comparados son 1, establece el resultado en 1. Las demás condiciones dan como resultado 0.

OR. Si cualquiera (o ambos) de los bits comparados es 1, el resultado es 1. Si ambos bits están en 0, el resultado es 0.

XOR. Si uno de los bits comparados es 0 y el otro 1, el resultado es 1. Si ambos bits comparados son iguales (ambos 0 o ambos 1), el resultado es 0.

TEST. Establece las banderas igual que lo hace AND, pero no cambia los bits de los operandos.

Las operaciones siguientes AND, OR y XOR ilustran los mismos valores de bits como operandos:

Monografias.com

Es útil recordar la siguiente regla: el empleo de AND con bits 0 es 0 y el de OR con bits 1 es 1.

Ejemplos de operaciones booleanas. Para los siguientes ejemplos independientes, suponga que AL contiene 11000101 y el BH contiene 01011100:

Monografias.com

Los ejemplos 2 y 6 muestran formas de limpiar un registro, y ponerlo a cero. El ejemplo 3 pone a cero los cuatro bits mas a la izquierda de AL.

TESt actúa igual que AND, pero solo establece las banderas. Aquí están algunos ejemplos :

Monografias.com

La instrucción NOT.

La instrucción NOT solo invierte los bits en un byte o palabra en un registro o en memoria; esto es, convierte los ceros en unos y los unos en ceros. El formato general es:

Monografias.com

Por ejemplo si el AL contiene 11000101, la instrucción NOT AL cambia el AL a 00111010 (el resultado es el mismo de XOR AL, 0FFH). Las banderas no son afectadas.

Instrucciones aritméticas:

Monografias.com

Monografias.comManejo de bits (rotaciones y desplazamientos):

Monografias.com

Monografias.com

En todas las instrucciones de rotación/desplazamiento de bits, cuenta puede ser 1 o bien CX.

Operaciones lógicas (booleanas):

Monografias.com

EJEMPLO MACRO : INCLUDE MACRO.BIB INCLUDE CARACTER.BIB INCLUDE LIMPIAR.BIB .MODEL SMALL .STACK .DATA TEXTO DB 13,10,"MACRO Y BIBLIOTECA DE MACROS","$" TEXTO1 DB 13,10,"REGISTRO DEL MICROPROCESADOR", "$" TEXTO2 DB 13,10,"COMANDOS DEL DEBUG","$" TEXTO3 DB 13,10,"PRESIONE CUALQUIER TECLA PARA CONTINUAR","$" TEXTO4 DB 13,10,"INTERRUPCIONES DEL DOS Y BIOS","$" TEXTO5 DB 13,10,"LO QUE FALTA ES DE LA MATERIA LENGUAJE ENSAMBLADOR","$" .CODE BEGIN PROC MOV AX,@DATA MOV DS,AX ;LIMPIA LETRA 83 LETRA 32 LETRA 89 LETRA 32 LETRA 66 LETRA 73 LETRA 79 LETRA 83 CADENA TEXTO CADENA TEXTO1 CADENA TEXTO2 CADENA TEXTO3 CADENA TEXTO4 CADENA TEXTO5 mov AX,4C00H int 21h ENDP END

UNIDAD 2:

Traductores de alto nivel

TRADUCTORES DE ALTO NIVEL

—-DEFINICION Y EJEMPLOS DE TRADUCTORES DE ALTO NIVEL Un traductor es un programa que toma el texto escrito en un lenguaje (el lenguaje fuente) y lo convierte en el texto equivalente en un segundo lenguaje (el lenguaje destino u objeto). Existen distintos tipos de traductores, entre ellos destacan:

· Ensambladores · Preprocesadores · Intérpretes · Compiladores

——————COMPILADORES Un compilador traduce desde un lenguaje de alto nivel a otro lenguaje de bajo nivel. Genera varias instrucciones de la máquina por cada comando fuente.

—————–FACES DE UN COMPILADOR Análisis Léxico. En la fase de análisis léxico se leen los caracteres del programa fuente y se agrupan en cadenas que representan los componentes léxicos. Cada componente léxico es una secuencia lógicamente coherente de caracteres relativa a un identificador, una palabra reservada, un operador o un carácter de puntuación.

A la secuencia de caracteres que representa un componente léxico se le llama lexema (o con su nombre en inglés token). En el caso de los identificadores creados por el programador no solo se genera un componente léxico, sino que se genera otro lexema en la tabla de símbolos.

Análisis Sintáctico. En esta fase, los componentes léxicos se agrupan en frases gramaticales que el compilador utiliza para sintetizar la salida.

Análisis Semántico. La fase de análisis semántico se intenta detectar instrucciones que tengan la estructura sintáctica correcta, pero que no tengan significado para la operación implicada.

Generación de código Intermedio. Algunos compiladores generan una representación intermedia explícita del programa fuente, una vez que se han realizado las fases de análisis. Se puede considerar esta operación intermedia como un subprograma para una máquina abstracta. Esta representación intermedia debe tener dos propiedades importantes: debe ser fácil de producir y fácil de traducir al programa objeto.

Optimización de Código. En esta fase se trata de mejorar el código intermedio, de modo que resulte un código de máquina más rápido de ejecutar.

Generación de Código. Esta constituye la fase final de un compilador. En ella se genera el código objeto que por lo general consiste en código en lenguaje máquina (código relocalizable) o código en lenguaje ensamblador.

Administrador de la tabla de símbolos. Una tabla de símbolos es una estructura de datos que contiene un registro por cada identificador. El registro incluye los campos para los atributos del identificador.

El administrador de la tabla de símbolos se encarga de manejar los accesos a la tabla de símbolos, en cada una de las etapas de compilación de un programa.

Manejador de errores. En cada fase del proceso de compilación es posibles encontrar errores. Es conveniente que el tratamiento de los errores se haga de manera centralizada a través de un manejador de errores. De esta forma podrán controlarse más eficientemente los errores encontrados en cada una de las fases de la compilación de un programa.

—-INTERPRETE Un interprete es un programa que acepta otro programa (el programa fuente) escrito en un determinado lenguaje (el lenguaje fuente), y lo ejecuta. El intérprete carga, analiza y ejecuta una a una las instrucciones del programa fuente.

———DIFERENCIA ENTRE COMPILADOR Y INTERPRETE Que el Interprete es un Programa que realiza varias fases del compilador, se diferencia de este, en que no genera código o no lo traduce a otro lenguaje, sino es ejecutado. Ademas La interpretación es muy lenta (hasta 100 veces mas)

————–APLICACIONES CON TRADUCTORES DE ALTO NIVEL C++, PASCAL, JAVA, SQL, CLIPER, VISUAL BASIC, MYSQL, SQL SERVER

—————-EJEMPLOS UTILIZANDO TRADUCTORES Y COMPILADORES TRADUCTORES= los navegadores de internet: interpretan lenguaje html y lo muestran; Las líneas de comandos SQL: interpretan y ejecutan las consultas. Algunos intérpretes conocidos son:

Un intérprete Caml Un intérprete Lisp El intérprete de comandos de Unix (shell).

COMPILADORES= década de los 50's, cuando con el advenimiento de computadoras comerciales surge también la necesidad de programarlas.

El primer compilador de FORTRAN tardó 18 años-persona en realizarse y era muy sencillo.

UNIDAD 3:

Sistemas operativos

DEFINICIÓN DE LOS SISTEMAS OPERATIVOS Un sistema operativo (SO) es un conjunto de programas destinados a permitir la comunicación del usuario con un ordenador y gestionar sus recursos de manera eficiente. Comienza a trabajar cuando se enciende el ordenador, y gestiona el hardwarw de la máquina desde los niveles más básicos.

Un sistema operativo se puede encontrar normalmente en la mayoría de los aparatos electrónicos que podamos utilizar sin necesidad de estar conectados a un ordenador y que utilicen microprocesadores para funcionar, ya que gracias a estos podemos entender la máquina y que ésta cumpla con sus funciones (teléfonos móviles, reproductores de DVD, autoradios… y computadoras) GENERACIONES DE LOS SISTEMAS OPERATIVOS Los Sistemas Operativo al igual que el Hardware de los computadores, han sufrido una serie de cambios revolucionarios llamados generaciones En el caso del Hardware, las generaciones han sido marcadas por grandes avances en los componentes utilizados, pasando de válvulas ( primera generación ) a transistores ( segunda generación ), a circuitos integrados ( tercera generación), a circuitos integrados de gran y muy gran escala (cuarta generación). Cada generación Sucesiva de hardware ha ido acompañada de reducciones substanciales en los costos, tamaño, emisión de calor y consumo de energía, y por incrementos notables en velocidad y capacidad.

Generacion Cero (década de 1940) Los primeros sistemas computacionales no poseían sistemas operativos. Los usuarios tenían completo acceso al lenguaje de la maquina. Todas las instrucciones eran codificadas a mano.

Primera Generacion (década de 1950) Los sistemas operativos de los años cincuenta fueron diseñados para hacer mas fluida la transición entre trabajos. Antes de que los sistemas fueran diseñados, se perdía un tiempo considerable entre la terminación de un trabajo y el inicio del siguiente. Este fue el comienzo de los sistemas de procesamiento por lotes, donde los trabajos se reunían por grupos o lotes. Cuando el trabajo estaba en ejecución, este tenia control total de la maquina. Al terminar cada trabajo, el control era devuelto al sistema operativo, el cual limpiaba y leía e iniciaba el trabajo siguiente.

Al inicio de los 50's esto había mejorado un poco con la introducción de tarjetas perforadas (las cuales servían para introducir los programas de lenguajes de máquina), puesto que ya no había necesidad de utilizar los tableros enchufables.

Además el laboratorio de investigación General Motors implementó el primer sistema operativo para la IBM 701. Los sistemas de los 50's generalmente ejecutaban una sola tarea, y la transición entre tareas se suavizaba para lograr la máxima utilización del sistema. Esto se conoce como sistemas de procesamiento por lotes de un sólo flujo, ya que los programas y los datos eran sometidos en grupos o lotes.

La introducción del transistor a mediados de los 50's cambió la imagen radicalmente.

Se crearon máquinas suficientemente confiables las cuales se instalaban en lugares especialmente acondicionados, aunque sólo las grandes universidades y las grandes corporaciones o bien las oficinas del gobierno se podían dar el lujo de tenerlas.

Para poder correr un trabajo (programa), tenían que escribirlo en papel (en Fortran o en lenguaje ensamblador) y después se perforaría en tarjetas. Enseguida se llevaría la pila de tarjetas al cuarto de introducción al sistema y la entregaría a uno de los operadores. Cuando la computadora terminara el trabajo, un operador se dirigiría a la impresora y desprendería la salida y la llevaría al cuarto de salida, para que la recogiera el programador.

Segunda Generación (a mitad de la década de 1960) La característica de los sistemas operativos fue el desarrollo de los sistemas compartidos con multiprogramación, y los principios del multiprocesamiento. En los sistemas de multiprogramación, varios programas de usuario se encuentran al mismo tiempo en el almacenamiento principal, y el procesador se cambia rápidamente de un trabajo a otro. En los sistemas de multiprocesamiento se utilizan varios procesadores en un solo sistema computacional, con la finalidad de incrementar el poder de procesamiento de la maquina.

La independencia de dispositivos aparece después. Un usuario que desea escribir datos en una cinta en sistemas de la primera generación tenia que hacer referencia especifica a una unidad de cinta particular. En la segunda generación, el programa del usuario especificaba tan solo que un archivo iba a ser escrito en una unidad de cinta con cierto numero de pistas y cierta densidad.

Se desarrollo sistemas compartidos, en la que los usuarios podían acoplarse directamente con el computador a través de terminales. Surgieron sistemas de tiempo real, en que los computadores fueron utilizados en el control de procesos industriales. Los sistemas de tiempo real se caracterizan por proveer una respuesta inmediata.

Tercera Generación (mitad de década 1960 a mitad década de 1970) Se inicia en 1964, con la introducción de la familia de computadores Sistema/360 de IBM. Los computadores de esta generación fueron diseñados como sistemas para usos generales . Casi siempre eran sistemas grandes, voluminosos, con el propósito de serlo todo para toda la gente. Eran sistemas de modos múltiples, algunos de ellos soportaban simultáneamente procesos por lotes, tiempo compartido, procesamiento de tiempo real y multiprocesamiento. Eran grandes y costosos, nunca antes se había construido algo similar, y muchos de los esfuerzos de desarrollo terminaron muy por arriba del presupuesto y mucho después de lo que el planificador marcaba como fecha de terminación.

Estos sistemas introdujeron mayor complejidad a los ambientes computacionales; una complejidad a la cual, en un principio, no estaban acostumbrados los usuarios.

Cuarta Generación (mitad de década de 1970 en adelante) Los sistemas de la cuarta generación constituyen el estado actual de la tecnología. Muchos diseñadores y usuarios se sienten aun incómodos, después de sus experiencias con los sistemas operativos de la tercera generación.

Con la ampliación del uso de redes de computadores y del procesamiento en línea los usuarios obtienen acceso a computadores alejados geográficamente a través de varios tipos de terminales.

Los sistemas de seguridad se ha incrementado mucho ahora que la información pasa a través de varios tipos vulnerables de líneas de comunicación. La clave de cifrado esta recibiendo mucha atención; han sido necesario codificar los datos personales o de gran intimidad para que; aun si los datos son expuestos, no sean de utilidad a nadie mas que a los receptores adecuados.

El porcentaje de la población que tiene acceso a un computador en la década de los ochenta es mucho mayor que nunca y aumenta rápidamente.

El concepto de maquinas virtuales es utilizado. El usuario ya no se encuentra interesado en los detalles físicos de; sistema de computación que esta siendo accedida. En su lugar, el usuario ve un panorama llamado maquina virtual creado por el sistema operativo.

Los sistemas de bases de datos han adquirido gran importancia. Nuestro mundo es una sociedad orientada hacia la información, y el trabajo de las bases de datos es hacer que esta información sea conveniente accesible de una manera controlada para aquellos que tienen derechos de acceso.

DEFINICION DEL SISTEMA OPERATIVO Un sistema operativo (SO) es un conjunto de programas destinados a permitir la comunicación del usuario con un ordenador y gestionar sus recursos de manera eficiente. Comienza a trabajar cuando se enciende el ordenador, y gestiona el hardware de la máquina desde los niveles más básicos.

Un sistema operativo se puede encontrar normalmente en la mayoría de los aparatos electrónicos que podamos utilizar sin necesidad de estar conectados a un ordenador y que utilicen microprocesadores para funcionar, ya que gracias a estos podemos entender la máquina y que ésta cumpla con sus funciones (teléfonos móviles, reproductores de DVD, autoradios… y computadoras).

FUNCIONES DE LOS SISTEMAS OPERATIVOS 1.- Aceptar todos los trabajos y conservarlos hasta su finalización.

2.- Interpretación de comandos: Interpreta los comandos que permiten al usuario comunicarse con el ordenador.

3.- Control de recursos: Coordina y manipula el hardware de la computadora, como la memoria, las impresoras, las unidades de disco, el teclado o el Mouse.

4.- Manejo de dispositivos de E/S: Organiza los archivos en diversos dispositivos de almacenamiento, como discos flexibles, discos duros, discos compactos o cintas magnéticas.

5.- Manejo de errores: Gestiona los errores de hardware y la pérdida de datos.

6.- Secuencia de tareas: El sistema operativo debe administrar la manera en que se reparten los procesos. Definir el orden. (Quien va primero y quien después).

7.- Protección: Evitar que las acciones de un usuario afecten el trabajo que esta realizando otro usuario.

8.- Multiacceso: Un usuario se puede conectar a otra máquina sin tener que estar cerca de ella.

9.- Contabilidad de recursos: establece el costo que se le cobra a un usuario por utilizar determinados recursos.

CARACTERÍSTICAS DE LOS SISTEMAS OPERATIVOS En general, se puede decir que un Sistema Operativo tiene las siguientes características:

· Conveniencia. Un Sistema Operativo hace más conveniente el uso de una computadora.

· Eficiencia. Un Sistema Operativo permite que los recursos de la computadora se usen de la manera más eficiente posible.

· Habilidad para evolucionar. Un Sistema Operativo deberá construirse de manera que permita el desarrollo, prueba o introducción efectiva de nuevas funciones del sistema sin interferir con el servicio.

· Encargado de administrar el hardware. El Sistema Operativo se encarga de manejar de una mejor manera los recursos de la computadora en cuanto a hardware se refiere, esto es, asignar a cada proceso una parte del procesador para poder compartir los recursos.

· Relacionar dispositivos (gestionar a través del kernel). El Sistema Operativo se debe encargar de comunicar a los dispositivos periféricos, cuando el usuario así lo requiera.

· Organizar datos para acceso rápido y seguro.

· Manejar las comunicaciones en red. El Sistema Operativo permite al usuario manejar con alta facilidad todo lo referente a la instalación y uso de las redes de computadoras.

· Procesamiento por bytes de flujo a través del bus de datos.

· Facilitar las entradas y salidas. Un Sistema Operativo debe hacerle fácil al usuario el acceso y manejo de los dispositivos de Entrada/Salida de la computadora.

COMPONENTES DEL SISTEMA OPERATIVO Un sistema operativo está conformado básicamente por cuatro módulos:

· Núcleo o Kernel. · Administrador de memoria. · Sistema de entrada/salida. · Administrador de archivos. A veces se considera un quinto módulo: el intérprete de comandos o intérprete de instrucciones, el cual se encarga de "traducir" las órdenes que el usuario ingresa mediante el teclado u otros dispositivos a un "lenguaje" que la máquina pueda entender.

Núcleo Es el módulo de más bajo nivel de un sistema operativo, pues descansa directamente sobre el hardware de la computadora. Entre las tareas que desempeña se incluyen el manejo de las interrupciones, la asignación de trabajo al procesador y el proporcionar una vía de comunicación entre los distintos programas. En general, el núcleo se encarga de controlar el resto de los módulos y sincronizar su ejecución.

El núcleo contiene un submódulo denominado "planificador", el cual se encarga de asignar tiempo del procesador a los programas, de acuerdo a una cierta política de planificación que varía de un sistema operativo a otro. Normalmente se utiliza una jerarquía de prioridades que determinan cómo se asignará el tiempo del CPU a cada programa. Una política de planificación muy común en los sistemas de multiprogramación y multiproceso son las técnicas de "time slicing" (fracción de tiempo). Se asigna a cada programa un corto intervalo de tiempo del procesador. Si el programa no ha terminado durante este intervalo de tiempo, vuelve a la cola de programas.

Administrador de memoria Este módulo se encarga de asignar ciertas porciones de la memoria principal (RAM) a los diferentes programas o partes de los programas que la necesiten, mientras el resto de los datos y los programas se mantienen en los dispositivos de almacenamiento masivo. De este modo, cuando se asigna una parte de la memoria principal se hace de una forma estructurada, siguiendo un determinado orden. La forma más común de administración de la memoria supone crear una memoria virtual; con este sistema, la memoria de la computadora aparece, para cualquier usuario del sistema, mucho mayor de lo que en realidad es.

Sistema de entrada/salida (E/S) Este componente presenta al usuario la E/S de datos como una cuestión independiente del dispositivo; es decir, para los usuarios, todos los dispositivos tienen las mismas características y son tratados de la misma forma, siendo el sistema operativo el encargado de atender las particularidades de cada uno de ellos (como su velocidad de operación). Una técnica muy común, especialmente en salida, es el uso de "spoolers". Los datos de salida se almacenan de forma temporal en una cola situada en un dispositivo de almacenamiento masivo (el spool), hasta que el dispositivo periférico requerido se encuentre libre; de este modo se evita que un programa quede retenido porque el periférico no esté disponible. El sistema operativo dispone de llamadas para añadir y eliminar archivos del spool.

Administrador de archivos Se encarga de mantener la estructura de los datos y los programas del sistema y de los diferentes usuarios (que se mantienen en archivos) y de asegurar el uso eficiente de los medios de almacenamiento masivo. El administrador de archivos también supervisa la creación, actualización y eliminación de los archivos, manteniendo un directorio con todos los archivos que existen en el sistema en cada momento y coopera con el módulo administrador de memoria durante las transferencias de datos desde y hacia la memoria principal. Si se dispone de un sistema de memoria virtual, existen transferencias entre la memoria principal y los medios de almacenamiento masivo para mantener la estructura de la misma.

Los archivos almacenados en los dispositivos de almacenamiento masivo tienen distintos propósitos. Algunos contienen información que puede ser compartida. Otros son de carácter privado, e incluso secreto. Por tanto, cada archivo está dotado de un conjunto de privilegios de acceso, que indican la extensión con la que se puede compartir la información contenida en el archivo. El sistema operativo comprueba que estos privilegios no sean violados.

FUNCIONES DEL KERNEL El kernel o núcleo de Linux se puede definir como el corazón de este sistema operativo. Es el encargado de que el software y el hardware del computador puedan trabajen juntos. Las funciones del Kernel se simplifican en:

1. Administración de la memoria, para todos los programas en ejecución.

2. Administración del tiempo de procesador, que estos programas en ejecución utilizan.

3. Acceder a los periféricos/elementos y hardware de entrada y salida de una forma practica y cómoda.

El usuario de Linux puede adaptar el Kernel a sus necesidades configurando y compilando un nuevo Kernel o simplemente parchando y compilando el Kernel existente.

INTERPRETES DE ÓRDENES En FreeBSD, gran parte del trabajo diario se realiza a través de un interfaz de la linea de órdenes llamado "shell". El principal trabajo del shell es recoger órdenes del canal de entrada y ejecutarlas. Muchos shells tienen también integradas funciones para ayudarnos en las tareas cotidianas tales como la manipulación de archivos, edición de líneas de órdenes, macros de órdenes, expansión de expresiones regulares en nombres de archivo y variables del sistema.

FreeBSD viene con un conjunto de shells, como sh, el shell Bourne y csh, el shell C. Hay disponibles muchos otros shells en la "FreeBSD Ports Collection" que son mucho más potentes, como bash y tcsh.

¿Qué shell usar? Es cuestión de gustos. Si se es programador de C se puede sentir más cómodo con tcsh, un shell con una sintaxis similar al C. Si se proviene del mundo Linux o se es nuevo en el interfaz de órdenes de Unix, se puede probar con bash. El asunto es que cada shell posee unas propiedades únicas que pueden o no funcionar con el entorno de trabajo preferido y se ha de efectuar una elección sobre el shell a usar.

Una de las propiedades comunes de un shell es que completa los nombres de archivo. Dada la introducción de las primeras letras de una orden o del nombre de un archivo, se puede hacer que el shell complete automáticamente el resto de la orden o el nombre del archivo pulsando la tecla TAB. Aquí va un ejemplo. Supongamos que se tienen dos archivos llamados foobar y foo.bar. Se quiere borrar foo.bar. Lo que habría que teclear es: rm fo[TAB].[TAB].

El shell nos mostraría rm foo[BEEP].bar.

El [BEEP] es el pitido de consola (console bell): es el shell diciéndonos que fue incapaz de completar totalmente el nombre de archivo porque hay más de una coincidencia. Tanto foobar como foo.bar comienzan por fo, pero solo se pudo completar hasta foo. Si se teclea ., y de nuevo TAB, el shell será capaz de introducir el resto del nombre por nosotros.

Otra función del shell son las variables de entorno. Las variables de entorno son parejas de valores clave almacenados en el espacio de entorno del shell. Este espacio puede ser leído por cualquier programa invocado por el shell y, por tanto, en él se encuentra bastante información relativa a la configuración de programas. Lo siguiente es una lista de las variables de entorno más comunes y su significado:

Variable Descripción USER Nombre de usuario con el que se ha entrado al sistema.

PATH Lista de directorios, separada por puntos y coma, en los que se busca ejecutables.

DISPLAY Nombre en la red de la pantalla de X11 a la que conectarse, si se encuentra disponible.

SHELL El shell actual.

TERM El nombre del terminal del usuario. Se usa para determinar las posibilidades del terminal de datos.

TERMCAP Base de datos donde encontrar los códigos de escape necesarios para realizar diferentes funciones en el terminal.

OSTYPE Tipo de sistema operativo. Por ejemplo, FreeBSD.

Variable Descripción MACHTYPE Arquitectura de la CPU en la que el sistema se está ejecutando. EDITOR El editor de texto preferido por el usuario.

PAGER El paginador de texto preferido por el usuario.

MANPATH Lista de directorios en los que se busca páginas de manual, separados por puntos y coma.

Visualizar o establecer una variable de entorno difiere ligeramente de shell a shell. Por ejemplo, en los shells al estilo C como tcsh y csh, se usaría setenv para establecer y visualizar las variables de entorno actuales. Siguiendo el ejemplo, para establecer o modificar el valor de EDITOR, bajo csh o tcsh una orden como la siguiente establecería el valor de EDITOR a /usr/local/bin/emacs:

% setenv EDITOR /usr/local/bin/emacs Bajo los shells tipo Bourne (Bourne Shells):

% export EDITOR="/usr/local/bin/emacs" También se puede hacer que la mayoría de los shells muestren el contenido de una variable de entorno situando el carácter $ delante del nombre de la variable desde la línea de órdenes. Por ejemplo, echo $TERM mostrará cualquiera que sea el valor que se le haya establecido a TERM, porque el shell expande el valor de TERM y se lo pasa al programa echo.

Los shells manejan muchos caracteres especiales, llamados meta-caracteres, como representaciones especiales de datos. El mas común es el carácter *, que representa cualquier número de caracteres en un nombre de archivo. Estos meta- caracteres especiales se pueden usar para la expansión de nombres de archivos. Por ejemplo, teclear echo * es casi lo mismo que introducir ls porque el shell recoge todos los archivos que coinciden con * y se los pone en la línea de órdenes a echo para que los vea.

Para evitar que el shell interprete estos caracteres especiales, se pueden salvar poniendo el carácter contrabarra () delante de ellos. echo $TERM muestra cualquiera que sea el valor establecido para el terminal que estamos usando. echo $TERM muestra $TERM tal cual.

SISTEMA DE ARCHIVOS La mayoría de los sistemas operativos poseen su propio sistema de archivos. Los sistemas de archivos son representados ya sea textual o gráficamente utilizando un gestor de archivos. Los sistemas de archivos más comunes utilizan dispositivos de almacenamiento de datos que permiten el acceso a los datos como una cadena de bloques de un mismo tamaño, a veces llamados sectores, usualmente de 512 bytes de longitud. El software del sistema de archivos es responsable de la organización de estos sectores en archivos y directorios y mantiene un registro de qué sectores pertenecen a qué archivos y cuáles no han sido utilizados. En la realidad, un sistema de archivos no requiere necesariamente de un dispositivo de almacenamiento de datos, sino que puede ser utilizado también para acceder a datos generados dinámicamente, como los recibidos a través de una conexión de red.

Generalmente un sistema de archivos tiene directorios que asocian nombres de archivos con archivos, usualmente conectando el nombre de archivo a un índice en una tabla de asignación de archivos de algún tipo, como FAT en sistemas de archivos MS-DOS o los inodos de los sistemas Unix. La estructura de directorios puede ser plana o jerárquica (ramificada o "en árbol"). En algunos sistemas de archivos los nombres de archivos son estructurados, con sintaxis especiales para extensiones de archivos y números de versión. En otros, los nombres de archivos son simplemente cadenas de texto y los metadatos de cada archivo son alojados separadamente.

En sistemas de archivos jerárquicos, en lo usual, se declara la ubicación precisa de un archivo con una cadena de texto llamada "ruta". La nomenclatura para rutas varía ligeramente de sistema en sistema, pero mantienen por lo general una misma estructura. Una ruta viene dada por una sucesión de nombres de directorios y subdirectorios, ordenados jerárquicamente de izquierda a derecha y separados por algún carácter especial que suele ser una barra ('/') o barra invertida ('') y puede terminar en el nombre de un archivo presente en la última rama de directorios especificada.

Así, por ejemplo, en un sistema Unix la ruta a la canción preferida del usuario "pedro" sería algo como:

Partes: 1, 2, 3, 4
 Página anterior Volver al principio del trabajoPágina siguiente 

Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.

Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.

Categorias
Newsletter