03 Subrutinas
-
Upload
independent -
Category
Documents
-
view
0 -
download
0
Transcript of 03 Subrutinas
Introducción Una subrutina es un fragmento de código que realiza una tarea
Una subrutina es el equivalente de una función en C, y tiene
parecido con un método en VisualBasic
Cuando se programa en C, el compilador traduce cada función en
una subrutina (depende del nivel de optimización seleccionado). El
compilador agrega el código adicional necesario
Para trabajar con subrutinas, se utiliza el stack
Subrutinas Las subrutinas son el equivalente a las funciones en lenguaje C. Se identifican por medio de etiquetas.
Las instrucciones utilizadas son:
call: Llamar una subrutina
ret: Retornar de una subrutina
El retorno se hace a la instrucción localizada inmediatamente después de la llamada
La dirección de retorno se guarda en el stack
Es responsabilidad de la subrutina guardar los registros que se modifiquen, para evitar que se vea afectado el código externo a la subrutina
Subrutinas . . . . . . . . . . . . Call miRutina . . . . . . . . . . . . . . . . lazo: rjmp lazo miRutina: . . . . . . . . . . . . ret
Flujo del programa en una llamada a una subrutina
Subrutinas . . . . . . . . . . . . Call miRutina . . . . . . . . . . . . . . . . lazo: rjmp lazo miRutina: . . . . . . . . . . . . ret
Flujo del programa en una llamada a una subrutina
Subrutinas . . . . . . . . . . . . Call miRutina . . . . . . . . . . . . . . . . lazo: rjmp lazo miRutina: almacena registros en stack . . . . . . . . recupera registros del stack ret
Generalmente es necesario guardar en el stack los valores de los registros que se modifican dentro de la subrutina, para que no se afecte el funcionamiento fuera de la subrutina.
Ejemplo configura Stack en parte alta de SRAM
Programa que rota un bit en el puerto B, tres veces
configura puerto B como salida
contador = 3
hace corrimiento a la derecha en puerto B
decrementa contador
nop
salta a instrucción NOP
¿contador ≠ 0? si
no
Subrutina
Llamada a la subrutina
Ejemplo
El registro 16 se utiliza dentro de la subrutina, pero no se afecta fuera de la subrutina porque su valor se almacena temporalmente en el stack