lunes, 26 de marzo de 2012

Tarea Intro: Lenguaje ensamblador

Introducción


El lenguaje ensamblador  es derivado del lenguaje maquina, es un lenaguaje en el que cada enunciado produce exactamente una instrucción maquina. 

Tiene acceso a todas las caracteristicas e instrucciones disponibles en la maquina.

Es importante ya que es cnosiderado de primera generación apartir de el se derivaron todos los demás lenguajes hasta llegar a los de alto nivel.








Ventajas y desventajas del lenguaje ensamblador vs Lenguaje de alto nivel 



Un programa escrito en lenguaje ensamblador se compone de varias secciones.
Las secciones más comunes son: la sección de texto, la sección de datos y la sección bss.

En la sección de texto se escriben las instrucciones, en la sección de datos los datos inicializados y en la sección bss las variables sin inicializar.
Para declarar las secciones se utilizan las siguientes directivas en el lenguaje ensamblador:

.section .text  para la sección de texto (instrucciones)
.section .bss para la sección de datos (datos inicializados)
.section .data para la sección de datos (datos sin inicializar)

La sección texto solo es de lectura osea que no puede ser modificada en tiempo de ejecución.

Las siglas bss corresponden a "block storage start", que significa inicio de bloque de almacenamiento.Esta sección tiene una ventaja que es que al declarar variables estos datos no se incluyen en el programa ejecutable y el tamaño del programa es  menor al tamaño generado por la declaración equivalente en la sección .data.

También nos encontramos con la sección .rodata (REad ONly Data. Datos de solo lectura), que se conforma de la misma manera que la sección de datos la diferencia es que no permite operaciones de escritura sobre los datos declarados dentro de esta, algunos de los datos delcarados serian las constantes, o literales no asociados a una variable como por ejemplo "Dame un numero ".

Programa

A continuación esta el código que utilizara pasa pasarlo a lenguaje ensamblador, es un programa de los numeros de catalan recursivo:

#include stdio.h 

double res;  //declarar como doble por que no seria suficiente con int
double numeroscatalan(double n); //función como doble, para regresar el valor que guardara la variable res

main(double n)
 {
   printf("\t\tNUMEROS DE CATALAN\n"); 
   printf("Numero: ");  //pedir numero
   scanf("%lf",&n); //asigna en variable n
   res=numeroscatalan(n);  // se manda a llamar la funcion que calcula pasando como parametro la variable n
   printf("Catalan:%.0lf\n",res); // imprimiendo variable que contiene respuesta
 }

double numeroscatalan(double n)
 {
   if (n==0) //Condicion de parada de la recursión para detenerla
     {
       return 1;
     }                         
   else
     {
       return(2*((2*n)-1))/(n+1)*numeroscatalan(n-1); //formula para calcular, llamandose asi misma
     }
 }

Ahora lo compilaremos y ejecutaremos con los siguientes comandos en la terminal:

gcc catalan.c -o catalan

./catalan

Y aquí esta la imagen donde se compila y ejecuta el programa:


Programa en lenguaje ensamblador

Ahora lo pasaremos a lenguaje ensamblador con los siguientes comandos en la terminal:
gcc -S catalan.c

Y a continuación se nos crea el archivo catalan.s que es programa en lenguaje ensamblador, este se crea en la misma carpeta donde se encuentra el programa que pasamos a ensamblador en estecaso catalan.c.

Ahora este es el programa de numeros catalan en lenguaje ensamblador que se genero, con el significado de cada línea:


Aquí esta un diagrama de las secciones mencionadas anteriormente que se encuentran en el lenguaje ensamblador:







Optimización del código ensamblador

Para poder optimizar el código yo tome en cuenta lo siguiente:
  • Plegamiento de Constantes
  • Eliminación de Subexpresiones Comunes
  • Eliminación de Código Muerto
  • Reducción de Resistencia utilizando Variables de Inducción

Después optimizamos el código:


Para saber si no hay errores a la hora de correr el programa ensamblador ya optimizado ponemos el siguientes comando en la términal:
gcc catalan.c -o catalan.out
./catalan.out

Imagen de que realmente corre sin problemas, se probo el mismo numero de la prueba de arriba:



 Páginas de referencia: