LENGUAJE MÁQUINA Los ordenadores sólo entienden un lenguaje específico para cada máquina, que se denomina Código Maquina

o Lenguaje Máquina. Este lenguaje utiliza un código binario (símbolos "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: código de operación y código(s) de operando(s):

En la primera, se codifica la operación que realiza la instrucción. Este código de operación siempre es único para cada instrucción. En la segunda, se indica(n) la(s) dirección(es) de memoria en la que se encuentra el operando, hasta un máximo de tres, sobre el/(los) que se aplicará la operación. Puesto que cada tipo de ordenador tiene su código máquina específico, para programar en este lenguaje el programador debe conocer la arquitectura física de la computadora con cierto detalle (registros de la CPU, palabras de memoria,...). La estructura del lenguaje máquina 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 día son resolubles con la computadora. Por ejemplo, para hacer cálculos aritméticos disponemos de un "lenguaje" matemático fácil de comprender y claro, que no se parece en nada al código máquina necesario para hacer dichos cálculos. Las ventajas de los lenguajes máquina son:  Un programa escrito en lenguaje máquina 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 más adelante veremos que sí ocurre con los programas escritos en lenguajes de alto nivel). Los programas escritos en lenguaje máquina se ejecutan muy eficientemente (con rapidez), debido a que el usuario lo redacta específicamente para los circuitos que lo han de interpretar y ejecutar, y a que desde el código máquina se puede utilizar la totalidad de los recursos de la máquina.

Por contra, los lenguajes máquina tienen los siguientes inconvenientes:   Las instrucciones son cadenas de ceros y unos, aunque estas cadenas se pueden introducir en la computadora mediante un código 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 asignación 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 máquina depende y está ligado íntimamente a la CPU del computador. Si dos computadoras tienen CPU's diferentes, tendrán distintos lenguajes máquina. En particular, dos microcomputadoras con el mismo microprocesador e iguales circuitos de control, tienen igual lenguaje máquina. La dependencia del lenguaje máquina de la configuración de la CPU hace que los programas redactados en este lenguaje de programación sean poco transferibles o transportables de una computadora a otra. En un programa en código máquina, no pueden incluirse comentarios que faciliten la legibilidad del mismo. Además, debido a su representación totalmente numérica, es muy difícil 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 también gestos y señas, así como signos gráficos). Principalmente lo hacemos utilizando el signo lingüístico. 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 códigos, y el lenguaje es un código característicamente creativo o productivo. Es un código abierto. Además, muchos de los códigos creados por el hombre son códigos secundarios respecto al lenguaje (la escritura, el Morse,...). Con ellos el hombre convierte su código lingüístico no inscripcional (los mensajes desaparecen sin dejar huella) en otro código inscripcional, la escritura, de extraordinaria trascendencia. NECESIDAD DE UN TRADUCTOR Para facilitar el trabajo de programación y hacer los programas más legibles, resolviendo las limitaciones que presentan los lenguajes máquina, se han desarrollado lenguajes de programación que permiten utilizar una simbología y terminología próximas a las tradicionalmente utilizadas en la descripción de problemas. Estos lenguajes se denominan genéricamente lenguajes simbólicos. Como la computadora únicamente puede interpretar y ejecutar código máquina, existen programas traductores, que traducen o trasladan programas desde el lenguaje simbólico al lenguaje máquina. 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 traducción 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. EVOLUCIÓN DE LOS LENGUAJES DE PROGRAMACIÓN Los lenguajes de programación 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 máquina, están diseñados para ejecutarse en una determinada computadora y las 2 más recientes, las de alto nivel son independientes de la máquina y se pueden utilizar en una variedad de computadoras.     Primera Generación: Lenguaje de Máquina. Segunda Generación: Lenguajes Simbólicos. Tercera Generación: Lenguajes de alto nivel. Cuarta Generación: Programación orientada a objetos.

CARÁCTERÍSTICAS DE UN LENGUAJE SIMBÓLICO:      Constituye la representación más directa del código máquina específico para cada arquitectura de computadoras legible por un programador. Fue usado principalmente en los inicios del desarrollo de software, cuando aún no se contaba con los potentes lenguajes de alto nivel. Un programa escrito en lenguaje simbólico 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 circuitería de la máquina. Se codifican mediante símbolos alfanuméricos, de puntuación, paréntesis, separadores, etc.

para que pueda ser interpretado y ejecutado por el microprocesador. que son más fáciles de escribir y de dar mantenimiento. archivo fuente o fichero fuente. un código escrito para un microprocesador. El archivo fuente debe ser traducido a código máquina. como C. 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 código difíciles y/o muy ineficientes de programar en un lenguaje de alto nivel. o assembler(assembly language en inglés). C++. Los programas residentes y rutinas de servicio de interrupción casi siempre son desarrollados en el lenguaje ensamblador. Esto está en contraste con la mayoría de los lenguajes de programación de alto nivel. para poder ser usado en otra máquina distinta. Implementa una representación simbólica de los códigos de máquina binarios y otras constantes necesarias para programar una arquitectura dada de CPU y constituye la representación más directa del código máquina específico para cada arquitectura legible por un programador. es decir. de lo cual se encarga el programa ensamblador. las posiciones de memoria y otras características del lenguaje. puede necesitar ser modificado. microprocesadores. El lenguaje ensamblador es difícilmente portable. es un lenguaje de bajo nivel. entre otras cosas. ¿CUÁL ES SU FUNCIÓN? El programa ensamblador es un software que se encarga de traducir los mnemónicos y símbolos alfanuméricos del programa escrito en ensamblador por el usuario a código máquina. Suele tener la extensión *. El lenguaje ensamblador da a un programador la capacidad de realizar tareas muy técnicas que serian difíciles.asm. que idealmente son portables. java. El conocimiento del lenguaje ensamblador permite una comprensión de la arquitectura de la maquina que ningún lenguaje de alto nivel puede ofrecer. ya que. generalmente es necesario reescribirlo completamente. Aunque la mayoría de los especialistas en Software desarrolla aplicaciones en lenguajes de alto nivel. La mayoría de los ensambladores proporcionan a su salida un fichero que suele tener la extensión *. Un lenguaje ensamblador es por lo tanto específico de cierta arquitectura de computador física (o virtual). Esta representación es usualmente definida por el fabricante de hardware. una práctica común es recodificar en lenguaje ensamblador aquellas rutinas que han causado cuellos de botella en el procesamiento.   MOTIVOS PARA NO USARLO   El código escrito en lenguaje ensamblador posee una cierta dificultad de ser entendido ya que su estructura se acerca al lenguaje máquina. 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 ejecución que un programa escrito en los conocidos lenguajes de alto nivel. es decir. Al cambiar a una máquina con arquitectura diferente. si no es que imposibles de realizar en un lenguaje de alto nivel. microcontroladores y otros circuitos integrados programables.¿A QUE SE REFIERE UN ENSAMBLADOR? El lenguaje ensamblador. y está basada en los mnemónicos que simbolizan los pasos de procesamiento (las instrucciones). etc. es un lenguaje de programación de bajo nivel para los computadores.hex. . los registros del procesador. en el lenguaje ensamblador se dispone de instrucciones del CPU que generalmente no están disponibles en los lenguajes de alto nivel. El programa escrito en lenguaje ensamblador recibe la denominación de código fuente.

El programa que indica al intérprete de instrucciones de la UCP cómo debe actuar se denomina microprograma. El empleo de este tipo de traductores permite aprovechar el soporte de medios físicos (discos.Dependiendo de la versión. pero normalmente son programas bastantes complejos. Su forma de uso consiste en generar un archivo fuente en código ASCII. En gran medida su funcionamiento y forma de invocarlo es sumamente similar al de Microsoft. por lo que suelen ser ensambladores residentes. También va construyendo la tabla de símbolos a medida que van apareciendo las definiciones de variables.EXE. para lo cual se utilizan microensambladores. Existen procesadores que permiten la modificación de sus microprogramas. crecen los programas fuentes. requerimos más instrucciones primitivas para describir procesos equivalentes. Este archivo es usado para el proceso de ensamble y generación de código objeto. que el intérprete de las mismas interpretaba de igual forma un determinado código de operación. etc. este ensamblador es capaz de soportar el juego de instrucciones de distintos tipos de microprocesadores Intel de la serie 80xx/80x86.0 este soporta desde el 8086 al 80286 y los coprocesadores 8087 y 80287. requiere de más cuidado por parte del programador. Posteriormente. normalmente son programas robustos que no permanecen en memoria una vez generado el programa objeto. Macro Ensamblador de Microsoft. Por otro lado.. el Lenguaje Ensamblador requiere más instrucciones para realizar el mismo proceso.) y de programación que ofrecen las máquinas potentes para desarrollar programas que luego los van a ejecutar en sistemas muy especializados en determinados tipos de tareas. impresoras.. En su versión 4. Macroensambladores Son ensambladores que permiten el uso de macroinstrucciones (macros). Es capaz de generar un listado con información del proceso de ensamble y referencias cruzadas. pues es propenso a que los errores de lógica se reflejen más fuertemente en la ejecución.COM. Debido a su potencia. Ejemplos: Macro Ensamblador IBM. y nuevamente reduce la productividad de los programadores. etiquetas. Esto es una desventaja porque dificulta el mantenimiento de los programas. y con un ligador. en comparación con un lenguaje de alto nivel. pues el programador goza de una menor abstracción.  Al ser de bajo nivel. se procede a generar un programa objeto que es ligado y se genera un programa .EXE. pantallas. simplemente. TIPOS DE ENSAMBLADORES. etc. los procesadores utilizados en las computadoras tienen un repertorio fijo de instrucciones. es más lento el desarrollo de programas comparables en Lenguaje Ensamblador que en un lenguaje de alto nivel. Opcionalmente puede recurrirse a la utilería EXE2BIN de MS-DOS para transformarlo a . es creado el código ejecutable en formato . dependiendo de las posibilidades de definición y manipulación de las macroinstrucciones.0 o superior. . El programa que ayuda a realizar este microprograma se llama microensamblador. Microensambladores: Generalmente.Está integrado por un ensamblador y un macroensamblador. Por las mismas razones que aumenta el tiempo. Ensambladores de una fase Estos ensambladores leen una línea del programa fuente y la traducen directamente para producir una instrucción en lenguaje máquina o la ejecuta si se trata de una pseudoinstrucción. Requiere 128KB de memoria y sistema operativo MS-DOS v2. Ensambladores cruzados: Se denominan así a los ensambladores que se utilizan en una computadora que posee un procesador diferente al que tendrán las computadoras donde va a ejecutarse el programa objeto producido. Trabaja con un archivo de código fuente creado a partir de un editor y grabado en formato ASCII. es decir. Puede variarse complejidad. Por todo esto.

Ejemplo: Ensamblador del 8086. vuelven a leer el programa fuente y pueden ir traduciendo totalmente. Ensambladores Residentes La ventaja de estos ensambladores es que permiten ejecutar inmediatamente el programa. Un ensamblador residente ofrece al programador la ventaja de utilizar una única máquina para crear. puesto que conocen la totalidad de los símbolos utilizados y las posiciones que se les ha asignado. baratos y ocupan poco espacio. COMPILADOR. Ensambladores de dos fases Se denominan así debido a que realizan la traducción en dos etapas. De esta manera un programador puede diseñar un programa en un lenguaje mucho más cercano a cómo piensa un ser humano. El polo opuesto del ensamblador cruzado es el ensamblador residente. Compilar es el proceso de traducción de un código fuente (escrito en un lenguaje de programación de alto nivel) a lenguaje máquina (código objeto) para que pueda ser ejecutado por la computadora. para luego compilarlo a un programa más manejable por una computadora. Un compilador es un programa que permite traducir el código fuente de un programa en lenguaje de alto nivel. leen el programa fuente y construyen una tabla de símbolos. los ensambladores residentes proporcionan ahora una variedad de características y velocidad de ensamblaje que anteriormente solo se encontraban en ensambladores cruzados sobre grandes computadores y microcomputadores.Debido a su forma de traducción. La construcción de un compilador involucra la división del proceso en una serie de fases que variará con su complejidad. e incluye las fases correspondientes al Análisis léxico(que consiste en la descomposición del programa fuente en componentes . Estos ensambladores son sencillos. En la primera fase. Análisis: Se trata de la comprobación de la corrección del programa fuente. la desventaja es que deben mantenerse en la memoria principal tanto el ensamblador como el programa fuente y el programa objeto. o simplemente texto). así como de realizar funciones más rápidas. de esta manera. pero también puede ser un código intermedio (bytecode). y depurar código. probar. Generalmente estas fases se agrupan en dos tareas: el análisis del programa fuente y la síntesis del programa objeto. se conozca la dirección de dicho símbolo y se pueda traducir de forma correcta. cuando aparezca una referencia a un determinado símbolo en una instrucción. 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. Los ensambladores residentes sobre los primeros microprocesadores fueron algo lentos y restrictivos en características debido al alto costo de memoria y la lentitud del microprocesador. en la segunda fase. Estos ensambladores son los más utilizados en la actualidad. estos ensambladores obligan a definir los símbolos antes de ser empleados para que. que se ejecuta sobre una maquina que contiene el mismo procesador que el destinatario del código ensamblado. pero tiene el inconveniente indicado. a otro lenguaje de nivel inferior (típicamente el lenguaje de máquina.

Análisis sintáctico (agrupación de los componentes léxicos en frases gramaticales) y Análisis semántico (comprobación de la validez semántica de las sentencias aceptadas en la fase de Análisis Sintáctico). ej. Síntesis: Su objetivo es la generación de la salida expresada en el lenguaje objeto y suele estar formado por una o varias combinaciones de fases de Generación de Código (normalmente se trata de código intermedio o de código objeto) y de Optimización de Código (en las que se busca obtener un código lo más eficiente posible). 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 máquina. . luego de modificado el archivo fuente.léxicos). La detección e información de errores hace que cada fase puede encontrar errores y debe tratarlo para continuar con la Compilación.Tipo -. Diagrama que muestra las fases de un compilador: La tabla de símbolos es una estructura de datos que contiene un registro por cada identificador. En el Análisis Léxico se detectan los ID y se introducen en la Tabla de Símbolos. sumar dos ID. Las fases de Análisis Sintáctico y Semántico manejan la mayoría de los errores. permitiendo detectar más errores.Si es nombre de procedimiento (número. se compilan sólo las modificaciones. Compilador incremental (interactivo o conversacional): Si se descubren errores. Las fases restantes introducen información sobre los ID y después la utilizan. tipo y método de paso de cada argumento) ⨳ ⨳ ⨳ Además la tabla de símbolos: Permite encontrar rápidamente cada ID y almacenar o consultar datos de ese registro.Información sobre la memoria asignada -. La fase final genera código objeto (en general código de máquina relocalizable o código ensamblador). 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 código máquina a partir de una única lectura del código fuente. con los campos para los atributos: -. En el Análisis Semántico se detectan errores donde la estructura sintáctica es correcta pero no tiene significado la operación (Por.

Un intérprete puede necesitar evaluar la misma parte del árbol sintáctico varias veces (por ejemplo cuando se hacen ciclos). este objeto es para una plataforma o computador distinto en el que se compila. Este archivo fuente. una serie de 0s y 1s. Ventaja: fácil depuración.Yacc Descompilador: Es un programa que tiene como entrada código de máquina y lo traduce a un lenguaje de alto nivel. con comandos que el ser humano pueda comprender (por ser similares a su propio lenguaje) los comandos que el equipo deberá ejecutar. La compilación se realiza en dos pasos: . ejemplo. debe compilarse una vez completado. en la práctica existen “desensambladores”. así que los intérpretes se utilizan menos que los compiladores. y una pasada final para producir y optimizar el código producido durante los pasos anteriores. Estos programas se traducen después a un lenguaje máquina (en binario) a través de un compilador. lo mejor es utilizar un intérprete. ¿CÓMO SE CREA UN PROGRAMA? Un programa es una serie de comandos ejecutados por el equipo. La interpretación comparte muchos aspectos con el compilador. Ejemplo de uso: fase de desarrollo de nuevos computadores. Por lo tanto. facilitando la portabilidad. el árbol sintáctico se procesa directamente para evaluar expresiones y ejecutar sentencias. llamado archivo fuente. Compilador de pasadas múltiples: requieren pasos intermedios para producir un código en otro lenguaje. se debe añadir código para lograr un compilador. por eso la interpretación puede ser más lenta que la ejecución de un programa compilado. en realidad genera el código del autómata. Los análisis léxico. Ej: Lex. el equipo sólo es capaz de procesar elementos binarios. Metacompilador: Es un programa que tiene como entrada una gramática y genera el “compilador” del lenguaje definido por la misma. Un intérprete es otra manera de implementar un lenguaje de programación. el programa es un simple archivo de texto (escrito usando un procesador o editor de texto). necesitamos un lenguaje de programación para escribir de manera legible. así que para aplicaciones donde la velocidad no importa. Sin embargo. INTERPRETE: Un intérprete traduce un código fuente en lenguaje máquina también. Este proceso puede hacer más lenta la ejecución del programa. En la práctica es muy difícil “volver atrás”. Desventaja: lentitud y consumo de recursos (pues el intérprete ocupa tiempo y memoria). es decir. lenguaje C. es decir. El intérprete difiere del compilador en que ejecuta cada orden una vez que se traduce. Ejemplos: Basic. Pero escribir un intérprete es más fácil de mover a una máquina diferente. PROLOG son interpretados. El archivo fuente contiene líneas de programa llamadas código fuente. LISP.Compilador con montador: compila módulos independientes y luego los enlaza. Autocompilador: Compilador escrito en el propio lenguaje que compila. Compilador cruzado: Compilador que toma un lenguaje fuente y genera un código objeto. y así hasta terminar. Pero en lugar de generar código del árbol sintáctico. que sirven para opciones de depuración. En términos generales. sintáctico y verificación de tipos son exactamente los mismos que en un compilador.

Para la creación de un programa es necesario seguir cinco pasos: Diseño del algoritmo. por ejemplo. Como una celda almacena un bit de información. La codificación del programa consiste en escribir el programa en algún lenguaje de programación. o sea.exe). 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 extensión . A continuación. La corrección de una falla normalmente requiere la repetición de los pasos comenzando desde el primero o el segundo. La última etapa es la eliminación de las fallas detectadas en el programa durante la fase de prueba. Un registro es un grupo de celdas binarias. La prueba del programa consiste en verificar que el programa funcione sin errores. creando diagramas esquemáticos utilizados para el mejor planteamiento de la solución. esto es. que haga lo que tiene que hacer. tomando como base la solución propuesta en el paso anterior. es decir que traduce el archivo fuente a lenguaje máquina (algunos compiladores también crean un archivo en ensamblador. Los registros se pueden clasificar de la siguiente forma: Registros de datos: . REGISTROS DEL CPU. cada uno de ellos de 16 bits (una palabra). En la etapa de diseño se plantea el problema a resolver y se propone la mejor solución. 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. tiene 14 registros internos. la prueba del programa y la depuración. El estado del registro es un número enésimo de unos o ceros con cada bit indicando el estado de una celda en el registro. un lenguaje similar al lenguaje máquina ya que posee las funciones básicas. Físicamente se podría pensar que el siguiente registro está compuesto de 16 celdas binarias. La traducción al lenguaje máquina es la creación del programa objeto. el compilador llama a un editor de vínculos (o ensamblador) que permite insertar los elementos adicionales (funciones y bibliotecas) a los que hace referencia el programa dentro del archivo final. de tal modo que el bit menos significativo es el bit 0. pero que no se almacenan en el archivo fuente.  Luego. Los bits están enumerados de derecha a izquierda. el programa escrito como una secuencia de ceros y unos que pueda ser interpretado por el procesador. su traducción a lenguaje máquina. con cada celda almacenando un 1 ó un 0. se desprende que un registro de n celdas puede almacenar cualquier cantidad discreta de información que contenga n bits. codificación del mismo. pero puede ser leído por los seres humanos. El compilador transforma el código fuente en código objeto y lo guarda en un archivo objeto.

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

y como enlazador utilizaremos el Turbo Link (TLINK). denominado fichero ejecutable. ES. como compilador utilizaremos el programa TurboAssembler (TASM). y utilizamos una dirección en un registro exclusivo para localizar cada segmento. por ejemplo DS:BX. de igual nombre y de extensión . El enlazador genera. dada por los registros DS. lo cual es.ASM. La extensión usada para que el TASM reconozca los programas fuente en ensamblador es . Segmento de pila: Los datos se direccionan mediante el registro segmento de pila y un registro de desplazamiento (SP o BP). si se divide la memoria de la PC en grupos o segmentos. El programa ensamblador generará un nuevo fichero. más memoria de la que veremos instalada en una PC.asm. CS: IP. por ejemplo SS:SP. Segundo un compilador que no es más que un programa que "traduce" el programa fuente a un programa objeto. una vez traducido el programa fuente. no sería posible accesar a más de 65536 localidades de memoria utilizando uno solo de estos registros. ESTRUCTURA Estas sentencias dirigen el proceso de compilación o construcción del programa ejecutable. este archivo contiene un "formato intermedio" del programa. Un programa consta de 4 tipos de segmentos.exe o . el tamaño de estos segmentos es de 64kb. El editor puede ser cualquier editor de textos que se tenga a la mano. llamado así porque aún no es ejecutable pero tampoco es ya un programa en lenguaje fuente. Este fichero tiene formato ASCII y contiene el código máquina de las instrucciones que componen el programa. . Para poder crear un programa se requieren varias herramientas: Primero un editor para crear el programa fuente.OBJ o la combinación de varios de estos archivos.EXE. Y tercero un enlazador (Linker). SS y CS. La arquitectura de los procesadores x86 obliga al uso de segmentos de memoria para manejar la información. nos es posible acceder a una cantidad de 4294967296 bytes de memoria. cuya extensión es . Segmento de datos: Los datos de direccionan mediante el registro de segmento de dato y un registro de desplazamiento (BX.SEGMENTOS Y REGISTROS ASOCIADOS. ahora.hex. El fichero fuente se compila utilizando el programa ensamblador. considerando que el tamaño máximo de un número que puede manejar el procesador está dado por una palabra de 16 bits o registro. el TASM crea un archivo con la extensión . a partir de un archivo . que genere el programa ejecutable a partir del programa objeto. Segmento extra: Igual que el de datos. Otros softwares empleados para la creación de programas son: MPLAB de Microchip y el PIC C compiler empleado en la programación de PICS. Este tipo de fichero tiene formato ASCII. y entonces cada dirección de una casilla específica la formamos con dos registros. Para que el ensamblador pueda manejar los datos es necesario que cada dato o instrucción se encuentren localizados en el área que corresponde a sus respectivos segmentos. La razón de ser de estos segmentos es que. un programa ejecutable. y dentro de dicho registro la dirección del dato específico. El ensamblador accede a esta información tomando en cuenta la localización del segmento. sustituyendo el registro de segmento. por ejemplo ES: BX. así como cierta información adicional para realizar la carga del programa en el simulador del computador elemental. Se recomienda que el fichero de código fuente tenga por extensión . en la actualidad. SOFTWARE EMPLEADO. El fichero creado con todas las sentencias que constituyen un programa se denomina fichero fuente. No generan código ejecutable. cada uno de 65536 localidades. Normalmente se utilizan para aumentar la legibilidad del código fuente. SI o DI). Cada segmento se direcciona mediante un determinado tipo de registro de segmento: Segmento código: Cada instrucción se direcciona mediante el registro segmento de código y el registro de desplazamiento IP. por ejemplo.OBJ.

Definición del código del programa INI: MOV R5. Definición de la pila .CODIGO . por lo que una instrucción no podrá ocupar más de una línea en el fichero fuente. Definición de constantes simbólicas ORIGEN 7F40h .PILA 100h . R4 … FIN TÉCNICAS DE CODIFICACIÓN. Cada una de las líneas del fichero puede contener una directiva. subrutinas y demás elementos se codifica de forma distinta de cómo se hace en otros lenguajes de alto nivel. Todos los ficheros fuente tienen que adecuarse a una estructura fija dividida en secciones. una instrucción o ambas cosas a la vez en los casos en quesea posible. BUCLES: Inicialización de un registro(a modo de contador) al nº de vueltas del bucle. En ensamblador los bucles. Ejemplo: Escala EQU 1000 . A continuación describiremos algunas técnicas útiles para codificar las estructuras más usuales. Etiqueta: Primera instrucción 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: Instrucción de comparación. El carácter separador de líneas es el retorno de carro. Definición de la etiqueta que marca la . Definición de los datos del programa Dato1 VALOR 12h … .DATOS .Estructura de un fichero en lenguaje ensamblador: Los ficheros de código fuente escritos en lenguaje ensamblador se organizan en líneas. Definición del origen de carga del programa INICIO int . condicionales. Primera instrucción a ejecutar del programa . Evalúa la condición y si se cumple saltar a la etiqueta prefijada <Instrucciones para el caso de no cumplirse la condición> saltar fuera del condicional MACROS: .

Esta línea es la llamada IRQ ("Interrupt ReQuest". petición de interrupción). Las interrupciones surgen de las necesidades que tienen los dispositivos periféricos de enviar información al procesador principal de un sistema de computación. no forma parte del programa. Este método presentaba el inconveniente de ser muy ineficiente. ya que el procesador constantemente consumía tiempo en realizar todas las instrucciones de sondeo. Un procesador principal que no tenga un controlador de interrupciones integrado. El controlador de interrupciones debe ser capaz de habilitar o inhibir líneas de interrupción (operación llamada comúnmente enmascarar por la utilización de una máscara). Luego de finalizada dicha subrutina. la cual. se reanuda la ejecución del programa. para pasar a ejecutar una subrutina de servicio de interrupción. La primera técnica que se empleó fue que el propio procesador se encargara de sondear (polling) los dispositivos cada cierto tiempo para averiguar si tenía pendiente alguna comunicación para él. y delegar en el dispositivo la responsabilidad de comunicarse con el procesador cuando lo necesitara. en este caso. También puede darse el caso de que una rutina de tratamiento de interrupción sea interrumpida para realizar otra rutina de tratamiento de una interrupción de mayor prioridad a la que se estaba ejecutando. y que puede estar integrado en el procesador principal o ser un circuito separado conectado al procesador principal. y establecer prioridades entre las distintas interrupciones habilitadas. por lo general. sino que queda a la espera de que estos le avisen (le "interrumpan") cuando tengan algo que comunicarle (ya sea un evento. A partir del número del IRQ busca en la tabla de vectores . Funcionamiento del mecanismo de interrupciones Cada dispositivo que desea comunicarse con el procesador por medio de interrupciones debe tener asignada una línea única capaz de avisar al CPU que le requiere para una operación. el procesador consulta los registros del controlador de interrupciones para averiguar cual IRQ hay que atender. etc. no sondea a ningún dispositivo. suele tener una única línea de interrupción llamada habitualmente INT. Las IRQ son líneas que llegan al controlador de interrupciones un componente de hardware dedicado a la gestión de las interrupciones. Sin embargo hay interrupciones que no se pueden enmascarar o deshabilitar. Cuando varias líneas de petición de interrupción se activan a la vez. Una interrupción es una suspensión temporal de la ejecución de un proceso. una condición de error. Esta línea es activada por el controlador de interrupciones cuando tiene una interrupción que servir. El procesador.Declaración: <nombre de la macro> MACRO <instrucciones de la macro> ENDM Llamada: <nombre de la macro> INTERRUPCIONES Interrupción (también conocida como interrupción de hardware o petición de interrupción) es una señal recibida por el procesador de un ordenador. Al activarse esta línea. una transferencia de información. las conocidas como interrupciones no enmascarables o NMI. indicando que debe "interrumpir" el curso de ejecución actual y pasar a ejecutar código específico para tratar esta situación. el controlador de interrupciones utilizará estas prioridades para escoger la interrupción sobre la que informará al procesador principal. El mecanismo de interrupciones fue la solución que permitió al procesador desentenderse de esta problemática.).

de interrupción la dirección de la rutina que debe llamar para atender una petición del dispositivo asociado a dicha IRQ. Terminar la ejecución de la instrucción de máquina en curso. Pasos para el procesamiento de una IRQ: 1. Normalmente son causadas al realizarse operaciones no permitidas tales como la división por 0. Traps. SALTOS CONDICIONALES Además de las instrucciones de salto incondicional se dispone de de instrucciones de salto condicional. etc. La CPU salta a la dirección donde está almacenada la rutina de servicio de interrupción (Interrupt Service Routine (ISR)) y ejecuta esa rutina que tiene como objetivo atender al dispositivo que generó la interrupción. Salva el valor de contador de programa. Una vez que la rutina de la interrupción termina. 4. Suelen ser de vital importancia ya que a partir de estas interrupciones se solicita al sistema operativo realizar determinadas funciones. esta instrucción simplemente carga la constante k en el contador de programa (PC). SALTOS La ejecución de los programas no suele ser lineal ejecutándose una lista de instrucciones una tras otras. en DOS se realiza la instrucción INT 0x21 y en Unix se utiliza INT 0x80 para hacer llamadas de sistema. 3. el procesador restaura el estado que había guardado en la pila en el paso 2 y retorna al programa que se estaba usando anteriormente. la nueva dirección de memoria de programa a partir de la cual comenzarán a leerse las instrucciones después de ejecutar la instrucción goto. Para generarla. Estas son asíncronas a la ejecución del procesador. que son aquéllas que producen un salto en función de que se cumpla o no una condición. de manera que en la CPU. IP. el acceso a una posición de memoria no permitida. En puntos determinados. Por ejemplo. suelen tener nemotécnicos tales como INT. 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 síncronas o asíncronas:    Interrupciones de hardware. se pueden producir en cualquier momento independientemente de lo que esté haciendo el CPU en ese momento. pueda seguir ejecutando el programa a partir de la última instrucción. el desbordamiento. Estas instrucciones son el único medio para realizar bifurcaciones en un programas. La constante literal “k” es la dirección de destino del salto. al terminar el proceso. Tipos de interrupciones En este subapartado vamos a hacer una clasificación de las distintas clases de interrupciones que nos podemos encontrar atendiendo a la fuente que las produce. SALTO INCONDICIONAL. Las causas que lo producen son externas al procesador y a menudo suelen estar ligadas con distintos dispositivos de E/S. Las interrupciones por software son generadas por el programa en ejecución. 2. para ello. Interrupciones por software. esta secuencia tiene que romperse por una toma de decisión o por cualquier otro motivo. . es decir. En casi todos los programas se usa la instrucción de salto incondicional <goto k> que produce un salto a la dirección del programa indicada por “k”. existen distintas instrucciones en el código máquina que permiten al programador producir una interrupción. Así pues. en la pila. es decir. En este caso nos referiremos a las instrucciones de salto que posee el microcontrolador PIC16F84A. Las rutinas de interrupción generalmente toman un pequeño tiempo de ejecución.

Estas instrucciones podrían categorizarse dentro del grupo de instrucciones aritméticas ya que efectivamente operan de forma aritmética (decrementando o incrementando) sobre los registros.El repertorio de instrucciones del PIC16F84 incluye cuatro instrucciones de salto condicional clasificadas en dos grupos:   Aquéllas que pueden producir el salto en función del estado de un bit. skip if Set). skip if clear). Instrucción “btfss f.   Si el bit número ‘b’ del registro ‘f’ es “0” la instrucción que sigue a ésta se ejecuta normalmente. Si el bit número ‘b’ del registro ‘f’ es “1” la instrucción que sigue a ésta se ignora y se salta. Si el bit número ‘b’ del registro ‘f’ es “0” la instrucción que sigue a ésta se ignora y se salta. Pero.b” (Bit test f. Saltos en función de un BIT.d” . Son btfsc y btfss.b” (Bit test f. SALTOS EN FUNCIÓN DE UN REGISTRO Las instrucciones de salto condicional “decfsz” e “incfsz” pueden producir el salto en función del contenido de un registro distinto de cero y son casos especiales de las instrucciones de incremento y decremento de un registro. Esta instrucción actúa de forma contraria a la instrucción anterior. Son decfsz y incfsz. a diferencia de las otras. Aquéllas que pueden producir el salto en función del contenido de un registro distinto de cero. además pueden alterar el flujo lineal del programa y por eso se las incluye en este grupo. Hay dos instrucciones de este tipo: Instrucción “btfsc f. Esta instrucción puede actuar de dos formas:   Si el bit número ‘b’ del registro ‘f’ es “1” la instrucción que sigue a ésta se ejecuta normalmente. Son muy poderosos ya que permiten al programa tomar decisiones en función del estado de un bit de cualquier registro o puerto de entrada/salida. Su forma de actuar se describe a continuación: Instrucción “decfsz f.

Si el resultado es cero la instrucción que sigue a esta se ignora y se salta. Después de incrementar. . CICLOS. Estos son fragmentos de programa que se repiten un número finito de veces. Después de decrementar. pueden ocurrir dos casos:   Si el resultado es distinto de cero la instrucción que sigue a ésta se ejecuta normalmente. pueden ocurrir dos casos:   Si el resultado es distinto de cero la instrucción que sigue a ésta se ejecuta normalmente. Esta instrucción incrementa en una unidad el contenido del registro ‘f’.(Decrement f. Los principales tipos están descritos en la siguiente figura. Si el resultado es cero (porque al incrementarse se ha desbordado y ha pasado del número b’11111111’ al b’00000000’) la instrucción que sigue a esta se ignora y se salta. Skip if 0). Skip if 0). LAZOS O BUCLES. Una aplicación muy importante de los saltos condicionales son los lazos o bucles. Almacena el resultado en W si ‘d’ = 0 (en cuyo caso ‘f’ no varía) y en el registro ‘f’ si ‘d’ = 1.d” (Increment f. Almacena el resultado en W si ‘d’ = 0 (en cuyo caso ‘f’ no varía) y en el registro ‘f’ si ‘d’ = 1. Instrucción “incfsz f. Esta instrucción decrementa en una unidad el contenido del registro ‘f’.

Lazo que se repite un número conocido de veces. para el diseño de lazos de instrucciones que deben repetirse una cantidad determinada de veces. escribir código repetido. el lenguaje ensamblador ofrece además. PROCEDIMIENTOS O SUBRUTINAS Como sabemos. Como se ha mencionado anteriormente. Se hace de manera tal que un registro se decrementa o incrementa hasta que tome un determinado valor. sin posibilidad de tomar otro camino. Es un salto incondicional a una posición anterior del programa conformando un lazo de repetición infinita. evitándonos por tanto. que podrán ser llamadas posteriormente desde cualquier parte del programa principal e incluso desde otra subrutina. Utiliza la instrucción goto. si se conoce el número de veces que se repite el bucle. Las instrucciones decfsz e incfsz se utilizan generalmente en combinación con una instrucción de salto goto. De esta forma el programa completo estará constituido esencialmente por una serie de pequeños programas llamados subrutinas. las subrutinas llevarán el encabezamiento propio de un programa y requerirán el estudio detallado de todas las condiciones en que pueden ser ejecutadas. es decir. En este caso. mediante la instrucción CALL. que pueden ser llamadas en repetidas ocasiones. Por esto. pero no se puede precisar el número de veces que se repite. las subrutinas son pequeños programas y como tal debemos aportar a cada una de ellas la documentación o información suficiente para que puedan ser tratadas independientemente. Ejemplo: Lazo con condición de testeo. Se utiliza una instrucción de testeo para controlar la ejecución del bucle. la estructura inicial de toda subrutina será: . Para este caso la repetición de lazo es finita. e incluso puedan ser empleadas en programas distintos.Lazo de repetición finita. denominadas subrutinas. la posibilidad de crear partes del programa independientes.

. Es importante tener en cuenta el orden en que se situaron dichos parámetros para no cometer errores en el tratamiento de los datos. es decir. 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 proporcionándole unos datos de entrada que llamaremos “parámetros de entrada” y después de ser ejecutada nos proporciona uno o más resultados. nos devolverá los resultados en las mismas posiciones de . Se almacenarán en ellos los datos que precise la subrutina para desarrollar su función y una vez ejecutada la subrutina. que llevará al principio una etiqueta con el nombre de la subrutina. CZ LABEL. Debemos recordar que además de la llamada CALL a subrutinas.A continuación comenzará el cuerpo de la subrutina propiamente dicho. disponemos también de otro tipo de llamadas a subrutinas con condiciones como CC LABEL. A continuación de la etiqueta se sitúan las instrucciones que componen la subrutina y finalmente es imprescindible concluir la subrutina con una instrucción RET que devuelve el control del programa a la posición desde donde se efectuó la llamada CALL a subrutina. todos los parámetros que necesite la subrutina para desarrollar su función. CNC LABEL. Este método está limitado por el bajo número de registros de que disponemos en el microprocesador 8085. Normalmente el nombre asignado a las subrutinas es suficientemente significativo como para darnos una idea o sugerir la función que desarrollarán las mismas. Empleo de memoria RAM.Su empleo está basado en la utilización de los registros del microprocesador libres para su uso en ese momento. etc. Además se producen modificaciones en el contenido de los registros que deben ser tenidas en cuenta y en caso de que no nos interese modificarlos. nos devolverá los resultados en los registros precisos. el parámetro que deberemos especificar en la instrucción de llamada a subrutina CALL. En definitiva. Hay varias formas de comunicarse con las subrutinas pasando y recibiendo datos. la cual busca en la RAM los parámetros introducidos para trabajar con ellos. Ejecutadas las tareas precisas por parte de la subrutina. tendremos que guardar previamente su contenido en la pila y recuperarlo al finalizar la subrutina.. A continuación se llama a la subrutina. entre las que podemos destacar: El empleo de registros. (dependiendo del microprocesador o microcontrolador usado) que efectuarán la llamada a la subrutina cuyo nombre venga especificado en LABEL si se cumple la condición que lleva implícita la instrucción que en cada caso se emplee.En este caso el programa debe colocar en posiciones consecutivas de la memoria RAM del sistema.

El programa principal buscará ahora los resultados en la RAM para proseguir con su desarrollo normal. 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 INSTRUCCIÓN MOV Mov es una instrucción en el lenguaje ensamblador de la mayoría de procesadores. ya sea un registro del procesador o una posición de memoria. No se puede mover una constante directamente a un registro de segmentos. seguido del destino de los datos. primero se debe mover a un registro de la UCP. de forma absoluta. es necesario primero mover los datos de la localidad origen hacia un registro y luego del registro a la localidad destino. En la sintaxis at&t de ensamblador la sintaxis sería distinta: "mov fuente. desde un origen a un destino. de registro a registro. Sintaxis La sintaxis en ensamblador es variable en dependencia del procesador utilizado. fuente" La instrucción mov. La sintaxis de mov se describe de la siguiente manera en los procesadoresx86 y compatibles: "mov destino. destino" .memoria en que le pasamos los datos. de un registro a una pila. sin que el dato desaparezca del origen. en el CPU. transmitir datos hacia dispositivos externos así como recibir datos de dichos dispositivos. amd y sparc entre muchos otros. "mover datos" significa en realidad copiar datos. una coma que actúa como separador y a continuación. No es posible mover datos de una localidad de memoria a otra directamente. cuyo propósito es la transferencia de datos entre registros de procesador o registro y memoria. Aunque la instrucción se llama "mover". existen diversas formas de hacer esto: puede copiar datos de la memoria a algún registro. de la pila a un registro. la fuente de los datos o lo datos en sí. Implementaciones Está disponible en procesadores intel pentium. una instrucción de ensamblador básica en cualquier procesador. como por ejemplo mover el número 10 a un registro del procesador. Adicionalmente mov también permite el uso de datos absolutos. Este movimiento de datos está sujeto a reglas y restricciones. es a la práctica. Algunas de ellas son lasque se citan a continuación. MOVIMIENTO DE LOS DATOS En todo programa es necesario mover datos en la memoria y en los registros de la UCP.

y a continuación y también separado por una coma. La mayoría de la lógica usada para escribir programas en lenguaje ensamblador se basa en las operaciones aritméticas y/o lógicas que se realicen entre los registros. Las instrucciones aritmético y/o lógicas. Las demás instrucciones tiene el mismo comportamiento que ADD. OPERACIONES LÓGICAS Y ARITMÉTICAS.En este caso. la fuente va en primer lugar. Por ejemplo para el 8085 tenemos las siguientes instrucciones lógicas y aritméticas: . permiten realizar operaciones entre registros. se especifica el destino de los datos. El resultado de la operación se almacena en el registro destino. Por ejemplo la instrucción ADD Rd. a diferencia solo de los parámetros que puedan tener.Rr realiza la suma entre el registro fuente Rd y el registro destino Rr.

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

Sign up to vote on this title
UsefulNot useful