Está en la página 1de 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

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

También podría gustarte