Sunteți pe pagina 1din 9

UNIVERSIDAD ANDINA DEL CUSCO ORGANIZACIN Y ARQUITECTURA DEL COMPUTADOR II GUIA DE LABORATORIO

ECP 1 de 9

I.

TEMA : INVOCACION DE FUNCIONES ESCRITAS EN ENSAMBLADOR DESDE C

II.

OBJETIVO DE LA PRACTICA Al finalizar la presente prctica, el estudiante: 1. Comprende los mecanismos de integracin de programas escritos en ensamblador y C 2. Escribe programas en C que utilizan mdulos escritos en ensamblador.

III.

TRABAJO PREPARATORIO. Para un trabajo con mejores resultados, es imprescindible que el estudiante: 1. Revise la arquitectura de los procesadores X86 2. Tenga conocimientos bsicos de programacin en el lenguaje C.

IV.

MATERIALES. Para el desarrollo de la presente prctica es necesario contar con: 1. Computador con arquitectura x86. 2. Sistema operativo Linux instalado en el computador o en su defecto un liveCD o liveUSB con las herramientas de compilacin y programacin pre instalados. 3. Compilador Nasm 4. Compilador GCC

V.

MARCO TEORICO

El uso de mdulos escritos en ensamblador se justifica por la necesidad de mejorar el tiempo de ejecucin de los programas. Los lenguajes de alto nivel facilitan el trabajo de escribir programas al incorporar libreras para la mayor parte de las necesidades de los programadores, sin embargo, esto trae como consecuencia la prdida de eficiencia en tamao y velocidad de los programas resultantes. Por otro lado, todo programa debe pasar por un proceso de compilacin para poder ser ejecutado por el computador. En ese proceso, la calidad de los programas obtenidos depende significativamente de las caractersticas del compilador y de sus mecanismos de optimizacin. Para un mejor control de los programas crticos, puede ser necesario escribir los programas o las partes ms importantes de estos en ensamblador. Esto es cierto sobre todo cuando se debe escribir aplicaciones que tengan por propsito procesar datos a altas velocidades y de manera eficiente en cuanto al uso de recursos.

UNIVERSIDAD ANDINA DEL CUSCO ORGANIZACIN Y ARQUITECTURA DEL COMPUTADOR II GUIA DE LABORATORIO
ECP 2 de 9

Es conveniente tomar en consideracin que los lenguajes de alto nivel son adecuados para mejorar la productividad de los programadores, por lo que la combinacin de ensamblador y los lenguajes alto nivel se debe realizar de acuerdo a las metas de diseo de las aplicaciones.

INVOCACION DE PROCEDIMIENTOS DE ENSAMBLADOR DESDE C

DECLARAR EL MODULO Para invocar a un mdulo en ensamblador desde C se debe declarar el mismo en el archivo fuente de C
extern <tipo devuelto> NombreDeModulo(<tipo de parmetro>, );

En la llamada se debe especificar el tipo de datos que el mdulo devuelve o void, si el mdulo es un procedimiento. Si el mdulo requiere parmetros, sus tipos deben declararse de acuerdo a la cantidad de parmetros requeridos. Por ejemplo, si un mdulo denominado fnSuma requiere dos parmetros de tipo entero y devuelve un valor tambin de tipo entero; entonces este se declarara as:
extern int fnSuma(int, int);

INVOCAR EL MODULO Dentro del programa en C, la invocacin al mdulo se realizara de acuerdo al siguiente criterio: Si es un procedimiento, ser suficiente invocar el mdulo, por ejemplo:
retardo();

Si es una funcin, se debe leer el valor devuelto en una variable, como se muestra en el siguiente ejemplo:
X = fnSuma(par1, par2);

PASO DE PARAMETROS A MODULOS EN ENSAMBLADOR Cuando se invoca un mdulo que requiere parmetros, estos son cargados por el programa que hace la llamada en la memoria pila y luego se ejecuta la instruccin CALL, la cual deposita en el tope de la pila la direccin de retorno del programa principal. Por esta razn, al

UNIVERSIDAD ANDINA DEL CUSCO ORGANIZACIN Y ARQUITECTURA DEL COMPUTADOR II GUIA DE LABORATORIO
ECP 3 de 9

momento de leer los parmetros en el mdulo de ensamblador se debe tener cuidado de no perder la referencia a la direccin de retorno, pues de ser as, no podramos volver al programa principal. Se debe tomar en cuenta que los parmetros se pasan en orden inverso. Por ejemplo, al llamar al mdulo int fnSuma(int, int); el estado de la memoria pila sera: 1. Antes de invocar a la funcin:

2. Al ejecutar X = fnSuma(par1, par2); i) Se carga los parmetros en la pila

ii) Se ejecuta CALL fnSuma

iii) Los parmetros, al ser enteros, ocupan una cuatro bytes en la pila.

UNIVERSIDAD ANDINA DEL CUSCO ORGANIZACIN Y ARQUITECTURA DEL COMPUTADOR II GUIA DE LABORATORIO
ECP 4 de 9

3. Para acceder al primer parmetro debemos hacer referencia a la posicin [ESP + 4] y para acceder al segundo parmetro debemos hacer referencia a la posicin [ESP + 8]. Si se crea un marco de pila, la ubicacin del primer argumento ser [EBP + 8] y la del segundo ser [EBP + 12].

;Crear un marco de pila push ebp mov ebp, esp ;Leer los parametros de la pila mov eax, [ebp+8] ;1er parametro mov [par1], eax mov eax, [ebp+12] ;2do parametro mov [par2], eax

4. El valor calculado por el mdulo, es devuelto a travs del registro EAX. Por tanto, al terminar el mdulo, debemos asegurarnos que el valor que se debe devolver est en el registro correcto.

VI.

TRABAJO DE LABORATORIO.

1. Escriba un programa en C, que invoque un procedimiento en ensamblador, el cual debe mostrar la cadena Hola desde Assembler. Solucin El cdigo del procedimiento en ensamblador:

;Nombre ;Proposito ;Autor ;FCreacion ;FModificacion

: : : : :

mostrarCadena.asm muestra la cadena "Hola desde Assembler" Edwin Carrasco 20/12/2011 ---

UNIVERSIDAD ANDINA DEL CUSCO ORGANIZACIN Y ARQUITECTURA DEL COMPUTADOR II GUIA DE LABORATORIO
ECP 5 de 9

;compilacion ; section .data mensaje db longMensaje section .text

nasm -f elf mostrarCadena.asm gcc -o mostrarCadena mostrarCadena.o

"Hola desde Assembler", 10,0 equ $-mensaje

global mostrarCadena mostrarCadena: push ebp mov ebp, esp mov mov mov mov int eax, ebx, ecx, edx, 80h 4 1 mensaje longMensaje

pop ebp ret

El cdigo del programa principal en C:


//Nombre //Proposito //Autor //FCreacion //FModificacion //Compilacion // : : : : : : imprimirMensaje.c llama al programa mostrarCadena Edwin Carrasco 26/12/2011 --nasm -f elf mostrarCadena.asm gcc -o mostrarCadena mostrarCadena.o

#include<stdio.h> extern void mostrarCadena(void); main() { mostrarCadena(); }

COMPILACION Ambos archivos deben guardarse en la misma carpeta con los nombres indicados en sus respectivos encabezados. Primero compilamos el programa en ensamblador, utilizando la orden:

UNIVERSIDAD ANDINA DEL CUSCO ORGANIZACIN Y ARQUITECTURA DEL COMPUTADOR II GUIA DE LABORATORIO
ECP 6 de 9

nasm -f elf mostrarCadena.asm

Si no existe errores de sintxis, el proceso de compilacin debe concluir con la creacin del archivo mostrarCadena.o Para compilar el programa principal ejecutamos la rden:
gcc -o imprimir imprimirMensaje.c mostrarCadena.o

En la que el enlazado es realizado por el compilador GCC. El resultado de la compilacin debe ser la creacin del archivo ejecutable imprimir.

2. Escriba un programa en C, que invoque una funcin en ensamblador para calcular la potencia de un nmero entero B, elevado a un exponente E, tambin entero. Tanto B como E deben ser ingresados por el usuario. Solucin El cdigo del procedimiento en ensamblador:
;Nombre ;Proposito ;Autor ;FCreacion ;FModificacion ;Compilacion section .bss base resd 1 exponente resd section .text global potencia potencia: ;Crear un marco de pila push ebp mov ebp, esp ;Leer los parametros de la pila mov eax, [ebp+8] ;1er parametro mov [base], eax mov eax, [ebp+12] ;2do parametro mov [exponente], eax ;Procesar mov ecx, [exponente] : : : : : : potencia.asm calcula p = b^e Edwin Carrasco 28/12/2011 --nasm -f elf potencia.asm

UNIVERSIDAD ANDINA DEL CUSCO ORGANIZACIN Y ARQUITECTURA DEL COMPUTADOR II GUIA DE LABORATORIO
ECP 7 de 9

mov ebx, [base] mov eax, 1 next: mul ebx loopnz next ;Liberar marco de pila pop ebp ;Regresar ret ;Retorna el valor a traves del registro EAX

El cdigo del programa principal en C:


//Nombre //Proposito hallaPotencia.c calcula P = X^Y utilizando una funcion implementada en ensamblador //Autor : Edwin Carrasco //FCreacion : 28/12/2011 //FModificacion : --//compilacion : nasm -f elf potencia.asm // gcc -o hallaPotencia hallaPotencia.c potencia.o #include <stdio.h> extern int potencia(int, int); main() { //Variables int base; int exponente; int pot=0; //Indicar que hace el programa printf("Este programa calcula la potencia de un numero\n"); //Leer datos printf("Ingrese la base: "); scanf("%d", &base); printf("Ingrese el exponente: "); scanf("%d", &exponente); //Procesar pot = potencia(base, exponente); //Mostrar resultados printf("%d ^ %d = %d\n", base, exponente, pot); } //La funcion en ensamblador : :

UNIVERSIDAD ANDINA DEL CUSCO ORGANIZACIN Y ARQUITECTURA DEL COMPUTADOR II GUIA DE LABORATORIO
ECP 8 de 9

VII.

PRACTICAS DE LABORATORIO 1. Escriba un programa que muestre los N primeros nmeros primos. El mdulo para determinar la primalidad de un nmero debe escribirse en ensamblador. N es ingresado por el usuario. 2. Si la suma de los divisores de un nmero M (excepto M) es igual a N y la suma de los divisores de N (excepto N) es igual a M, se dice que estos son nmeros amigos; por ejemplo 220 y 284 son nmeros amigos. Escriba un programa que determine todos los nmeros amigos desde 1 hasta B. El mdulo que determine si dos nmeros son amigos debe escribirse en ensamblador. B es proporcionado por el usuario. 3. Investigue la forma de tomar el tiempo de ejecucin de programas en C y compare las soluciones escritas puramente en C con las soluciones basadas en ensamblador tanto para los ejercicios propuestos. Utilice el siguiente cuadro para mostrar los resultados tabulados:
Ejercicio Ejercicio Tamao propuesto 01 propuesto 02 de entrada NASM C NASM C 10 100 1000 10000

...
1000000

VIII.

BIBLIOGRAFIA

LIBROS [L01]. Bartlett Jonathan. Programming From The Ground Up. Bartlett Publishing, 2003 [L02]. Brey Barry. Los Microprocesadores Intel. Arquitectura, Programacin e Interfaces. Prentice Hall 3Ed. [L03]. Dandamudi. Guide To Assembly Language Programming In Linux. Springer 2005 [L04]. Hyde Randall. Art of Assembly Language Programming. Nostarch Press 1Ed. [L05]. Smith B. E., Johnson M. T. Programming The Intel 80386 Editorial Scott, Foresman And Company, 1987.

REFERENCIAS WEB [W01]. Anvin P. http://nasm.sourceforge.net/. Sitio web del compilador NASM. (visitado: 01/01/2012). [W02]. Carrasco E. http://www.uandina.edu.pe/dais/ecarrasco/asignaturas/oacII/oacII.html. Sitio web de la asignatura. (visitado: 01/01/2012)

UNIVERSIDAD ANDINA DEL CUSCO ORGANIZACIN Y ARQUITECTURA DEL COMPUTADOR II GUIA DE LABORATORIO
ECP 9 de 9

[W03]. Leto J. Writing a useful Program With NASM. http://leto.net/writing/nasm.php. (visitado: 01/01/2012) [W04]. Johnson P. Mixing Assembly And C. http://courses.engr.illinois.edu/ece390/books/labmanual/c-prog-mixing.html. (visitado: 01/01/2012) [W05]. Swanepoel D. http://docs.cs.up.ac.za/programming/asm/derick_tut/. Tutorial de ensamblador para Linux. (visitado: 01/01/2012). [W06]. Toal R. http://www.cs.lmu.edu/~ray/notes/nasmexamples/. Ejemplos de cdigo en ensamblador. (visitado: 01/01/2012)

S-ar putea să vă placă și