You are on page 1of 9

UNIVERSIDAD DE EL SALVADOR FACULTAD DE INGENIERIA Y ARQUITECTURA ESCUELA DE INGENIERIA DE SISTEMAS INFORMATICOS

MICROPROGRAMACION

UNIDAD I Introduccin a Lenguaje Ensamblador


Conceptos bsicos Al desarrollarse las primeras computadoras electrnicas, se vio la necesidad de programarlas, es decir, de almacenar en memoria la informacin sobre la tarea que iban a ejecutar. Las primeras se usaban como calculadoras simples; se les indicaban los pasos de clculo, uno por uno. John Von Neumann desarroll el modelo que lleva su nombre, para describir este concepto de "programa almacenado". En este modelo, se tiene una abstraccin de la memoria como un conjunto de celdas, que almacenan simplemente nmeros. Estos nmeros pueden representar dos cosas: los datos, sobre los que va a trabajar el programa; o bien, el programa mismo. Cmo es que describimos un programa como nmeros? Se tena el problema de representar las acciones que iba a realizar la computadora, y que la memoria, al estar compuesta por switches correspondientes al concepto de bit, solamente nos permita almacenar nmeros ceros o unos (binarios). La solucin que se tom fue la siguiente: a cada accin que sea capaz de realizar nuestra computadora, asociarle un nmero, que ser su cdigo de operacin (opcode) . Por ejemplo, una calculadora programable simple podra asignar los opcodes : 1 = SUMA, 2 = RESTA, 3 = MULTIPLICA, 4 = DIVIDE. Supongamos que queremos realizar la operacin 5 * 3 + 2, en la calculadora descrita arriba. En memoria, podramos "escribir" el programa de la siguiente forma: Localidad Opcode Significado Comentario 0 1 2 3 5 3 3 1 5 * 3 + En esta localidad, tenemos el primer nmero de la frmula En esta localidad, tenemos el opcode que representa la multiplicacin. En esta localidad, tenemos el segundo nmero de la frmula En esta localidad, tenemos el opcode que representa la suma.

En esta localidad, tenemos el ltimo nmero de la frmula

Podemos ver que con esta representacin, es simple expresar las operaciones de las que es capaz el hardware (en este caso, nuestra calculadora imaginaria), en la memoria. La descripcin y uso de los opcodes es lo que llamamos lenguaje de mquina. Es decir, la lista de cdigos que la mquina va a interpretar como instrucciones, describe las capacidades de programacin que tenemos de ella; es el lenguaje ms primitivo, depende directamente del hardware, y requiere del programador que conozca el funcionamiento de la mquina al ms bajo nivel. Cuando abstraemos los opcodes y los sustituimos por una palabra que sea una clave de su significado, a la cual comnmente se le conoce como mnemnico, tenemos el concepto de Lenguaje Ensamblador. As, podemos definir simplemente al Lenguaje Ensamblador de la siguiente forma: Lenguaje Ensamblador es la primera abstraccin del Lenguaje de Mquina, consistente en asociar a los cdigos de operacin (opcodes) palabras clave que faciliten su uso por parte del programador. Como se puede ver, el Lenguaje Ensamblador es directamente traducible al Lenguaje de Mquina, y viceversa; simplemente, es una abstraccin que facilita su uso para los seres humanos. Por otro lado, la computadora no entiende directamente el Lenguaje Ensamblador; es necesario traducirle a Lenguaje de Mquina. Originalmente, este proceso se haca a mano, usando para ello hojas donde se escriban tablas de programa similares al ejemplo de la calculadora que vimos anteriormente. Pero, al ser tan directa la traduccin, pronto aparecieron los programas Ensambladores, que son traductores que convierten el cdigo fuente (en Lenguaje Ensamblador) a cdigo objeto (es decir, a Lenguaje de Mquina). Una caracterstica que hay que resaltar, es que al depender estos lenguajes del hay un distinto Lenguaje de Mquina (y, por consiguiente, un distinto Ensamblador) para cada CPU. Por ejemplo, podemos mencionar tres completamente diferentes, que sin embargo vienen de la aplicacin de los anteriores: hardware, Lenguaje lenguajes conceptos

1. Lenguaje Ensamblador de la familia Intel 80x86 2. Lenguaje Ensamblador de la familia Motorola 68000 3. Lenguaje Ensamblador del procesador POWER, usado en las IBM RS/6000. Tenemos 3 fabricantes distintos, compitiendo entre s y cada uno aplicando conceptos distintos en la manufactura de sus procesadores, su arquitectura y programacin; todos estos aspectos, influyen en que el lenguaje de mquina y ensamblador cambie bastante.

UES_MICROPROGRAMACION_JEIT

Para este curso, trabajaremos con el Lenguaje Ensamblador de la familia Intel 80x86, que es el ms difundido junto con las computadoras personales compatibles con IBM; pero es importante que se desarrollen las estructuras de programacin y la comprensin de los conceptos, suficientes para poder usar otros ensambladores, teniendo una lista de mnemnicos y su uso.

Evolucin de los lenguajes computacionales


Como se pudo ver en la seccin anterior, los lenguajes ms primitivos fueron los lenguajes de mquina. Esto, ya que el hardware se desarroll antes del software, y adems cualquier software finalmente tiene que expresarse en el lenguaje que maneja el hardware. La programacin en esos momentos era sumamente tediosa, pues el programador tena que "bajarse" al nivel de la mquina y decirle, paso a paso, cada punto de la tarea que tena que realizar. Adems, deba expresarlo en forma numrica; y por supuesto, este proceso era propenso a errores, con lo que la productividad del programador era muy limitada. Sin embargo, hay que recordar que en estos momentos, simplemente an no exista alternativa. El primer gran avance que se dio, como ya se coment, fue la abstraccin dada por el Lenguaje Ensamblador, y con l, el nacimiento de las primeras herramientas automticas para generar el cdigo mquina. Esto redujo los errores triviales, como poda ser el nmero que corresponda a una operacin, que son sumamente engorrosos y difciles de detectar, pero fciles de cometer. Sin embargo, an aqu es fcil para el programador perderse y cometer errores de lgica, pues debe bajar al nivel de la forma en que trabaja el CPU, y entender bien todo lo que sucede dentro de l. Con el desarrollo en los 50s y 60s de algoritmos de ms elevado nivel, y el aumento de poder del hardware, empezaron a entrar al uso de computadoras cientficos de otras ramas; ellos conocan mucho de Fsica, Qumica y otras ramas similares, pero no de Computacin, y por supuesto, les era sumamente complicado trabajar con lenguaje Ensamblador en vez de frmulas. As, naci el concepto de Lenguaje de Alto Nivel, con el primer compilador de FORTRAN (FORmula TRANslation), que, como su nombre indica, inici como un "simple" esfuerzo de traducir un lenguaje de frmulas, al lenguaje ensamblador y por consiguiente al lenguaje de mquina. A partir de FORTRAN, se han desarrollado innumerables lenguajes, que siguen el mismo concepto: buscar la mayor abstraccin posible, y facilitar la vida al programador, aumentando la productividad, encargndose los compiladores o intrpretes de traducir el lenguaje de alto nivel, al lenguaje de computadora. Hay que notar la existencia de lenguajes que combinan caractersticas de los de alto nivel y los de bajo nivel (es decir, Ensamblador). El ejemplo favorito de estos es el lenguaje C, el cual contiene estructuras de programacin de alto nivel, y la facilidad de usar libreras que tambin son caractersticas de alto nivel; sin embargo, fue diseado con muy pocas instrucciones, las cuales son sumamente sencillas, fciles de traducir al lenguaje de la mquina; y requiere de un entendimiento apropiado de cmo funciona la mquina, el uso de la memoria, etctera. Por ello, muchas personas consideramos a lenguajes como C (que fue diseado para hacer sistemas operativos), lenguajes de nivel medio.

UES_MICROPROGRAMACION_JEIT

Ventajas y desventajas del Lenguaje Ensamblador


Una vez que hemos visto la evolucin de los lenguajes, cabe preguntarse: En tiempos "modernos", donde las facilidades de programacin estn bastante desarrolladas, para qu quiero el Lenguaje Ensamblador? El proceso de evolucin trajo consigo algunas desventajas, que ahora veremos como las ventajas de usar el Lenguaje Ensamblador, respecto a un lenguaje de alto nivel: 1. Velocidad 2. Eficiencia de tamao 3. Flexibilidad Por otro lado, al ser un lenguaje ms primitivo, el Ensamblador tiene ciertas desventajas respecto a los lenguajes de alto nivel: 1. 2. 3. 4. Tiempo de programacin Programas fuente grandes Peligro de afectar recursos inesperadamente Falta de portabilidad

Velocidad El proceso de traduccin que realizan los intrpretes, implica un proceso de cmputo adicional al que el programador quiere realizar. Por ello, nos encontraremos con que un intrprete es siempre ms lento que el realizar la misma accin en Lenguaje Ensamblador, simplemente porque tiene el costo adicional de estar traduciendo el programa, cada vez que lo ejecutamos. De ah nacieron los compiladores, que son mucho ms rpidos que los intrpretes, pues hacen la traduccin una vez y dejan el cdigo objeto, que ya es Lenguaje de Mquina, y se puede ejecutar muy rpidamente. Aunque el proceso de traduccin es ms complejo y costoso que el de ensamblar un programa, normalmente podemos despreciarlo, contra las ventajas de codificar el programa ms rpidamente. Sin embargo, la mayor parte de las veces, el cdigo generado por un compilador es menos eficiente que el cdigo equivalente que un programador escribira. La razn es que el compilador no tiene tanta inteligencia, y requiere ser capaz de crear cdigo genrico, que sirva tanto para un programa como para otro; en cambio, un programador humano puede aprovechar las caractersticas especficas del problema, reduciendo la generalidad pero al mismo tiempo, no desperdicia ninguna instruccin, no hace ningn 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 ms en Visual Basic (un intrprete), y 2 veces ms en C (un compilador), que el equivalente en Ensamblador.

UES_MICROPROGRAMACION_JEIT

Por ello, cuando es crtica la velocidad del programa, el Ensamblador se vuelve un candidato lgico como lenguaje. Ahora bien, esto no es un absoluto; un programa bien hecho en C puede ser muchas veces ms rpido que un programa mal hecho en Ensamblador; sigue siendo sumamente importante la eleccin 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 ms optimizacin y no se puede lograr por estos medios. Tamao Por las mismas razones que vimos en el aspecto de velocidad, los compiladores e intrpretes generan ms cdigo mquina del necesario; por ello, el programa ejecutable crece. As, cuando es importante reducir el tamao del ejecutable, mejorando el uso de la memoria y teniendo tambin beneficios en velocidad, puede convenir usar el lenguaje Ensamblador. Entre los programas que es crtico el uso mnimo de memoria, tenemos a los manejadores de dispositivos (drivers). Muchos de ellos, por supuesto, estn escritos en lenguaje Ensamblador. Flexibilidad Las razones anteriores son cuestin de grado: podemos hacer las cosas en otro lenguaje, pero queremos hacerlas ms 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 mquina puede hacer, pero que un lenguaje de alto nivel no permite. Por ejemplo, en Visual Basic no es posible cambiar la resolucin del monitor a medio programa; es una limitante, impuesta por la abstraccin 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 mquina, puede hacerse en el lenguaje ensamblador de esta mquina; los lenguajes de alto nivel tienen en una u otra forma limitante para explotar al mximo los recursos de la mquina.

Tiempo de programacin Al ser de bajo nivel, el Lenguaje Ensamblador requiere ms instrucciones para realizar el mismo proceso, en comparacin con un lenguaje de alto nivel. Por otro lado, requiere de ms cuidado por parte del programador, pues es propenso a que los errores de lgica se reflejen ms fuertemente en la ejecucin.

UES_MICROPROGRAMACION_JEIT

Por todo esto, es ms lento el desarrollo de programas comparables en Lenguaje Ensamblador que en un lenguaje de alto nivel, pues el programador goza de una menor abstraccin. Programa fuente grande Por las mismas razones que aumenta el tiempo, crecen los programas fuentes; simplemente, requerimos ms 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 mquina, 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 tambin en este Lenguaje. Dicho de otra forma, tener mucho poder es til pero tambin es peligroso. En la vida prctica, afortunadamente no ocurre mucho; sin embargo, al programar en este lenguaje vern que es mucho ms comn que la mquina se "bloquee" o "se inhiba; y que se reinicialice. Por qu?, porque con este lenguaje es perfectamente posible (y sencillo) realizar secuencias de instrucciones invlidas, que normalmente no aparecen al usar un lenguaje de alto nivel. Falta de portabilidad Como ya se mencion, existe un lenguaje ensamblador para cada mquina; por ello, evidentemente no es una seleccin apropiada de lenguaje cuando deseamos codificar en una mquina 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 ms notorio en ensamblador: se puede reutilizar un 90% o ms del cdigo que se desarrolla en "C", en una PC, al llevarlo a una RS/6000 con UNIX, y lo mismo si despus lo llevo a una Macintosh, siempre y cuando est bien hecho y siga los estndares de "C", y los principios de la programacin estructurada. En cambio, si escribimos el programa en Ensamblador de la PC, por muy bien que lo desarrollemos y muchos estndares que sigamos, tendremos prcticamente que reescribir el 100 % del cdigo al llevarlo a UNIX, y otra vez lo mismo al llevarlo a Mac.

UES_MICROPROGRAMACION_JEIT

Representacin y Tipos de Datos


Representacin de Datos Cmo ve la informacin el CPU, en los distintos tipos de datos: 1. 2. 3. 4. 5. 6. Nmeros enteros sin signo Nmeros enteros con signo Caracteres Punto flotante Arreglos Cadenas

Nmeros enteros sin signo


Tipos "unsigned" de C Representan solamente la magnitud, en forma binaria. Permiten almacenar nmeros desde 0 hasta (2n) - 1 n se refiere al nmero de bits usados para representarlo

Nmeros de 1 byte sin signo: 0 a 255: unsigned char Nmeros de 2 bytes sin signo: 0 a 65,535: unsigned short Nmeros de 4 bytes sin signo: 0 a 4,294,967,295: unsigned long

Nmeros enteros con signo


Los ms usuales, "integer", "long". Un bit (el ms significativo) es usado para representar el signo. Cuando es 0, el nmero es positivo Cuando es 1, el nmero es negativo Permiten almacenar nmeros desde -2(n-1), hasta +(2(n-1)) - 1 Byte: -128 a +127 Word: -32768 a 32767 Double word: -2147,483,648 a +2147,483,647 Los nmeros negativos se almacenan usando el complemento a dos del nmero

Complemento a uno

Primer paso para el manejo de nmeros negativos Consiste en complementar todos los bits de un nmero binario Los dgitos 0 se convierten en dgitos 1, y los dgitos 1 se convierten en dgitos 0

Complemento a dos UES_MICROPROGRAMACION_JEIT

Se obtiene sumndole uno al complemento a uno Tiene la propiedad de que si sumamos un nmero binario con su complemento a dos, nos da 0.

Representacin de caracteres
Es una abstraccin de datos

El CPU solamente sabe procesar nmeros Otros datos deben representarse en trminos numricos

Cdigo de caracter: define una tabla de correspondencias entre caracteres y nmeros asignados

EBCDIC: Extended Binary Coded Decimal Interchange Code ( Cdigo extendido binario codificado decimal ), usado en Mainframes. ASCII: American Standard Code for Information Interchange ( Cdigo estandar americano para el intercambio de informacin ) es de 7 bits (0 a 127), en PC's se extiende a 256

Punto flotante
Es una representacin de los nmeros reales. Utiliza para su representacin 32 bits (palabra doble), 64 (palabra cudruple). El formato precisin simple utiliza los 32 bits de la siguiente manera:

1 bit para signo, 8 bits para el exponente, 23 bits para la precisin.

El rango de los nmeros a representar, en los positivos, es desde 1.18 x 10^-38 a 3.40 x 10^38). Y equivalentemente, en los negativos. El formato precisin doble utiliza los 64 bits de la siguiente manera:

1 bit para signo, 11 bits para el exponente, 52 bits para la precisin.

El rango de los nmeros a representar, en los positivos, es desde 2.23 x 10^-308 a 1.79 x 10^308). Y equivalentemente, en los negativos.

Arreglos

UES_MICROPROGRAMACION_JEIT

El arreglo es un tipo de datos estructurado formado por una coleccin finita de elementos ordenados, todos del mismo tipo. El acceso se realiza mediante un ndice que permite especificar cul es el elemento deseado dando su posicin en la coleccin. Un byte es la unidad de memoria que se asigna para almacenar un valor. En el caso de un arreglo las sentencias de declaracin le dicen al compilador cuntos bytes se necesitan para representar el arreglo. Entonces el nombre del arreglo se asocia con las caracteristicas del mismo, estas son:

El lmite superior del rango. El lmite inferior del rango La posicin en memoria del primer byte del arreglo, llamada la direccin base. El nmero de posiciones de memoria necesarias para cada elemento del arreglo.

La funcin de acceso utiliza esta informacin para determinar la posicin del elemento deseado, usando una simple multiplicacin y una suma: Posicin Elemento[i] = Direccin Base + (i - Limite Inferior) * Tamao Elemento

Cadenas
Una cadena es una secuencia de caracteres. Se utiliza para guardar textos. Dado que la longitud es dinmica, se usan algunos bits extras con informacin sobre la longitud mxima, la longitud real de la cadena o un indicador de fin de cadena. Por ejemplo, Pascal almacena en el primer byte, el nmero de caracteres que contiene la cadena. Por ello, la longitud mxima que permite es de 255 caracteres. C permite cadenas de longitud indefinida, pues codifica la informacin desde el primer byte, hasta encontrar un caracter nulo (cdigo ASCII 0), que funciona como terminador de cadena.

UES_MICROPROGRAMACION_JEIT

You might also like