| Compilacion de un Programa | |||||||||||||||||||||||
| Descripcion del Problema. Se pide que se implemente el siguiente codigo: -------------------------------------------------------------- | FOR numero := 1 TO N DO BEGIN | | suma := 0; | | temp := numero; | | WHILE temp <> 0 DO BEGIN | | digito := temp MOD 10; { <- } | | suma := suma + (digito * digito * digito); | | temp := temp DIV 10; | | END; | | END; | -------------------------------------------------------------- tanto en Pascal como en C++, luego compilar ambos archivos y generar sus respectivos codigos en lenguaje ensamblador, asegurandose de que la optimizacion del codigo este desactivada. Tomar el codigo ensamblador que se ha obtenido para cada version del programa y modificarlo, incluyendole comentarios explicativos que muestren la correspondencia entre el programa fuente y el que produce cada compilador. Luego comparar los resultados obtenidos, y destacar las diferencias importantes que encuentre. Haga un concienzudo analisis de los resultados obtenidos y describa con exactitud las conclusiones a las que llega. Objetivo. Observar y diferenciar los codigos en lenguaje ensamblador que generan distintos compiladores, para diversos lenguajes de programacion, para de esta manera comprender mejor el proceso de generacion de codigo de bajo nivel para distintos lenguajes de programacion. Requerimientos. Dada la naturaleza simple del problema a resolver, unicamente se requiere instalar un compilador de C++ y uno de Pascal, pues es con respecto a dichos lenguajes de programacion que se realizara el analisis del codigo ensamblador. En este caso particular se usaran Visual Studio 2005 y Free Pascal para la tarea a realizar. |
|||||||||||||||||||||||
| Proceso de generacion de codigo ensamblador | |||||||||||||||||||||||
| C++:
Se utilizo Visual Studio 2005 para generar el codigo ensamblador a partir del codigo escrito en C++. Para lograr esto se deben seguir los siguientes pasos: - Tener creado el archivo en C++. - Dar click derecho sobre el archivo en el cuadro de clases. - Ir a propiedades. - Se abre la siguiente ventana. |
|||||||||||||||||||||||
| - Se va a la opcion output files.
- Se se�ala Assembler Output. - Se modifica su atributo y se escribe en Assembly With Source Code(/FAs). Pascal: Se uso Free Pascal (fpc) para generar el c�digo ensamblador a partir del codigo escrito en Pascal. Para lograr esto se deben seguir los siguientes pasos: - Copiar el archivo .pas dentro del directorio bin de Free Pascal. - Entrar al directorio donde se encuentre fpc: normalmente c:\FPC\bin usando el Command Prompt(Simbolo de sistema). - Escribir : fpc -a �nombreDelArchivo�.pas. - Dentro del mismo directorio se genera el archivo .s . |
|||||||||||||||||||||||
| Codigo ensamblador generado a partir de C++ | |||||||||||||||||||||||
| Codigo ensamblador generado a partir de Pascal | |||||||||||||||||||||||
| Diferencias encontradas entre ambas versiones | |||||||||||||||||||||||
| * Diferencia de tama�o:
El documento resultante de la conversion de C++ a ensamblador hecha en Visual Studio 2005 tiene un tama�o de 3KB, mientras que el tama�o del archivo generado por el Free Turbo Pascal, al realizar la conversion de Pascal a ensamblador es de 1KB. Esto puede darse debido a los include que cada programa hace. En Visual Studio se deben agregar mayor cantidad de librerias para la correcta compilacion. Hay una diferencia de 2KB en los archivos de tipo ensamblador (.s->pascal y .asm->c++). * Diferencia de dirreccionamiento: El codigo ensamblador generado por el Free Turbo Pascal, usa un tipo de direccionamiento directo en cuanto al uso de los movw y movswl y movl(movw $1,U_P$RARO_NUMERO), cabe destacar que en este codigo no se utiliza la instruccion mov. El codigo que se genero para el programa en C++ usa el direccionamiento de registro a relativo o relativo a registro (mov eax, DWORD PTR _numero$[ebp]). * Diferencia de sintaxis: Hay una gran diferencia en la sintaxis usada en el codigo ensamblador generado por los compiladores de los diferentes lenguajes(C++ y pascal), el creado a partir de C++ tiene el formato de las arquitecturas Intel mientras que el que genera pascal tiene un parecido mayor al de AT&T. Esto se nota por el uso de % para los registros y de $ para los operandos inmediatos, ademas del uso del ultimo caracter de los operadores ya sea "b" (8-bit), "w" (16-bit), y "l" (32-bit). Tambien se nota la diferencia en que el orden de los registros en operaciones esta invertido, es decir, no es el formato fuente, destino que usa Intel, sino destino, fuente. Bibliografia - http://personales.mundivia.es/jap/djasm.htm - www.di-mare.com/adolfo - The Intel Microprocessors: 8086/8088, 80186, 80286, 80386, 80486, Pentium, Pentium Pro, Pentium II, Pentium III, Pentium 4, Seventh Edition, � 2005, Prentice-Hall. |
|||||||||||||||||||||||