Professional Documents
Culture Documents
MICROPROGRAMACION
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.
UES_MICROPROGRAMACION_JEIT
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
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
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
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:
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:
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