Sie sind auf Seite 1von 10

UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO

ESCUELA DE POSTGRADO
MAESTRIA EN CIENCIAS MENCION INFORMATICA
ARQUITECTURAS DE ALTO RENDIMIENTO – GUIA DE LABORATORIO

1) TEMA : INVOCACION DE FUNCIONES DE C DESDE NASM

2) OBJETIVO DE LA PRACTICA

Al finalizar la presente práctica, el estudiante:

1. Comprende los mecanismos de integración de programas escritos en ensamblador y C


2. Escribe programas en ensamblador, que utilizan funciones del lenguaje C.

3) TRABAJO PREPARATORIO.

Para un trabajo con mejores resultados, es imprescindible que el estudiante:

1. Revise la arquitectura de los procesadores X86


2. Tenga conocimientos básicos de programación en el lenguaje C.

4) MATERIALES.

Para el desarrollo de la presente práctica 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 compilación y programación pre instalados.
3. Compilador Nasm
4. Compilador GCC

08/09/2018 ECP 1 de 10
UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO
ESCUELA DE POSTGRADO
MAESTRIA EN CIENCIAS MENCION INFORMATICA
ARQUITECTURAS DE ALTO RENDIMIENTO – GUIA DE LABORATORIO

5) MARCO TEORICO

FUNCION scanf()

Esta función de C permite leer datos desde el teclado.


La sintaxis de la función scanf() es:

Por ejemplo:

int nroEntero
scanf(“%d”, &nroEntero)

En este caso, los datos leídos desde el teclado se interpretan como entero y son
almacenados en la variable nroEntero.

LLAMADA DE LA FUNCIÓN scanf() DESDE ENSAMBLADOR

Para llamar a la función scanf() se necesita declarar la misma como externa. Puesto
que la función necesita parámetros, estos deben dejarse en la pila antes de llamar a la
misma. Así, para el ejemplo anterior, se debe declarar una cadena que se usará como
formato de lectura. Igualmente, la variable a donde se leerá el número ingresado será
declarada en la sección BSS.

section .data

formato db "%d",0

section .bss

nroEntero resd 1

Los parámetros se pasan a través de la pila en orden inverso, así:

;Leer numero
push dword nroEntero
push dword formato
call scanf

Para restablecer el estado de la pila al estado previo a la llamada de la función scanf(),


le sumamos al registro ESP el número de bytes que se pasaron como parámetros. Puesto
que para el ejemplo se pasaron dos palabras dobles, entonces debemos sumarle 2 x 4 = 8
bytes.

add esp, 8

08/09/2018 ECP 2 de 10
UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO
ESCUELA DE POSTGRADO
MAESTRIA EN CIENCIAS MENCION INFORMATICA
ARQUITECTURAS DE ALTO RENDIMIENTO – GUIA DE LABORATORIO

FUNCION printf()

Esta función de C permite mostrar datos a través de la consola.


La sintaxis de la función printf() es:

int nroEntero;
int mitadNro;
printf(“La mitad de %d es %d\n”, nroEntero, mitadNro);

LLAMADA DE LA FUNCIÓN printf() DESDE ENSAMBLADOR

Para llamar a la función printf() se necesita declarar la misma como externa. Puesto
que la función necesita parámetros, estos deben dejarse en la pila antes de llamar a la
misma. Así, para el ejemplo anterior, se debe declarar una cadena que se usará como
formato de salida. Igualmente, las variables serán declaradas en la sección BSS (En lugar
de ello, estos parámetros podría pasarse desde registros a la pila).

section .data

formato db " La mitad de %d es %d\n ", 10, 0

section .bss

nroEntero resd 1
mitadNro resd 1

Los valores que se mostrarán se deben dejar en la pila en orden inverso, asi:

;Mostrar resultados
push dword [mitadNro]
push dword [nroEntero]
push dword formato
call printf

Para restablecer el estado de la pila al estado previo a la llamada de la función printf(),


le sumamos al registro ESP el número de bytes que se pasaron como parámetros. Puesto
que para el ejemplo se pasaron tres palabras dobles, entonces debemos sumarle 3 x 4 = 12
bytes.

add esp, 12

08/09/2018 ECP 3 de 10
UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO
ESCUELA DE POSTGRADO
MAESTRIA EN CIENCIAS MENCION INFORMATICA
ARQUITECTURAS DE ALTO RENDIMIENTO – GUIA DE LABORATORIO

6) TRABAJO DE LABORATORIO.

1. Escriba un programa en ensamblador que calcule el doble de un número ingresado por


el usuario. Utilice la función scanf() para leer el numero del teclado y la función
printf() para mostrar el resultado.

Solución

;Nombre : doble.asm
;Proposito : calcula el doble de un entero ingresado por
el usuario
;Autor : Edwin Carrasco
;FCreacion : 20/12/2011
;FModificacion : ---
;compilacion : nasm -f elf doble.asm
; gcc -o doble doble.o

;Declarar las funciones de C que se utilizaran


extern printf
extern scanf

section .data
mensaje db "ESTE PROGRAMA CALCULA EL DOBLE DE UN NUMERO
ENTERO",10,0
pideNro db "Ingrese el numero: ",0
salida db "El doble es: ",0
leer db "%d",0
imprimir db "El doble de %d es %d", 10, 0

section .bss
numero resd 1
doble resd 1

section .text
global main

main:
push ebp
mov ebp, esp

;--INDICAR QUE HACE EL PROGRAMA


push dword mensaje
call printf
add esp, 4

;--LEER DATOS
;Pedir numero

08/09/2018 ECP 4 de 10
UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO
ESCUELA DE POSTGRADO
MAESTRIA EN CIENCIAS MENCION INFORMATICA
ARQUITECTURAS DE ALTO RENDIMIENTO – GUIA DE LABORATORIO

push dword pideNro


call printf
add esp, 4

;Leer numero
push dword numero
push dword leer
call scanf
add esp, 8

;--PROCESAR
mov eax, [numero]
shl eax, 1
mov [doble], eax

;--MOSTRAR RESULTADOS
push dword [doble]
push dword [numero]
push dword imprimir
call printf
add esp, 12

;--SALIR DEL PROGRAMA


mov eax,1
int 80h

2. Escriba un programa en ensamblador que calcule el MCD de dos números ingresados


por el usuario. Utilice las función scanf() y printf() para leer los números del
teclado y para mostrar el resultado.

Solución

;Nombre : mcd.asm
;Proposito : calcula el mcd de dos números enteros
ingresados por el usuario
;Autor : Edwin Carrasco
;FCreacion : 28/12/2011
;FModificacion : 01/01/2012
;compilacion : nasm -f elf mcd.asm
; gcc -o mcd mcd.o

;Declarar las funciones de C que se utilizaran


extern printf
extern scanf

section .data
strProposito db "ESTE PROGRAMA CALCULA EL MCD DE DOS NUMEROS
ENTEROS",10,0
strInNro1 db "Ingrese el primer numero: ",0
strInNro2 db "Ingrese el segundo numero: ",0
formatOut db "El MCD de %d y %d es %d", 10, 0

08/09/2018 ECP 5 de 10
UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO
ESCUELA DE POSTGRADO
MAESTRIA EN CIENCIAS MENCION INFORMATICA
ARQUITECTURAS DE ALTO RENDIMIENTO – GUIA DE LABORATORIO

formatIn db "%d", 0

section .bss
nro1 resd 1
nro2 resd 1

section .text

global main

main:
;--INDICAR QUE HACE EL PROGRAMA
push strProposito
call printf
add esp, 4

;--LEER DATOS
;Leer primer nro
push strInNro1
call printf
add esp, 4

push nro1
push dword formatIn
call scanf
add esp, 8

;Leer segundo nro


push strInNro2
call printf
add esp, 4

push nro2
push dword formatIn
call scanf
add esp, 8

;--PROCESAR
;Parametros para el modulo MCD
mov eax, [nro1]
mov ebx, [nro2]

call fnMCD

;--MOSTRAR RESULTADOS
push ebx
push dword [nro2]
push dword [nro1]
push dword formatOut
call printf
add esp, 16

;--SALIR DEL PROGRAMA

08/09/2018 ECP 6 de 10
UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO
ESCUELA DE POSTGRADO
MAESTRIA EN CIENCIAS MENCION INFORMATICA
ARQUITECTURAS DE ALTO RENDIMIENTO – GUIA DE LABORATORIO

mov eax, 1
int 80h

;--MODULO fnMCD
;======================================================
; int MCD (int nro1, int nro2){
; do {
; resto = nro1 % nro2;
; nro1 = nro2;
; nro2 = resto;
; } while (resto != 0);
; return nro1;
; }
;======================================================

fnMCD:
;Parametros en eax = nro1, ebx = nro2
;Crear el marco de pila
push ebp
mov ebp, esp
sgte:
xor edx, edx
div ebx ;Q = eax = edx:eax/ebx, R = edx
cmp edx, 0
je fin
mov eax, ebx
mov ebx, edx
jmp sgte
fin:
;destruir marco de pila
mov esp, ebp
pop ebp

;return ebx
ret

08/09/2018 ECP 7 de 10
UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO
ESCUELA DE POSTGRADO
MAESTRIA EN CIENCIAS MENCION INFORMATICA
ARQUITECTURAS DE ALTO RENDIMIENTO – GUIA DE LABORATORIO

7) PRACTICAS DE LABORATORIO

1. Escriba un programa que muestre el enésimo término de la serie de Fibonacci. N es


ingresado por el usuario.
2. Escriba un programa que calcule el área de un triángulo a partir de sus coordenadas,
las cuales deben ser ingresadas por el usuario.
3. Escriba un programa que muestre el elemento mayor de un vector de N elementos.

08/09/2018 ECP 8 de 10
UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO
ESCUELA DE POSTGRADO
MAESTRIA EN CIENCIAS MENCION INFORMATICA
ARQUITECTURAS DE ALTO RENDIMIENTO – GUIA DE LABORATORIO

8) EVALUACION

La evaluación de las actividades realizadas en la presente guía de práctica se hará en


función de la siguiente tabla:

SESION 01 SESION 02
ACTIVIDAD
Procedimental Procedimental
Ejecución del ejercicio de ejemplo 05 --
Resolución del ejercicio propuesto 01 05 --
Resolución del ejercicio propuesto 02 10 --
Resolución del ejercicio propuesto 03 -- 10
Resolución del ejercicio propuesto 04 -- 10
TOTAL 20 20

08/09/2018 ECP 9 de 10
UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO
ESCUELA DE POSTGRADO
MAESTRIA EN CIENCIAS MENCION INFORMATICA
ARQUITECTURAS DE ALTO RENDIMIENTO – GUIA DE LABORATORIO

BIBLIOGRAFIA

LIBROS

[L01]. Bartlett Jonathan. “Programming From The Ground Up”. Bartlett Publishing,
2003
[L02]. Brey Barry. “Los Microprocesadores Intel. Arquitectura, Programación 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


[W02]. Swanepoel D. http://docs.cs.up.ac.za/programming/asm/derick_tut/. Tutorial de
ensamblador para Linux

08/09/2018 ECP 10 de 10

Das könnte Ihnen auch gefallen