Microprocesadores El Stack y Subrutinas Carlos Canto Quintal Microprocesadores El STACK El Stack es un grupo de localidades de memoria de lecto-escritura que son usadas para almacenar el contenido de registros y direcciones de memoria temporalmente durante la ejecución de un programa. En el Z80, el inicio del Stack es definido en el programa usando la instrucción LD SP, dirección de 16 bits. Teóricamente, el tamaño del stack es ilimitado, restringido solamente por la cantidad de memoria RAM disponible en el sistema . La dirección en el Stack Pointer siempre apunta a la parte superior del STACK e indica que la siguiente localidad de memoria (SP-1) está disponible para almacenar información Carlos Canto Quintal Microprocesadores El STACK Una práctica generalizada, es que el stack se inicialice en la localidad de memoria RAM más alta posible para prevenir que el programa del usuario sea destruido por la información del STACK. El stack es compartido por el programador y el microprocesador para almacenar o recuperar información. El programador puede almacenar y recuperar el contenido de los pares de registros usando instrucciones PUSH y POP. El microprocesador puede cargar y recuperar automáticamente el contenido del Contador de programa PC cuando se llama a una subrutina . Carlos Canto Quintal Microprocesadores El STACK Al cargar un dato (siempre de 16 bits) al stack , primero se decrementa el SP, se carga la parte alta del dato en la localidad de memoria apuntada por SP, luego se repite el procedimiento para cargar el byte bajo del dato en la siguiente localidad de memoria. SPÅSP-1 (SP)ÅDatoH SPÅSP-1 (SP)Å DatoL Ejemplo :Para que el stack empiece a partir de 0FFFH, stack es inicializado con: LD SP,1000H SP STACK Programa 1000h 0FFFh 0FFEh 0FFDh 0FFCh El stack del Z80 crece hacia abajo al cargar un dato Carlos Canto Quintal Microprocesadores Uso del Stack como almacén temporal de datos: salvar datos al stack usando instrucciones PUSH PUSH AF PUSH BC Z80 CPU Dirección de memoria PUSH DE 77 13 F B A2 22 C D 10 40 E H FD C5 L SP 0F 10 FD FC FE FB FA FF 00 F9 F8 A contenido de memoria PUSH HL STACK 77 13 A2 22 10 40 FD C5 1000h 0FFFh 0FFEh 0FFDh 0FFCh 0FFBh 0FFAh 0FF9h 0FF8h Carlos Canto Quintal Microprocesadores Uso del Stack como almacén temporal de datos: recuperación de datos del stack usando instrucciones POP POP HL POP DE Z80 CPU A contenido de memoria Dirección de memoria POP BC 00 77 13 00 F B FF A2 FF 22 C D 00 10 00 40 E H FD FF C5 00 L SP 0F 10 FA FB FC FD FE FF F8 F9 00 POP AF STACK 77 13 A2 22 10 40 FD C5 C5 1000h 0FFFh 0FFEh 0FFDh 0FFCh 0FFBh 0FFAh 0FF9h 0FF8h Carlos Canto Quintal Microprocesadores Subrutinas Una subrutina es un grupo de instrucciones escritas por separado del programa principal para realizar una función que puede ser usada repetidamente por el programa principal. Una subrutina se implementa asociada con dos instrucciones : CALL ( llamado a la subrutina) y RETurn (retorno de la subrutina). Carlos Canto Quintal Microprocesadores Subrutinas La instrucción CALL se pone en el programa principal (excepto en la subrutinas anidadas) para invocar la ejecución de la subrutina. La instrucción RETurn se ubica en la subrutina para retornar al programa principal. Carlos Canto Quintal Microprocesadores Subrutinas Cuando una subrutina es llamada, el contenido del Contador de Programa, PC , que contiene la dirección de la instrucción que sigue a la instrucción CALL, es almacenado en el STACK y la ejecución del programa es transferido a la subrutina. Cuando la instrucción RETurn es ejecutada al final de la subrutina, la dirección de memoria almacenada en el STACK es recuperada y la secuencia de ejecución es continuada en el programa principal Carlos Canto Quintal Microprocesadores Tipos de subrutinas Llamadas múltiples Anidadas De Final múltiple Carlos Canto Quintal Microprocesadores subrutinas de llamadas múltiple Programa principal subrutina xx00 xx01 xx50 Push DE 09 0A 0B call 50 xx Push AF 12 13 14 call 50 xx Pop AF Pop DE 1B 1C 1D call 50 xx DELAY 61 Ret Carlos Canto Quintal Microprocesadores subrutinas anidadas Programa principal 2000 Subrutina I 2050 2051 2052 2053 CALL 90 20 2090 Subrutina II 20C2 CALL C2 20 RET RET Carlos Canto Quintal Microprocesadores Subrutinas de Final múltiple Subrutina 2050 RET Z 2058 RET C 2070 RET Carlos Canto Quintal Microprocesadores Carlos Canto Quintal