jueves, 3 de enero de 2013

Tutorial de ensamblador x86. Capítulo 5. Llamar a funciones desde asm



Hola a todos,

Ya habéis pasado por varios capítulos de programación en asm, y seguramente ya habréis practicado implementando alguna función en asm. El problema que habréis tenido es que no os había explicado como se llama a funciones desde asm.

Lo primero que tenéis que saber es que la instrucción que se  utiliza para llamar a una subrutina es la instrucción CALL. Cuando la subrutina se acabe de ejecutar seguirá el flujo de programa donde se había quedado y el valor devuelto por la función llamada residirá en eax.

Para pasarle parámetros a una función ( que será lo usual) se usa la pila. La pila es una zona de memoria a la que se accede mediante las instrucciones PUSH y POP.
PUSH:  Pone arriba de todo de la pila el valor que le pasemos por parametro
POP: Nos devuelve el valor que hay arriba de todo de la pila y lo elimina de la pila.

Aquí os dejo un par de ejemplos, no son hechos por mi, los tenía por el ordenador hace ya mucho tiempo y no recuerdo de donde los saqué, así que si el autor original està leyendo esto que se ponga en contacto conmigo.

Espero que os sirvan

Cálculo de factorial de forma recursiva:


_fact:
enter 0,0

mov  eax,[ebp+8] ; eax = n
cmp  eax,1
jbe  term_cond   ; si n <= 1, termina
dec eax
push eax
call _fact ; eax = fact (n-1)
        pop ecx          ; respuesta en eax
        mul dword [ebp+8] ; edx:eax = eax * [ebp+8]
jmp short end_fact

term_cond:
mov eax,1

end_fact:
leave
ret


Ejemplo de uso de la función printf
_f:
enter 4,0 ; guarda espacio en la pila para i (4 bytes)
mov dword[i],0 ; i = 0

lp:
mov eax,[i]  ; es i < x?
cmp eax,[x]
jnl quit

push eax   ; llamamos a printf
push format
call _printf
add esp,8

push dword[i] ; llamamos a f
call _f
pop eax

inc dword[i] ; i++
jmp short lp

quit:
leave
ret


Para cualquier duda ya lo sabeis,

Nos vemos

LordPakusBlog

0 comentarios :

Publicar un comentario

Entradas populares