You are on page 1of 20

LENGUAJE MQUINA Los ordenadores slo entienden un lenguaje especfico para cada mquina, que se denomina Cdigo Maquina

o Lenguaje Mquina. Este lenguaje utiliza un cdigo binario (smbolos "0" y "1"). Las rdenes que se dan a un ordenador han de ir codificadas en instrucciones, y estas forman los programas. Las instrucciones tienen dos partes diferenciadas: cdigo de operacin y cdigo(s) de operando(s):

En la primera, se codifica la operacin que realiza la instruccin. Este cdigo de operacin siempre es nico para cada instruccin. En la segunda, se indica(n) la(s) direccin(es) de memoria en la que se encuentra el operando, hasta un mximo de tres, sobre el/(los) que se aplicar la operacin. Puesto que cada tipo de ordenador tiene su cdigo mquina especfico, para programar en este lenguaje el programador debe conocer la arquitectura fsica de la computadora con cierto detalle (registros de la CPU, palabras de memoria,...). La estructura del lenguaje mquina est totalmente adaptada a los circuitos de la computadora y muy alejada del lenguaje que empleamos normalmente para expresar y analizar los problemas que hoy da son resolubles con la computadora. Por ejemplo, para hacer clculos aritmticos disponemos de un "lenguaje" matemtico fcil de comprender y claro, que no se parece en nada al cdigo mquina necesario para hacer dichos clculos. Las ventajas de los lenguajes mquina son: Un programa escrito en lenguaje mquina es directamente interpretable por el procesador central. Una vez introducido el programa en la memoria principal de la computadora, no se necesitan transformaciones previas para ser ejecutado (como ms adelante veremos que s ocurre con los programas escritos en lenguajes de alto nivel). Los programas escritos en lenguaje mquina se ejecutan muy eficientemente (con rapidez), debido a que el usuario lo redacta especficamente para los circuitos que lo han de interpretar y ejecutar, y a que desde el cdigo mquina se puede utilizar la totalidad de los recursos de la mquina.

Por contra, los lenguajes mquina tienen los siguientes inconvenientes: Las instrucciones son cadenas de ceros y unos, aunque estas cadenas se pueden introducir en la computadora mediante un cdigo intermedio (octal o hexadecimal). Los datos se utilizan por medio de las direcciones de memoria donde se encuentran. En las instrucciones no aparecen nombres de variables (i, j, aux,...), sino que el programador debe asignar las direcciones de memoria para las variables y constantes del programa. Para realizar esta asignacin se debe tener en cuenta la zona de memoria que ocupa el programa, para que no se traslape con la zona en la que se almacenan las variables. El repertorio de instrucciones suele ser muy reducido y las instrucciones realizan operaciones muy simples. El lenguaje mquina depende y est ligado ntimamente a la CPU del computador. Si dos computadoras tienen CPU's diferentes, tendrn distintos lenguajes mquina. En particular, dos microcomputadoras con el mismo microprocesador e iguales circuitos de control, tienen igual lenguaje mquina. La dependencia del lenguaje mquina de la configuracin de la CPU hace que los programas redactados en este lenguaje de programacin sean poco transferibles o transportables de una computadora a otra. En un programa en cdigo mquina, no pueden incluirse comentarios que faciliten la legibilidad del mismo. Adems, debido a su representacin totalmente numrica, es muy difcil de reconocer o interpretar por el usuario.

LENGUAJE HUMANO El lenguaje humano se basa en la capacidad de los seres humanos para comunicarse por medio de signos(usualmente secuencias sonoras, pero tambin gestos y seas, as como signos grficos). Principalmente lo hacemos utilizando el signo lingstico. Aun as, hay diversos tipos de lenguaje. La complejidad del lenguaje humano se debe sin duda a su potencia. El hombre es un creador de cdigos, y el lenguaje es un cdigo caractersticamente creativo o productivo. Es un cdigo abierto. Adems, muchos de los cdigos creados por el hombre son cdigos secundarios respecto al lenguaje (la escritura, el Morse,...). Con ellos el hombre convierte su cdigo lingstico no inscripcional (los mensajes desaparecen sin dejar huella) en otro cdigo inscripcional, la escritura, de extraordinaria trascendencia. NECESIDAD DE UN TRADUCTOR Para facilitar el trabajo de programacin y hacer los programas ms legibles, resolviendo las limitaciones que presentan los lenguajes mquina, se han desarrollado lenguajes de programacin que permiten utilizar una simbologa y terminologa prximas a las tradicionalmente utilizadas en la descripcin de problemas. Estos lenguajes se denominan genricamente lenguajes simblicos. Como la computadora nicamente puede interpretar y ejecutar cdigo mquina, existen programas traductores, que traducen o trasladan programas desde el lenguaje simblico al lenguaje mquina. En general existen traductores para convertir programas escritos en un lenguaje a otro. El programa inicial se denomina programa fuente, y el programa obtenido tras el proceso de traduccin programa objeto. En el mecanismo el programa fuente es utilizado por el traductor como conjunto de datos que debe procesar, y a partir del mismo genera como resultado el programa objeto. Todo ello con la ayuda del computador. EVOLUCIN DE LOS LENGUAJES DE PROGRAMACIN Los lenguajes de programacin han pasado por 4 diferentes generaciones en las que han evolucionado notablemente. Las 2 primeras son llamadas de bajo nivel, porque son dependientes de la mquina, estn diseados para ejecutarse en una determinada computadora y las 2 ms recientes, las de alto nivel son independientes de la mquina y se pueden utilizar en una variedad de computadoras. Primera Generacin: Lenguaje de Mquina. Segunda Generacin: Lenguajes Simblicos. Tercera Generacin: Lenguajes de alto nivel. Cuarta Generacin: Programacin orientada a objetos.

CARCTERSTICAS DE UN LENGUAJE SIMBLICO: Constituye la representacin ms directa del cdigo mquina especfico para cada arquitectura de computadoras legible por un programador. Fue usado principalmente en los inicios del desarrollo de software, cuando an no se contaba con los potentes lenguajes de alto nivel. Un programa escrito en lenguaje simblico consiste en una serie de instrucciones que corresponden al flujo de rdenes ejecutables que pueden ser cargados en la memoria de un sistema basado microprocesador. No son directamente interpretados por la circuitera de la mquina. Se codifican mediante smbolos alfanumricos, de puntuacin, parntesis, separadores, etc.

A QUE SE REFIERE UN ENSAMBLADOR? El lenguaje ensamblador, o assembler(assembly language en ingls), es un lenguaje de programacin de bajo nivel para los computadores, microprocesadores, microcontroladores y otros circuitos integrados programables. Implementa una representacin simblica de los cdigos de mquina binarios y otras constantes necesarias para programar una arquitectura dada de CPU y constituye la representacin ms directa del cdigo mquina especfico para cada arquitectura legible por un programador. Esta representacin es usualmente definida por el fabricante de hardware, y est basada en los mnemnicos que simbolizan los pasos de procesamiento (las instrucciones), los registros del procesador, las posiciones de memoria y otras caractersticas del lenguaje. Un lenguaje ensamblador es por lo tanto especfico de cierta arquitectura de computador fsica (o virtual). Esto est en contraste con la mayora de los lenguajes de programacin de alto nivel, que idealmente son portables. CUL ES SU FUNCIN? El programa ensamblador es un software que se encarga de traducir los mnemnicos y smbolos alfanumricos del programa escrito en ensamblador por el usuario a cdigo mquina, para que pueda ser interpretado y ejecutado por el microprocesador. El programa escrito en lenguaje ensamblador recibe la denominacin de cdigo fuente, archivo fuente o fichero fuente. Suele tener la extensin *.asm. El archivo fuente debe ser traducido a cdigo mquina, de lo cual se encarga el programa ensamblador. La mayora de los ensambladores proporcionan a su salida un fichero que suele tener la extensin *.hex. Este fichero puede ser grabado en la memoria ROM de un sistema con microprocesador. MOTIVOS DE SU USO Un programa escrito en el lenguaje ensamblador requiere considerablemente menos memoria y tiempo de ejecucin que un programa escrito en los conocidos lenguajes de alto nivel, como C, C++, java, etc. El lenguaje ensamblador da a un programador la capacidad de realizar tareas muy tcnicas que serian difciles, si no es que imposibles de realizar en un lenguaje de alto nivel. El conocimiento del lenguaje ensamblador permite una comprensin de la arquitectura de la maquina que ningn lenguaje de alto nivel puede ofrecer. Aunque la mayora de los especialistas en Software desarrolla aplicaciones en lenguajes de alto nivel, que son ms fciles de escribir y de dar mantenimiento, una prctica comn es recodificar en lenguaje ensamblador aquellas rutinas que han causado cuellos de botella en el procesamiento. Los programas residentes y rutinas de servicio de interrupcin casi siempre son desarrollados en el lenguaje ensamblador. Con el lenguaje ensamblador se tiene un control muy preciso de las tareas realizadas por un microprocesador por lo que se pueden crear segmentos de cdigo difciles y/o muy ineficientes de programar en un lenguaje de alto nivel, ya que, entre otras cosas, en el lenguaje ensamblador se dispone de instrucciones del CPU que generalmente no estn disponibles en los lenguajes de alto nivel.

MOTIVOS PARA NO USARLO El cdigo escrito en lenguaje ensamblador posee una cierta dificultad de ser entendido ya que su estructura se acerca al lenguaje mquina, es decir, es un lenguaje de bajo nivel. El lenguaje ensamblador es difcilmente portable, es decir, un cdigo escrito para un microprocesador, puede necesitar ser modificado, para poder ser usado en otra mquina distinta. Al cambiar a una mquina con arquitectura diferente, generalmente es necesario reescribirlo completamente.

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. 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. 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.

TIPOS DE ENSAMBLADORES. Ensambladores cruzados: Se denominan as a los ensambladores que se utilizan en una computadora que posee un procesador diferente al que tendrn las computadoras donde va a ejecutarse el programa objeto producido. El empleo de este tipo de traductores permite aprovechar el soporte de medios fsicos (discos, impresoras, pantallas, etc.) y de programacin que ofrecen las mquinas potentes para desarrollar programas que luego los van a ejecutar en sistemas muy especializados en determinados tipos de tareas. Macroensambladores Son ensambladores que permiten el uso de macroinstrucciones (macros). Debido a su potencia, normalmente son programas robustos que no permanecen en memoria una vez generado el programa objeto. Puede variarse complejidad, dependiendo de las posibilidades de definicin y manipulacin de las macroinstrucciones, pero normalmente son programas bastantes complejos, por lo que suelen ser ensambladores residentes. Ejemplos: Macro Ensamblador IBM.- Est integrado por un ensamblador y un macroensamblador. En gran medida su funcionamiento y forma de invocarlo es sumamente similar al de Microsoft. Su forma de uso consiste en generar un archivo fuente en cdigo ASCII, se procede a generar un programa objeto que es ligado y se genera un programa .EXE. Opcionalmente puede recurrirse a la utilera EXE2BIN de MS-DOS para transformarlo a .COM. Es capaz de generar un listado con informacin del proceso de ensamble y referencias cruzadas. Macro Ensamblador de Microsoft.- Dependiendo de la versin, este ensamblador es capaz de soportar el juego de instrucciones de distintos tipos de microprocesadores Intel de la serie 80xx/80x86. En su versin 4.0 este soporta desde el 8086 al 80286 y los coprocesadores 8087 y 80287. Requiere 128KB de memoria y sistema operativo MS-DOS v2.0 o superior. Trabaja con un archivo de cdigo fuente creado a partir de un editor y grabado en formato ASCII. Este archivo es usado para el proceso de ensamble y generacin de cdigo objeto. Posteriormente, y con un ligador, es creado el cdigo ejecutable en formato .EXE. Microensambladores: Generalmente, los procesadores utilizados en las computadoras tienen un repertorio fijo de instrucciones, es decir, que el intrprete de las mismas interpretaba de igual forma un determinado cdigo de operacin. El programa que indica al intrprete de instrucciones de la UCP cmo debe actuar se denomina microprograma. El programa que ayuda a realizar este microprograma se llama microensamblador. Existen procesadores que permiten la modificacin de sus microprogramas, para lo cual se utilizan microensambladores. Ensambladores de una fase Estos ensambladores leen una lnea del programa fuente y la traducen directamente para producir una instruccin en lenguaje mquina o la ejecuta si se trata de una pseudoinstruccin. Tambin va construyendo la tabla de smbolos a medida que van apareciendo las definiciones de variables, etiquetas, etc.

Debido a su forma de traduccin, estos ensambladores obligan a definir los smbolos antes de ser empleados para que, cuando aparezca una referencia a un determinado smbolo en una instruccin, se conozca la direccin de dicho smbolo y se pueda traducir de forma correcta. Estos ensambladores son sencillos, baratos y ocupan poco espacio, pero tiene el inconveniente indicado. Ensambladores de dos fases Se denominan as debido a que realizan la traduccin en dos etapas. En la primera fase, leen el programa fuente y construyen una tabla de smbolos; de esta manera, en la segunda fase, vuelven a leer el programa fuente y pueden ir traduciendo totalmente, puesto que conocen la totalidad de los smbolos utilizados y las posiciones que se les ha asignado. Estos ensambladores son los ms utilizados en la actualidad. Ejemplo: Ensamblador del 8086. Ensambladores Residentes La ventaja de estos ensambladores es que permiten ejecutar inmediatamente el programa; la desventaja es que deben mantenerse en la memoria principal tanto el ensamblador como el programa fuente y el programa objeto. El polo opuesto del ensamblador cruzado es el ensamblador residente, que se ejecuta sobre una maquina que contiene el mismo procesador que el destinatario del cdigo ensamblado. Un ensamblador residente ofrece al programador la ventaja de utilizar una nica mquina para crear, probar, y depurar cdigo. Los ensambladores residentes sobre los primeros microprocesadores fueron algo lentos y restrictivos en caractersticas debido al alto costo de memoria y la lentitud del microprocesador, con la disponibilidad de memoria de bajo costo (y consecuentemente grandes memorias disponibles en la mayor parte de los sistemas) y la posibilidad del procesador de direccionar directamente grandes cantidades de memoria, as como de realizar funciones ms rpidas, los ensambladores residentes proporcionan ahora una variedad de caractersticas y velocidad de ensamblaje que anteriormente solo se encontraban en ensambladores cruzados sobre grandes computadores y microcomputadores.

COMPILADOR. Compilar es el proceso de traduccin de un cdigo fuente (escrito en un lenguaje de programacin de alto nivel) a lenguaje mquina (cdigo objeto) para que pueda ser ejecutado por la computadora. Un compilador es un programa que permite traducir el cdigo fuente de un programa en lenguaje de alto nivel, a otro lenguaje de nivel inferior (tpicamente el lenguaje de mquina, pero tambin puede ser un cdigo intermedio (bytecode), o simplemente texto). De esta manera un programador puede disear un programa en un lenguaje mucho ms cercano a cmo piensa un ser humano, para luego compilarlo a un programa ms manejable por una computadora.

La construccin de un compilador involucra la divisin del proceso en una serie de fases que variar con su complejidad. Generalmente estas fases se agrupan en dos tareas: el anlisis del programa fuente y la sntesis del programa objeto. Anlisis: Se trata de la comprobacin de la correccin del programa fuente, e incluye las fases correspondientes al Anlisis lxico(que consiste en la descomposicin del programa fuente en componentes

lxicos), Anlisis sintctico (agrupacin de los componentes lxicos en frases gramaticales) y Anlisis semntico (comprobacin de la validez semntica de las sentencias aceptadas en la fase de Anlisis Sintctico). Sntesis: Su objetivo es la generacin de la salida expresada en el lenguaje objeto y suele estar formado por una o varias combinaciones de fases de Generacin de Cdigo (normalmente se trata de cdigo intermedio o de cdigo objeto) y de Optimizacin de Cdigo (en las que se busca obtener un cdigo lo ms eficiente posible). La fase final genera cdigo objeto (en general cdigo de mquina relocalizable o cdigo ensamblador), se seleccionan las posiciones de memoria para las variables usadas por el programa y se traduce cada una de las instrucciones intermedias a una secuencia de instrucciones de mquina. Diagrama que muestra las fases de un compilador:

La tabla de smbolos es una estructura de datos que contiene un registro por cada identificador, con los campos para los atributos: -- Informacin sobre la memoria asignada -- Tipo -- Si es nombre de procedimiento (nmero, tipo y mtodo de paso de cada argumento) Adems la tabla de smbolos: Permite encontrar rpidamente cada ID y almacenar o consultar datos de ese registro. En el Anlisis Lxico se detectan los ID y se introducen en la Tabla de Smbolos. Las fases restantes introducen informacin sobre los ID y despus la utilizan.

La deteccin e informacin de errores hace que cada fase puede encontrar errores y debe tratarlo para continuar con la Compilacin, permitiendo detectar ms errores. Las fases de Anlisis Sintctico y Semntico manejan la mayora de los errores. En el Anlisis Semntico se detectan errores donde la estructura sintctica es correcta pero no tiene significado la operacin (Por. ej. sumar dos ID, donde uno es el nombre de una matriz y el otro un nombre de procedimiento)

Los compiladores se pueden clasificar como: Compiladores de una sola pasada: generan el cdigo mquina a partir de una nica lectura del cdigo fuente. Compilador incremental (interactivo o conversacional): Si se descubren errores, luego de modificado el archivo fuente, se compilan slo las modificaciones.

Compilador con montador: compila mdulos independientes y luego los enlaza. Compilador de pasadas mltiples: requieren pasos intermedios para producir un cdigo en otro lenguaje, y una pasada final para producir y optimizar el cdigo producido durante los pasos anteriores. Compilador cruzado: Compilador que toma un lenguaje fuente y genera un cdigo objeto, este objeto es para una plataforma o computador distinto en el que se compila. Ejemplo de uso: fase de desarrollo de nuevos computadores. Autocompilador: Compilador escrito en el propio lenguaje que compila, facilitando la portabilidad, ejemplo, lenguaje C. Metacompilador: Es un programa que tiene como entrada una gramtica y genera el compilador del lenguaje definido por la misma, en realidad genera el cdigo del autmata, se debe aadir cdigo para lograr un compilador. Ej: Lex,Yacc Descompilador: Es un programa que tiene como entrada cdigo de mquina y lo traduce a un lenguaje de alto nivel. En la prctica es muy difcil volver atrs, en la prctica existen desensambladores, que sirven para opciones de depuracin. INTERPRETE: Un intrprete traduce un cdigo fuente en lenguaje mquina tambin. El intrprete difiere del compilador en que ejecuta cada orden una vez que se traduce. Este proceso puede hacer ms lenta la ejecucin del programa, as que los intrpretes se utilizan menos que los compiladores. Un intrprete es otra manera de implementar un lenguaje de programacin. La interpretacin comparte muchos aspectos con el compilador. Los anlisis lxico, sintctico y verificacin de tipos son exactamente los mismos que en un compilador. Pero en lugar de generar cdigo del rbol sintctico, el rbol sintctico se procesa directamente para evaluar expresiones y ejecutar sentencias, y as hasta terminar. Un intrprete puede necesitar evaluar la misma parte del rbol sintctico varias veces (por ejemplo cuando se hacen ciclos), por eso la interpretacin puede ser ms lenta que la ejecucin de un programa compilado. Pero escribir un intrprete es ms fcil de mover a una mquina diferente, as que para aplicaciones donde la velocidad no importa, lo mejor es utilizar un intrprete. Ejemplos: Basic, LISP, PROLOG son interpretados. Ventaja: fcil depuracin. Desventaja: lentitud y consumo de recursos (pues el intrprete ocupa tiempo y memoria). CMO SE CREA UN PROGRAMA? Un programa es una serie de comandos ejecutados por el equipo. Sin embargo, el equipo slo es capaz de procesar elementos binarios, es decir, una serie de 0s y 1s. Por lo tanto, necesitamos un lenguaje de programacin para escribir de manera legible, es decir, con comandos que el ser humano pueda comprender (por ser similares a su propio lenguaje) los comandos que el equipo deber ejecutar. Estos programas se traducen despus a un lenguaje mquina (en binario) a travs de un compilador. En trminos generales, el programa es un simple archivo de texto (escrito usando un procesador o editor de texto), llamado archivo fuente. El archivo fuente contiene lneas de programa llamadas cdigo fuente. Este archivo fuente, debe compilarse una vez completado. La compilacin se realiza en dos pasos:

El compilador transforma el cdigo fuente en cdigo objeto y lo guarda en un archivo objeto, es decir que traduce el archivo fuente a lenguaje mquina (algunos compiladores tambin crean un archivo en ensamblador, un lenguaje similar al lenguaje mquina ya que posee las funciones bsicas, pero puede ser ledo por los seres humanos. Luego, el compilador llama a un editor de vnculos (o ensamblador) que permite insertar los elementos adicionales (funciones y bibliotecas) a los que hace referencia el programa dentro del archivo final, pero que no se almacenan en el archivo fuente. A continuacin, se crea un archivo ejecutable que contiene todos los elementos requeridos por el programa para funcionar de manera independiente (en Microsoft Windows o MS-DOS este archivo tendr la extensin .exe).

Para la creacin de un programa es necesario seguir cinco pasos: Diseo del algoritmo, codificacin del mismo, su traduccin a lenguaje mquina, la prueba del programa y la depuracin. En la etapa de diseo se plantea el problema a resolver y se propone la mejor solucin, creando diagramas esquemticos utilizados para el mejor planteamiento de la solucin. La codificacin del programa consiste en escribir el programa en algn lenguaje de programacin, tomando como base la solucin propuesta en el paso anterior. La traduccin al lenguaje mquina es la creacin del programa objeto, esto es, el programa escrito como una secuencia de ceros y unos que pueda ser interpretado por el procesador. La prueba del programa consiste en verificar que el programa funcione sin errores, o sea, que haga lo que tiene que hacer. La ltima etapa es la eliminacin de las fallas detectadas en el programa durante la fase de prueba. La correccin de una falla normalmente requiere la repeticin de los pasos comenzando desde el primero o el segundo.

REGISTROS DEL CPU. Un registro es un grupo de celdas binarias. Como una celda almacena un bit de informacin, se desprende que un registro de n celdas puede almacenar cualquier cantidad discreta de informacin que contenga n bits. El estado del registro es un nmero ensimo de unos o ceros con cada bit indicando el estado de una celda en el registro. Fsicamente se podra pensar que el siguiente registro est compuesto de 16 celdas binarias, con cada celda almacenando un 1 un 0. 1 1 1 2 0 3 0 4 0 5 1 6 1 7 1 8 0 9 0 10 1 11 0 12 0 13 1 14 0 15 1 16

La UCP o CPU de los procesadores x86, por ejemplo, tiene 14 registros internos, cada uno de ellos de 16 bits (una palabra). Los bits estn enumerados de derecha a izquierda, de tal modo que el bit menos significativo es el bit 0. Los registros se pueden clasificar de la siguiente forma: Registros de datos:

AX: Registro acumulador. Es el principal empleado en las operaciones aritmticas. BX: Registro base. Se usa para indicar un desplazamiento. CX: Registro contador. Se usa como contador en los bucles. DX: Registro de datos. Tambin se usa en las operaciones aritmticas. Estos registros son de uso general y tambin pueden ser utilizados como registros de 8 bits, para utilizarlos como tales es necesario referirse a ellos como por ejemplo: AH y AL, que son los bytes alto (high) y bajo (low) del registro AX. Esta nomenclatura es aplicable tambin a los registros BX, CX y DX. Registros de segmentos: CS: Registro de segmento de cdigo. Contiene la direccin de las instrucciones del programa. DS: Registro segmento de datos. Contiene la direccin del rea de memoria donde se encuentran los datos del programa SS: Registro segmento de pila. Contiene la direccin del segmento de pila. La pila es un espacio de memoria temporal que se usa para almacenar valores de 16 bits (palabras). ES: Registro segmento extra. Contiene la direccin del segmento extra. Se trata de un segmento de datos adicional que se utiliza para superar la limitacin de los 64Kb del segmento de datos y para hacer transferencias de datos entre segmentos. Registros punteros de pila: SP: Puntero de la pila. Contiene la direccin relativa al segmento de la pila. BP: Puntero base. Se utiliza para fijar el puntero de pila y as poder acceder a los elementos de la pila. Registros ndices: SI: ndice fuente. DI: ndice destino. Puntero de instrucciones: IP: Registro puntero de instruccin o contador de programa (PC). Contiene el desplazamiento de la siguiente instruccin a ejecutar respecto al segmento de cdigo en ejecucin. Por lo tanto, la direccin completa de la siguiente instruccin sera CS:IP. La nica forma de influir en este registro es de forma indirecta mediante instrucciones de bifurcacin. Registro de banderas (flags): Cada bandera es un bit y se usa para registrar la informacin de estado y de control de las operaciones del microprocesador.

SEGMENTOS Y REGISTROS ASOCIADOS. La arquitectura de los procesadores x86 obliga al uso de segmentos de memoria para manejar la informacin, el tamao de estos segmentos es de 64kb. La razn de ser de estos segmentos es que, considerando que el tamao mximo de un nmero que puede manejar el procesador est dado por una palabra de 16 bits o registro, no sera posible accesar a ms de 65536 localidades de memoria utilizando uno solo de estos registros, ahora, si se divide la memoria de la PC en grupos o segmentos, cada uno de 65536 localidades, y utilizamos una direccin en un registro exclusivo para localizar cada segmento, y entonces cada direccin de una casilla especfica la formamos con dos registros, nos es posible acceder a una cantidad de 4294967296 bytes de memoria, lo cual es, en la actualidad, ms memoria de la que veremos instalada en una PC. Para que el ensamblador pueda manejar los datos es necesario que cada dato o instruccin se encuentren localizados en el rea que corresponde a sus respectivos segmentos. El ensamblador accede a esta informacin tomando en cuenta la localizacin del segmento, dada por los registros DS, ES, SS y CS, y dentro de dicho registro la direccin del dato especfico. Un programa consta de 4 tipos de segmentos. Cada segmento se direcciona mediante un determinado tipo de registro de segmento: Segmento cdigo: Cada instruccin se direcciona mediante el registro segmento de cdigo y el registro de desplazamiento IP, CS: IP. Segmento de datos: Los datos de direccionan mediante el registro de segmento de dato y un registro de desplazamiento (BX, SI o DI), por ejemplo DS:BX. Segmento de pila: Los datos se direccionan mediante el registro segmento de pila y un registro de desplazamiento (SP o BP), por ejemplo SS:SP. Segmento extra: Igual que el de datos, sustituyendo el registro de segmento, por ejemplo ES: BX. SOFTWARE EMPLEADO. Para poder crear un programa se requieren varias herramientas: Primero un editor para crear el programa fuente. Segundo un compilador que no es ms que un programa que "traduce" el programa fuente a un programa objeto. Y tercero un enlazador (Linker), que genere el programa ejecutable a partir del programa objeto. El editor puede ser cualquier editor de textos que se tenga a la mano, como compilador utilizaremos el programa TurboAssembler (TASM), por ejemplo, y como enlazador utilizaremos el Turbo Link (TLINK). La extensin usada para que el TASM reconozca los programas fuente en ensamblador es .ASM, una vez traducido el programa fuente, el TASM crea un archivo con la extensin .OBJ, este archivo contiene un "formato intermedio" del programa, llamado as porque an no es ejecutable pero tampoco es ya un programa en lenguaje fuente. El enlazador genera, a partir de un archivo .OBJ o la combinacin de varios de estos archivos, un programa ejecutable, cuya extensin es .EXE. Otros softwares empleados para la creacin de programas son: MPLAB de Microchip y el PIC C compiler empleado en la programacin de PICS.

ESTRUCTURA Estas sentencias dirigen el proceso de compilacin o construccin del programa ejecutable. No generan cdigo ejecutable. Normalmente se utilizan para aumentar la legibilidad del cdigo fuente. El fichero creado con todas las sentencias que constituyen un programa se denomina fichero fuente. Este tipo de fichero tiene formato ASCII. Se recomienda que el fichero de cdigo fuente tenga por extensin .asm. El fichero fuente se compila utilizando el programa ensamblador. El programa ensamblador generar un nuevo fichero, denominado fichero ejecutable, de igual nombre y de extensin .exe o .hex. Este fichero tiene formato ASCII y contiene el cdigo mquina de las instrucciones que componen el programa, as como cierta informacin adicional para realizar la carga del programa en el simulador del computador elemental.

Estructura de un fichero en lenguaje ensamblador: Los ficheros de cdigo fuente escritos en lenguaje ensamblador se organizan en lneas. Cada una de las lneas del fichero puede contener una directiva, una instruccin o ambas cosas a la vez en los casos en quesea posible. El carcter separador de lneas es el retorno de carro, por lo que una instruccin no podr ocupar ms de una lnea en el fichero fuente. Todos los ficheros fuente tienen que adecuarse a una estructura fija dividida en secciones. Ejemplo: Escala EQU 1000 ; Definicin de constantes simblicas ORIGEN 7F40h ; Definicin del origen de carga del programa INICIO int ; Definicin de la etiqueta que marca la ; Primera instruccin a ejecutar del programa .PILA 100h ; Definicin de la pila .DATOS ; Definicin de los datos del programa Dato1 VALOR 12h .CODIGO ; Definicin del cdigo del programa INI: MOV R5, R4 FIN

TCNICAS DE CODIFICACIN. En ensamblador los bucles, condicionales, subrutinas y dems elementos se codifica de forma distinta de cmo se hace en otros lenguajes de alto nivel. A continuacin describiremos algunas tcnicas tiles para codificar las estructuras ms usuales. BUCLES: Inicializacin de un registro(a modo de contador) al n de vueltas del bucle. Etiqueta: Primera instruccin del bucle <Resto de instrucciones dentro del bucle> decrementar el contador saltar a la etiqueta si el contador es mayor que cero <Instrucciones fuera del bucle> SALTOS CONDICIONALES: Instruccin de comparacin. Evala la condicin y si se cumple saltar a la etiqueta prefijada <Instrucciones para el caso de no cumplirse la condicin> saltar fuera del condicional MACROS:

Declaracin: <nombre de la macro> MACRO <instrucciones de la macro> ENDM Llamada: <nombre de la macro> INTERRUPCIONES Interrupcin (tambin conocida como interrupcin de hardware o peticin de interrupcin) es una seal recibida por el procesador de un ordenador, indicando que debe "interrumpir" el curso de ejecucin actual y pasar a ejecutar cdigo especfico para tratar esta situacin. Una interrupcin es una suspensin temporal de la ejecucin de un proceso, para pasar a ejecutar una subrutina de servicio de interrupcin, la cual, por lo general, no forma parte del programa. Luego de finalizada dicha subrutina, se reanuda la ejecucin del programa. Las interrupciones surgen de las necesidades que tienen los dispositivos perifricos de enviar informacin al procesador principal de un sistema de computacin. La primera tcnica que se emple fue que el propio procesador se encargara de sondear (polling) los dispositivos cada cierto tiempo para averiguar si tena pendiente alguna comunicacin para l. Este mtodo presentaba el inconveniente de ser muy ineficiente, ya que el procesador constantemente consuma tiempo en realizar todas las instrucciones de sondeo. El mecanismo de interrupciones fue la solucin que permiti al procesador desentenderse de esta problemtica, y delegar en el dispositivo la responsabilidad de comunicarse con el procesador cuando lo necesitara. El procesador, en este caso, no sondea a ningn dispositivo, sino que queda a la espera de que estos le avisen (le "interrumpan") cuando tengan algo que comunicarle (ya sea un evento, una transferencia de informacin, una condicin de error, etc.). Funcionamiento del mecanismo de interrupciones Cada dispositivo que desea comunicarse con el procesador por medio de interrupciones debe tener asignada una lnea nica capaz de avisar al CPU que le requiere para una operacin. Esta lnea es la llamada IRQ ("Interrupt ReQuest", peticin de interrupcin). Las IRQ son lneas que llegan al controlador de interrupciones un componente de hardware dedicado a la gestin de las interrupciones, y que puede estar integrado en el procesador principal o ser un circuito separado conectado al procesador principal. El controlador de interrupciones debe ser capaz de habilitar o inhibir lneas de interrupcin (operacin llamada comnmente enmascarar por la utilizacin de una mscara), y establecer prioridades entre las distintas interrupciones habilitadas. Cuando varias lneas de peticin de interrupcin se activan a la vez, el controlador de interrupciones utilizar estas prioridades para escoger la interrupcin sobre la que informar al procesador principal. Tambin puede darse el caso de que una rutina de tratamiento de interrupcin sea interrumpida para realizar otra rutina de tratamiento de una interrupcin de mayor prioridad a la que se estaba ejecutando. Sin embargo hay interrupciones que no se pueden enmascarar o deshabilitar, las conocidas como interrupciones no enmascarables o NMI. Un procesador principal que no tenga un controlador de interrupciones integrado, suele tener una nica lnea de interrupcin llamada habitualmente INT. Esta lnea es activada por el controlador de interrupciones cuando tiene una interrupcin que servir. Al activarse esta lnea, el procesador consulta los registros del controlador de interrupciones para averiguar cual IRQ hay que atender. A partir del nmero del IRQ busca en la tabla de vectores

de interrupcin la direccin de la rutina que debe llamar para atender una peticin del dispositivo asociado a dicha IRQ. Las rutinas de interrupcin generalmente toman un pequeo tiempo de ejecucin. Pasos para el procesamiento de una IRQ: 1. Terminar la ejecucin de la instruccin de mquina en curso. 2. Salva el valor de contador de programa, IP, en la pila, de manera que en la CPU, al terminar el proceso, pueda seguir ejecutando el programa a partir de la ltima instruccin. 3. La CPU salta a la direccin donde est almacenada la rutina de servicio de interrupcin (Interrupt Service Routine (ISR)) y ejecuta esa rutina que tiene como objetivo atender al dispositivo que gener la interrupcin. 4. Una vez que la rutina de la interrupcin termina, el procesador restaura el estado que haba guardado en la pila en el paso 2 y retorna al programa que se estaba usando anteriormente. Tipos de interrupciones En este subapartado vamos a hacer una clasificacin de las distintas clases de interrupciones que nos podemos encontrar atendiendo a la fuente que las produce. Por un lado distinguiremos si se producen por causas internas o externas al procesador y remarcaremos que este hecho est ntimamente ligado con que las interrupciones sean sncronas o asncronas:

Interrupciones de hardware. Estas son asncronas a la ejecucin del procesador, es decir, se pueden producir en cualquier momento independientemente de lo que est haciendo el CPU en ese momento. Las causas que lo producen son externas al procesador y a menudo suelen estar ligadas con distintos dispositivos de E/S. Traps. Normalmente son causadas al realizarse operaciones no permitidas tales como la divisin por 0, el desbordamiento, el acceso a una posicin de memoria no permitida, etc. Interrupciones por software. Las interrupciones por software son generadas por el programa en ejecucin. Para generarla, existen distintas instrucciones en el cdigo mquina que permiten al programador producir una interrupcin, suelen tener nemotcnicos tales como INT. Suelen ser de vital importancia ya que a partir de estas interrupciones se solicita al sistema operativo realizar determinadas funciones, para ello. Por ejemplo, en DOS se realiza la instruccin INT 0x21 y en Unix se utiliza INT 0x80 para hacer llamadas de sistema.

SALTOS La ejecucin de los programas no suele ser lineal ejecutndose una lista de instrucciones una tras otras. En puntos determinados, esta secuencia tiene que romperse por una toma de decisin o por cualquier otro motivo. En este caso nos referiremos a las instrucciones de salto que posee el microcontrolador PIC16F84A. SALTO INCONDICIONAL. En casi todos los programas se usa la instruccin de salto incondicional <goto k> que produce un salto a la direccin del programa indicada por k. La constante literal k es la direccin de destino del salto, es decir, la nueva direccin de memoria de programa a partir de la cual comenzarn a leerse las instrucciones despus de ejecutar la instruccin goto. As pues, esta instruccin simplemente carga la constante k en el contador de programa (PC). SALTOS CONDICIONALES Adems de las instrucciones de salto incondicional se dispone de de instrucciones de salto condicional, que son aqullas que producen un salto en funcin de que se cumpla o no una condicin. Estas instrucciones son el nico medio para realizar bifurcaciones en un programas.

El repertorio de instrucciones del PIC16F84 incluye cuatro instrucciones de salto condicional clasificadas en dos grupos: Aqullas que pueden producir el salto en funcin del estado de un bit. Son btfsc y btfss. Aqullas que pueden producir el salto en funcin del contenido de un registro distinto de cero. Son decfsz y incfsz.

Saltos en funcin de un BIT. Son muy poderosos ya que permiten al programa tomar decisiones en funcin del estado de un bit de cualquier registro o puerto de entrada/salida. Hay dos instrucciones de este tipo: Instruccin btfsc f,b (Bit test f, skip if clear). Esta instruccin puede actuar de dos formas: Si el bit nmero b del registro f es 1 la instruccin que sigue a sta se ejecuta normalmente. Si el bit nmero b del registro f es 0 la instruccin que sigue a sta se ignora y se salta.

Instruccin btfss f,b (Bit test f, skip if Set). Esta instruccin acta de forma contraria a la instruccin anterior. Si el bit nmero b del registro f es 0 la instruccin que sigue a sta se ejecuta normalmente. Si el bit nmero b del registro f es 1 la instruccin que sigue a sta se ignora y se salta.

SALTOS EN FUNCIN DE UN REGISTRO Las instrucciones de salto condicional decfsz e incfsz pueden producir el salto en funcin del contenido de un registro distinto de cero y son casos especiales de las instrucciones de incremento y decremento de un registro. Estas instrucciones podran categorizarse dentro del grupo de instrucciones aritmticas ya que efectivamente operan de forma aritmtica (decrementando o incrementando) sobre los registros. Pero, a diferencia de las otras, adems pueden alterar el flujo lineal del programa y por eso se las incluye en este grupo. Su forma de actuar se describe a continuacin: Instruccin decfsz f,d

(Decrement f, Skip if 0). Esta instruccin decrementa en una unidad el contenido del registro f. Almacena el resultado en W si d = 0 (en cuyo caso f no vara) y en el registro f si d = 1. Despus de decrementar, pueden ocurrir dos casos: Si el resultado es distinto de cero la instruccin que sigue a sta se ejecuta normalmente. Si el resultado es cero la instruccin que sigue a esta se ignora y se salta.

Instruccin incfsz f,d (Increment f, Skip if 0). Esta instruccin incrementa en una unidad el contenido del registro f. Almacena el resultado en W si d = 0 (en cuyo caso f no vara) y en el registro f si d = 1. Despus de incrementar, pueden ocurrir dos casos: Si el resultado es distinto de cero la instruccin que sigue a sta se ejecuta normalmente. Si el resultado es cero (porque al incrementarse se ha desbordado y ha pasado del nmero b11111111 al b00000000) la instruccin que sigue a esta se ignora y se salta.

CICLOS, LAZOS O BUCLES. Una aplicacin muy importante de los saltos condicionales son los lazos o bucles. Estos son fragmentos de programa que se repiten un nmero finito de veces. Los principales tipos estn descritos en la siguiente figura.

Lazo de repeticin finita. Es un salto incondicional a una posicin anterior del programa conformando un lazo de repeticin infinita, sin posibilidad de tomar otro camino. Utiliza la instruccin goto. Ejemplo:

Lazo con condicin de testeo. Se utiliza una instruccin de testeo para controlar la ejecucin del bucle. Para este caso la repeticin de lazo es finita, pero no se puede precisar el nmero de veces que se repite.

Lazo que se repite un nmero conocido de veces. Las instrucciones decfsz e incfsz se utilizan generalmente en combinacin con una instruccin de salto goto, para el diseo de lazos de instrucciones que deben repetirse una cantidad determinada de veces. Se hace de manera tal que un registro se decrementa o incrementa hasta que tome un determinado valor. En este caso, si se conoce el nmero de veces que se repite el bucle.

PROCEDIMIENTOS O SUBRUTINAS Como sabemos, el lenguaje ensamblador ofrece adems, la posibilidad de crear partes del programa independientes, denominadas subrutinas, que podrn ser llamadas posteriormente desde cualquier parte del programa principal e incluso desde otra subrutina, mediante la instruccin CALL. De esta forma el programa completo estar constituido esencialmente por una serie de pequeos programas llamados subrutinas, que pueden ser llamadas en repetidas ocasiones, evitndonos por tanto, escribir cdigo repetido. Como se ha mencionado anteriormente, las subrutinas son pequeos programas y como tal debemos aportar a cada una de ellas la documentacin o informacin suficiente para que puedan ser tratadas independientemente, e incluso puedan ser empleadas en programas distintos. Por esto, las subrutinas llevarn el encabezamiento propio de un programa y requerirn el estudio detallado de todas las condiciones en que pueden ser ejecutadas, es decir, la estructura inicial de toda subrutina ser:

A continuacin comenzar el cuerpo de la subrutina propiamente dicho, que llevar al principio una etiqueta con el nombre de la subrutina, es decir, el parmetro que deberemos especificar en la instruccin de llamada a subrutina CALL. Normalmente el nombre asignado a las subrutinas es suficientemente significativo como para darnos una idea o sugerir la funcin que desarrollarn las mismas. A continuacin de la etiqueta se sitan las instrucciones que componen la subrutina y finalmente es imprescindible concluir la subrutina con una instruccin RET que devuelve el control del programa a la posicin desde donde se efectu la llamada CALL a subrutina. Debemos recordar que adems de la llamada CALL a subrutinas, disponemos tambin de otro tipo de llamadas a subrutinas con condiciones como CC LABEL, CNC LABEL, CZ LABEL, etc. (dependiendo del microprocesador o microcontrolador usado) que efectuarn la llamada a la subrutina cuyo nombre venga especificado en LABEL si se cumple la condicin que lleva implcita la instruccin que en cada caso se emplee. En definitiva, una subrutina tendr para nosotros la siguiente estructura:

Las subrutinas deben ser vistas desde el programa principal como un bloque o una caja a la que se accede proporcionndole unos datos de entrada que llamaremos parmetros de entrada y despus de ser ejecutada nos proporciona uno o ms resultados. Hay varias formas de comunicarse con las subrutinas pasando y recibiendo datos, entre las que podemos destacar: El empleo de registros.- Su empleo est basado en la utilizacin de los registros del microprocesador libres para su uso en ese momento. Se almacenarn en ellos los datos que precise la subrutina para desarrollar su funcin y una vez ejecutada la subrutina, nos devolver los resultados en los registros precisos. Este mtodo est limitado por el bajo nmero de registros de que disponemos en el microprocesador 8085. Adems se producen modificaciones en el contenido de los registros que deben ser tenidas en cuenta y en caso de que no nos interese modificarlos, tendremos que guardar previamente su contenido en la pila y recuperarlo al finalizar la subrutina. Empleo de memoria RAM.- En este caso el programa debe colocar en posiciones consecutivas de la memoria RAM del sistema, todos los parmetros que necesite la subrutina para desarrollar su funcin. A continuacin se llama a la subrutina, la cual busca en la RAM los parmetros introducidos para trabajar con ellos. Es importante tener en cuenta el orden en que se situaron dichos parmetros para no cometer errores en el tratamiento de los datos. Ejecutadas las tareas precisas por parte de la subrutina, nos devolver los resultados en las mismas posiciones de

memoria en que le pasamos los datos. El programa principal buscar ahora los resultados en la RAM para proseguir con su desarrollo normal. MOVIMIENTO DE LOS DATOS En todo programa es necesario mover datos en la memoria y en los registros de la UCP; existen diversas formas de hacer esto: puede copiar datos de la memoria a algn registro, de registro a registro, de un registro a una pila, de la pila a un registro, transmitir datos hacia dispositivos externos as como recibir datos de dichos dispositivos. Este movimiento de datos est sujeto a reglas y restricciones. Algunas de ellas son lasque se citan a continuacin. No es posible mover datos de una localidad de memoria a otra directamente, es necesario primero mover los datos de la localidad origen hacia un registro y luego del registro a la localidad destino. No se puede mover una constante directamente a un registro de segmentos, primero se debe mover a un registro de la UCP. Aunque la instruccin se llama "mover", en el CPU, "mover datos" significa en realidad copiar datos, desde un origen a un destino, sin que el dato desaparezca del origen. Se pueden mover valores:

desde un registro a otro desde un registro a un lugar de la memoria desde un lugar de la memoria a un registro desde un lugar a otro de la memoria un valor inmediato a un registro un valor inmediato a un lugar de memoria

INSTRUCCIN MOV Mov es una instruccin en el lenguaje ensamblador de la mayora de procesadores, cuyo propsito es la transferencia de datos entre registros de procesador o registro y memoria. Adicionalmente mov tambin permite el uso de datos absolutos, como por ejemplo mover el nmero 10 a un registro del procesador.

Implementaciones Est disponible en procesadores intel pentium, amd y sparc entre muchos otros, es a la prctica, una instruccin de ensamblador bsica en cualquier procesador. Sintaxis La sintaxis en ensamblador es variable en dependencia del procesador utilizado. La sintaxis de mov se describe de la siguiente manera en los procesadoresx86 y compatibles: "mov destino, fuente" La instruccin mov, seguido del destino de los datos, ya sea un registro del procesador o una posicin de memoria, una coma que acta como separador y a continuacin, la fuente de los datos o lo datos en s, de forma absoluta. En la sintaxis at&t de ensamblador la sintaxis sera distinta: "mov fuente, destino"

En este caso, la fuente va en primer lugar, y a continuacin y tambin separado por una coma, se especifica el destino de los datos.

OPERACIONES LGICAS Y ARITMTICAS. Las instrucciones aritmtico y/o lgicas, permiten realizar operaciones entre registros. La mayora de la lgica usada para escribir programas en lenguaje ensamblador se basa en las operaciones aritmticas y/o lgicas que se realicen entre los registros. Por ejemplo la instruccin ADD Rd,Rr realiza la suma entre el registro fuente Rd y el registro destino Rr. El resultado de la operacin se almacena en el registro destino. Las dems instrucciones tiene el mismo comportamiento que ADD, a diferencia solo de los parmetros que puedan tener. Por ejemplo para el 8085 tenemos las siguientes instrucciones lgicas y aritmticas:

BIBLIOGRAFA http://es.kioskea.net/contents/langages/programme.php3 http://es.scribd.com/doc/50746990/23/TECNICAS-DE-CODIFICACION-EN-ENSAMBLADOR http://wwwdi.ujaen.es/~mcdiaz/docencia/cur04_05/fi/teoria/03_Lenguajes.pdf http://signapuntes.8forum.info/t121-el-lenguaje-humano http://www.slideshare.net/neldom/generaciones-de-los-lenguajes-de-programacion http://es.scribd.com/doc/53024489/Ventajas-y-desventajas-del-Lenguaje-Ensamblador http://www.slideshare.net/SpiderHal/tipos-de-ensambladores http://es.scribd.com/doc/97566966/16/Movimiento-de-datos http://ucsystem.blogspot.mx/2011/11/instrucciones-aritmetico-logicas.html Microcontrolador PIC16F84, Desarrollo de Proyectos. Palacios, Enrique. Editorial RA-MA. http://es.wikipedia.org/wiki/Lenguaje_ensamblador

You might also like