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,
0 comentarios :
Publicar un comentario