CURSO de ASM 6502 [NES]

La pila

Por DaRKWiZaRDX

En esta corta lección explicaré de qué se trata la pila, uno de los recursos más importantes del programador (de ASM, C, lo que sea xD).

¿Qué es?

La pila es un espacio de memoria (entre $100 y $1FF) usado para almacenamiento temporal de datos que, obviamente, no deben perderse. La pila utiliza un sistema LIFO (Last in first out), que significa que el último elemento que introduzcamos (push) en la pila será el primero que extraigamos (pull). El procesador sabe dónde está el último valor que se insertó y dónde poner un nuevo valor en la pila gracias al registro de pila (S, por eso decía antes que no hay que tocarlo a menos que sepas muy bien lo que haces). Por ejemplo, si tenemos la pila vacía, y hacemos lo siguiente:

LDA #$40     ; carga A con el valor $40
PHA          ; mete A ($40) en la pila
PHA          ; mete A ($40) en la pila
LDA #$00     ; carga A con el valor $00
PHA          ; mete A ($00) en la pila

Hemos metido en la pila los valores $40 $40 $00 (en ese orden), cuando comencemos a extraer bytes de la pila no sacaremos primero el $40 que pusimos al principio, sino el $00 que pusimos al final:

PLA          ; carga A con el valor de la pila
PLA          ; ídem
PLA          ; ídem

Después del primer PLA tendremos en A el valor $00, después del segundo A quedará en $40 y después del tercero A quedará en $40 (otra vez). Y la pila quedará nuevamente vacía.

De arriba hacia abajo

Como ya dije, la pila guarda los valores que se le introducen en una zona de memoria ente $100 - $1FF, pero no empieza poniendo el primer valor (suponiendo que la pila esté vacía) en $100, y luego en $101, NO. Todo lo contrario, siempre se recomienda al escribir programas de NES, poner el puntero de pila a #$FF (el 1 de la unidad de centenas no hace falta ponerlo) mediante LDX #$FF y TXS. El puntero de pila debe apuntar siempre (cuando la pila está vacía) a $1FF, cada vez que introduzcamos un valor en la pila pasará algo así:

(suponiendo que la pila está vacía y el puntero es $1FF)
En los comentarios pondré cómo quedarían los registros DESPUÉS de ejecutarse la instrucción.

LDA #$00               ; A = $00      S = $FF     PILA = (vacía)
PHA                    ; A = $00      S = $FE     PILA = $00
PHA                    ; A = $00      S = $FD     PILA = $00 $00
LDA #$20               ; A = $20      S = $FD     PILA = $00 $00
PHA                    ; A = $20      S = $FC     PILA = $00 $00 $20
LDA #$60               ; A = $60      S = $FC     PILA = $00 $00 $20
; ya terminamos de meter valores en la pila
PLA                    ; A = $20      S = $FD     PILA = $00 $00
PLA                    ; A = $00      S = $FE     PILA = $00
PLA                    ; A = $00      S = $FF     PILA = (vacía)

Espero que haya quedado claro con ese ejemplo.

Una recomendación: Cuando escribas código (demos, rutinas, lo que sea) recuerda siempre que guardes un valor en la pila SACARLO antes de volver de la rutina, o puede causar varios errores.

Además del uso que le da el programador (guardar valores) la pila también es usada por el procesador para guardar direcciones de regreso para subrutinas, pero eso lo veremos con más detalle en su sección correspondiente.

<< Anterior - Siguiente >>