ensamblador

14
UNIDAD III “ENSAMBLADORES” ¿De dónde viene la denominación de ensamblador? Es una consecuencia natural del desarrollo histórico de la programación, al aumentar el tamaño de los programas y el número de subrutinas de biblioteca disponibles. Un programador, que tiene que codificar un programa muy largo, normalmente lo descompone, lo divide en un número más o menos grande de subprogramas o rutinas -independientes o no- los escribe, los traduce y los prueba por separado. Por consiguiente, el traductor debe seguir la pista de todas las referencias cruzadas entre los diversos subprogramas y subrutinas con el fin de generar un programa que esté en condiciones de ser procesado; es decir, debe estar en condiciones de ensamblar (unir) todas las partes para dar un resultado único; y de ahí viene el nombre de ensamblador. ¿Que es ensamblador y para que sirve? Cuando se empezaron a utilizar símbolos nmotécnicos, se escribieron programas para traducir automáticamente los programas escritos en lenguaje ensamblador a lenguaje máquina. A estos programas traductores se les llamo ensambladores . La entrada para un ensamblador es un programa fuente escrito en lenguaje ensamblador. La salida es un programa objeto , escrito en lenguaje de máquina. El programa objeto incluye también la información necesaria para que el cargador pueda preparar el programa objeto para su ejecución. De aquí en adelante llamaremos lenguaje ensamblador al conjunto de nemotécnicos y a las reglas para su manejo. Al programa que traduce un programa objeto a partir de un programa escrito en lenguaje ensamblador lo llamaremos ensamblador . Motivos para utilizarlo: Rapidez: Como el programador directamente selecciona las instrucciones que se ejecutan en el programa, el programa final queda mas optimizado que un programa generado por un compilador. Mayor control de la computadora: Un programa puede accesar directamente cualquier componente y periférico de la computadora. Independencia del lenguaje: No depende de librerías o del lenguaje mismo para realizar una tarea especifica. Lenguajes como el Basic limitan al programador a lo que el lenguaje puede hacer. La mayoría de las computadoras pueden ensamblar: Los recursos necesarios para ensamblar un programa son mucho menores que los compiladores o interpretes. El ensamblador generalmente es más rápido ensamblando un programa que un compilador generando un archivo ejecutable.

Upload: arturo-castellanos

Post on 08-Dec-2015

12 views

Category:

Documents


4 download

DESCRIPTION

tipos de ensamblador

TRANSCRIPT

Page 1: ensamblador

UNIDAD III “ENSAMBLADORES”

¿De dónde viene la denominación de ensamblador?

Es una consecuencia natural del desarrollo histórico de la programación, al aumentar el

tamaño de los programas y el número de subrutinas de biblioteca disponibles. Un

programador, que tiene que codificar un programa muy largo, normalmente lo descompone,

lo divide en un número más o menos grande de subprogramas o rutinas -independientes o

no- los escribe, los traduce y los prueba por separado. Por consiguiente, el traductor debe

seguir la pista de todas las referencias cruzadas entre los diversos subprogramas y

subrutinas con el fin de generar un programa que esté en condiciones de ser procesado; es

decir, debe estar en condiciones de ensamblar (unir) todas las partes para dar un resultado

único; y de ahí viene el nombre de ensamblador.

¿Que es ensamblador y para que sirve?

Cuando se empezaron a utilizar símbolos nmotécnicos, se escribieron programas para

traducir automáticamente los programas escritos en lenguaje ensamblador a lenguaje

máquina. A estos programas traductores se les llamo ensambladores .

La entrada para un ensamblador es un programa fuente escrito en lenguaje ensamblador.

La salida es un programa objeto , escrito en lenguaje de máquina. El programa objeto

incluye también la información necesaria para que el cargador pueda preparar el programa

objeto para su ejecución.

De aquí en adelante llamaremos lenguaje ensamblador al conjunto de nemotécnicos y a

las reglas para su manejo. Al programa que traduce un programa objeto a partir de un

programa escrito en lenguaje ensamblador lo llamaremos ensamblador .

Motivos para utilizarlo:

• Rapidez: Como el programador directamente selecciona las instrucciones que se ejecutan

en el programa, el programa final queda mas optimizado que un programa generado por un

compilador.

• Mayor control de la computadora: Un programa puede accesar directamente cualquier

componente y periférico de la computadora.

• Independencia del lenguaje: No depende de librerías o del lenguaje mismo para realizar

una tarea especifica. Lenguajes como el Basic limitan al programador a lo que el lenguaje

puede hacer.

• La mayoría de las computadoras pueden ensamblar: Los recursos necesarios para

ensamblar un programa son mucho menores que los compiladores o interpretes. El

ensamblador generalmente es más rápido ensamblando un programa que un compilador

generando un archivo ejecutable.

Page 2: ensamblador

Motivos para no utilizarlo:

• Dependencia del hardware: El código se hace en extremo dependiente del

microprocesador, de los dispositivos, de los controladores, etc.

• Mayor tiempo de codificación: El numero de líneas de un programa hecho en

ensamblador es mayor a uno hecho en un lenguaje de alto nivel (por ejemplo: Función en C

puede realizar varias decenas o centenas de instrucciones del microprocesador).

• Comprensión mas profunda de la computadora: Entender un lenguaje de alto nivel es

generalmente más sencillo que el ensamblador. Comprender ensamblador requiere

conocimientos más exactos sobre el funcionamiento interno de la computadora.

• Errores mas frecuentes en el programa: El evitar un error o encontrar alguno que ya

exista es difícil. Las herramientas para este caso (como el CodeView y el TurboDebbuger)

ayudan en gran medida a ver lo que esta ocurriendo en la maquina, pero no localizan los

errores.

Entonces, cuando utilizo ensamblador y cuando no?

Depende del programa a desarrollar. Si el programa debe controlar en gran medida los

componentes internos de la computadora o debe ser lo suficientemente veloz, entonces es

recomendable utilizarlo. Si se requiere un sistema grande y no se dispone de mucho tiempo

para entregarlo, entonces es mejor juntar un lenguaje de alto nivel con ensamblador (las

funciones básicas del programa realizarlas en ensamblador, y el programa en general

codificarlo con el lenguaje de alto nivel).

EL NIVEL DEL LENGUAJE ENSAMBLADOR

Vistos a muy bajo nivel, los microprocesadores procesan exclusivamente señales

electrónicas binarias. Dar una instrucción a un microprocesador supone en realidad enviar

series de unos y ceros espaciadas en el tiempo de una forma determinada. Esta secuencia de

señales se denomina código máquina. El código representa normalmente datos y números e

instrucciones para manipularlos. Un modo más fácil de comprender el código máquina es

dando a cada instrucción un mnemónico, como por ejemplo STORE, ADD o JUMP. Esta

abstracción da como resultado el ensamblador, un lenguaje de muy bajo nivel que es

específico de cada microprocesador.

Los lenguajes de bajo nivel permiten crear programas muy rápidos, pero que son a menudo

difíciles de aprender. Más importante es el hecho de que los programas escritos en un bajo

nivel son prácticamente específicos para cada procesador. Si se quiere ejecutar el programa

en otra máquina con otra tecnología, será necesario reescribir el programa desde el

principio.

Lenguaje ensamblador, Uno de los métodos inventados por los programadores para

reducir y simplificar el proceso es la denominada programación con lenguaje ensamblador.

Al asignar un código mnemotécnico (por lo general de tres letras) a cada comando en

lenguaje máquina, es posible escribir y depurar o eliminar los errores lógicos y de datos en

los programas escritos en lenguaje ensamblador, empleando para ello sólo una fracción del

tiempo necesario para programar en lenguaje máquina. En el lenguaje ensamblador, cada

comando mnemotécnico y sus operadores simbólicos equivalen a una instrucción de

Page 3: ensamblador

máquina. Un programa ensamblador traduce el código fuente, una lista de códigos de

operación mnemotécnicos y de operadores simbólicos, a código objeto (es decir, a lenguaje

máquina) y, a continuación, ejecuta el programa. Sin embargo, el lenguaje ensamblador

puede utilizarse con un solo tipo de chip de CPU o microprocesador. Los programadores,

que dedicaron tanto tiempo y esfuerzo al aprendizaje de la programación de un ordenador,

se veían obligados a aprender un nuevo estilo de programación cada vez que trabajaban con

otra máquina. Lo que se necesitaba era un método abreviado en el que un enunciado

simbólico pudiera representar una secuencia de numerosas instrucciones en lenguaje

máquina, y un método que permitiera que el mismo programa pudiera ejecutarse en varios

tipos de máquinas. Estas necesidades llevaron al desarrollo de lenguajes de alto nivel.

Características del lenguaje ensamblador:

1. Las direcciones son simbólicas.

2. Traducción de las instrucciones en lenguaje ensamblador a lenguaje máquina de una

en una.

3. Existen unas instrucciones no traducibles a código máquina llamadas pseudo

instrucciones. Sirven para el control del programa.

• FUNCIONES DE UN ENSAMBLADOR

Un ensamblador es un programa que toma un programa fuente escrito en lenguaje de

ensamblador y lo traduce a lenguaje de máquina. Este último lenguaje es el conjunto de

información binaria que interpreta el procesador.

Un ensamblador procesa un programa, en el cual las instrucciones reflejan la estructura

interna de la computadora y permiten al programador referirse directamente a

acumuladores, direcciones, códigos de función, etc.

Un ensamblador debe trabajar con tres tipos de información en el programa fuente:

Información que no va a depender del lugar en que se almacene el subprograma en

la memoria, como pueden ser los códigos de operación y las constantes numéricas.

Por consiguiente, su traducción es independiente de si el subprograma está

encadenado con otros o no. Son las llamadas cantidades absolutas.

Información a la que se hace referencia o que se define en otros subprogramas. El

valor de estos símbolos no puede ser conocido hasta que todo el programa sea

enlazado. Son los llamados valores (cantidades o variables) globales o externas.

Y, por último, información que sólo es definida o referenciada en ese subprograma

y, por consiguiente, su dirección absoluta de almacenamiento en memoria

dependerá de la posición del subprograma, que será independiente de la

combinación con otros subprogramas. Basta conocer la dirección de inicio del

subprograma para, añadiéndosela a la dirección relativa, obtener la dirección

absoluta. Esta información se denomina localizable (variables locales o internas).

Page 4: ensamblador

Funciones de un ensamblador:

La función principal del ensamblador es: Traducir el código fuente (instrucciones

nemonicas a código máquina). Este código generado recibe el nombre de codigo objeto.

Para efectuar la traducción de código fuente a código objeto es necesario realizar las

siguientes funciones:

• Conversión de las constantes a datos especificos en el programa fuente a sus

representaciones internas de maquina.

• Conversión de operandos simbolicos y sus direcciones de maquina equivalentes.

• Conversión de código de operaciones a nemonicos a lenguaje maquina.

• Construcción de las instrucciones de maquina en un formato adecuado.

• Escritura de un programa objeto y listado ensamblado.

Para obtener el verdadero programa objeto del procesador de la computadora, es necesario

encadenar todos los subprogramas entre si y con las subrutinas de biblioteca que sean

precisas. Esta fusión es realizada por un programa de servicio que recibe varios nombres:

Editor de encadenamiento, cargador, introductor o montador de enlaces.

• TIPOS DE ENSAMBLADORES

Se pueden hacer varios tipos de ensambladores, con las anteriores características básicas,

según el tipo de máquina y de la potencia del lenguaje ensamblador deseado.

En definitiva, el ensamblador empleado dependerá de que en las instrucciones se emplee

uno o varios operandos, de que existan uno o varios tipos de direccionamiento, etc. La

potencia de un ensamblador se mide por las pseudo instrucciones que contenga.

Aunque todos los ensambladores realizan básicamente las mismas tareas, podemos

clasificarlos de acuerdo a características.

Clasificación de los ensambladores:

Ensambladores Cruzados (Cross-Assembler): Se denominan así 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. El empleo de este tipo

de traductores permite aprovechar el soporte de medios físicos (discos, impresoras,

pantallas, etc.), y de programación que ofrecen las máquinas potentes para desarrollar

programas que luego los van a ejecutar sistemas muy especializados en determinados tipos

de tareas.

Ensambladores Residentes: Son aquellos que permanecen en la memoria principal de la

computadora y cargan, para su ejecución, al programa objeto producido. Este tipo de

ensamblador tiene la ventaja de que se puede comprobar inmediatamente el programa sin

necesidad de transportarlo de un lugar a otro, como se hacía en cross-assembler, y sin

necesidad de programas simuladores.

Page 5: ensamblador

Sin embargo, puede presentar problemas de espacio de memoria, ya que el traductor ocupa

espacio que no puede ser utilizado por el programador. Asimismo, también ocupará

memoria el programa fuente y el programa objeto. Esto obliga a tener un espacio de

memoria relativamente amplio. Es el indicado para desarrollos de pequeños sistemas de

control y sencillos automatismo empleando microprocesadores.

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.

Microensambladores: Generalmente, los procesadores utilizados en las computadoras

tienen un repertorio fijo de instrucciones, es decir, que el intérprete de las mismas

interpretaba de igual forma un determinado código de operación.

El programa que indica al intérprete de instrucciones de la UCP cómo debe actuar se

denomina microprograma. El programa que ayuda a realizar este microprograma se llama

microensamblador. Existen procesadores que permiten la modificación de sus

microprogramas, para lo cual se utilizan microensambladores.

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 variar la complejidad de los

mismos, dependiendo de las posibilidades de definición y manipulación de las

macroinstrucciones, pero normalmente son programas bastantes complejos, por lo que

suelen ser ensambladores residentes.

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. También va construyendo la tabla de símbolos a medida

que van apareciendo las definiciones de variables, etiquetas, etc.

Debido a su forma de traducción, estos ensambladores obligan a definir los símbolos antes

de ser empleados para que, cuando aparezca una referencia a un determinado símbolo en

una instrucción, se conozca la dirección de dicho símbolo 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: Los ensambladores de dos fases se denominan así debido a

que realizan la traducción en dos etapas. En la primera fase, leen el programa fuente y

construyen una tabla de símbolos ; 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

símbolos utilizados y las posiciones que se les ha asignado. Estos ensambladores son los

más utilizados en la actualidad.

La tabla de símbolos es un conjunto de pares ordenados ( Si , Ti ) en los que el primer

elemento Si es un símbolo y el segundo Ti el valor asociado, es decir la traducción

correspondiente.

Se puede considerar una tabla de símbolos posibles, en un conjunto T , de los códigos de

operación y direcciones binarias.

Page 6: ensamblador

En general, en las tablas de símbolos llevan un número fijo de caracteres, que se completan

con espacios en blanco si es necesario. Como es natural, las tecnicas de construcción y

consultas de tablas tienen que ser diferentes en cada caso.

• EL PROCESO DE ENSAMBLE DE UNO, DOS O MAS PASOS

Como se vio en la sección anterior, existen ensambladores que realizan su tarea en una o

más fases o pasos.

El proceso de ensamble de un paso consiste en leer una línea de programa fuente y

traducirla a lenguaje máquina cuando se trata de una instrucción, o se ejecuta si es una

pseudoinstrucción.

La tabla de símbolos se va construyendo a medida que se avanza en la lectura de las líneas

del programa fuente.

Para que el ensamble de un paso funciones, todos los símbolos deben estar definidos antes

de emplearse. Esto debido a que, para traducir correctamente cada instrucción, se debe

conocer la dirección de cada uno de los símbolos que intervienen en ella. En otras palabras,

no pueden quedar referencias pendientes porque ya no habrá otra oportunidad de

resolverlas.

Tampoco podrán hacerse saltos hacia líneas posteriores. No es posible saltar hacia una línea

cuya etiqueta todavía no ha sido definida.

Para resolver el problema que presenta el proceso de ensamble de un paso, se utiliza el

proceso de ensamble de dos pasos o fases. En la primera fase, se lee el programa fuente y se

construye la tabla de símbolos.

En la segunda fase, se vuelve a leer el programa fuente y se traduce totalmente ya que se

conoce la totalidad de los símbolos utilizados (incluyendo las etiquetas) y las posiciones de

memoria que se les han asignado. Como ya se conocen las direcciones de las etiquetas

utilizadas, pueden realizarse saltos hacia adelante.

ENSAMBLADORES DE UN PASO

La evolución de la programación ha ido variando la estructura de los ensambladores

haciéndolos cada vez más complejos. Los más sencillos son los llamados en inglés Ioad-

and-go, que se puede traducir por ensambladores sobre la marcha, ya que aceptan un

programa en forma simbólica; y en cuanto entra, lo ensambla en binario en la memoria,

generalmente, mediante una exploración (scan) del programa fuente. En este caso se

obtienen los ensambladores de un paso.

Los ensambladores de un paso pueden ser de dos tipos diferentes, según que la salida

generada esté en binario o en simbólico-binario.

Page 7: ensamblador

Los ensambladores que generan una salida en binario, llamados en la ingles de tipo

load and go, suelen ser utilizados para programas pequeños (que son

frecuentemente modificados) o para máquinas pequeñas sin memorias auxiliares, en

los cuales el hecho de leer dos veces el programa por cinta de papel o por máquina

de escribir supondría una gran pérdida de tiempo. El principal problema de estos

ensambladores es la necesidad de usar los símbolos antes de definirlos. Se utiliza,

por ello, una técnica parecida a la del editor de encadenamiento: Si a un símbolo se

le menciona, pero no está definido, se le introduce en una tabla que almacena todas

las presencias del símbolo. En el momento en que se define, se vuelve atrás y se

rellenan todas las referencias con el valor correspondiente. El resto de la técnica es

análoga a la de los ensambladores de dos pasos.

En los ensambladores que producen una salida simbólico-binaria, suele requerirse

que todos los nombres de datos se definan en cabeza, por lo que sólo queda el

problema de símbolos no definidos para las instrucciones de bifurcación. El resto es

análogo a los del tipo load and go, aunque la salida no es procesable directamente,

sino que necesita un cargador.

La mayor dificultad de este tipo de ensambladores aparece cuando hay operandos cuyos

símbolos son expresiones aritméticas, en las que todavía no se han definido sus símbolos

constituyentes.

En las bifurcaciones hacia adelante debe dejar una indicación de que el cargador ha de

completar estas instrucciones. Se crea una tabla de referencia hacia adelante.

ENSAMBLADORES DE DOS PASOS

Las ventajas de dividir un programa en subprogramas son grandes. A parte de poder

trabajar con unidades independientes, cuando hay que cambiar o corregir un programa

basta con reprogramar y ensamblar de nuevo los subprogramas o rutinas afectados por el

cambio. Este método aumenta la eficacia del ensamblador, ya que el tiempo de proceso de

las referencias cruzadas o parámetros de ensamblaje es prácticamente proporcional al

cuadrado del número de instrucciones del programa; por consiguiente, al dividir el

programa en partes, se consigue una reducción importante en el tiempo de ensamblaje. A

los ensambladores que pueden realizar la incorporación automática de subrutinas de

bibliotecas y el enlazamiento de las diversas partes de un programa se les denomina

ensambladores de rutinas o de subprogramas. Este tipo de ensambladores suele trabajar en

dos pasos, es decir, haciendo dos exploraciones del programa fuente: En el primer paso,

construyen la tabla de símbolos y acumulan todas las definiciones de símbolos que se

encuentran en la rutina para efectuar la traducción en el segundo paso. Las rutinas

ensambladas se suelen almacenar en un medio externo (cinta magnética, discos, tarjetas,

etc.).

EL PRIMER PASO:

Durante el primer paso, la principal tarea del ensamblador es extraer del programa fuente

todas las definiciones de símbolos y crear las correspondientes tablas. Para ello, como ya se

Page 8: ensamblador

ha visto, procede a analizar las cadenas de entrada para convertirlas en un conjunto de

campos y buscarlos o añadirlos a la tabla correspondiente. En esta fase se suele efectuar un

análisis sintáctico de las sentencias del programa fuente, con el fin de poder detectar

posibles errores. Este análisis lo realiza una subrutina cuya estructura es muy variable,

puesto que las sentencias de entrada, que dependen del lenguaje de que se trate, tienen muy

diversas estructuras: formato y longitud fijos, formato variable y longitud fija o formato y

longitud variable, aparte de que el número de operandos y expresiones permitidas varían

desde un mínimo de dos campos a cuatro o cinco por término medio.

Algoritmo para el primer paso

En el caso de la pseudo-instrucción se bifurca a la subrutina correspondiente para efectuar

las acciones de control que sean adecuadas a cada caso; en particular, cuando se detecta la

de fin de programa, el efecto es inicializar la rutina de post-análisis, completar las tablas de

símbolos y dar paso a la segunda fase.

La definición de los símbolos depende del tipo de instrucción en la que aparezcan. La más

sencilla se manifiesta cuando se define por una etiqueta, pues automáticamente el contador

de direcciones refleja la dirección relativa del símbolo.

En las tablas se almacena el símbolo, el valor -si se puede determinar en ese momento- y un

identificador de tipo del símbolo cuya utilidad se comprenderá al estudiar el fin del paso 1.

El primer paso de un ensamblador tiene por misión principal la del análisis de las

sentencias o instrucciones. Un esquema de las etapas del primer paso es el siguiente:

PRIMER PASO

Leer sentencia o instrucción.

Analizar sentencia o instrucción.

• Tratamiento de etiquetas.

• Buscar en tabla de símbolos (si no está, pasar al siguiente paso).

• Insertar en tabla de símbolos.

• Tratamiento de código de operación.

• Buscar en tabla de código de operación y actualizar campo de dirección.

• Escribir código de operación.

• Buscar en tabla de pseudo- instrucciones y hacer el tratamiento de la pseudo-instrucción.

• Análisis del operando (en caso de la creación de un código intermedio).

• Almacenar en tabla de símbolos.

• Buscar en tabla de símbolos.

• Sustituir por dirección en tabla de símbolos.

Page 9: ensamblador

Al finalizar el paso uno, entra en juego una subrutina postanalizadora que, según el tipo de

indicador asociado a cada símbolo en las tablas, completa los valores. Así, si este indicador

era de definición por etiqueta, respeta el valor almacenado; si era definición por pseudo-

instrucción, evalúa las correspondientes cadenas de equivalencia; o si era de indefinición, le

da una dirección que haya quedado libre de acuerdo con la estrategia del ensamblador,

siempre que no se trate de una variable externa.

EL SEGUNDO PASO:

El objetivo de este paso es obtener una visión semicompilada (simbólica-binaria del

programa o rutina que se está ensamblando), además de las tablas de uso para el cargador y

la información necesaria para la localización de las variables.

Para ello vuelve a leer el programa fuente, bien de un medio exterior (cinta de papel,

tarjetas) o, lo más usual, de una cinta o disco magnético. Al leer una instrucción, ignora la

etiqueta que ya fue completamente procesada en el primer paso. El código de operación es

traducido de acuerdo con la tabla correspondiente o se genera la bifurcación a la subrutina

correspondiente, sí se trataba de un código de pseudo-instrucción. Determina si las

cantidades y direcciones se encuentran en modo absoluto, localizable o todavía

indeterminada (variables externas), efectuando los cálculos o evaluaciones necesarios y

generando los valores binarios correspondientes, con indicación para la posterior

localización si fuese necesaria.

La salida de esta fase y, por consiguiente, del ensamblaje depende del editor de

encadenamiento, aunque un formato típico es el siguiente:

Nombre de la rutina, subprograma o programa.

Sección binaria con el programa en forma semicompilada y con la información

necesaria para la localización.

Tabla de definición, con los símbolos globales definidos en la rutina.

Tabla de uso, que detalla el uso de los símbolos globales.

Esta última tabla es muy compleja, puesto que registra todas las apariciones de los símbolos

externos, al depender de las posibilidades del ensamblador correspondiente. Si se permite la

multiplicación de estos símbolos globales, hay que generar también una tabla de uso para el

producto.

Las tablas de uso son necesarias para la fase siguiente del encadenamiento de las diversas

rutinas.

En el caso más sencillo -que es cuando se canalizan todas las variables globales a través de

un área común (COMMON)- se almacena en la tabla, para cada símbolo, el lugar o lugares

de la rutina en que ha sido usada. Cuando el valor del símbolo es determinado, el editor de

encadenamiento puede colocarlo en sus lugares correctos.

Al acabar el ensamblaje -o simultáneamente a él en otros casos- se produce un listado con

el programa fuente, incluidos: Los comentarios, el programa objeto, las tablas de símbolos

Page 10: ensamblador

con sus valores y los errores detectados con sus diagnósticos. El formato y características

particulares de este listado depende del lenguaje utilizado.

SEGUNDO PASO

Lectura del programa de memoria secundaria.

Tratamiento de sentencias o instrucciones. En el primer paso sólo se analizaban las

sentencias para ver si eran correctas.

• Tratamiento del código de operación (SEGUNDO PASO). En el primer paso el código

de operación se trataba simplemente para ver si era correcto o no.

• Buscar en tabla de código de operación. Obtener código de máquina y su longitud.

o Actualizar contador de direcciones.

o Buscar tabla de pseudo-instrucción (si es símbolo). Tratar la pseudo-

instrucción.

• Tratamiento del operando.

o Buscar en tabla de símbolo (si es símbolo). Obtener la dirección.

o Obtener valor (si no es símbolo se obtiene la dirección directamente).

• Escribir código objeto

• LITERALES Y EXPRESIONES

En computación, las literales son mecanismos mediante los cuales se reservan espacios de

memoria para guardar valores de cierto tipo. Generalmente, el término literal se asocia un

símbolo para representar la dirección del primer byte de espacio asignado. En el espacio

asignado se pueden almacenar valores constantes o variables.

Las expresiones son combinaciones de literales y operadores. En lenguaje ensamblador las

expresiones involucran valores constantes y operadores. Los resultados se almacenan como

constantes ya que los cálculos ocurren durante el ensamble, no durante la ejecución. Los

operadores que se utilizan en las expresiones de lenguaje ensamblador no tienen ningún

efecto en tiempo de ejecución del programa ensamblado. No debe confundirse el manejo de

expresiones en lenguaje ensamblador con el manejo de expresiones en los lenguajes de alto

nivel. En los lenguajes de alto nivel, la evaluación de las expresiones se hace en tiempo de

ejecución.

Cada traductor dará sus reglas de construcción de expresiones y, muy importante, de cómo

las evalúa.

Se mencionará brevemente las caracteristicas de las instrucciones y pseudoinstrucciones de

los lenguajes de ensamblaje sin describir ninguna en particular y con el proposito de

presentar los diferentes tipos de problemas con los que se encuentra el ensamblador.

Page 11: ensamblador

Instrucciones simbolicas

Una instrucción en ensamblador consta de códigos de operación, operaciones, operandos y

comentarios.

La etiqueta , es el símbolo que añadido a una instrucción permite que se pueda referenciar

simbólicamente en el programa.

El código de operación , es generalmente un símbolo, aunque en algunos sistemas es un

entero octal, hexadecimal o decimal que indica la operación que se quiere realizar.

El campo operando , es un campo de dirección de datos que puede estar dividido en varios

subcampos de acuerdo con la constitución interna de la computadora correspondiente.

El comentario , que no es obligatorio, no es procesado por el ensamblador. Nos dice que

las instrucciones pueden ser de formato fijo, formato libre y formato mixto.

ENSAMBLADOR HIPOTETICO

Un ensamblador hipotético es un pequeño programa que se ejecuta a través de un software

que reconoce y ejecuta precisamente instrucciones nemónicas codificadas en lenguaje

maquina.

Las instrucciones de este ejemplo están definidas de la siguiente manera:

ORG Esta pseudo instrucción que proporcione información acerca de alguna parte

de la traducción.

LDA SUB Instrucción que permite cargar el sustraendo a AC. El nombre simbólico de la

operación es LDA.

SUB Indica que es un símbolo de dirección.

CMA Instrucción de maquina que representa un complemento.

INC Instrucción que indica un incremento a AC.

ADD MIN Permite sumar el minuendo a AC.

MIN El valor binario de la parte de dirección debe obtenerse un símbolo de

dirección MIN.

STA DIF Permite almacenar la diferencia.

DIF El valor binario de la parte de dirección debe obtenerse un símbolo de

dirección DIF.

HLT Instrucción que nos permite detener la computadora.

DEC N Este es un número decimal con signo N para convertirse en binario.

Dos líneas del programa simbólico especifican operando decimales con la pseudo

instrucción DEC.

HEX 0 La diferencia se encuentra almacenada aquí.

END Fin del programa simbólico y nos indica que ya no hay líneas para traducir.

Page 12: ensamblador

EJEMPLO DE PROGRAMA PARA RESTAR DOS NUMEROS

ORG 100 /Origen del programa en posición 100

LDA SUB /Cargar el sustraendo de AC

CMA /Complementar AC

INC /Incrementar AC

ADD MIN /Sumar el minuendo a AC

STA DIF /Almacenar la diferencia

HTL /Detener la computadora

MIN, DEC 83 /Minuendo

SUB, DEC-23 /Sustraendo

DIF, HEX 0 /La diferencia almacenada esta aquí

END /Fin del programa simbólico

EJEMPLO DE ENSAMBLADOR HIPOTETICO

Posición Programa Simbólico Comentario

___ ORG 100 /Origen del programa en posición

100 LDA SUB /Cargar el sustraendo de AC

101 CMA /Complementar AC

102 INC /Incrementar AC

103 ADD MIN /Sumar el minuendo a AC

104 STA DIF /Almacenar la diferencia

105 HTL /Detener la computadora106

106 MIN, DEC 83 /Minuendo

107 SUB, DEC-23 /Sustraendo

108 DIF, HEX 0 /La diferencia almacenada esta aquí

END /Fin del programa simbólico

Cuando se termina el primer examen asociamos cada valor con su número de posición y

formamos una tabla que defina el valor hexadecimal de cada dirección simbólica (Consta

de 1,2 o3 pero no mas de 3 caracteres alfanuméricos), para este ejemplo, la tabla de

dirección es como sigue:

Dirección simbólica Dirección hexadecimal

MIN 106

SUB 107

DIF 108

TABLA DE SIMBOLOS DE DIRECCION

Palabra de Símbolo Código Representación

1 M I 4D 49 0100110101001001

2 N , 4E 2C 0100111000101100

3 (LC) 01 06 0000000100000110

4 S U 53 55 010100110101 0101

5 B , 42 2C 0100001000101100

6 (LC) 01 07 0000000100000111

Page 13: ensamblador

7 D I 44 49 0100010001001001

8 F , 46 2C 0100011000101100

9 (LC) 01 08 0000000100001000

Durante el segundo examen del programa simbólico hacemos referencia a la tabla de

símbolos de dirección para determinar el valor de dirección de una instrucción de referencia

a memoria.

Posteriormente se ensamblan las dos partes en una instrucción hexadecimal de cuatro

dígitos como se muestra en el ejemplo ensamblador hipotético.

El código hexadecimal puede convertirse de cuatro dígitos como dígitos como se muestra

en el ejemplo del ensamblador hipotético.

El código hexadecimal puede convertirse con facilidad en el sistema binario si se desea

conocer exactamente como reside este programa de memoria.

TRADUCCIÓN AL CÓDIGO HEXADECIMAL A CÓDIGO BINARIO

Posición Programa simbólico Contenido Rep. Binaria

ORG 100

100 LDA SUB 2107 0010000100000111

101 CMA 7200 0111001000000000

102 INC 7020 0111000000100000

103 ADD 1106 0001000100000110

104 STA DIF 3108 0011000100001000

105 HLT 7001 0111000000000001

106 MIN DEC 83 0053 0000000001010011

107 SUB DEC-23 FFE9 1111111111011001

108 DIF HEX 0 003C 0000000000111100

Se muestra la tabla de código de instrucciones y código de caracteres hexadecimales.

Código de caracteres hexadecimales

Carácter Código Carácter Código Carácter Código Carácter Código A 41 M 4D Y 59 ESPACIO 20

B 42 N 4E Z 5A ( 28

C 43 O 4F 0 30 ) 29

D 44 P 50 1 31 * 2A

E 45 Q 51 2 32 + 2B

F 46 R 52 3 33 , 2C

G 47 S 53 4 34 - 2D

H 48 T 54 5 35 . 2E

I 49 U 55 6 36 / 2F

J 4A V 56 7 37 = 3D

K 4B W 57 8 38 CR OD

L 4C X 58 9 39

Page 14: ensamblador

TABLA DE INSTRUCCIONES

Símbolo Código hexadecimal Descripción

AND 0 u 8 Aplicar AND M a AC

ADD 1 o 9 Sumar M a AC, acarrear E

LDA 2 o A Cargar AC desde M

STA 3 o B Almacenar AC en M

BUN 4 o C Brincar en forma condicional a M

BSA 5 o D Salvar la dirección de retorno en M

ISZ 6 o E Incrementar M y saltar si hay un cero

CLA 7800 Borrar a AC

CLE 7400 Borrar E

CMA 7200 Complementar a AC

CME 7100 Complementar E

CIR 7080 Circular a la derecha E y AC

CIL 7040 Circular a la izquierda E y AC

INC 7020 Incrementar AC

SPA 7010 Brincar si AC es positivo

SNA 7008 Brincar si AC es negativo

SZA 7004 Brincar si AC es cero

SZE 7002 Brincar si E es cero

HLT 7001 Introducir y borrar bandera

OU F400 Sacar información y borrar bandera

SKI F200 Saltar si la bandera de entrada esta activada

SKO F100 Saltar si la bandeja de salida esta activada

ION F080 Habilitar la interrupción

IOF F040 Deshabilitar interrupción