Trabajo de Assembler - Baron Sebastian - Consuegra Luis

20
UNIVERSIDAD DE CARTAGENA SIEMPRE A LA ALTURA DE LOS TIEMPOSLENGUAJE DE PROGRAMACION ASSEMBLER BARON CAICEDO SEBASTIAN FELIPE CONSUEGRA ARRIETA LUIS ENRIQUE INGENIERIA DE SISTEMAS SISTEMAS OPERATIVOS HUMBERTO CAICEDO 25-02-2014 CARTAGENA DE INDIAS D.T. Y C.

Transcript of Trabajo de Assembler - Baron Sebastian - Consuegra Luis

UNIVERSIDAD DE CARTAGENA

“SIEMPRE A LA ALTURA DE LOS TIEMPOS”

LENGUAJE DE PROGRAMACION ASSEMBLER

BARON CAICEDO SEBASTIAN FELIPE

CONSUEGRA ARRIETA LUIS ENRIQUE

INGENIERIA DE SISTEMAS

SISTEMAS OPERATIVOS

HUMBERTO CAICEDO

25-02-2014

CARTAGENA DE INDIAS D.T. Y C.

Introducción

En el siguiente trabajo trataremos sobre la definición del término ensamblador este término es tomado del inglés assembler y se refiere a un tipo de programa informático que se encarga de traducir un fichero fuente escrito en un lenguaje ensamblador, a un fichero objeto que contiene código máquina, ejecutable directamente por el microprocesador. El programa lee el fichero escrito en lenguaje ensamblador y sustituye cada uno de los códigos nemotécnicos que aparecen por su código de programación correspondiente en sistema binario para la plataforma que se eligió como destino en las opciones específicas del ensamblador.

Podemos distinguir entre dos tipos de ensambladores:

Ensambladores básicos. Son de muy bajo nivel, y su tarea consiste básicamente en ofrecer nombres simbólicos a las distintas instrucciones, parámetros y cosas tales como los modos.

Ensambladores modulares 32-bits o de alto nivel. Son ensambladores que aparecieron como respuesta a una nueva arquitectura de procesadores de 32 bits, muchos de ellos teniendo compatibilidad hacia atrás pudiendo trabajar con programas con estructuras de 16 bits. Además de realizar la misma tarea que los anteriores, permitiendo también el uso de macros, permiten utilizar estructuras de programación más complejas propias de los lenguajes de alto nivel.

Lenguaje de ensamblador.

El lenguaje ensamblador, o assembler (assembly language en inglés), es un lenguaje de programación de bajo nivel para los computadores, microprocesadores, micro controladores y otros circuitos integrados programables. 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. Esta representación es usualmente definida por el fabricante de hardware, y está basada en los mnemónicos que simbolizan los pasos de procesamiento (las instrucciones), los registros del procesador, las posiciones de memoria y otras características del lenguaje. Un lenguaje ensamblador es por lo tanto específico de cierta arquitectura de computador física (o virtual). Esto está en contraste con la mayoría de los lenguajes de programación de alto nivel, que idealmente son portátiles.

Del lenguaje de ensamblador podemos decir que tiene las siguientes características:

El único lenguaje que entienden los microcontroladores es el código máquina formado por ceros y unos del sistema binario.

El lenguaje ensamblador expresa las instrucciones de una forma más natural al hombre a la vez que muy cercana al microcontrolador, ya que cada una de esas instrucciones se corresponde con otra en código máquina.

El lenguaje ensamblador trabaja con nemónicos, que son grupos de caracteres alfanuméricos que simbolizan las órdenes o tareas a realizar.

La traducción de los nemónicos a código máquina entendible por el microcontrolador la lleva a cabo un programa ensamblador.

El programa escrito en lenguaje ensamblador se denomina código fuente (*.asm). El programa ensamblador proporciona a partir de este fichero el correspondiente código máquina, que suele tener la extensión *.hex.

El código escrito en lenguaje ensamblador posee una cierta dificultad de ser entendido ya que su estructura se acerca al lenguaje máquina, es decir, es un lenguaje de bajo nivel.

El lenguaje ensamblador es difícilmente portable, es decir, un código escrito para un microprocesador, puede necesitar ser modificado, para poder ser usado en otra máquina distinta. Al cambiar a una máquina con arquitectura diferente, generalmente es necesario reescribirlo completamente.

Los programas hechos por un programador experto en lenguaje ensamblador son generalmente mucho más rápidos y consumen menos recursos del sistema (memoria RAM y ROM) que el programa equivalente compilado desde un lenguaje de alto nivel. Al programar cuidadosamente en lenguaje ensamblador se pueden crear programas que se ejecutan más rápidamente y ocupan menos espacio que con lenguajes de alto nivel.

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, ya que, entre otras cosas, en el lenguaje ensamblador se dispone de instrucciones del CPU que generalmente no están disponibles en los lenguajes de alto nivel.

También se puede controlar el tiempo en que tarda una rutina en ejecutarse, e impedir que se interrumpa durante su ejecución.

La imagen que se encuentra a continuación explica el proceso mediante el cual el usuario le dicta instrucciones de funcionamiento a la máquina y como el programa ensamblador traduce a lenguaje nativo de la máquina.

Instrucciones y código fuente

Del código fuente y las instrucciones del programa de ensamblador hay que resaltar las siguientes características de la sintaxis

Está compuesto por una sucesión de líneas de texto. Cada línea puede estructurarse en hasta cuatro campos o columnas separadas por

uno o más espacios o tabulaciones entre sí.

La sintaxis de las instrucciones es la siguiente:

Etiqueta   Opcode   Operando(s)   Comentario

Teniendo en cuenta el ejemplo anterior que muestra la estructura de una línea de código fuente en ensamblador se resaltan las siguientes recomendaciones al momento de escribir en un lenguaje de ensamblador

El campo etiqueta es opcional

Opcode contiene el mnemónico de la instrucción o la directiva de ensamblador. Operando(s), son los operandos (1 o 2 o ninguno) de la instrucción o directiva. Cua

ndo hay 2 o más operandos, estos se separan por comas. De forma opcional, el último campo es el comentario.

Partes de la sintaxis del lenguaje de ensamblador

Campo de etiquetas. Expresiones alfanuméricas escogidas por el usuario para identificar una determinada línea. Todas las etiquetas tienen asignado el valor de la posición de memoria en la que se encuentra el código al que acompañan.

Campo de código. Corresponde al nemónico de una instrucción, de una directiva o de una llamada a macro. En el lenguaje de ensamblador existen 3 tipos de instrucciones principales:

Instrucciones: son aquellos nemónicos que son convertidos por el ensamblador en código máquina que puede ejecutar el núcleo del microcontrolador. En la gama media (PIC16xxx) cada nemónico se convierte en una palabra en la memoria de programa

Directivas: Pseudoinstrucciones que controlan el proceso de ensamblado del programa, pero no son parte del código. Son indicaciones al programa ensamblador de cómo tiene que generar el código máquina

Macros: Secuencia de nemónicos que pueden insertarse en el código fuente del ensamblador de una manera abreviada mediante una simple llamada.

Campo de operandos y datos. Contiene los operandos que precisa el nemónico utilizado. Según el código, puede haber dos, uno o ningún operando. El ensamblador MPASM (distribuido por Microchip) soporta los sistemas de numeración decimal, hexadecimal, octal, binario y ASCII. Los nemónicos que tengan una constante como operando deberán incluirla respetando la sintaxis que se indica a continuación.

Campo de comentarios. Dentro de una línea, todo lo que se encuentre a continuación de un punto y coma (;) será ignorado.

Primeros pasos en el lenguaje de programación de ensamblador

En el lenguaje de programación de ensamblador de deben seguir una serie de pasos a dar para poder generar código fuente:

1.- Juego de Instrucciones 2.- Directivas y Macros 3.- Organización de la Memoria interna:

Programa Datos

Del juego de instrucciones para programar en lenguaje de ensamblador tenemos que, es un juego reducido de 35 instrucciones muy simples. Procesador RISC

La mayoría de las instrucciones se ejecuta en 4 ciclos de reloj; los saltos y llamadas a subprogramas se ejecutan en 8 (no se aprovecha pipeline). Todas las instrucciones tienen la misma longitud en la gama media: 14 bits. Por lo tanto el cálculo del tiempo de ejecución y de lo que ocupa un programa resulta simple las instrucciones se pueden clasificar atendiendo a dos criterios:

1.) Formato.2.) Funcionalidad.

La imagen a continuación describe el juego de instrucciones según su formato

CICLO DE INSTRUCCION

Un ciclo de instrucción es el tiempo que se tarda en ejecutar una instrucción (salvo las instrucciones de salto) en el microcontrolador. En los PIC16, un ciclo de instrucción dura 4 ciclos de reloj.

En una primera etapa, la instrucción es traída a la CPU. Esto lleva un ciclo de instrucción TCY.

En la segunda etapa se ejecuta la instrucción. Esto lleva otro TCY.

No obstante, debido al solapamiento (pipelining ó entubado) de traer la instrucción actual y ejecución de la instrucción previa, una instrucción se trae y otra se ejecuta cada TCY.

Pudiera haber un ciclo de instrucción de retardo si el resultado de ejecutar la instrucción anterior modifica el contenido del Contador de Programa (Ej: GOTO ó CALL).

Esto implica suspender el entubado (pipelining) de las instrucciones durante un ciclo para que la instrucción a donde se salta se traiga a la CPU.

El juego de instrucciones: SEGÚN SU FUNCIONALIDAD

LAS CLAVES DEL JUEGO DE INSTRUCCIONES

Directivas de MPASM

Son aquellas instrucciones que controlan el proceso de ensamblado del programa, pero no son parte del mismo (también se conocen como pseudo-instrucciones), hay más de 50 directivas reconocidas por MPASM. Entre las más usadas se encuentran:

END: Es la única directiva obligatoria. Indica al ensamblador dónde debe detener el proceso. Debe colocarse en la última línea del programa.

<etiqueta> EQU <expresión>: El valor <expresión> es asignado a <etiqueta>. Estas directivas se suelen colocar al principio del programa y habitualmente se usan para definir constantes y direcciones de memoria.

[<etiqueta>] ORG <expresión>: Las instrucciones del código fuente que siguen a esta directiva se ensamblan a partir de la posición indicada por <expresión>.

__CONFIG <expresión> [& <expresión> & ... & <expresión>]:Permite indicar la configuración elegida para la grabación del PIC. Ejemplo: __CONFIG _CP_OFF & _WDT_OFF & _XT_OSC

LIST P=16F877: Indica el tipo de microcontrolador utilizado. INCLUDE <p16F877.inc> o INCLUDE “p16F877.inc”: Incluye en el programa un

fichero donde se definen las etiquetas con las que se nombra a los diferentes registros y sus bits. Este fichero se encuentra en el directorio principal del

programa ensamblador. Puede usarse esta directiva para incluir cualquier otro fichero (¡Ojo! El fichero de inclusión no puede terminar con una directiva END).

DT <expr1> [, <expr2>, ... , <exprN>] Genera una instrucción retlw por cada expresión que incluya la directiva. Si la expresión es del tipo cadena, se generará una instrucción retlw por cada carácter de la misma.

Listado completo de directivas MPASM

Organización interna de la memoria principal.

Una memoria principal se compone de un conjunto de celdas básicas dotadas de una determinada organización. Cada celda soporta un bit de información. Los bits se agrupan en unidades direccionables denominadas palabras. La longitud de palabra la determina el número de bits que la componen y constituye la resolución de la memoria (mínima cantidad de información direccionable). La longitud de palabra suele oscilar desde 8 bits (byte) hasta 64 bits.

Cada celda básica es un dispositivo físico con dos estados estables (o semi-estables) con capacidad para cambiar el estado (escritura) y determinar su valor (lectura). Aunque en los primeros computadores se utilizaron los materiales magnéticos como soporte de las celdas de memoria principal (memorias de ferritas, de película delgada, etc.) en la actualidad sólo se utilizan los materiales semiconductores.

Dentro de las memorias electrónicas de semiconductor podemos distinguir dos grandes grupos:

Las estáticas (SRAM: Static Random Access Memory) y las dinámicas (DRAM: Dynamic Random Access Memory). Las estáticas utilizan el principio de biestabilidad que se consigue con dos puertas inversoras (NAND ó NOR) realimentadas, mientras que las dinámicas aprovechan la carga o ausencia de carga de un pequeño condensador creado en un material semiconductor. Debido a la descarga natural que sufren las celdas cargadas, las memorias dinámicas necesitan un sistema de refresco que periódicamente - y antes que la carga eléctrica del condensador se haga indetectable - recargue las celdas que se encuentran en estado de carga.

Desde un punto de vista conceptual y con independencia de la tecnología, consideraremos la celda básica de memoria como un bloque con tres líneas de entrada (entrada dato, selección y lectura/escritura) y una de salida (salida dato). La celda sólo opera (lectura ó escritura) cuando la selección está activa.

Organización interna de la memoria: Las celdas de memoria se disponen en el interior de un chip atendiendo a dos organizaciones principales: la organización por palabras, también denominada 2D, y la organización por bits, también denominada 2 ½ D o 3D.

Organización 2D: Es la organización más sencilla que responde al esquema mostrado en la siguiente figura:

Las celdas forman una matriz de 2n filas y m columnas, siendo 2n el número de palabras del chip y m el número de bits de cada palabra. Cada fila es seleccionada por la decodificación de una configuración diferente de los n bits de dirección.

Esta organización tiene el inconveniente que el selector (decodificador) de palabras crece exponencialmente con el tamaño de la memoria. Igual le ocurre al número de entradas (fan-in) de las puertas OR que generan la salida de datos.

Ejemplo

En la siguiente figura se muestra la organización 2D de un chip de memoria con 4 palabras de 4 bits:

Organización 3D: En lugar de una única selección (decodificador) de 2n salidas en esta organización se utilizan dos decodificadores de 2n/2 operando en coincidencia. Las líneas de dirección se reparten entre los dos decodificadores. Para una configuración dada de las líneas de dirección se selecciona un único bit de la matriz. Por ello se la denomina también organización por bits.

Ejemplo:

En esta organización se necesitan varias matrices de celdas básicas, tantas como bits deba tener la palabra de memoria, actuando sobre ellas en paralelo los circuitos de decodificación:

Ejemplo de un programa escrito en lenguaje de ensamblador

CONCLUSION

Podemos concluir que el lenguaje assembler o ensamblador nos permite establecer una relación directa entre el usuario y la máquina, mediante el uso de las herramientas conocidas como programas de ensamblador, los cuales a través de una sintaxis especifica facilitan la comunicación de órdenes y evitan la casi imposible labor de programar en lenguaje binario las instrucciones para la máquina.

REFERENCIAS

1. David Salomon (1993). Assemblers and Loaders

2.  Answers.com. «assembly language: Definition and Much More from Answers.com». Consultado el 19-06-2008.

3. http://www.unioviedo.es/ate/alberto/TEMA3Ensamblador.pdf . Consultado el 24-02-2014.

4.  Principles of Computer Architecture (POCA) – ARCTools computadora virtual disponible para descarga y ejecución del código, acceso el 24 de agosto de 2005